diff --git a/.changeset/README.md b/.changeset/README.md
deleted file mode 100644
index 79d7984f62..0000000000
--- a/.changeset/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Changesets
-
-Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
-with multi-package repos, or single-package repos to help you version and publish your code. You can
-find the full documentation for it [in our repository](https://github.com/changesets/changesets)
-
-We have a quick list of common questions to get you started engaging with this project in
-[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
-
-
-## Add A Changeset
-
-Read the [documentation](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md) for more detail.
-
-## Publish Snapshot Version
-
-> NOTE: It is useful for you to release a version to test your package on your current branch.
-
-Run the following command to publish the snapshot version:
-
-```bash
-$ npm run release:snapshot
-```
-
-After that, you don't need to commit the change to the branch.
-
-## Publish Beta Version
-
-> NOTE: Recommend you to publish a beta version on a new branch(such as `release-beta`) which is checked out from the `release*` branch.
-
-Run the following command to publish the beta version:
-
-```bash
-$ npm run release:beta
-```
-
-Then, we need to commit the changes to the branch.
-
-For more detail, please see this [documentation](https://github.com/changesets/changesets/blob/main/docs/prereleases.md).
-
-## Publish Latest Version
-
-GitHub bot will automatically create a PR to update the latest versions for the released package.
-
-
-
-What we need to do is to merge the PR to the `release*` branch. After the `release*` branch was merged to the master branch, the versions will be released automatically.
diff --git a/.changeset/config.json b/.changeset/config.json
deleted file mode 100644
index 4570eadc8c..0000000000
--- a/.changeset/config.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
- "changelog": "@changesets/cli/changelog",
- "commit": false,
- "fixed": [],
- "linked": [],
- "access": "restricted",
- "baseBranch": "master",
- "updateInternalDependencies": "patch",
- "ignore": [
- "@examples/*",
- "ice-website-v3"
- ],
- "snapshot": {
- "useCalculatedVersion": true,
- "prereleaseTemplate": "{tag}-{commit}-{datetime}"
- }
-}
diff --git a/.changeset/dull-steaks-melt.md b/.changeset/dull-steaks-melt.md
deleted file mode 100644
index c2235b4d8a..0000000000
--- a/.changeset/dull-steaks-melt.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@ice/runtime': patch
----
-
-fix: duplicate css
diff --git a/.commitlintrc.js b/.commitlintrc.js
deleted file mode 100644
index 54823c7509..0000000000
--- a/.commitlintrc.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const { getCommitlintConfig } = require('@applint/spec');
-
-module.exports = getCommitlintConfig('common');
diff --git a/.editorconfig b/.editorconfig
index 06cc6647e2..22ef5ace54 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -7,7 +7,6 @@ indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
-quote_type=single
[*.md]
trim_trailing_whitespace = false
@@ -15,7 +14,3 @@ trim_trailing_whitespace = false
[makefile]
indent_style = tab
indent_size = 4
-
-[*.rs]
-indent_style = space
-indent_size = 4
\ No newline at end of file
diff --git a/.eslintignore b/.eslintignore
index b95cb05b89..7dbcda88e1 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,28 +1,20 @@
# 忽略目录
build/
-fixtures/
+tests/
+demo/
+react-materials/layouts/**/lib/
+react-materials/blocks/**/lib/
node_modules/
-dist/
-out/
-compiled/
-public/
+scripts/
# node 覆盖率文件
coverage/
-# 忽略测试文件
-/packages/*/lib/
-/packages/*/esm/
-/packages/*/es2017/
-/packages/*/es2021/
-**/tests/libs/*.js
-
-# 忽略第三方包
-/vendor/loader.js
-override/
-
# 忽略文件
**/*-min.js
**/*.min.js
-workspace/
+# templorarily ignore tools
+tools/
+
+**/templates/**
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000000..4b9a90acce
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,60 @@
+{
+ "root": true,
+ "parser": "babel-eslint",
+ "extends": "eslint-config-airbnb",
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "ecmaFeatures": {
+ "jsx": true,
+ "experimentalObjectRestSpread": true
+ }
+ },
+ "env": {
+ "browser": true,
+ "mocha": true,
+ "node": true,
+ "commonjs": true
+ },
+ "plugins": ["react", "babel"],
+ "rules": {
+ "arrow-parens": [2, "always"],
+ "no-console": 0,
+ "no-use-before-define": 0,
+ "react/forbid-prop-types": 0,
+ "jsx-a11y/label-has-for": 0,
+ "jsx-a11y/no-static-element-interactions": 0,
+ "jsx-a11y/anchor-has-content": 0,
+ "jsx-a11y/click-events-have-key-events": 0,
+ "jsx-a11y/anchor-is-valid": 0,
+ "react/no-array-index-key": 0,
+ "func-names": 0,
+ "arrow-body-style": 0,
+ "react/sort-comp": 0,
+ "react/prop-types": 0,
+ "react/jsx-first-prop-new-line": 0,
+ "react/jsx-filename-extension": [
+ 1,
+ {
+ "extensions": [".js", ".jsx"]
+ }
+ ],
+ "import/extensions": 0,
+ "import/no-unresolved": 0,
+ "import/no-extraneous-dependencies": 0,
+ "prefer-destructuring": 0,
+ "no-param-reassign": 0,
+ "no-return-assign": 0,
+ "max-len": 0,
+ "consistent-return": 0,
+ "no-redeclare": 0,
+ "react/require-extension": 0,
+ "react/no-danger": 0,
+ "comma-dangle": ["error", "always-multiline"],
+ "function-paren-newline": 0,
+ "object-curly-newline": 0,
+ "no-restricted-globals": 0,
+ "react/prefer-stateless-function": 0,
+ "react/jsx-no-bind": 0,
+ "no-plusplus": 0
+ }
+}
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index e7cf50e623..0000000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,54 +0,0 @@
-const { getESLintConfig } = require('@applint/spec');
-
-const commonRules = {
- 'react/jsx-filename-extension': 0,
- 'react/no-unknown-property': 0,
- 'no-underscore-dangle': 0,
- 'class-methods-use-this': 0,
- 'no-param-reassign': 0,
- 'no-console': 0,
- 'comma-dangle': 0,
- 'prefer-object-spread': 0,
- 'import/named': 0,
- indent: 0,
- 'react/react-in-jsx-scope': 0,
- 'jsx-a11y/html-has-lang': 0,
- 'react/static-property-placement': 0,
- 'no-multiple-empty-lines': 1,
- 'react/jsx-no-bind': 0,
- 'import/order': 1,
- 'no-multi-assign': 0,
-};
-
-module.exports = getESLintConfig('react-ts', {
- rules: {
- ...commonRules,
- '@typescript-eslint/ban-types': 0,
- '@typescript-eslint/ban-ts-comment': 0,
- '@typescript-eslint/no-explicit-any': 0,
- '@typescript-eslint/interface-name-prefix': 0,
- '@typescript-eslint/explicit-function-return-type': 0,
- '@typescript-eslint/no-var-requires': 0,
- '@typescript-eslint/explicit-module-boundary-types': 0,
- '@typescript-eslint/prefer-for-of': 0,
- 'id-length': 0,
- 'no-use-before-define': 0,
- 'no-unused-vars': 0,
- '@typescript-eslint/no-unused-vars': ['warn', {
- varsIgnorePattern: '[iI]gnored|createElement',
- }],
- '@typescript-eslint/ban-ts-ignore': 0,
- '@typescript-eslint/no-confusing-void-expression': 0,
- '@typescript-eslint/promise-function-async': 0,
- '@typescript-eslint/no-unnecessary-type-assertion': 0,
- '@typescript-eslint/non-nullable-type-assertion-style': 0,
- '@typescript-eslint/no-unnecessary-type-arguments': 0,
- '@typescript-eslint/await-thenable': 0,
- '@typescript-eslint/prefer-nullish-coalescing': 0,
- '@typescript-eslint/consistent-type-imports': 2,
- },
- parserOptions: {
- project: [],
- createDefaultProgram: false,
- },
-});
\ No newline at end of file
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index b5306e581f..f4aeec3109 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -2,68 +2,32 @@
Hi! I’m really excited that you are interested in contributing to ICE. Before submitting your contribution though, please make sure to take a moment and read through the following guidelines.
-- [Setup Environment](#setup-environment)
-- [Run Examples](#run-examples)
-- [Publish Packages](publish-packages)
-- [Pull Request Guidelines](#pull-request-guidelines)
- [Issue Reporting Guidelines](#issue-reporting-guidelines)
-- [Git Commit Specific](#git-commit-specific)
-
-## Setup Environment
-
-clone repo and initialize the setup environment:
-
-```bash
-# 1. clone and setup
-$ git clone git@github.com:alibaba/ice.git
-$ cd ice && npm run setup
-
-# 2. watch packages
-$ npm run watch
-```
-
-## Run Examples
-
-We provide a lot of examples, you can run the examples:
-
-```bash
-$ cd examples/basic-project
-$ npm start
-```
+- [Pull Request Guidelines](#pull-request-guidelines)
+- [Git Commit Specific](./GIT_COMMIT_SPECIFIC.md)
-## Publish Packages
-When you need to release, you can execute the command:
+## Issue Reporting Guidelines
-```bash
-$ npm run publish
-# 1. ✔️ ✔️ ✔️ Checking the working tree status...
-# 2. 📦 📦 📦 Building packages...
-# 3. ⚡ ⚡ ⚡ Update package version automatically...
-# 4. 🚀 🚀 🚀 Start publishing...
-# 5. 🔖 🔖 🔖 Commit & Create tag'...
-# 6. 💡 💡 💡 Start syncing...
-```
+- The issue list of this repo is **exclusively** for bug reports and feature requests. Non-conforming issues will be closed immediately.
-> DO NOT manually execute the publish command, using Github Actions provided.
+ - For simple beginner questions, you can get quick answers from
-## Rollback Packages
+ - For more complicated questions, you can use Google or StackOverflow. Make sure to provide enough information when asking your questions - this makes it easier for others to help you!
-When a serious bug occurs in the production environment, you can backtrack the package version:
+- Try to search for your issue, it may have already been answered or even fixed in the development branch.
-```bash
-# rollback packages
-$ npm run rollback
+- It is **required** that you clearly describe the steps necessary to reproduce the issue you are running into. Issues with no clear repro steps will not be triaged. If an issue labeled "need repro" receives no further input from the issue author for more than 5 days, it will be closed.
-# sync packages
-$ npm run sync
-```
+- For bugs that involves build setups, you can create a reproduction repository with steps in the README.
+- If your issue is resolved but still open, don’t hesitate to close it. In case you found a solution by yourself, it could be helpful to explain how you fixed it.
## Pull Request Guidelines
- Only code that's ready for release should be committed to the master branch. All development should be done in dedicated branches.
- Checkout a **new** topic branch from master branch, and merge back against master branch.
+- Work in the `src` folder and **DO NOT** checkin `lib` or `dist` in the commits.
- Make sure `npm test` passes.
- If adding new feature:
- Add accompanying test case.
@@ -73,15 +37,6 @@ $ npm run sync
- Provide detailed description of the bug in the PR. Live demo preferred.
- Add appropriate test coverage if applicable.
-## Issue Reporting Guidelines
-
-- The issue list of this repo is **exclusively** for bug reports and feature requests. Non-conforming issues will be closed immediately.
- - For simple beginner questions, you can get quick answers from
- - For more complicated questions, you can use Google or StackOverflow. Make sure to provide enough information when asking your questions - this makes it easier for others to help you!
-- Try to search for your issue, it may have already been answered or even fixed in the development branch.
-- It is **required** that you clearly describe the steps necessary to reproduce the issue you are running into. Issues with no clear repro steps will not be triaged. If an issue labeled "need repro" receives no further input from the issue author for more than 5 days, it will be closed.
-- For bugs that involves build setups, you can create a reproduction repository with steps in the README.
-- If your issue is resolved but still open, don’t hesitate to close it. In case you found a solution by yourself, it could be helpful to explain how you fixed it.
## Git Commit Specific
diff --git a/.github/GIT_COMMIT_SPECIFIC.md b/.github/GIT_COMMIT_SPECIFIC.md
index b5b6d10e8d..ae2b9398fe 100644
--- a/.github/GIT_COMMIT_SPECIFIC.md
+++ b/.github/GIT_COMMIT_SPECIFIC.md
@@ -3,13 +3,14 @@
**Proposed format of the commit message**
```
-:
+():
```
All lines are wrapped at 100 characters !
+
**Allowed ``**
- feat (A new feature)
@@ -23,15 +24,18 @@ All lines are wrapped at 100 characters !
- ci (Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs))
- chore (Other changes that don't modify src or test files)
- revert (Reverts a previous commit)
-- release (Relase version)
+**Allowed ``**
+Scope could be anything specifying place of the commit change.
-**Breaking changes**
+For example $location, $browser, compiler, scope, ng:href, etc...
+
+**Breaking changes**
All breaking changes have to be mentioned in message body, on separated line:
+ _Breaks removed $browser.setUrl() method (use $browser.url(http://github.com/newUrl))_
+ _Breaks ng: repeat option is no longer supported on selects (use ng:options)_
- _Breaks removed $browser.setUrl() method (use $browser.url(http://github.com/newUrl))_
- _Breaks ng: repeat option is no longer supported on selects (use ng:options)_
**Message body**
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000000..ee90e83a04
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,13 @@
+## 环境信息
+
+- 操作系统:
+- Iceworks 版本:
+
+## 问题描述
+
+
+
+## 错误信息
+
+
+
diff --git a/.github/ISSUE_TEMPLATE/Bug_Report.yml b/.github/ISSUE_TEMPLATE/Bug_Report.yml
deleted file mode 100644
index a92f1e76f5..0000000000
--- a/.github/ISSUE_TEMPLATE/Bug_Report.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-name: Bug Report
-description: Report ice.js, documents and other issues
-labels: bug
-body:
- - type: textarea
- id: description
- attributes:
- label: Describe the bug
- description: |
- If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem.
- 清晰的描述遇到的问题,并建议附上错误截图。
- validations:
- required: true
- - type: textarea
- id: expected-behavior
- attributes:
- label: Expected behavior
- description: |
- A clear and concise description of what you expect to happen.
- 描述您希望的正常表现。
- validations:
- required: true
- - type: textarea
- id: actual-behavior
- attributes:
- label: Actual behavior
- description: |
- A clear and concise description of actual behavior.
- 请清晰、简洁地描述您的实际表现。
- validations:
- required: false
- - type: input
- id: version
- attributes:
- label: Version of ice.js
- validations:
- required: true
- - type: textarea
- id: build-config
- attributes:
- label: Content of build.json or ice.config.mts
- render: TypeScript
- - type: textarea
- id: addition
- attributes:
- label: Additional context
- placeholder: Add any other context about the problem here. 添加其它关于此问题的描述。
diff --git a/.github/ISSUE_TEMPLATE/RFC_Discussion.yml b/.github/ISSUE_TEMPLATE/RFC_Discussion.yml
deleted file mode 100644
index 88d79140b7..0000000000
--- a/.github/ISSUE_TEMPLATE/RFC_Discussion.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: RFC Discussion
-description: To submit a feature request or a proposal, follow the RFC process.
-labels: rfc
-body:
- - type: textarea
- id: summary
- attributes:
- label: Summary | 概述
- placeholder: Optional, brief explanation of the feature.
- - type: textarea
- id: motivation
- attributes:
- label: Motivation | 背景
- placeholder: Why are we doing this? What use cases does it support? What is the expected outcome?
- validations:
- required: true
- - type: textarea
- id: example
- attributes:
- label: Usage example | 使用示例
- placeholder: If the proposal involves a new or changed API, include a basic code example. Omit this section if it's not applicable.
- - type: textarea
- id: design
- attributes:
- label: Detailed design | 方案设计
- placeholder: |
- This is the bulk of the RFC. Explain the design in enough detail for somebody familiar with React to understand, and for somebody familiar with the implementation to implement. This should get into specifics and corner-cases, and include examples of how the feature is used. Any new terminology should be defined here.
- validations:
- required: true
- - type: textarea
- id: addition
- attributes:
- label: Additional context | 额外信息
- placeholder: What parts of the design are still to be done? Add any other context about this feature here.
diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml
deleted file mode 100644
index 29e0a0651b..0000000000
--- a/.github/workflows/canary.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-name: Publish canary
-
-on:
- push:
- branches:
- - release/**
-
-jobs:
- check_changeset:
- name: Check Changeset exists
- outputs:
- status: ${{ steps.check.outcome }}
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout Branch
- uses: actions/checkout@v4
-
- - name: Check
- id: check
- continue-on-error: true
- run: test "$(ls -1 .changeset | wc -l)" -gt "2"
-
- canary:
- name: Publish Canary
- runs-on: ubuntu-latest
- needs: check_changeset
- if: needs.check_changeset.outputs.status == 'success'
-
- strategy:
- matrix:
- node-version: [18]
-
- steps:
- - name: Checkout Branch
- uses: actions/checkout@v4
-
- - name: Install pnpm
- uses: pnpm/action-setup@v4
-
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
- with:
- node-version: ${{ matrix.node-version }}
- cache: 'pnpm'
-
- - name: Setup
- run: pnpm run setup
-
- - name: Config npm
- run: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc
- env:
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- - run: pnpm run release:snapshot
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index cc91aa6007..0000000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-name: CI
-
-env:
- NODE_OPTIONS: --max-old-space-size=6144
-
-on: [push]
-
-jobs:
- build:
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- node-version: [16.x, 18.x]
- os: [ubuntu-latest, windows-latest]
- fail-fast: false
- steps:
- - name: Checkout Branch
- uses: actions/checkout@v3
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- registry-url: https://registry.npmjs.org/
- - name: Install pnpm
- uses: pnpm/action-setup@v4
- with:
- run_install: false
- - name: Get pnpm store directory
- id: pnpm-cache
- run: |
- echo "pnpm_cache_dir=$(pnpm store path)" >> "$GITHUB_OUTPUT"
- - uses: actions/cache@v3
- name: Setup pnpm cache
- with:
- path: |
- ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
- .cache
- key: ${{ runner.os }}-pnpm-store-node-${{ matrix.node-version }}-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-pnpm-store-node-${{ matrix.node-version }}
- - run: npm run setup
- - run: npm run dependency:check
- - run: npm run lint
- - run: npm run test
- env:
- TEST: true
- CI: true
- ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
- ACCESS_KEY_SECRET: ${{ secrets.ACCESS_KEY_SECRET }}
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
deleted file mode 100644
index 6ed68113bf..0000000000
--- a/.github/workflows/coverage.yml
+++ /dev/null
@@ -1,66 +0,0 @@
-name: Coverage
-
-env:
- NODE_OPTIONS: --max-old-space-size=6144
-
-on:
- push:
- branches:
- - master
- paths-ignore:
- - 'examples/**'
- - 'website/**'
- - '**/*.md'
- pull_request:
- types:
- - 'opened'
- - 'synchronize'
- workflow_dispatch:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
- cancel-in-progress: true
-
-jobs:
- coverage:
- permissions:
- checks: write
- pull-requests: write
- contents: read
- runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [16.x]
-
- steps:
- - uses: actions/checkout@v3
- with:
- fetch-depth: 0
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- registry-url: https://registry.npmjs.org/
- - name: Install pnpm
- uses: pnpm/action-setup@v4
- with:
- run_install: false
- - name: Get pnpm store directory
- id: pnpm-cache
- run: |
- echo "pnpm_cache_dir=$(pnpm store path)" >> "$GITHUB_OUTPUT"
- - uses: actions/cache@v3
- name: Setup pnpm cache
- with:
- path: |
- ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
- .cache
- key: ${{ runner.os }}-pnpm-store-node-${{ matrix.node-version }}-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-pnpm-store-node-${{ matrix.node-version }}
- - run: npm run setup
- - run: npm run cov
- - name: Upload coverage to Codecov
- uses: codecov/codecov-action@v3
- env:
- CI: true
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 9f2c7e8dc5..0000000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-name: Release
-
-on:
- push:
- branches:
- - master
-
-jobs:
- release:
- name: Release
- runs-on: ubuntu-latest
-
- strategy:
- matrix:
- node-version: [16]
-
- steps:
- - name: Checkout Branch
- uses: actions/checkout@v3
-
- - name: Install pnpm
- uses: pnpm/action-setup@v4
-
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- cache: 'pnpm'
-
- - name: Setup
- run: pnpm run setup
-
- - name: Setup git user
- run: pnpm run setup-git
-
- - name: Publish to npm
- id: changesets
- uses: changesets/action@v1
- with:
- version: pnpm run version
- commit: 'chore: update versions'
- title: 'chore: update versions'
- publish: pnpm release
- createGithubReleases: false
- setupGitUser: false
- env:
- GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.github/workflows/version.yml b/.github/workflows/version.yml
deleted file mode 100644
index 640402c4c3..0000000000
--- a/.github/workflows/version.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: Version
-
-on:
- push:
- branches:
- - release/next
-
-jobs:
- version:
- name: Version
- runs-on: ubuntu-latest
-
- strategy:
- matrix:
- node-version: [16]
-
- steps:
- - name: Checkout Branch
- uses: actions/checkout@v3
-
- - name: Install pnpm
- uses: pnpm/action-setup@v4
-
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- cache: 'pnpm'
-
- - name: Install Dependencies
- run: pnpm install
-
- - name: Setup git user
- run: pnpm run setup-git
-
- - name: Create Release Pull Request
- uses: changesets/action@v1
- with:
- version: pnpm run version
- commit: 'chore: update versions'
- title: 'chore: update versions'
- setupGitUser: false
- env:
- GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml
deleted file mode 100644
index 1c86fd4d55..0000000000
--- a/.github/workflows/website.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: Build Website
-on:
- push:
- paths:
- - 'website/**'
- branches:
- - master
- workflow_dispatch:
-
-# 任务
-jobs:
- build-and-deploy:
- # 服务器环境:最新版 Ubuntu
- runs-on: ubuntu-latest
- steps:
- # 拉取代码
- - uses: actions/checkout@v3
- with:
- fetch-depth: 0
-
- - name: Install pnpm
- uses: pnpm/action-setup@v4
-
- - name: Use Node.js 16.x
- uses: actions/setup-node@v3
- with:
- node-version: 16.x
- cache: 'pnpm'
-
- - run: pnpm install --filter=./website
-
- - run: cd website && pnpm build
-
- # 部署到 GitHub Pages
- - name: Deploy
- uses: JamesIves/github-pages-deploy-action@4.1.0
- if: github.ref == 'refs/heads/master'
- with:
- BRANCH: gh-pages
- FOLDER: website/build
- clean-exclude: ice.png
diff --git a/.gitignore b/.gitignore
index 16b66d940f..77c7598919 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,59 +1,16 @@
-# https://github.com/github/gitignore/blob/master/Node.gitignore
-# Dependencies
node_modules
-jspm_packages
-
-# Only keep yarn.lock in the root
-package-lock.json
-*/**/yarn.lock
-
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-lerna-debug.log*
-
-# Coverage directory used by tools like istanbul
-coverage
-*.lcov
-
-# Others
-.npm
-.eslintcache
-.idea
.DS_Store
+lerna-debug.log
+npm-debug.log
+mochawesome-report
.happypack
-.vscode
-.tmp
-.cache
-*.swp
-*.dia~
-*.temp.json
-*.swc
-
-# yalc
-.yalc
-yalc.lock
-
-# Packages
-packages/*/lib/
-packages/*/esm/
-packages/*/es2017/
-
-# temp folder .ice
-examples/*/.ice
-examples/*/.swc
-
+package-lock.json
+*/blocks/**/lib/
+*/layouts/**/lib/
+.eslintcache
+databases
build
-dist
-.history
-compiled
-
-# website
-.docusaurus
-.cache-loader
+.vscode/
+tools/ice-scripts/lib/ICE_CA
-*.local
-.fleet/
+npmrc
diff --git a/.husky/commit-msg b/.husky/commit-msg
deleted file mode 100755
index 5a8500090b..0000000000
--- a/.husky/commit-msg
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-npx --no -- commitlint --edit $1
diff --git a/.husky/pre-commit b/.husky/pre-commit
deleted file mode 100755
index 36af219892..0000000000
--- a/.husky/pre-commit
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-npx lint-staged
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index 741a833fe6..0000000000
--- a/.npmrc
+++ /dev/null
@@ -1,2 +0,0 @@
-strict-peer-dependencies=false
-registry=https://registry.npmjs.org/
diff --git a/.prettierignore b/.prettierignore
index 6804be2e85..ec6d3cdd7f 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,9 +1 @@
-node_modules
-.ice
-dist
-*.d.ts
-*.js
-fixtures
-*.md
-*.yaml
-*.less
\ No newline at end of file
+package.json
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000000..ee34d3b1a2
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "trailingComma": "es5",
+ "singleQuote": true,
+ "bracketSpacing": true,
+ "arrowParens": "always"
+}
diff --git a/.prettierrc.js b/.prettierrc.js
deleted file mode 100644
index a0a7f3a25f..0000000000
--- a/.prettierrc.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const { getPrettierConfig } = require('@applint/spec');
-module.exports = getPrettierConfig('common');
\ No newline at end of file
diff --git a/.puppeteerrc.cjs b/.puppeteerrc.cjs
deleted file mode 100644
index 3d02138cca..0000000000
--- a/.puppeteerrc.cjs
+++ /dev/null
@@ -1,9 +0,0 @@
-const { join } = require('path');
-
-/**
- * @type {import("puppeteer").Configuration}
- */
-module.exports = {
- // Changes the cache location for Puppeteer.
- cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
-};
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000..6890d3d48b
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,15 @@
+sudo: required
+language: node_js
+node_js:
+- '8'
+script:
+- npm run lint:nofix
+
+deploy:
+ provider: script
+ skip_cleanup: true # 避免清空已安装的依赖
+ script: node ./scripts/deploy.js && npm run generate && npm run sync
+ on:
+ all_branches: true # 仅在 master | pre-depoly 分支进行 deploy
+ repo: alibaba/ice
+ condition: $TRAVIS_BRANCH =~ ^master|pre-depoly$
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index bd968657b6..0000000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# 参与贡献
-
-## 环境准备
-
-1. 保证 Node.js 版本是 Node.js 14 以上。推荐安装 Node.js 16+ 版本,会大大提升本地调试速度
-2. ice.js 仓库是 `monorepo`,并使用 `pnpm workspace`。因此需要安装 [pnpm](https://pnpm.io/) 包管理工具
-3. 在项目根目录下执行 `pnpm run setup` 后会安装依赖和编译代码
-
-> 如果在安装 puppeteer 的时候过慢,可以参考此 [issue](https://github.com/puppeteer/puppeteer/issues/6833#issuecomment-863488626) 进行配置 chromium 缓存。
-
-## 目录说明
-
-```markdown
-ice-next
-├── examples # 存档各种示例代码
-├── packages # 存放 npm 包
-| ├── bundles # 依赖预编译,锁定框架三方依赖版本,框架中的依赖需要从此包导入模块
-| ├── ice # 工程代码,包括创建 service、构建任务、Webpack 和 esbuild 的打包编译逻辑等
-| ├── plugin-auth # Auth 插件
-| ├── route-manifest # 根据约定式路由生成路由配置
-| ├── runtime # 运行时代码,包括 Client/Server 入口、Document、路由组件等
-| ├── types # 公共 TS 依赖
-| └── webpack-config # 存放 Webpack 默认的配置项
-├── scripts # 执行脚本
-├── tests # 测试用例
-| ├── integration
-| └── utils
-└── website # ice.js 官方文档
-```
-
-补充说明:
-
-1. `packages` 目录下以 `plugin-xxx` 命名的都是插件包,插件的开发规范可以参考[文档]()
-2. `packages/types` 是用于存放公共的 TS 类型声明,以在其他 `package` 中进行复用
-
-## 调试
-
-### 启动 watch 命令
-
-此命令用于监听 `packages` 目录下代码变更,并增量编译代码。
-
-```bash
-pnpm watch
-```
-
-### 跑 example
-
-`examples` 目录下存放了各种用于测试的 demo,并且自动 Link 到 `packages` 目录下的代码。只需执行以下命令即可开始调试:
-
-```bash
-# 进入某个 example
-$ cd examples/basic-project
-# 调试 example
-$ pnpm start
-```
-
-`packages` 目录下的 `npm` 包在进行代码编译时会生成 `SourceMap`,结合 IDE 可以很方便进行断点调试。以 VS Code 为例:
-
-1. 选择 `JavaScript Debug Terminal` 进入 Debug 模式:
-
-
-2. 进入某个 `example` 目录并执行 `pnpm start` 开始调试
-
-3. 在某一行设置一个断点,当代码执行到此行时,将会停止执行并可查看各个变量的值
-
-
-## 测试
-
-ice.js 使用 [vitest](https://vitest.dev/) 进行单元测试和集成测试。执行以下命令可快速运行项目中的测试用例:
-
-```bash
-# 执行一次测试并生成代码覆盖率
-$ pnpm test
-# 启用 Test Watch 模式
-$ pnpm test:watch
-# 只跑部分测试用例
-$ pnpm test basic-project.test.ts
-```
-
-## 文档
-
-ice.js 的文档使用了 [docusaurus](https://docusaurus.io/) 进行搭建。执行以下命令即可开始文档的开发:
-
-```bash
-# 进入到 website 目录
-$ cd websites
-# 安装依赖
-$ yarn install
-# 本地预览
-$ yarn start
-```
-
-## 发布
-
-```bash
-# 发布 alpha 版本
-$ pnpm publish:alpha
-# 发布 beta 版本
-$ pnpm publish:beta
-```
diff --git a/README.md b/README.md
index e80eac8d2e..6002f3bd61 100644
--- a/README.md
+++ b/README.md
@@ -1,62 +1,52 @@
-# ice.js
-
-
-
-
-
-
-
-
+
+
+
+让前端开发简单而友好
-A universal framework based on React.js, [📚 Docs](https://ice.work/).
-
-## Features
+
+
+
+
+
-- 🐒 **Zero Config**: Out of the box support for ES6+, TypeScript, Less, Sass, CSS Modules,etc
-- 🐯 **Practice**: Practice about file-system routing, state Management, request, etc
-- 🦁 **Hybrid**: pre-render pages at build time (SSG) or request time (SSR) for default
-- 🐌 **Plugin system**: The plugin system provides rich features and allow the community to build reusable solutions
-- 🐂 **Multi-End**: Support both web, miniapp and Weex
+---
-## Quick start
+
+
+
-We recommend creating a new ice.js app using create-ice, which sets up everything automatically for you. To create a project, run:
+:zap: **[`海量高质量物料`](https://alibaba.github.io/ice/block)** 物料丰富:组件、区块、布局、模版,场景化分类,覆盖面广,官方与社区共同维护;专业视觉设计,`每周持续有新增`,满足日常开发之所需。
-```bash
-$ npm init ice ice-app --template @ice/lite-scaffold
-```
+:dart: **[`ICEWORKS 桌面工具`](https://alibaba.github.io/ice/iceworks)** 极速上手,全链路工程支持:多项目管理、页面路由管理、包依赖管理、零配置本地构建、代理配置、一键发布等,`效率提升 100%`;插件化的工作台,可自定义插件启用,让前端开发得心应手。
-`npm init ` is available in npm 6+
+:art: **[`ICE DESIGN 设计语言`](https://alibaba.github.io/ice/design.html)** 传统平台界面的设计语言存在着的一些不足,比如色彩单一,大量线条的使用,分割化明显。将这些不足归类一下就是界面单调、雷同性明显、缺少惊喜。我们认为新的平台类视觉风格可以打破这些束缚,尝试一些新的探索,启发传统的设计认知,因此结合当下设计趋势,构思了平台产品设计语言 ICE DESIGN。
-Start local server to launch project:
+## 开始使用
-```bash
-$ cd ice-app
-$ npm install
-$ npm run start # running on http://localhost:3000.
-```
+下载 [`ICEWORKS`](https://alibaba.github.io/ice/iceworks) 后创建或导入项目,详细步骤请浏览 [`快速上手指南`](https://alibaba.github.io/ice/docs/iceworks)。
-It's as simple as that!
+## 参与物料建设
-## Contributing
+参考[`物料贡献指南`](https://alibaba.github.io/ice/docs/materials/how-to-contribute)开发完成后 `PR` 到官方仓库。
-Please see our [CONTRIBUTING.md](/.github/CONTRIBUTING.md)
+## 浏览器兼容性
-## Contributors
+ |  |  |  |  |  | 
+:---: | :---: | :---: | :---: | :---: | :---: | :---:
+ ✔ | ✔ | ✔ | 10+ ✔ | ✔ | ✔ | ✔
-Contributors can contact us to join the Contributor Group.
+## README 徽章
-
-
-
+如果你的项目正在使用飞冰,可以将飞冰徽章 [](https://github.com/alibaba/ice) 添加到你的 README 中:
-## Community
+```
+[](https://github.com/alibaba/ice)
+```
-- [Issues](https://github.com/alibaba/ice/issues)
-- [Gitter](https://gitter.im/alibaba/ice)
+## 加入社区
-## LICENSE
+扫码加入即刻交流与反馈:
-[MIT](https://github.com/alibaba/ice/blob/master/LICENSE)
+
diff --git a/codecov.yml b/codecov.yml
deleted file mode 100644
index b20a0d54e6..0000000000
--- a/codecov.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-coverage:
- status:
- patch: off
- project:
- default:
- threshold: 5%
-
-github_checks:
- annotations: false
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000000..986a0ad728
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,33 @@
+> 在修改文档之前,请先阅读此文章
+
+### 目录结构
+
+```
+- foo.md 文档内容, 可以有文件夹嵌套
+- yoo.md
+```
+
+### 文档结构
+
+```markdown
+---
+title: 文档标题(必须有)
+order: 可选, 文档顺序, 数字越小越在前面, 否则按照字母序
+hide: 可选, 布尔值, 是否隐藏文档
+category: 可选, 字符串, 一级分类
+cover: 可选, 建议有, 封面图
+---
+
+markdown 格式的文档内容
+```
+
+### 词汇表述
+
+请注意大小写和复数形式
+
+* `ICE`: 品牌名, 中文称之为 `飞冰`
+* `Iceworks`: 配套 GUI 软件
+* `物料 - marterial`: 包含区块, 布局, 模板和组件
+* `区块 - block`: 复用的最小代码片段
+* `布局 - layout`: 为 ICE 提供整体布局方案的代码
+* `模板 - scaffold`: 整站示例, 脚手架
diff --git a/docs/about.md b/docs/about.md
new file mode 100644
index 0000000000..a18e6d4808
--- /dev/null
+++ b/docs/about.md
@@ -0,0 +1,40 @@
+---
+title: 关于飞冰
+order: 1
+cover: https://gw.alicdn.com/tfs/TB1vBRYaVOWBuNjy0FiXXXFxVXa-2558-1306.jpg
+---
+
+## 目标和愿景
+
+飞冰是一套基于 React 的中后台应用解决方案,在阿里巴巴内部,已经有 270 多个来自几乎所有 BU 的项目在使用。经过 2 年的发展,飞冰已经是中后台 2.0 体系,这个阶段中我们的目标是赋能企业、组织搭建自己的中后台体系。飞冰包含了一条从设计端到开发端的完整链路,帮助我们的用户快速搭建属于自己的中后台应用。
+
+我们希望中后台应用的开发能变得更高效。面向**设计者**端,我们提供了 ICE Design 设计语言,来给我们的 UI 界面提供专业的视觉指导。面向**开发者**端,我们提供了 Iceworks 工具,这是一个图形化界面的开发平台,它承载了飞冰的物料体系和开发体验,获取更多信息您可以立即[点击这里](#/iceworks)下载体验。同时,我们还提供了独有的**服务体系**,在物料与工具这一基础之上进行服务的配套。我们将构建一个面向开发者的服务体系。针对每一个使用飞冰的企业或个人,我们会安排专人客服进行一对一的对接,一旦有问题可以随时找到我们,第一时间帮助解决问题。
+
+## 初心
+
+在整个阿里体系内,面向卖家、运营小二以及达人有数不尽的后台,并且这些后台一直在持续不断的增长着,但是随着时间的推移,这些项目或多或少的存在着以下这些问题:
+
+* 每个后台相互独立,同类功能也需要重复开发,前期开发成本较高
+* 技术方案差异大,人员变动后维护成本非常高
+* 视觉质量参差不齐,使用效率大打折扣
+* ...
+
+飞冰就是为了解决这些问题而诞生。飞冰由淘宝前端团队发起,与淘宝 UED 及后端开发同学共同打造,旨在「提高中后台系统的开发效率」。
+
+## 物料体系
+
+在飞冰中,组件、区块、布局、模板等统称为物料,由飞冰团队维护,在内部有一套完整的开发规范和工具,目前也正在逐步对外开放中;基于此,你可以参与共建飞冰,也可以自建私有的物料体系。
+
+* 组件:最基础的物料,目前飞冰的基础组件达到 55+,具有高度可复用性。
+
+* 区块:通过对大量的中后台系统常用的场景进行分类、对比和抽象,基于基础组件组合而成,目前飞冰的区块达到 110+,可以通过 iceworks 进行快速组合搭建应用,减少重复的开发,提升效率。
+
+* 布局:在中后台系统中布局通常较为统一,以 `顶部-侧边布局-通栏` 模式为主,为此我们提供了 4+ 常见的布局,支持 `light` 和 `dark` 两套主题。
+
+* 模板:基于已有的区块搭建而成,目前提供了 4+ 的特定领域的模板,可以从零开始搭建应用,也可以选择特定类型的模板开始使用。
+
+## 联系我们
+
+* 邮件:
+* 反馈/建议:
+* 答疑钉钉群:
diff --git a/docs/advanced/custom-theme.md b/docs/advanced/custom-theme.md
new file mode 100644
index 0000000000..61302ed3a5
--- /dev/null
+++ b/docs/advanced/custom-theme.md
@@ -0,0 +1,39 @@
+---
+title: 修改主题配色
+order: 3
+category: 进阶指南
+---
+
+## 为什么要修改
+
+ICE Design 为 ICE 体系内的组件和物料提供了指导性规范,但是我们也支持在一定程度内对样式风格进行个性化定制。
+
+## 开放的定制能力
+
+* 皮肤风格 (theme)
+ * 由 `Layout` 提供能力支持,当前可传入 `dark` 或者 `light`
+* 主品牌色 (primaryColor)
+ * 支持 CSS 提供的颜色格式规范
+ * Hex: 如 `#ff0000`, `#f00`
+ * RGB: 如 `rgb(255, 0, 0)`
+ * 颜色常量: 如 `red`, `yellow`
+* 副品牌色 (secondaryColor)
+ * 同上
+
+我们也在考虑开放更多可供定制的变量,如果以上变量不能满足你的需求,可以给我们提 issue 进行讨论。
+
+## 如何修改
+
+请先确保您的 `ice-scripts` 已经升级到 `1.0.8` 及以上版本。
+
+修改项目目录下的 `package.json` 文件如下所示:
+
+```json
+{
+ "themeConfig": {
+ "theme": "dark",
+ "primaryColor": "red",
+ "secondaryColor": "grey"
+ }
+}
+```
diff --git a/docs/advanced/how-to-make-form.md b/docs/advanced/how-to-make-form.md
new file mode 100644
index 0000000000..6033aa73a2
--- /dev/null
+++ b/docs/advanced/how-to-make-form.md
@@ -0,0 +1,223 @@
+---
+title: 如何制作表单
+order: 4
+category: 进阶指南
+---
+
+在中后台前端应用中,表单是一个非常常见的需求,用于填写一些信息、校验、编辑、提交等。本文档专门介绍如何使用 ICE 快速实现常见的后台表单类需求。
+
+为了简化使用,提高开发效率,我们推荐使用 ICE 表单粘合剂组件 `@icedesign/form-binder` 配合 ICE 提供的一系列表单类组件(如 Input, Select 等) 的组合来进行开发。
+
+在这里我们准备了非常常见的业务场景作为演示,**模态框 + 表格 + 表单** 组合的业务场景。
+
+
+
+在各个表单组件包裹 `FormBinder` 组件,并声明对应的 `name` `FormBinder` 会自动与这些组件的数据进行关联,之后我们就要利用 `FormBinder` 自带的功能进行获取、校验、回填处理。
+
+## 回填数据
+
+在使用 `FormBinder` 组件后,我们不需要为单独的表单组件(如 Input,Radio 等)进行 value 值的回填。我们可以在 `FormBinderWrapper` 上用 `value` 统一进行回填,使用对象的形式,其中键值会自动与 `FormBinder` 上的 `name` 进行关联,就像 HTML5 标准表单一样:
+
+```jsx
+import {
+ FormBinderWrapper,
+ FormBinder,
+ FormError,
+} from '@icedesign/form-binder';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+
+
+
+
+```
+
+由于 Form 此时是一个受控组件,清空数据等操作可以对 `value` 赋空值进行:
+
+```jsx
+class Demo extends Component {
+ state = {
+ formValue: {
+ id: '1'
+ name: '卓凌',
+ age: 20,
+ sex: 'male'
+ }
+ };
+
+ clearForm = () => {
+ this.setState({
+ formValue: {}
+ });
+ };
+
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+
+
+ 清空表单值
+
+
+ );
+ }
+}
+```
+
+## 主动触发校验
+
+如果想要主动校验全部表单,则需要在 FormBinderWrapper 组件上面添加 ref,在合适的地方调用实现,全部校验发现报错表单会自动跳转到对应表单。
+
+```jsx
+import {
+ FormBinderWrapper,
+ FormBinder,
+ FormError,
+} from '@icedesign/form-binder';
+
+validateForm = () => {
+ this.form.validateAll((errors, values) => {
+ console.log('errors', errors, 'values', values);
+ });
+};
+
+ { this.form = ref; }}
+ value={value}
+ onChange={this.formChange}
+>
+ ...
+
+校验
+```
+
+### 校验规则的类型陷阱
+
+在前端开发中,有一些类型陷阱是需要开发者特别注意的。用户输入的 `Input` 等,它的类型默认都是字符串 `String`,当然你可以回填一个 `Number` 类型的数据给 `Input`,但是在取值的时候它会被转换成字符串。
+
+```jsx
+
+
+
+```
+
+## 总结
+
+至此,已经讲解完了如何使用 `FormBinder` 组件并进行相关操作,以及可能遇到的问题。简单的回顾:
+
+1. 首先使用 `FormBinderWrapper` 包裹所有表单项。
+2. 在 `FormBinder` 组件上使用 `name` 进行数据关联,配置校验规则。
+3. 使用 `FormBinderWrapper` 的 `value` 属性进行数据回填。
+4. 使用 ref 上的 `valildateAll` 方法校验当前表单数据并进行后续操作。
+
+## FAQ
+
+### Q:表单作为一个子组件的时候,我怎么把需要回填的值传递下去并回填?
+
+React 组件有一个生命周期 componentWillReceiveProps 是在当前组件 props 变动的时候触发,此时可以在这个生命周期方法中传递 value:
+
+```jsx
+class Demo extends React.Component {
+
+ ...
+
+ state = {
+ formValue: {}
+ };
+
+ componentWillReceiveProps(nextProps) {
+ // nextProps 是上层传下来需要回填的数据
+ if(nextProps.name) {
+ const { formValue } = this.state;
+ this.setState({
+ formValue: {
+ ...formValue,
+ name
+ }
+ });
+ }
+ }
+
+ render() {
+ return (
+ ...
+ );
+
+ }
+}
+```
+
+### Q:如何在表单组件 onChange 的时候做一些额外的事情?
+
+直接使用表单组件的 `onChange` 或者 FormBinderWrapper 的 `onChange` 即可,没有任何魔法。
+
+```jsx
+handleInputChange = (input) => {
+ console.log('Input 的值现在是', input);
+};
+// ...
+ ;
+```
+
+```jsx
+handleFormChange = (value, changedByName) => {
+ const changedValue = value[changedByName];
+ console.log('由于' + changedByName + '变成了' + changedValue);
+ console.log('表单的值现在是', value);
+};
+// ...
+
+
+
+
+
+
+ ;
+```
diff --git a/docs/advanced/webpackrc.md b/docs/advanced/webpackrc.md
new file mode 100644
index 0000000000..525cd03a9d
--- /dev/null
+++ b/docs/advanced/webpackrc.md
@@ -0,0 +1,102 @@
+---
+title: 定制构建器
+order: 3
+category: 进阶指南
+---
+
+ICE 的[工程](https://github.com/alibaba/ice/tree/master/tools/ice-scripts)使用了 `webpack` 作为构建的基石,并且提供了零配置的构建配置,但是如果你对 `webpack` 配置有特别的需求,可以参考本文对默认配置进行定制。
+
+## 要求
+
+* devDependencies 里的 ice-scripts 依赖版本号为 1.1.0 及以上
+
+## 如何配置
+
+ICE 项目支持在项目根目录创建 `.webpackrc.js` 文件对 `webpack` 项目进行定制和覆盖,`.webpackrc.js` 文件需要导出一个 `webpackConfig` 对象,其支持的参数可以参考 `webpack` [官方文档](https://webpack.js.org/concepts/output/)。
+
+`.webpackrc.js` 文件采用您操作系统中安装的 Node.js 所支持的语法,所以您可以使用除了 `import`, `export` 等之外的几乎所有 ES6 语法。
+
+```js
+module.exports = {
+ // webpack config
+};
+```
+
+## 配置举例
+
+* 修改编译输出的路径为 `dist/`
+
+```js
+const { resolve } = require('path');
+
+module.exports = {
+ output: {
+ path: resolve('dist'),
+ },
+};
+```
+
+* 添加反向代理服务
+
+```js
+const proxyTarget = 'http://127.0.0.1:7001/';
+
+module.exports = {
+ devServer: {
+ proxy: {
+ '/**': {
+ target: proxyTarget,
+ changeOrigin: true,
+ bypass: function(req, res, proxyOpt) {
+ // 添加 HTTP Header 标识 proxy 开启
+ res.set('X-ICE-PROXY', 'on');
+ res.set('X-ICE-PROXY-BY', proxyTarget);
+ },
+ },
+ },
+ },
+};
+```
+
+* `webpack` 支持配置多入口实现在一个工程中同时构建多个单页面应用,以下为多 `entry` 的 `.webpackrc.js` 配置示例
+
+```js
+const { resolve } = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+
+module.exports = {
+ entry: {
+ index: ['src/index.js'],
+ app: ['src/index.js'],
+ },
+ output: {
+ path: resolve('dist'),
+ filename: '[name].[hash].js',
+ },
+ plugins: [
+ new HtmlWebpackPlugin({
+ title: 'index',
+ chunks: ['index'],
+ template: resolve('./public/index.html'),
+ filename: 'index.html',
+ }),
+ new HtmlWebpackPlugin({
+ title: 'app',
+ chunks: ['app'],
+ template: resolve('./public/index.html'),
+ filename: 'app.html',
+ }),
+ ],
+ devServer: {
+ before(app) {
+ app.use(function(req, res, next) {
+ // 重定向 html 的请求到 /build/ dev 服务上
+ if (req.url === '/' || req.path.endsWith('.html')) {
+ req.url = '/build' + req.url;
+ }
+ next();
+ });
+ },
+ },
+};
+```
diff --git a/docs/advanced/work-with-create-react-app.md b/docs/advanced/work-with-create-react-app.md
new file mode 100644
index 0000000000..49894a25d9
--- /dev/null
+++ b/docs/advanced/work-with-create-react-app.md
@@ -0,0 +1,292 @@
+---
+title: 在 create-react-app 中使用
+order: 1
+category: 进阶指南
+---
+
+[create-react-app](https://github.com/facebook/create-react-app) 是社区广泛使用的 React 开发工具,本文讲述如何在使用 create-react-app 创建的项目中使用飞冰,以及如何通过 Iceworks 生成 create-react-app 项目。
+
+# 如何在使用 create-react-app 创建的项目中使用
+
+## 初始化项目
+
+使用 `npx` 命令执行 `create-react-app` 创建一个项目
+
+```bash
+npx create-react-app my-app
+cd my-app
+npm start
+```
+
+> npx 命令在 npm 5.2+ 自带,如果没有 npx 您可能需要按照官方文档操作
+
+此时浏览器会打开本地调试地址 http://localhost:3000/ 。
+
+## 引入组件
+
+根据组件文档,安装对应的组件。
+
+```bash
+npm install @icedesign/base @icedesign/img --save
+```
+
+修改 `src/App.js`,引入 `Button` 和 `Img` 组件。
+
+```jsx
+import React, { Component } from 'react';
+import Button from '@icedesign/base/lib/button';
+import Img from '@icedesign/img';
+import './App.css';
+
+const image =
+ 'https://img.alicdn.com/tfs/TB1saOBbYGYBuNjy0FoXXciBFXa-218-58.png';
+
+class App extends Component {
+ render() {
+ return (
+
+
Button
+
+
+ );
+ }
+}
+
+export default App;
+```
+
+修改 `src/App.css`,在文件顶部引入组件的样式。
+
+```css
+@import 'http://github.com/~@icedesign/base/dist/ICEDesignBase.css';
+@import 'http://github.com/~@icedesign/img/dist/Img.css';
+
+.App {
+ text-align: center;
+}
+
+...
+```
+
+现在你应该能看到页面上已经有了蓝色的 `Button` 组件,接下来就可以继续选用其他组件开发应用了。
+
+其他开发流程你可以参考 `create-react-app` 的官方文档。
+
+这种方式引入的基础组件样式为全量引入,如果需要按需引入请看下面。
+
+## 自定义按需引入
+
+上面的方法虽然能够正常运行组件,但是可以发现样式是全量引入的,`Button` 的引入需要额外增加 `lib/button` 的二级路径。
+
+要解决这些问题,我们需要对 `create-react-app` 进行一些工程定制。我们建议使用社区流行的 [react-app-rewired](https://github.com/timarney/react-app-rewired) 进行自定义配置。
+
+首先安装 `react-app-rewired`
+
+```bash
+npm i react-app-rewired --save-dev
+```
+
+修改 `package.json` 文件的 `scripts` 字段
+
+```json
+{
+ "scripts": {
+ "start": "react-app-rewired start",
+ "build": "react-app-rewired build",
+ "test": "react-app-rewired test --env=jsdom"
+ }
+}
+```
+
+在您的项目根目录创建 `config-overrides.js` 文件来修改默认配置。
+
+### 使用 babel-plugin-import 实现按需加载
+
+[babel-plugin-import](https://github.com/ant-design/babel-plugin-import) 是一个用于按需加载组件代码和样式的 babel 插件,现在我们尝试安装它并修改 `config-overrides.js` 文件。
+
+```bash
+npm i babel-plugin-import --save-dev
+```
+
+```diff
++ const { injectBabelPlugin } = require('react-app-rewired');
+
+ module.exports = function override(config, env) {
++ config = injectBabelPlugin(['import', {
++ libraryName: '@icedesign/base'
++ }], config);
+ return config;
+ };
+```
+
+### 使用 webpack-plugin-import 实现样式自动引入
+
+`webpack-plugin-import` 是用于自动加载样式的 webpack 插件,它的原理是对引入模块路径下存在 `style.js` 的样式进行自动加载,这意味着您可能需要同时配置 `less` 或 `sass` 等预处理器的 `loader`。
+
+修改 `config-overrides.js` 的内容
+
+```js
+// ...
+const WebpackPluginImport = require('webpack-plugin-import');
+
+module.exports = function override(config, env) {
+ // ...
+ config.plugins.push(
+ new WebpackPluginImport([
+ {
+ libraryName: /^@icedesign\/base\/lib\/([^/]+)/,
+ stylePath: 'style.js',
+ },
+ {
+ libraryName: /@icedesign\/.*/,
+ stylePath: 'style.js',
+ },
+ ])
+ );
+ // ...
+ return config;
+};
+```
+
+### 配置 sass-loader 和 ice-skin-loader
+
+`ICE` 官方提供的组件依赖了 Sass 作为 CSS 预处理器,所以您需要手动配置并引入 `sass-loader`。同时 `ICE` 使用了 `ice-skin-loader` 支持自定义皮肤的定制。首先安装以下依赖。
+
+```bash
+npm i @icedesign/skin --save
+npm i sass-loader node-sass ice-skin-loader --save-dev
+```
+
+在根目录创建 `rewire-scss.js` 文件,添加以下内容。
+
+```js
+const getRules = (config) =>
+ config.module.rules.find((rule) => Object.keys(rule).includes('oneOf')).oneOf;
+const findFileLoaderRuleFn = (rule) =>
+ typeof rule.loader === 'string' && rule.loader.includes('file-loader');
+const findStyleLoaderRuleFn = (rule) =>
+ rule.test.toString() === /\.css$/.toString();
+
+function rewireSass(config, env, sassOptions = {}) {
+ // find the non-javascript ruleset in the webpack config
+ const rules = getRules(config);
+
+ // find the file-loader and add a rule excluding sass files from being loaded as text
+ config.module.rules[1].oneOf
+ .find(findFileLoaderRuleFn)
+ .exclude.push(/\.scss$/);
+
+ // find the current rule for loading css files
+ const styleLoaderRule = rules.find(findStyleLoaderRuleFn);
+
+ // allows the test to be pre-defined by react-scripts as an array or a single regex
+ const currentTests = Array.isArray(styleLoaderRule.test)
+ ? [...styleLoaderRule.test]
+ : [styleLoaderRule.test];
+
+ // add regexes for scss files
+ styleLoaderRule.test = [...currentTests, /\.scss$/, /\.sass$/];
+
+ styleLoaderRule.use.push({
+ loader: require.resolve('sass-loader'),
+ options: sassOptions,
+ });
+ styleLoaderRule.use.push({
+ loader: require.resolve('ice-skin-loader'),
+ options: {
+ themeFile: require.resolve('@icedesign/skin'),
+ },
+ });
+
+ return config;
+}
+
+module.exports = rewireSass;
+```
+
+修改 `config-overrides.js` 的内容
+
+```js
+// ...
+const rewireSass = require('./rewire-scss');
+
+module.exports = function override(config, env) {
+ // ...
+ config = rewireSass(config);
+ // ...
+ return config;
+};
+```
+
+### 如何使用
+
+在项目的任意 `js` 文件中,您都可以使用类似如下的方法直接按需引入某一组件,不用担心全量引入和样式缺失的问题。
+
+```jsx
+import { Button } from '@icedesign/base';
+import Img from '@icedesign/img';
+
+ICE ;
+```
+
+# 如何通过 Iceworks 生成 create-react-app 项目
+
+如果你觉得使用 create-react-app 自定义太麻烦,我们也提供了基于 Iceworks 模板创建项目的流程生成 create-react-app 项目,使用 react-app-rewired 进行自定义配置,支持按需引入飞冰基础组件,添加区块。
+
+## 初始化项目
+
+在 Iceworks 模板界面选择 create-react-app 模板,以该模板创建项目
+
+
+
+## 预览
+
+创建项目后,可以在 Iceworks 项目界面启动调试服务, 会自动打开浏览器窗口,看到如下页面说明创建项目成功
+
+
+
+## 添加区块
+
+使用 Iceworks create-react-app 模板创建的项目与官方 create-react-app 模板基本保持一致,不同的点在于使用了 react-app-rewired 进行自定义配置,支持按需引入 ICE 基础组件,目录结构如下:
+
+### 目录结构
+
+```
+.
+├── README.md
+├── .gitignore
+├── config-overrides.js
+├── package.json
+├── public
+│ ├── favicon.ico
+│ ├── index.html
+│ └── manifest.json
+├── rewire-scss.js
+└── src
+ ├── App.css
+ ├── App.js
+ ├── App.test.js
+ ├── index.css
+ ├── index.js
+ ├── logo.svg
+ └── registerServiceWorker.js
+```
+
+### 添加区块
+
+通过 Iceworks 新建页面添加的区块默认会在项目 `src` 下新建 `pages` 目录,用于存放添加的区块,如添加一个 TabTable 区块后,目录结构如下:
+
+```
+.
+└── src
+ ├── pages/ // 新增 pages 目录
+ ├── App.css
+ ├── App.js
+ ├── App.test.js
+ ├── index.css
+ ├── index.js
+ ├── logo.svg
+ └── registerServiceWorker.js
+```
+
+使用 create-react-app 模板创建的项目默认只支持添加区块;接下来,可以按照你熟悉的开发方式自定义开发。
diff --git a/docs/basis/api-communicate.md b/docs/basis/api-communicate.md
new file mode 100644
index 0000000000..89d1a91954
--- /dev/null
+++ b/docs/basis/api-communicate.md
@@ -0,0 +1,125 @@
+---
+title: 如何实现前后端通信
+order: 9
+category: 入门指引
+---
+
+实现前后端通信,我们推荐使用 axios 或 DataBinder 与后端 HTTP API 接口通信的方案。
+
+传输数据格式描述使用 JSON。
+
+## 使用 axios 进行请求
+
+我们推荐使用 `axios` 方法库提供基础的 Ajax 能力,也可以使用 DataBinder 为组件(比如 Table)绑定 AJAX 接口数据,方便查询异步数据以及错误处理。
+
+首先安装模块:
+
+```bash
+npm install axios --save
+```
+
+引入对应组件,并使用 `axios` 函数获取数据:
+
+```jsx
+import axios from 'axios';
+
+export default class extends Component {
+ componentDidMount() {
+ // 使用 axios 获取数据
+ axios(remoteURL).then((response) => {
+ const { body } = response;
+ this.setState({
+ data: body,
+ });
+ });
+ }
+
+ render() {
+ // ...
+ }
+}
+```
+
+> 更多请参考 [axios 的文档](https://github.com/axios/axios)
+
+## 使用 DataBinder 为组件绑定数据
+
+DataBinder 是 ICE 推出的基于约定,在组件上绑定数据和自动更新数据的组件,让你专注于 UI 显示逻辑,从而屏蔽数据状态管理的开发成本。
+
+**使用方法**
+
+```jsx
+@DataBinder({
+ '模块名 key': {
+ url: 'xxxx.json',
+ method: 'post',
+ // 请求附带的 request 参数,method post 下是 data 参数,method get 下是 params
+ data: {
+ page: 1,
+ },
+ // AJAX 部分的参数完全继承自 axios ,参数请详见:https://github.com/axios/axios
+ // 下面是请求会返回的默认数据
+ defaultBindingData: {
+ // ...字段需要与 xxxx.json 接口返回的字段一一对应
+ },
+ },
+})
+class ListView extends Component {
+ // ...
+ render() {
+ const { account } = this.props.bindingData;
+
+ return (
+
+
用户名:{account.userName}
+
年龄:{account.userAge}
+
+ );
+ }
+}
+```
+
+> 更多请参考 [DataBinder 的文档](#/component/databinder)
+
+## 最佳实践
+
+对于一些嵌套较深的对象数据,如果后端返回为空,就可能导致渲染异常,所以需要进行先行判断:
+
+**注意:以下是错误的用法**
+
+```js
+this.setState({
+ foo: data.list.foo,
+});
+```
+
+**最佳实践**
+
+```js
+if (data && data.list && data.list.foo) {
+ this.setState({
+ foo: data.list.foo,
+ });
+} else {
+ // foo 未取到
+}
+```
+
+## 同源限制导致的跨域问题
+
+浏览器安全的基石是"同源政策",所谓"同源"指的是"三个相同"。
+
+* 协议相同
+* 域名相同
+* 端口相同
+
+举例来说,`http://www.example.com/dir/page.html`这个网址,协议是`http://`,域名是`www.example.com`,端口是`80`(默认端口可以省略)。它的同源情况如下。
+
+* `http://www.example.com/dir2/other.html`:同源
+* `http://example.com/dir/other.html`:不同源(域名不同)
+* `http://v2.www.example.com/dir/other.html`:不同源(域名不同)
+* `http://www.example.com:81/dir/other.html`:不同源(端口不同)
+
+同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
+
+跨域指的是前端页面请求一个非同源的 API 地址,这种请求一般来说会被浏览器阻挡。
diff --git a/docs/basis/env-config.md b/docs/basis/env-config.md
new file mode 100644
index 0000000000..d879e49df6
--- /dev/null
+++ b/docs/basis/env-config.md
@@ -0,0 +1,39 @@
+---
+title: 开发环境配置
+order: 1
+category: 入门指引
+---
+
+飞冰的开发环境依赖于 Node.js,如您已经安装了 Node.js 且版本号符合 \*LTS 版本,则可以忽略此文档。
+
+### 安装 Node.js 环境
+
+#### macOS 用户
+
+我们建议您使用 \*nvm 来管理 Node.js 的安装。
+
+打开终端,执行如下命令
+
+```bash
+curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
+```
+
+完成后重启终端,执行 `nvm install --lts` 来安装最新 LTS 版本的 Node.js
+
+#### Windows 用户
+
+访问 Node.js 的官网 ,下载对应平台且标记为 LTS 版本的安装包,并执行安装,安装成功后在终端执行:
+
+### 验证安装的 Node.js 版本
+
+在终端中执行如下命令 (Windows 下可以是 Git Bash 或其它终端模拟器)
+
+```bash
+node -v
+npm -v
+```
+
+终端打印出 Node.js 和 npm 的版本,则表示安装成功。
+
+> * LTS: 指的是 Node.js 的长期维护版本,您可以在这里 https://github.com/nodejs/Release#release-schedule 看到 Node.js 各版本的官方持续维护期限
+> * nvm: 请参考 https://github.com/creationix/nvm
diff --git a/docs/basis/find-components.md b/docs/basis/find-components.md
new file mode 100644
index 0000000000..705993c45f
--- /dev/null
+++ b/docs/basis/find-components.md
@@ -0,0 +1,23 @@
+---
+title: 如何查找社区组件
+order: 11
+category: 入门指引
+---
+
+飞冰组件体系基于 NPM 包管理,因此除了我们提供的高质量组件之外,你还可以自行检索使用 NPM 社区里超过 37w+ 的组件,下面介绍下通常我们是怎么查找这些组件拿来用的。
+
+#### 1. 使用英语在 google 或者 github 站点上检索
+
+优质的组件往往会采用英语(为了服务全世界,很多中国人开发的也是用英语介绍),所以针对你的需求使用英文关键词会极大的提升检索效率和结果质量。
+
+比如我们希望找到管理 react state 更好的方案或者库,可以试着搜索 "react state management github" 或者 "react state management npm" 可以找到几个选项,其中可以看到 [mobx](https://github.com/mobxjs/mobx) 在 github 上面有非常多的 star,证明这个包比较可靠、使用者比较多,可以优先选择使用。
+
+#### 2. 查找文档找到安装方法和使用方法
+
+目前前端相关的项目,基本都会提供 NPM 的安装方式,基于 NPM 进行包管理。查找文档你可能会看到类似这样的安装说明:
+
+
+
+通常来说,组件的安装方式是执行命令 `npm install [package name] --save`。
+
+之后需要参照相关文档进行使用,如果你觉得符合你的需求挺好用,欢迎推荐给我们补充到站点上面。如有问题也可以随时咨询。
diff --git a/docs/basis/git-assets-work.md b/docs/basis/git-assets-work.md
new file mode 100644
index 0000000000..8b3b996ac9
--- /dev/null
+++ b/docs/basis/git-assets-work.md
@@ -0,0 +1,75 @@
+---
+title: Git 仓库开发实践
+order: 3
+category: 入门指引
+---
+
+使用 Iceworks 创建项目后,会自动生成项目的脚手架文件,下面就对这些文件的仓库管理进行说明。
+
+## 目录结构
+
+以 `ICE Design Pro` 模板为例:
+
+```
+ice-design-pro
+├── dist // 打包资源
+├── mock // 模拟数据
+├── public // 静态资源
+├── src
+│ ├── components // 公共组件
+│ ├── layouts // 通用布局
+│ ├── pages // 页面
+│ ├── index.js // 应用入口
+│ ├── menuConfig // 导航配置
+│ ├── routerConfig // 路由配置
+│ └── router.jsx // 路由入口
+├── tests // 测试
+├── .gitignore // git 忽略目录配置
+├── .editorconfig // 代码风格配置
+├── .eslintignore // eslint 忽略目录配置
+├── .eslintrc // eslint 配置
+├── package.json // package.json
+└── README.md // 项目说明
+```
+
+## 使用命令行操作
+
+这里介绍使用命令行操作 git 仓库的基本命令,如果您使用 GUI 工具 (如 SourceTree) 进行管理,请遵循该工具的帮助文档。
+
+### 初始化 Git 仓库
+
+在初始化的项目根目录下执行以下命令,并将初始化的文件推送到 git 仓库:
+
+```bash
+$ git init
+$ git add .
+$ git commit # 输入提交信息并保存
+```
+
+### 2. 提交项目到远程 Git 仓库
+
+您需要使用 github 或者 gitlab 创建一个远程仓库,由于 Git 是一种分布式仓库管理工具,如果您打算只在本地使用这些代码, 那么可以忽略这一步。
+
+```bash
+$ git remote add origin git://your-repo-url
+$ git push origin master -u
+```
+
+## 分支管理
+
+Git 仓库创建好后,此时只有一个 master 主干,不允许向 master 提交代码,后续开发都应该创建分支在分支上开发。
+
+### 创建新分支
+
+创建一个名为 feature/0.1.0 的分支。并将分支提交到 gitlab 仓库上。
+
+```bash
+$ git checkout -b feature/0.1.0 # 创建分支
+$ git push origin feature/0.1.0 # 提交分支
+```
+
+这样就创建好一个名为 daily/0.1.0 的分支了。 分支名是可以任意定义的,比如你可以创建自己的功能命名的分支, 如 `git checkout -b feature/add-login` 表示一个登录功能的分支。
+
+### 提交变更代码
+
+在编写代码完成后,或者某个功能完成时,可以将变更的代码提交到远端分支,准备部署发布。
diff --git a/docs/basis/intro-javascript.md b/docs/basis/intro-javascript.md
new file mode 100644
index 0000000000..f972506a74
--- /dev/null
+++ b/docs/basis/intro-javascript.md
@@ -0,0 +1,406 @@
+---
+title: JavaScript 基础知识
+order: 4
+category: 入门指引
+---
+
+写前端必须要掌握一定基础的 JavaScript 语言知识,本文档将介绍绝大部分常用的 JavaScript 语言基础知识,同样概念添加 Java 语言对比,帮你快速学习理解。
+
+## JavaScript 语言概述和开发环境、运行环境配置
+
+JavaScript 是一门脚本语言,用在网页上增强页面功能,是一门动态语言因此不需要进行编译、部署。
+
+JavaScript 是弱类型的语言,语法比较简单,掌握基本语法之后怎么写都可以,比 Java 灵活的多,同时不需要依赖 IDE,任何文本编辑器都可以进行开发。当然如果你用 IDEA 等 IDE 更是锦上添花。
+
+JavaScript 比较常见的运行环境就是 Web 浏览器,比如 Chrome 直接打开 console 输入 JavaScript 代码即可运行实时看到结果:
+
+
+
+> 提示:在 Chrome 中,右击网页选择『检查』即可打开开发者工具,可以切换到 console 面板。详情可以看[如何使用控制台](https://leeon.gitbooks.io/devtools/content/learn_basic/using_console.html)。
+> 提示:控制台比较常用的有 console.log 方法,它可以打印一些内容、变量值等到你的控制台辅助开发,等同 Java 中的 System.out.println 方法。
+
+## JavaScript 语法基础
+
+### 变量定义
+
+* let 定义普通变量(推荐),详情:http://es6.ruanyifeng.com/#docs/let#let命令。
+* const 定义常量,后面只能读不能写,详情:http://es6.ruanyifeng.com/#docs/let#const命令。
+* var 定义普通变量,不建议使用。
+
+var 由于缺失某些特性,不建议使用,关于 let 和 var 的对比,详情见:https://www.zhihu.com/question/47456978 。
+
+由于 JavaScript 是弱类型语言,因此你不需要声明变量的数据类型。
+
+JavaScript:
+
+```js
+let x = 20;
+```
+
+Java:
+
+```java
+float x = 20.0;
+double x = 20.0;
+int x = 20;
+```
+
+具体支持的数据类型参照下面文档。
+
+### 数据类型
+
+数据类型基础知识详见:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures ,这里针对常用的几种进行重点讲解。
+
+基础类型包括:Undefined、Null、Boolean、Number、String,引用类型包括:Object、Array、Function。当一个变量值为引用类型的时候,直接赋值其他变量传递的是引用。同样的,引用的数据在某个地方改变了值会影响所有调用这个变量的地方。这跟 Java 里面引用概念一样。
+
+#### undefined 和 null
+
+声明一个变量没有赋值,直接访问当前变量可以得到 `undefined`。不同于 Java 针对不同数据类型有不同的初始值:
+
+JavaScript:
+
+```js
+let x;
+console.log(x); // -> undefined
+```
+
+Java:
+
+```java
+int x;
+System.out.println(x); // -> 0
+```
+
+访问一个对象上不存在的 key 也会取到 undefined。
+
+```js
+let a = {};
+console.log(a.b); // -> undefined
+```
+
+null 表示空值。它不同于 undefined,它是有值的只不过是一个空值,而 undefined 是未定义的临时兜底的缺省值。undefined 和 null 具体的区别请参见:http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html 。
+
+#### number、boolean、string
+
+基本的数据类型:
+
+```js
+console.log(typeof 10); // -> number
+console.log(typeof '10'); // -> string
+console.log(typeof true); // -> boolean
+console.log(typeof "true"); // -> string
+```
+
+JavaScript 中带引号的均为字符串,可以是单引号也可以是双引号。不同于 Java 字符串只能使用双引号表示。JavaScript 没有 int、float 和 double 之分。
+
+#### array
+
+数组类型,栈结构,有序数组。每个 item 可以是任意类型的值,数据类型类似 Java 的 ArrayList ,比如:
+
+```js
+// 字符串数组
+['string', 'aaa']
+
+// 对象和字符串混合数组
+[{
+ aa: 'aaa',
+ bb: 'bbb',
+}, 'string']
+
+// 函数数组
+[() => {
+ return '这是一个函数'
+}, () => {
+ return '这是一个函数'
+}]
+```
+
+如果需要取得特定需要的值,直接获取(比如获取第一个数据):
+
+JavaScript:
+
+```js
+array[0];
+```
+
+Java:
+
+```java
+list.get(0);
+```
+
+数组是有序的,遍历数组需要使用流程控制语句 for 等。为了方便,array 内置了一些数组常用操作方法可以简化常用操作,详情可见:。
+
+比较常用 [forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) 和 [map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) 方法,可以重点关注下用法。
+
+简易循环举例:
+
+JavaScript:
+```js
+let list = [];
+list.push('aa');
+list.push('bb');
+
+for(let i=0; i {
+ console.log(val, i);
+});
+```
+
+Java:
+
+```java
+List list = new ArrayList();
+list.add('aa');
+list.add('bb');
+
+for(int i=0; i {
+ System.out.println(val);
+});
+```
+
+相比 Java 的 add 操作,JavaScript array 的出栈入栈删除的方法名略有不同,常见的 push 入栈、pop 出栈,具体的参照 http://javascript.ruanyifeng.com/stdlib/array.html 。
+
+#### object
+
+对象类型,无序,需要指定 key 等信息关联值,类似 Java 的 HashMap,比如:
+
+JavaScript:
+
+```js
+let obj = {
+ name: 'string 字符串',
+ home: {
+ province: '山东'
+ }
+};
+
+obj.age = 18;
+
+console.log(obj.home.province);
+let key = 'age';
+console.log(obj[key], obj['age']);
+delete obj.name;
+```
+
+Java:
+
+```java
+HashMap obj = new HashMap();
+obj.put('age', 18);
+
+obj.get('age');
+obj.remove('age');
+
+```
+
+如果不确定 key 的值(变量)可以使用如下方法调用:
+
+```js
+let key = 'age';
+obj[key]; // -> 18
+```
+
+因此可以用来做 key value 的数据映射使用。由于弱类型存储的值可以多种多样,比 Java 使用起来要容易一些。详情:
+
+#### function
+
+函数类型,用来创建一个函数,通常会返回一个数据。
+
+JavaScript:
+
+```js
+function fun(a, b) {
+ return a + b;
+}
+fun(1, 2); // -> 3;
+```
+
+Java:
+
+```java
+public static int fun(int a, int b) {
+ int result;
+ result = a + b;
+
+ return result;
+}
+fun(1, 2);
+```
+
+函数是一个可执行的小程序,根据参数处理一些逻辑并返回一段新的数据,在 JavaScript 中用非常多,为此 ES6(新版 JavaScript 语言规范)新增了箭头函数语法,用来简化函数书写:
+
+```js
+let add = function(a, b) {
+ return a + b;
+};
+
+等同于
+
+let add = (a, b) => {
+ return a + b;
+};
+
+循环语句中也非常直观方便:
+
+list.forEach((a, b) => {
+ console.log(a + b);
+});
+```
+
+箭头函数有个重要的特点就是自动绑定了当前的作用域,作用域的概念,JavaScript 和 Java 的一样,JavaScript 中可以使用 bind、call、apply 三个方法改变函数执行的作用域,简单区别如下:
+
+* bind 方法,创建一个新的函数的**引用**并绑定到一个作用域特定作用域上面,同时支持传参。`bind(作用域对象, 参数1, 参数2)`
+* apply、call 方法,直接调用执行该函数,在执行的时候将函数内部的作用域绑定到参数指定的作用域。`call(作用域)`
+
+这几个方法详情请见: 。通常可能会在 JavaScript 的作用域上产生疑惑,没关系随时联系 ICE 小组进行处理解答。
+
+箭头函数声明和特性:
+
+函数作用域: 和
+
+设置函数参数的默认值:
+
+#### 类型转换
+
+类型转换可以通过调用类型的类进行转换,比如将变量 a 转换成 Number 类型,可以使用:
+
+JavaScript:
+
+```js
+let a = '10';
+a = Number(a);
+```
+
+Java:
+
+```java
+int x;
+(double)x;
+```
+
+除了这种比较正规的方法之外,跟 Java 一样还有其他惯用方法进行转换。
+
+##### 转换 number 类型
+
+JavaScript:
+
+```js
+let a = '12.33';
+console.log(parseInt(a)); // -> 12 number
+console.log(parseFloat(a)); // -> 12.33 number
+```
+
+Java:
+
+```java
+int i = Integer.parseInt(“123”);
+```
+
+##### 转换 string 类型
+
+同 Java 每个类型的值都含有 toString() 方法。
+
+```js
+let a = 12.33;
+console.log(a.toString()); // -> '12.33'
+
+将 Object 转成 JSON 字符串
+
+let obj = {
+ a: 'aa',
+ b: 'bb'
+};
+console.log(JSON.stringify(obj)); // -> '{"a":"aa","b":"bb"}'
+let objStr = '{"a":"aa","b":"bb"}';
+console.log(JSON.parse(objStr)); // -> {a:"aa", b:"bb"}
+```
+
+##### 转换 boolean 类型
+
+JavaScript 中的 boolean 的值比较多,空字符串、数字 0、null、undefined 均为布尔值的 false。此外 `!` 表示取当前布尔值的反值,可以通过 `!!` 巧妙的将值转换成布尔值类型的数据。
+
+JavaScript:
+
+```js
+console.log(!!'a'); // -> true
+console.log(!!''); // -> false 空字符串
+console.log(!!0); // -> false 数字 0
+console.log(!!10); // -> true
+console.log(!!null); // -> false
+console.log(!!undefined); // -> false
+console.log(!![].length); // -> false
+```
+
+### 流程控制、比较、运算符等
+
+* 流程控制
+ * If:
+ * Switch:
+ * For:
+ * While:
+* 比较:
+* 运算符:
+
+基本跟 Java 一样,下面介绍几个 JavaScript 比较常用、特殊的知识点:
+
+#### == 和 === 的区别
+
+JS 是弱类型语言,=== 表示全等判断,会把类型也进行比较:
+
+```js
+2 == '2' // -> true
+2 === '2' // -> false
+```
+
+#### + 运算符会改变数据类型
+
+运算符会导致数据类型的改变,这是因为运算符同时表示多种含义导致。+ 运算符既可以链接字符串,也可以计算数字,使用时需要注意:
+
+```js
+2 + 2 // -> 4 number
+2 + '2' // -> '22' string
+```
+
+### ES6 新版语法增强功能
+
+ES6 是新一代 JavaScript 语法规范,里面新增了非常多的语法和功能,而且往 Java 等传统语言靠拢。比如 class 类定义、箭头函数、真正的 Set、Map 数据类型等。下面仅列出比较推荐的用法,有一些用法由于不太稳定暂时不推荐使用。
+
+##### `...obj` 扩展运算符
+
+object 的赋值需要遍历相关字段,比如:
+
+```js
+let bb = {
+ age: 18,
+ sex: 'male',
+};
+let aa = {
+ name: '浩睿',
+};
+// 在 aa 上面新增 bb 的属性需要
+aa.age = bb.age;
+aa.sex = bb.sex;
+```
+
+这样就比较麻烦,你必须知道所有 key 而且每次新增都需要改动相关字段。为此,ES6 规范将扩展运算符(`...`)引入对象。就上面的例子,可以这样写:
+
+```js
+let bb = {
+ age: 18,
+ sex: 'male',
+ name: '后面的同 key 内容会覆盖前面的'
+};
+let aa = {
+ name: '浩睿',
+ ...bb,
+};
+```
+
+相当于把某个对象拆开分别赋值,遇到同样的 key 后面内容会覆盖前面的。详情请看:
\ No newline at end of file
diff --git a/docs/basis/intro-react.md b/docs/basis/intro-react.md
new file mode 100644
index 0000000000..1e0b91bce6
--- /dev/null
+++ b/docs/basis/intro-react.md
@@ -0,0 +1,198 @@
+---
+title: React 基础知识和介绍
+order: 5
+category: 入门指引
+---
+
+> React 是 21 世纪人类智慧的结晶。
+
+目前几乎绝大部分的组件化方案都是基于 React 实现,因为 React 就是专门为组件化而生的。因此,ICE 后台解决方案也采用了 React 这套方案进行构建。
+
+## 了解 React
+
+本文档不只谈 React 的功能、特性、优势,而是按照实际业务需求对创建一个 React 组件流程做一个介绍,并附带介绍相关特性给出详细参考文档链接。
+
+### 创建一个 React 组件
+
+首先拿到一系列的页面,我们第一步并不是去马上开发,而是先观察可复用部分抽出成独立的小组件,然后就可以通过拼接组件组装页面了。
+
+制作一个组件通常需要展示一段 HTML 代码,创建一个最简单的 React 方法如下:
+
+```jsx
+class HelloMessage extends React.Component {
+
+ render() {
+
+ return (
+ Hello world!
+ );
+ }
+}
+```
+只需要声明一个继承 React Component 的 class 即可创建一个组件,每个组件必须要有一个 render 方法,render 方法的返回值是一段 JSX 代码。
+
+JSX 语法跟 HTML 很像,但是还是有一些不同,比较简单的场景下,你可以看做是一样的。[JSX 具体语法请参见这篇文档](https://facebook.github.io/react/docs/jsx-in-depth-zh-CN.html)。
+
+创建了一个 class 我们还需要去实例化、执行才可以渲染到页面上,所以我们可以调用下面这句代码将这个组件实际的渲染出来:
+
+```
+ReactDOM.render( , document.body);
+```
+
+### 为 React 组件传入数据
+
+组件往往是需要展示一些动态数据的,而不是静态的,因此内容不能写死需要获取并传递下去。为此 React 创建了 props 这个概念用来往组件传入数据。
+
+```jsx
+class HelloMessage extends React.Component {
+ render() {
+ return (
+ Hello {this.props.name}
+ );
+ }
+}
+
+ReactDOM.render( , mountNode);
+```
+渲染组件的时候,按照 HTML 的方式传递一个属性 name 和值 '浩睿',即可在组件内部的任何位置使用 `this.props.name` 拿到这个值进行处理。
+
+props 是只读的,用来获取上层组件传递下来的数据。详情请参见:http://stackoverflow.com/questions/27991366/what-is-the-difference-between-state-and-props-in-react
+
+### React 组件的变化是基于状态的
+
+如果设计一个灯开关组件,那么对于这个开关组件它有两种状态,一种是开关开启状态(此时需要连通电线),一种是开关关闭状态(此时需要断开电线),而摁下开关是则是一种触发行为。为此 React 创建了 state 这个概念用来描述组件内部的状态,并支持获取事件进行触发。
+
+```jsx
+class Switch extends React.Component {
+ state = {
+ // 开关状态默认关闭
+ switchStatus: false
+ }
+
+ switch = () => {
+ // 切换开关的值
+ this.setState({
+ switchStatus: !this.state.switchStatus
+ });
+ };
+
+ render() {
+
+ if (this.state.switchStatus) {
+ return (
+
+
灯已经打开,电线接通
+ 关灯
+
+ );
+ } else {
+ return (
+
+
灯已经关闭,电线断开
+ 开灯
+
+ );
+ }
+ }
+}
+```
+
+> Demo 链接:http://ice.alibaba-inc.com/playground/142
+
+组件内用到的数据都算作一种状态,存储在 state 里面,当可以拦截某些行为来去改变 state 的值(比如 点击 按钮),需要注意的是改变当前组件的 state 不能直接用 `this.state.switchStatus = true` 来改,必须使用 `this.setState` 方法进行修改。原因是因为状态改变了之后,React 需要重新执行 render 方法进行渲染,此时 render 方法读取 `this.state.switchStatus` 的值就是最新的数据,渲染结果也是最新的。所以必须有一种机制通知 React state 已经变换了,直接改变 `this.state.switchStatus = true` 的值,React 无法检测到状态有変更,因此必须使用 `this.setState({xxx})` 来修改 state 值。
+
+React 组件在渲染的时候需要遵循一定的执行顺序,比如 state 改变之后必须重新执行 render 方法等。为了方便控制 React 的执行顺序和流程,React 创建了生命周期的概念用来处理此类功能。
+
+关于 props 和 state 的详解,请参见:http://stackoverflow.com/questions/27991366/what-is-the-difference-between-state-and-props-in-react
+
+### React 组件的生命周期
+
+就像一个人一样,出生、赋予属性(props)、成长(state 変更)、衰老死亡(组件销毁),React 组件同样存在这些状态,便于做相关功能处理。
+
+```jsx
+class Person extends React.Component {
+
+ // 即将出生(刚开始调用)
+ componentWillMount() {
+ console.log('我要出生了,我的名字叫 ', this.props.name);
+ }
+
+ // 出生(开始渲染,准备初始数据,调用 render 方法)
+ constructor(props) {
+ super(props);
+
+ console.log('name', this.props.name);
+
+ this.state = {
+ name: this.props.name,
+ age: 0
+ };
+
+ // 时间开始转动,5 秒等于 1 岁
+ this.timer = setInterval(() => {
+ this.setState({
+ age: this.state.age + 1
+ });
+ }, 5000);
+
+ console.log('我正在出生');
+ }
+
+
+ // 出生完毕(调用 render 完成并渲染到页面上)
+ componentDidMount() {
+ console.log('我已经出生');
+ }
+
+ // 接收了新的属性
+ componentWillReceiveProps(nextProps) {
+ // 换了个新名字,固定的属性
+ if (nextProps.name !== this.state.name) {
+ console.log('我换了个名字:', nextProps.name);
+ this.setState({
+ name: nextProps.name
+ });
+ }
+ }
+
+ // 要重新渲染了(准备过生日)
+ componentWillUpdate() {
+ console.log('我要改变了!');
+ }
+ // 更新渲染完成了(过完生日)
+ componentDidUpdate() {
+ console.log('我改变完了!');
+ }
+
+ // 要火化了(组件销毁)
+ componentWillUnmount() {
+ // 停止时间
+ console.log('再见啦!');
+ clearInterval(this.timer);
+ }
+
+ render() {
+ console.log('我正在改变!');
+ return (
+
+
姓名:{this.state.name},年龄:{this.state.age}
+
+ );
+ }
+}
+```
+
+> Demo 链接:http://ice.alibaba-inc.com/playground/143
+
+每一次 props 或者 state 改变,都会重新渲染组件,为了阻止渲染,React 还提供了 `shouldComponentUpdate` 方法,在 render 前判断是否有必要执行 render 提升性能。关于 React 声明周期,详情请参见官方文档:https://facebook.github.io/react/docs/react-component.html 。
+
+附生命周期图:
+
+
+
+## 总结
+
+至此,几大 React 特性你大概了解了,再来回顾一下:
+
+* props 用来传递数据,state 用来存储组件内部的状态和数据。props 是只读的,state 当前组件 state 的值可以作为 props 传递给下层组件。
+* React 组件按照生命周期运行,改变 state 就会重新执行 render 方法。render 方法返回的是一段 JSX 语法的结构用来渲染到页面上。
diff --git a/docs/basis/use-component.md b/docs/basis/use-component.md
new file mode 100644
index 0000000000..d74966c2c2
--- /dev/null
+++ b/docs/basis/use-component.md
@@ -0,0 +1,53 @@
+---
+title: 如何使用 ICE 组件
+category: 入门指引
+order: 6
+---
+
+ICE 的组件统一使用 NPM 进行管理,所有的组件包都可以通过 npm 命令来安装。
+
+## 检索组件
+
+ICE 所有组件文档说明都部署在[物料 - 组件](https://alibaba.github.io/ice/#/components)上,同时你也可以在全局搜索框输入你想要的的组件名称进行查找。
+
+## 安装与更新
+
+ICE 基础组件在初始化项目时,已默认安装。这里主要讲解业务组件的安装与更新方法。
+
+### 安装业务组件
+
+在对应的业务组件文档上都有具体的安装和升级方法:
+
+#### 安装命令:
+
+```bash
+npm install --save
+```
+
+#### 更新命令:
+
+```bash
+npm install @latest --save
+```
+
+当需要更新项目内的组件的时,使用此命令 `@latest` 表示当装当前最新版本。也就达到升级组件的目的。
+
+> 关于组件版本说明详见
+
+## 使用组件
+
+使用 `import from '';` 语句载入脚本,并定义为 `ComponentName` 。
+
+> 对应组件文档下都有 DEMO 示例,可点击 查看源码 / 实时编辑 查看效果。
+
+如:
+
+```jsx
+import ReactDOM from 'react-dom';
+import IceTitle from '@icedesign/title';
+
+// .... 省略其他代码
+
+// 渲染
+ReactDOM.render(, mountNode)
+```
diff --git a/docs/ice-design.md b/docs/ice-design.md
new file mode 100644
index 0000000000..1889a1d20d
--- /dev/null
+++ b/docs/ice-design.md
@@ -0,0 +1,93 @@
+---
+title: ICE 设计语言
+order: 2
+cover: https://gw.alicdn.com/tfs/TB1fcX1bkyWBuNjy0FpXXassXXa-1600-422.png
+---
+
+在淘宝内部,经过长时间调研和沉淀,我们产出了 ICE Design 这一套适合于中后台前端应用使用的设计语言。
+我们基于 ICE Design 开发了大量的可复用代码片段(区块),根据区块进行代码复用,大大节省开发时间,详情请见 [物料 - 区块](#/blocks)。
+脚手架初始模板简称为模板,我们针对实际场景的调研,提供了一批官方精选模板,实际效果请参见 [物料 - 模板](#/scaffolds)。在 [Iceworks](#/iceworks) 中生成项目选择对应脚手架即可。
+
+## 升级背景
+
+目前传统平台界面的设计语言存在着一些不足,比如色彩单一,大量线条的使用,分割化明显。其实,将这些不足归类一下就是界面单调,雷同性明显,缺少惊喜。也许新的平台类视觉风格可以打破这些束缚,尝试一些新的探索,启发传统的设计认知。因此,结合当下设计趋势,构思了一套新的平台产品设计语言。
+
+### IDS 设计语言
+
+
+
+### 设计手法
+
+
+
+## 介绍 Introduction
+
+目前大部分的组件体系设计风格任然大同小异,ICE 为了突破现有的设计,尝试采用更激进的设计风格,比如沉浸式的导航设计,无分割的表格设计。新的设计语言除了遵循经典的设计定则,还汲取的最新的设计趋势,比如模块化投影化的处理方式,圆角的处理,更加突出内容的表现方式。
+
+## 风格 Style
+
+### 色彩
+
+色彩上相对于其他的组件风格,会将色彩更多的采用到组件和页面当中,避免传统的乏味、沉闷、冰冷的感觉。在合适的节点透出惊喜的感觉。此外增加了渐变的颜色,添加了质感,同时迎合当下流行的趋势。
+
+
+
+同时提供了浅色版本和深色版本两个风格主题,在对氛围感有很强的要求的产品中可以尝试深色的主题。
+
+
+
+### 字体排版
+
+同时使用过多的字体尺寸和样式可以很轻易的毁掉布局。在字体的选择上,采用的是基础的并且适于阅读的字体字号,12、14、16、18、24 号字,并且他们能够良好的适应布局结构。这些尺寸和样式在经典应用场合中让内容密度和阅读舒适度取得平衡。
+
+
+
+### 图像
+
+在后台界面设计中,图像的用途几乎被忽视,然而图像有着建立情感联系,给人轻松愉悦感的作用。这些是 ICE 新的视觉风格里面需要的,因此,新的设计里加大了图像的透出比例。希望可以给用户更轻松的体验。
+
+
+
+## 基础设计原则
+
+**接近原则**
+
+这样可以给用户一个直观的提示,越靠近的信息区块,关联性越大。接近原则是把信息按一定逻辑进行的“组队”。
+
+**层次对比**
+
+页面上的信息通过组队后,一定会需要有侧重点,这时候对比的方法可以拉开内容之间的差距,从而凸显出页面的重点信息。层次对比是增加视觉效果的最直接的方式。
+
+**对齐原则**
+
+如果页面上一些项是对齐的,就可以得到一个更内聚的单一,像是有一条看不见的线把信息排列的更整齐,即使元素可能在空间上间隔的很远,或不在一个“组队”里,对齐可以告诉用户他们之间还是存在某种联系。
+
+**流程顺畅**
+
+中后台项目用户主要是进行信息查询或完成任务,所以相比前台项目注重页面的点击,在后台项目中路径顺畅要比点击次数更重要,甚至需要用越少的有效点击完成页面任务。流程顺畅可以快速提升用户对页面的好感度。
+
+**简化认知**
+
+为了让用户准确有效的获取到页面的信息,就需要减少对信息元素的误解,简化认知成本,尽量让页面信息直白展现。中后台并不需要太多的“内涵丰富”的概念来呈现内容,准确表述功能减少认知负担。
+
+## 预览效果图
+
+### 首页预览效果
+
+
+
+### 表格
+
+
+
+### 列表页
+
+
+
+### Dashboard 页
+
+
+
+### 氛围增强版
+
+
diff --git a/docs/iceworks.md b/docs/iceworks.md
new file mode 100644
index 0000000000..9ade66a6fd
--- /dev/null
+++ b/docs/iceworks.md
@@ -0,0 +1,139 @@
+---
+title: Iceworks 快速开始
+order: 3
+---
+
+**零环境搭建** **零配置** **简单易用**
+
+Iceworks 是 ICE 推出的辅助开发者快速开发中后台前端应用的 GUI 软件,目前支持 macOS 和 Windows 两大平台。通过 [Iceworks](https://alibaba.github.io/ice/#/iceworks) 点击下载按钮即可。
+
+## 创建项目
+
+软件启动后,项目列表为空,可通过的【创建项目】新建一个项目。
+
+
+
+界面会跳转到模板市场,目前提供三种模板进行选择,鼠标移动到指定的模板上,点击【以该模板创建项目】进入项目配置页面。
+
+
+
+* 新建一个文件夹或者选择已有的空文件夹(避免覆盖原有文件)。
+* 给项目起一个项目名,以便后续识别。
+
+点击【开始创建项目】即可开始创建
+
+> 默认会在创建的时候同时安装项目依赖,时间上会相对久一些,也可取消勾选,后续自行安装
+
+## 管理项目
+
+项目创建完成后,会自动添加到项目列表中,并打开当前项目管理面板。
+
+通过项目管理面板,可执行 **启动调试服务** **新建页面** **构建项目** 等操作。
+
+
+
+## 启动调试服务
+
+点击 `启动调试服务` 等待完成后出现服务地址,点击可以预览当前项目。
+
+
+
+> 上图是一个 ICE Design CMS 模板启动后的预览效果。
+
+## 新建页面
+
+启动调试服务后,可使用新建页面来搭建页面,通过 [block](https://alibaba.github.io/ice/#/template/block) 的组合完成页面的创建。
+
+进入 block 搭建界面
+
+
+
+上方列出了当前项目可用的 layout 布局方式,选中任一一个作为新页面的布局。
+
+下方列出了当前可选择的 blocks, 点击即可选择该 block 到已选区块列表中。
+
+右侧为选中 block 组合的缩略图预览。
+
+选择 layout 以及 block 后,点击右下角生成页面,会提示输入页面名,路由名,可以定义需要的名称,
+
+* 页面名:表示生成的文件名称。
+* 路由名:表示页面的访问地址,可通过 `http://127.0.0.1:4444/#/xxxx` 访问到对应的路由页面。
+
+示例中,创建了 `page16` 访问后即可看到刚搭建的页面了。
+
+
+
+## 进入开发调试
+
+点击项目版面上的 `编辑中打开` 会立即使用设置中选择的编辑器打开项目,目前支持 [Visual Studio Code](https://code.visualstudio.com/),[Sublime Text 3](https://www.sublimetext.com/),`WebStorm` 和 `Atom` 等编辑器,推荐使用 [Visual Studio Code](https://code.visualstudio.com/),如果你的电脑中未安装请先安装。
+
+项目目录结构说明:
+
+```
+project-name
+├── build // 打包资源
+├── mock // 模拟数据
+├── public // 静态资源
+├── src
+│ ├── components // 公共组件
+│ ├── config // 公共配置
+│ ├── layouts // 通用布局
+│ ├── pages // 页面
+│ ├── utils // 通用方法
+│ ├── global.scss // 全局样式
+│ ├── index.html // 入口模板
+│ ├── index.js // 应用入口
+│ └── routes.jsx // 路由入口
+├── tests // 测试
+├── .editorconfig // 代码风格配置
+├── .eslintignore // eslint 忽略目录配置
+├── .eslintrc // eslint 配置
+├── generator.json // generator.json
+├── package.json // package.json
+├── README.md // 项目说明
+└── yarn.lock // 模板版本管理
+```
+
+例如上一步已创建的 `Page16` 页面:
+
+
+
+通过二次开发增加业务逻辑,完成业务需求。
+
+## 打包发布
+
+点击项目面板上的构建项目按钮,将开发的构建出最终的 js css 等资源。
+
+构建完成后,会在项目目录下生成 `build` 文件夹,里面存在了 `index.html` `index.js` `index.css` 文件。使用你熟悉的方式,上传到对应的 cdn 服务器。
+
+
+
+## 部署上线
+
+上线过程即发布 HTML 文件的过程,`index.html` 文件存在在 `build` 目录中,将 `index.html` 文件复制到对应的服务服务器,并修改 html 源码中的 `/build/index.css` 和 `/build/index.js` 地址,是上一步中得到的 cdn 地址以及站点标题。
+
+一个标准的 HTML 文件如下所示:
+
+```html
+
+
+
+
+
+
+
+
+ ICE Design CMS
+
+
+
+
+
+
+
+
+```
+
+> 在线上环境我们强烈推荐使用 production 版本的 React,而不是 development 版本。它们之间的区别除了体积之外,还包括一些针对线上环境的性能优化。
+
+到这里你已经学会使用 Iceworks 创建一个项目并发布:)
diff --git a/docs/materials/custom-react-materials.md b/docs/materials/custom-react-materials.md
new file mode 100644
index 0000000000..d648b8b547
--- /dev/null
+++ b/docs/materials/custom-react-materials.md
@@ -0,0 +1,254 @@
+---
+title: 自定义 React 物料
+order: 3
+category: 物料
+---
+
+## 基础规范
+
+* 区块名称: 大驼峰写法, 如 `ExampleBlock`, 遵循简练能表达组件含义的原则
+* 基础编码码规范: [JavaScript Style Guide](https://github.com/airbnb/javascript)
+* CSS 规范: [CSS-in-JS](https://github.com/MicheleBertoli/css-in-js)
+
+## 初始 React 物料项目
+
+使用 `ice-devtools init` 选择初始类型是 React,按照提示依次输入初始信息:
+
+```
+$ ice-devtools init ice-materials-template app
+? 选择初始类型
+❯ ◯ React
+ ◯ Vue
+? 项目名称
+? 项目描述
+```
+
+创建完成后会生成如下目录结构,包含区块、布局、脚手架模板三个目录,在对应的目录下面默认内置一个相对应的示例:
+
+```
+ice-materials-template
+├── react-materials
+│ ├── blocks // 区块
+│ │ └── ExampleBlock
+│ ├── layouts // 布局
+│ │ └── ExampleLayout
+│ └── scaffolds // 脚手架模板
+│ │ └── ice-app
+├── .editorconfig
+├── .eslintignore
+├── .eslintrc
+├── .gitignore
+├── .prettierignore
+├── .prettierrc
+├── LICENSE
+├── README.md
+├── lerna.json
+└── package.json
+```
+
+## 启动本地服务
+
+初始化完成后,可以通过 `ice-devtools start` 启动本地服务,可以看到初始的区块,布局列表:
+
+```
+$ ice-devtools start
+```
+
+**预览界面**
+
+
+## 自定义区块
+
+### 区块分类
+
+区块主要按照中后台业务常见的功能类型进行分类,不同的分类对应不同的区块,分类如下:
+
+* 登录页
+* 欢迎页
+* 表格
+* 列表
+* 表单
+* 图表
+* 异常
+* 筛选
+* 视频
+* 模态框
+* 数据展示
+* 信息展示
+
+### 添加区块
+
+进入初始化的项目,使用 `ice-devtools add` 添加区块,添加流程的规则如下:
+
+* 初始项目选择 react 类型,默认添加到 react 对应的 react-materials/blocks 物料目录下
+* 初始项目选择 vue 类型,默认添加到 vue 对应的 vue-materials/blocks 物料目录下
+* 初始项目同时选择 react、vue,添加物料的时候将会询问添加物料的类型,同时生成到对应的物料目录下
+
+```
+➜ cd your-project
+➜ ice-devtools add
+? 选择添加类型 (Use arrow keys)
+❯ 区块
+ 布局
+ 模板
+```
+
+根据提示输入对应的区块信息,添加完成后会在 `your-project/react-materials/blocks/` 目录下新增一个区块,目录结构如下:
+
+```
+.
+└── ExampleBlock
+ ├── README.md // 说明文档
+ ├── package.json // pkg.json
+ └── src // source 源码目录
+ ├── ExampleBlock.jsx
+ └── index.js // 模块入口
+```
+
+### 目录文件说明
+
+**src/ExampleBlock.jsx**
+
+`ExampleBlock.jsx` 文件提供了基础的区块模板代码规范,方便快速开发一个区块:
+
+```jsx
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+export default class ExampleBlock extends Component {
+ static displayName = 'ExampleBlock';
+
+ static propTypes = {
+ value: PropTypes.string,
+ };
+
+ static defaultProps = {
+ value: 'string data',
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {};
+ }
+
+ render() {
+ return example-block
;
+ }
+}
+
+const styles = {};
+```
+
+**src/index.js**
+
+区块的入口文件,导出当前区块
+
+```
+import ExampleBlock from './ExampleBlock';
+
+export default ExampleBlock;
+```
+
+**package.json**
+
+`package.json` 的 `blockConfig` 字段描述了区块的名称,截图,标题,分类等信息,主要用于 Iceworks 展示使用,在创建区块时自动生成,但截图需要在区块开发完成后录入。
+
+```
+{
+ "name": "example-block", // npm 包名
+ "version": "1.0.0",
+ "description": "", // 区块描述
+ "author": "",
+ "files": [
+ "src/",
+ "lib/"
+ ],
+ "dependencies": {
+ "react": "^16.3.0",
+ },
+ "blockConfig": { // 区块的相关配置,用于 Iceworks 和站点的展示
+ "name": "example-block", // 名称
+ "screenshot": "", // 截图
+ "title": "示例区块", // 标题
+ "categories": "[]" // 分类
+ }
+}
+```
+
+**README.md**
+说明文档主要包含区块名,区块简介,以及区块截图三个字段信息
+
+```
+# example-block
+
+简介:示例区块
+
+![截图]()
+```
+
+### 开发调试
+
+新增一个区块后,可以看到通过 `ice-devtools start` 启动的浏览器窗口看到新增的区块,支持实时编译和监听改动。
+
+## 自定义布局
+
+布局与区块在开发模式上基本保持相同,不同点在于布局没有分类的概念,可以根据业务需求和设计规范自定义不同的布局。
+
+## 自定义脚手架
+
+### 添加模板
+
+在生成的项目中默认内置了一个模板示例,你可以基于该模板进行开发,也可以通过命令 `ice-devtools add` 时选择模板进行添加:
+
+```
+$ ice-devtools add
+? 选择添加类型 (Use arrow keys)
+ 区块
+ 布局
+❯ 模板
+```
+
+初始化完成会生成如下目录结构:
+
+```
+.
+├── mock // 模拟数据
+├── public // 静态资源
+├── src
+│ ├── components // 公共组件
+│ ├── layouts // 通用布局
+│ ├── pages // 页面
+│ ├── index.js // 应用入口
+│ ├── menuConfig // 导航配置
+│ ├── routerConfig // 路由配置
+│ └── router.jsx // 路由入口
+├── tests // 测试
+├── .gitignore // git 忽略目录配置
+├── .editorconfig // 代码风格配置
+├── .eslintignore // eslint 忽略目录配置
+├── .eslintrc // eslint 配置
+├── package.json // package.json
+└── README.md // 项目说明
+```
+
+### 开发调试
+
+脚手架的开发调试与常规项目开发模式相同:
+
+```
+$ cd your-scaffold
+$ npm run start // 启动服务
+$ npm run build // 构建项目
+```
+
+## 发布
+
+当物料开发完成时,需要生成静态的物料数据,发布到 CDN 或者其他可访问的在线地址提供给 Iceworks 使用,命令如下
+
+```
+$ npm run bootstrap // 初始 lerna
+$ npm run publish // 发布 NPM 包
+$ npm run db // 生成 DB 数据
+```
+
+接入 Iceworks 流程与自定义 Vue 物料开发接入流程一致,具体请参考 `自定义 Vue 物料` 接入 Iceworks 流程部分。
diff --git a/docs/materials/custom-vue-materials.md b/docs/materials/custom-vue-materials.md
new file mode 100644
index 0000000000..70ad2dffc5
--- /dev/null
+++ b/docs/materials/custom-vue-materials.md
@@ -0,0 +1,310 @@
+---
+title: 自定义 Vue 物料
+order: 4
+category: 物料
+---
+
+## 基础规范
+
+* 区块名称: 大驼峰写法, 如 `ExampleBlock`, 遵循简练能表达组件含义的原则
+* 基础编码码规范: [JavaScript Style Guide](https://github.com/airbnb/javascript)
+* CSS 规范: [CSS-in-JS](https://github.com/MicheleBertoli/css-in-js)
+
+## 安装物料开发工具
+
+执行 `npm install ice-devtools -g`
+
+## 初始 Vue 物料项目
+
+使用 `ice-devtools init` 开始进入环境生成操作,按照提示依次输入初始信息:
+
+```
+$ ice-devtools init ice-materials-template app
+? 选择初始类型
+ ◯ React
+❯ ◯ Vue
+? 项目名称
+? 项目描述
+```
+
+创建完成后会生成如下目录结构,包含区块、布局、脚手架模板三个目录,在对应的目录下面默认内置一个相对应的示例:
+
+```
+ice-materials-template
+├── vue-materials
+│ ├── blocks // 区块
+│ │ └── ExampleBlock
+│ ├── layouts // 布局
+│ │ └── ExampleLayout
+│ └── scaffolds // 脚手架模板
+│ │ └── ice-app
+├── .editorconfig
+├── .eslintignore
+├── .eslintrc
+├── .gitignore
+├── .prettierignore
+├── .prettierrc
+├── LICENSE
+├── README.md
+├── lerna.json
+└── package.json
+```
+
+## 启动本地服务
+
+初始化完成后,可以通过 `ice-devtools start` 启动本地服务,可以看到初始的区块,布局列表:
+
+```
+$ ice-devtools start
+```
+
+**预览界面(todo 目前 beta 阶段只有简版)**
+
+
+## 自定义区块
+
+### 区块分类
+
+区块主要按照中后台业务常见的功能类型进行分类,不同的分类对应不同的区块,分类如下:
+
+* 登录页
+* 欢迎页
+* 表格
+* 列表
+* 表单
+* 图表
+* 异常
+* 筛选
+* 视频
+* 模态框
+* 数据展示
+* 信息展示
+
+### 添加区块
+
+进入初始化的项目,使用 `ice-devtools add` 添加区块,添加流程的规则如下:
+
+* 初始项目选择 react 类型,默认添加到 react 对应的 react-materials/blocks 物料目录下
+* 初始项目选择 vue 类型,默认添加到 vue 对应的 vue-materials/blocks 物料目录下
+* 初始项目同时选择 react、vue,添加物料的时候将会询问添加物料的类型,同时生成到对应的物料目录下
+
+```
+➜ cd your-project
+➜ ice-devtools add
+? 选择添加类型 (Use arrow keys)
+❯ 区块
+ 布局
+ 模板
+```
+
+根据提示输入对应的区块信息,添加完成后会在 `your-project/vue-materials/blocks/` 目录下新增一个区块,目录结构如下:
+
+```
+.
+└── ExampleBlock
+ ├── README.md // 说明文档
+ ├── package.json // pkg.json
+ └── src // source 源码目录
+ ├── ExampleBlock.vue
+ └── index.js // 模块入口
+```
+
+### 目录文件说明
+
+**src/ExampleBlock.vue**
+
+`ExampleBlock.vue` 文件提供了基础的区块模板代码规范,方便快速开发一个区块:
+
+```
+
+
+
ExampleBlock
+
+
+
+
+
+
+```
+
+**src/index.js**
+
+区块的入口文件,导出当前区块
+
+```
+import ExampleBlock from './ExampleBlock';
+
+export default ExampleBlock;
+```
+
+**package.json**
+
+`package.json` 的 `blockConfig` 字段描述了区块的名称,截图,标题,分类等信息,主要用于 Iceworks 展示使用,在创建区块时自动生成,但截图需要在区块开发完成后录入。
+
+```
+{
+ "name": "example-block", // npm 包名
+ "version": "1.0.0",
+ "description": "", // 区块描述
+ "author": "",
+ "files": [
+ "src/",
+ "lib/"
+ ],
+ "dependencies": {
+ "vue": "^2.5.16"
+ },
+ "blockConfig": { // 区块的相关配置,用于 Iceworks 和站点的展示
+ "name": "example-block", // 名称
+ "screenshot": "", // 截图(如果没有截图则不在 Iceworks 中显示图片)
+ "title": "示例区块", // 标题
+ "categories": "[]" // 分类
+ }
+}
+```
+
+**README.md**
+说明文档主要包含区块名,区块简介,以及区块截图三个字段信息
+
+```
+# example-block
+
+简介:示例区块
+
+![截图]()
+```
+
+### 开发调试
+
+新增一个区块后,可以看到通过 `ice-devtools start` 启动的开发者界面刷新看到新增的区块,支持实时编译和监听改动。
+
+## 自定义布局
+
+布局与区块在开发模式上基本保持相同,不同点在于布局没有分类的概念,可以根据业务需求和设计规范自定义不同的布局。
+
+## 自定义脚手架
+
+### 添加模板
+
+在生成的项目中默认内置了一个模板示例,你可以基于该模板进行开发,也可以通过命令 `ice-devtools add` 时选择模板进行添加:
+
+```
+$ ice-devtools add
+? 选择添加类型 (Use arrow keys)
+ 区块
+ 布局
+❯ 模板
+```
+
+初始化完成会生成如下目录结构:
+
+```
+.
+├── README.md
+├── package.json
+├── public
+│ ├── favicon.ico
+│ └── index.html
+├── src
+│ ├── App.vue
+│ ├── assets
+│ │ └── logo.png
+│ ├── components
+│ │ └── HelloWorld.vue
+│ ├── layouts
+│ │ └── BlankLayout
+│ │ └── index.vue
+│ ├── main.js
+│ ├── pages
+│ │ ├── About
+│ │ │ ├── About.vue
+│ │ │ └── index.js
+│ │ └── Home
+│ │ ├── Home.vue
+│ │ └── index.js
+│ └── router.js
+└── vue.config.js
+```
+
+### 开发调试
+
+脚手架就是用户生成到项目中的初始文件、目录,脚手架的开发调试与常规项目开发模式相同:
+
+```
+$ cd your-scaffold
+$ npm run start // 启动服务
+$ npm run build // 构建项目
+```
+
+Iceworks 对于脚手架会将其直接下载解压到目录中。
+
+## 发布
+
+当物料开发完成时,发布需要几个步骤:
+
+1. 清理无用代码。默认生成的 example-block 等需要删除,因为它们的 package name 已经被占用无法发布。
+2. 将物料以 npm 包的形式发布。Iceworks 将通过 npm 下载物料解压使用。
+3. 生成物料源 db.json。根据你当前的物料生成 db 的数据,提供给 iceworks 使用。
+4. 部署 db.json 到 http 静态服务器,将 url 发送给使用者填入 iceworks 即可开始使用。
+
+> 建议:模板 + 布局 + 模块 为一套完整的工程物料,建议发布之前保证每一类都有一个物料。
+
+相关命令如下:
+
+通过 lerna 发布物料包:
+
+```
+$ npm run bootstrap // 初始 lerna
+$ npm run publish // 发布 NPM 包
+```
+
+lerna 批量发包会比较容易,但可能会出现一些异常。而且 lerna 的变更检测是通过 git tag 实现的,因此通过这种方式你必须创建一个 git 仓库在 github 或者 gitlab 等。
+
+其实只要将物料发包即可,因此你也可以选择普通的 npm 命令的方式发布,只是这样操作步骤会变多一些:
+
+```
+$ cd 到对应物料目录
+$ npm publish
+```
+
+之后生成物料 DB:
+
+```
+$ ice-devtools generate // 生成 DB 数据
+```
+
+此时将会在当前物料源下面新建 `build` 目录,并生成 json 文件。
+
+创建一个 http 静态服务器托管这个 db.json。你可以使用 https://browsersync.io/ 或者 python SimpleHTTPServer 等启动静态服务,并可以通过类似 `http://localhost:3000/vue-materials.json` 这样的方式获取到物料数据。
+
+至此,物料源开发完成,可以在 Iceworks 中试用。
+
+## 接入 Iceworks
+
+目前还在 beta 版本,支持多物料源的 Iceworks 并没有正式发布,详情请参见群里。
+
+在设置面板中填入当前物料源 db url:
+
+
+
+之后在创建项目界面即可看到你的自定义物料:
+
+
diff --git a/docs/materials/data-specification.md b/docs/materials/data-specification.md
new file mode 100644
index 0000000000..aeab5e50ea
--- /dev/null
+++ b/docs/materials/data-specification.md
@@ -0,0 +1,164 @@
+---
+title: 物料数据规范
+order: 6
+category: 物料
+---
+
+## 飞冰设计思路
+
+在了解飞冰物料数据规范之前,我们先来大概了解一下飞冰的设计思路;在飞冰使用过程中,大多数开发者只需要下载 GUI 工具 Iceworks,然后按照文档教程进行项目开发即可。目前飞冰提供的物料数据源有 React 和 Vue 版本,然而,在飞冰开发群里常见的问题是有没有计划支持 AngularJS 版本,有没有移动端的支持计划等等。实际上,对飞冰来说,本质上一套通用的模式,只需要按照相应的数据规范生产物料、生成数据源,最后通过 Iceworks 接入即可。如果你计划接入一套新的框架物料,可以参考下面的步骤进行:
+
+
+
+**选定物料类型和开发规范**
+
+前面讲到,对飞冰来讲本质上是通过一套通用的数据协议结合 Iceworks 运作的,因此,选定物料类型你可以基于 React、Vue、Angular 甚至是 Bootstrap 进行开发。
+
+开发规范主要是指开发物料时的编码规范,比如 `HTML`、`CSS`、 `JavaScript` 等基础规范。
+
+**物料脚手架**
+
+物料主要包括组件、区块、布局、模板,在开发物料时,我们需要按照一定的模板代码进行开发,因此需要先规划好物料类型以及对应的物料脚手架。详细可参考 [React 和 Vue 物料脚手架](https://github.com/alibaba/ice/tree/master/templates)
+
+**开发者工具**
+
+开发者工具主要包含`项目构建工具`和`物料开发工具`,项目构建工具故名思议是用来启动,构建项目的,比如我们为飞冰项目提供的项目构建工具 [ice-scripts](https://github.com/alibaba/ice/tree/master/tools/ice-scripts)。大家在使用 Iceworks 时,会经常用到 Iceworks 项目面板的 **启动调试服务**、**构建项目** 等功能,其背后的原理本质上是通过 GUI 的形式去调用了 CLI 的命令.
+
+项目是可以脱离 Iceworks 单独运行的,`package.json` 里声明 `scripts` 命令,必须存在 `start` `build`. 通过 `npm run start` 与 `npm run build` 即可启动调试服务与构建。
+
+Iceworks 会识别项目中定义的 `scripts` 脚本,**启动调试服务**、**构建项目** 分别对应 `npm run start` `npm run build`。当然,你不一定要自己去实现一个完整的 CLI 工具,Vue 社区已经有了很完善的工具 [vue-cli](https://github.com/vuejs/vue-cli),AngularJs 也有对应的 [angular-cli](https://github.com/angular/angular-cli)。
+
+物料开发工具即为开发物料提供的配套工具,物料开发工具提供的能力主要是根据预设好的物料脚手架进行初始化,生成模板文件方便开发,同时提供预览,热加载等服务。详细可参考 [飞冰物料开发工具 ice-devtools](https://github.com/alibaba/ice/tree/master/tools/ice-devtools)
+
+**生成物料数据**
+
+在物料开发完成时,需要生成对应的物料元数据,为 Iceworks 提供数据源。数据源为一份 JSON 文件。
+
+> 可参考
+
+**接入 Iceworks**
+
+生成好物料数据源,只需要将物料数据源发布 CDN 提供给 Iceworks, 在设置面板中添加即完成了完整链路的闭环。
+
+## 物料数据规范
+
+飞冰`物料数据规范`是一套通用的描述物料的元数据的标准格式,规范约定了物料的类型、名称、版本、数据源、存储位置等信息。目前基于飞冰物料数据规范实现了 [vue-materials](https://g.alicdn.com/ice-assets/ice-design/databases/vue-materials.json) 和 [react-materials](https://g.alicdn.com/ice-assets/ice-design/databases/react-materials.json) 两个版本的物料数据源。
+
+**数据规范**
+
+```
+{
+ "name": "react-materials", // 名称
+ "type": "react", // 类型(vue、react、angular、bootstrap、etc)
+ "blocks": [], // 区块元数据
+ "layouts": [], // 布局元数据
+ "scaffolds": [] // 模板脚手架元数据
+}
+```
+
+**区块规范说明**
+
+```
+{
+ // (必)英文名
+ "name": "application-progress",
+
+ // (必)中文描述
+ "title": "申请进度信息展示",
+
+ // (可)区块详细说明
+ "description": "",
+
+ // (必) source 字段描述区块下载方式
+ "source": {
+ "type": "npm",
+ "npm": "@icedesign/foo-block",
+ "version": "0.1.0",
+ "sourceCodeDirectory": "src",
+ },
+
+ // (必) 分类
+ "categories": ["信息展示"],
+
+ // (必) 截图
+ "screenshot": "https://img.alicdn.com/tfs/TB1I67ih3vD8KJjy0FlXXagBFXa-947-929.png",
+
+ // (必) 发布时间
+ "publishTime": "2018-03-13 22:19",
+
+ // (必) 最后修改时间
+ "updateTime": "2018-03-13 22:19",
+
+ // (必) 用于说明组件依赖关系
+ "components": {
+ "@icedesign/base": "^x.x.x",
+ },
+
+ // (可) 保留字段
+ "features": {
+ // 分词, 用于搜索
+ "participle": { /* ... */ },
+ }
+}
+```
+
+**区块规范说明**
+
+布局规范与区块类似,但需要增加一个 `thumbnail` 用来指定抽象缩略图,用在 iceworks 的新建页面流程中,用来选择布局
+
+```
+...
+"thumbnail": "https://gw.alicdn.com/tfs/TB172QmlsLJ8KJjy0FnXXcFDpXa-976-974.png"
+...
+```
+
+**模板规范说明**
+
+```
+{
+ // (必)英文名
+ "name": "ice-design-pro",
+
+ // (必)中文描述
+ "title": "pro 模板",
+
+ // (可)区块详细说明
+ "description": "",
+
+ // (可)模板预览地址
+ "homepage": "https://alibaba.github.io/ice/scaffold-preview/ice-design-pro.html"
+
+ // (必) source 字段描述下载方式, 下详
+ "source": {
+ "type": "npm",
+ "npm": "@icedesign/foo-block",
+ "version": "0.1.5",
+ "sourceCodeDirectory": "src",
+ },
+
+ // (可) 分类
+ "categories": [],
+
+ // (必) 截图
+ "screenshot": "https://img.alicdn.com/tfs/TB1I67ih3vD8KJjy0FlXXagBFXa-947-929.png",
+
+ // (必) 发布时间
+ "publishTime": "2018-03-13 22:19",
+
+ // (必) 最后修改时间
+ "updateTime": "2018-03-13 22:19",
+
+ // (必) 用于说明组件依赖关系 (dependencies 字段)
+ "components": {
+ "@icedesign/base": "^x.x.x",
+ },
+
+ // (可) 保留字段
+ "features": {
+ // 分词, 用于搜索
+ "participle": { /* ... */ },
+ }
+}
+```
+
+至此,我们对飞冰的设计思想和物料数据规范有了大概的了解,如何自定义一套物料接入 Iceworks 的流程。如果你看完还是不知道如何开始动手,可以通过飞冰钉钉群联系我们。
diff --git a/docs/materials/how-to-contribute.md b/docs/materials/how-to-contribute.md
new file mode 100644
index 0000000000..6831abc498
--- /dev/null
+++ b/docs/materials/how-to-contribute.md
@@ -0,0 +1,225 @@
+---
+title: 如何贡献
+order: 5
+category: 物料
+---
+
+目前飞冰提供了基于 React 技术栈的物料,React 物料由飞冰团队维护,每周会定期更新。但在飞冰的用户群里,我们收到很多反馈,希望能提供对 Vue 的支持,为此,我们提供了开发者工具 ice-devtools,以及基础的 Vue 物料。当然,这对于物料体系来说,所做的远远不够,如果你热爱开源,欢迎与我们一起共同建设。
+
+## 环境准备
+
+```
+// 安装开发者工具 ice-devtools
+$ npm i ice-devtools -g
+
+// clone 官方仓库
+$ git clone git@github.com:alibaba/ice.git
+$ npm run bootstrap
+$ npm run start
+```
+
+通过上面的命令可以启动服务,支持预览 react-materials 和 vue-materials 目录下的所有区块和布局,启动主界面如下,可通过点击物料类型选择预览不同的物料。
+
+
+
+## 开发区块
+
+以开发 Vue 物料为例添加一个区块,首先进入 ice 项目目录,通过 `ice-devtools add` 命令选择需要添加的物料类型,根据提示输入对应的信息,添加完成后会在 `ice/vue-materials` 目录下新增对应的模板文件。
+
+```
+$ cd ice
+$ ice-devtools add
+ ? 选择添加类型 (Use arrow keys)
+ ❯ 区块
+ 布局
+ 模板
+```
+
+目录结构如下:
+
+```
+.
+└── ExampleBlock
+ ├── README.md // 说明文档
+ ├── package.json // pkg.json
+ └── src // source 源码目录
+ ├── ExampleBlock.vue
+ └── index.js // 模块入口
+```
+
+## 目录文件说明
+
+**src/ExampleBlock.vue**
+
+`ExampleBlock.vue` 文件提供了基础的区块模板代码规范,方便快速开发一个区块:
+
+```
+
+
+
+ ExampleBlock
+
+
+
+
+
+
+
+```
+
+**src/index.js**
+
+区块的入口文件,导出当前区块
+
+```
+import ExampleBlock from './ExampleBlock';
+
+export default ExampleBlock;
+```
+
+**package.json**
+
+`package.json` 的 `blockConfig` 字段描述了区块的名称,截图,标题,分类等信息,主要用于 Iceworks 展示使用,在创建区块时自动生成,但截图需要在区块开发完成后补充录入。
+
+```
+{
+ "name": "example-block", // npm 包名
+ "version": "1.0.0",
+ "description": "", // 区块描述
+ "author": "",
+ "files": [
+ "src/",
+ "lib/"
+ ],
+ "dependencies": {
+ "vue": "^2.5.16",
+ "@vue-materials/basic-container": "^1.0.0",
+ },
+ "blockConfig": { // 区块的相关配置,用于 Iceworks 和站点的展示
+ "name": "example-block", // 名称
+ "screenshot": "", // 截图(如果没有截图则不在 Iceworks 中显示图片)
+ "title": "示例区块", // 标题
+ "categories": "[]" // 分类
+ }
+}
+```
+
+**README.md**
+说明文档主要包含区块名,区块简介,以及区块截图三个字段信息
+
+```
+# example-block
+
+简介:示例区块
+
+![截图]()
+```
+
+## 添加布局
+
+布局与区块在开发模式上基本保持相同,不同点在于布局没有分类的概念,可以根据业务需求和设计规范自定义不同的布局。
+
+## 开发调试
+
+新增一个区块后,在主界面物料类型选择 vue-materials 进入物料列表页面如下:
+
+
+
+在列表页面,已经有了一些基础的区块和布局,可以点击预览查看效果图,支持实时编译刷新调试。
+
+## 提交代码
+
+### 提交 Pull Request
+
+如果你准备贡献代码,那么你可以创建分支修改代码提交 PR,飞冰开发团队会 review 代码合并到主干。
+
+```bash
+# 先创建开发分支开发,分支名应该有含义,避免使用 update、tmp 之类的
+$ git checkout -b branch-name
+
+# 开发完成后可以运行 lint 检查语法
+$ npm run lint
+
+# 提交代码,message 见下面的规范
+$ git add . # git add -u 删除文件
+$ git commit -m "fix: add xxx block"
+$ git push origin branch-name
+```
+
+提交后就可以在 [ice](https://github.com/alibaba/ice/pulls) 创建 Pull Request 了。
+
+### 代码风格
+
+你的代码风格必须通过 eslint,你可以运行 `$ npm run lint` 本地测试。
+
+### Commit 提交规范
+
+根据 [angular 规范](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format)提交 commit,这样 history 看起来更加清晰,还可以自动生成 changelog。
+
+```xml
+():
+
+
+
+
+```
+
+(1)type
+
+提交 commit 的类型,包括以下几种
+
+* feat: 新功能
+* fix: 修复问题
+* docs: 修改文档
+* style: 修改代码格式,不影响代码逻辑
+* refactor: 重构代码,理论上不影响现有功能
+* perf: 提升性能
+* test: 增加修改测试用例
+* chore: 修改工具相关(包括但不限于文档、代码生成等)
+* deps: 升级依赖
+
+(2)scope
+
+修改文件的范围
+
+(3)subject
+
+用一句话清楚的描述这次提交做了什么
+
+(4)body
+
+补充 subject,适当增加原因、目的等相关因素,也可不写。
+
+(5)footer
+
+* **当有非兼容修改(Breaking Change)时必须在这里描述清楚**
+* 关联相关 issue,如 `Closes #1, Closes #2, #3`
+
+- 查看具体[文档](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit)
+- [CONTRIBUTING.md](https://github.com/alibaba/ice/blob/master/.github/CONTRIBUTING.md)
+
+## 发布
+
+当你提交的 Pull Request 被合并到主干后,我们会进行发布并将你贡献的物料同步在[飞冰官网](https://alibaba.github.io/ice/)。
diff --git a/docs/materials/ice-devtools.md b/docs/materials/ice-devtools.md
new file mode 100644
index 0000000000..ac34ef5763
--- /dev/null
+++ b/docs/materials/ice-devtools.md
@@ -0,0 +1,65 @@
+---
+title: 开发者工具
+order: 2
+category: 物料
+---
+
+## 开发者工具 ice-devtools
+
+在实际项目中,官方提供的物料源和设计风格可能不能满足某些业务场景,基于此我们提供了开发者工具 ice-devtools 来满足自定义物料体系的能力,支持自定义接入 React 或者是 Vue 的区块、布局、模板等功能。
+
+### 安装 ice-devtools
+
+```
+$ npm i ice-devtools -g
+```
+
+### 使用 ice-devtools init 进行初始化
+
+```
+$ ice-devtools init ice-materials-template app
+? 选择初始类型
+❯ ◯ React
+ ◯ Vue
+? 项目名称
+? 项目描述
+```
+
+在初始化时可以选择是 React 或者是 Vue 类型的物料,支持多选,也就是在同一个仓库下同时包含 React 和 Vue 类型的物料。
+
+这里以多选为例,同时选择 React 和 Vue,初始化完成后会自动生成如下目录结构,可以看到生成的目录里包含了 react-materials 和 vue-materils 两个目录, 且目录下面分别对应 `blocks`、`layouts`、`scaffolds` 三个文件夹,即上一章节介绍的物料类型。
+
+```
+ice-materials-template
+├── react-materials // react 物料
+│ ├── blocks
+│ ├── layouts
+│ └── scaffolds
+├── vue-materials // vue 物料
+│ ├── blocks
+│ ├── layouts
+│ └── scaffolds
+├── .editorconfig
+├── .eslintignore
+├── .eslintrc
+├── .gitignore
+├── .prettierignore
+├── .prettierrc
+├── LICENSE
+├── README.md
+├── lerna.json
+└── package.json
+```
+
+### 启动本地服务
+
+初始化完成后,可以通过 `ice-devtools` 启动本地服务,默认包含区块,布局,模板展示案例
+
+```
+$ ice-devtools start
+```
+
+**预览界面**
+
+
+至此,按照上面的步骤,我们已经初始化了一个物料仓库,接下来,你可以按照实际的业务场景进行自定义物料。
diff --git a/docs/materials/intro-materials.md b/docs/materials/intro-materials.md
new file mode 100644
index 0000000000..c2afaf7b32
--- /dev/null
+++ b/docs/materials/intro-materials.md
@@ -0,0 +1,17 @@
+---
+title: 物料简介
+order: 1
+category: 物料
+---
+
+在飞冰中,组件、区块、布局、模板等统称为物料,由飞冰团队维护,基于这些物料结合 Iceworks 可以快速搭建中后台应用。在此之外,如果已有的物料不能满足你的业务需求,我们提供了一套完整的开发规范和开发者工具,你可以参与共建飞冰物料,也可以自建私有的物料体系。
+
+* 组件:最基础的物料,目前飞冰的基础组件达到 55+,具有高度可复用性。
+
+* 区块:通过对大量的中后台系统常用的场景进行分类、对比和抽象,基于基础组件组合而成,目前飞冰的区块达到 110+,可以通过 iceworks 进行快速组合搭建应用,减少重复的开发,提升效率。
+
+* 布局:在中后台系统中布局通常较为统一,以 顶部-侧边布局-通栏 模式为主,为此我们提供了 4+ 常见的布局,支持 light 和 dark 两套主题。
+
+* 模板:基于已有的区块搭建而成,目前提供了 4+ 的特定领域的模板,可以从零开始搭建应用,也可以选择特定类型的模板开始使用。
+
+
diff --git a/docs/others/migration-to-react-router-v4.md b/docs/others/migration-to-react-router-v4.md
new file mode 100644
index 0000000000..b1900ed7a5
--- /dev/null
+++ b/docs/others/migration-to-react-router-v4.md
@@ -0,0 +1,290 @@
+---
+title: 迁移到 react-router v4
+order: 3
+category: 其它
+---
+
+## 前言
+
+react-router v4 相对于 react-router v3 几乎是重写了整个库, 新版的 react-router 遵循一切皆 React Component 的理念,路由即是组件,使路由更具声明式。
+
+在 Iceworks 2.0.0 版本里支持了 react-router v4,所有的模板也做了相应的升级,使用 Iceworks 2.0.0 版本新创建的项目默认使用 react-router v4。 如果你是在这之前创建的项目,可以参考下面的 `Iceworks 路由管理方案`和`迁移步骤`进行对应的升级。
+
+## Iceworks 路由管理方案
+
+在 Iceworks 2.0.0 版本中统一对项目的路由配置信息进行增删改处理,不同的项目类型,根据约定的标准数据协议进行操作。主要包含以下三部分:
+
+* menuConfig.js: 描述导航的结构关系
+* routerConfig.js: 描述路由的结构关系
+* router.js: 根据 routerConfig 数据协议实现对应的路由信息(react-router、vue-router)
+
+**menuConfig.js**
+
+```jsx
+// 导航配置
+// headerMenuConfig:头部导航配置
+// asideMenuConfig:侧边导航配置
+// 变量名 asideMenuConfig 为 iceworks 检测关键字,请不要修改名称
+
+const headerMenuConfig = [
+ {
+ name: '首页',
+ path: '/',
+ icon: 'home',
+ }
+];
+
+const asideMenuConfig = [
+ {
+ name: 'Dashboard', // 名称
+ path: '/', // 路径
+ icon: 'home', // 图标
+ },
+ {
+ name: '文章管理',
+ path: '/post',
+ icon: 'copy',
+ children: [
+ { name: '文章列表', path: '/post/list' },
+ { name: '添加文章', path: '/post/create' },
+ ],
+ }
+];
+
+export { headerMenuConfig, asideMenuConfig };
+```
+
+**routerConfig.js**
+
+```jsx
+// 路由结构配置
+// 每个页面支持配置不同的 Layout 结构
+// 变量名 routerConfig 为 iceworks 检测关键字,请不要修改名称
+
+const routerConfig = [
+ {
+ path: '/', // 页面路径
+ layout: HeaderAsideFooterLayout, // 页面渲染的布局
+ component: Dashboard, // 页面渲染的组件
+ },
+ {
+ path: '/post',
+ layout: HeaderAsideFooterLayout,
+ component: PostList,
+ children: [
+ {
+ path: 'list',
+ layout: HeaderAsideFooterLayout,
+ component: PostList,
+ },
+ {
+ path: 'create',
+ layout: HeaderAsideFooterLayout,
+ component: CreatePost,
+ },
+ ],
+ },
+]
+```
+
+**router.js**
+```jsx
+// 主要根据 routerConfig 数据协议实现对应的路由信息,比如 react-router 转换后的格式如下:
+// 完整实现参考:https://github.com/alibaba/ice/blob/master/react-materials/scaffolds/ice-design-cms/src/router.jsx
+
+
+
+
+
+
+
+
+```
+
+
+## 迁移步骤
+
+### 替换依赖包
+
+在 v4 版本中,需要安装 `react-router` 和 `react-router-dom` 两个依赖包。
+
+* react-router: React Router 核心组件
+* react-router-dom:用于 DOM 绑定的 React Router
+
+```
+// package.json
+"react-router": "^4.2.0",
+"react-router-dom": "^4.2.2",
+```
+
+### 新建 `routerConfig.js` 文件
+
+在 `src` 目录下新建 `routerConfig.js` 文件,将 `routes.js` 文件的代码按照约定的标准数据协议写入 `routerConfig.js` 后删除 `routes.js`。
+
+**之前:routes.js**
+
+```jsx
+/**
+ * 定义应用路由
+ */
+import React from 'react';
+import { Router,hashHistory } from 'react-router';
+
+// 路由配置规则参考: https://github.com/ReactTraining/react-router/blob/v3/docs/guides/RouteConfiguration.md#configuration-with-plain-routes
+// 一下部分是由 ICE 相关工具自动生成的路由,请勿随意改变,否则可能会出现一些异常情况
+//
+import HeaderAsideFooterLayout from './layouts/HeaderAsideFooterLayout';
+import Dashboard from './pages/Dashboard';
+
+const autoGeneratedRoutes = [
+ {
+ path: '/',
+ component: HeaderAsideFooterLayout,
+ indexRoute: { component: Dashboard },
+ },
+];
+
+//
+
+// 自定义路由,如果 path 相同则会覆盖自动生成部分的路由配置
+const customRoutes = [];
+
+export default (
+
+);
+```
+
+**现在:routerConfig.js**
+
+```jsx
+// 以下文件格式为描述路由的协议格式
+// 你可以调整 routerConfig 里的内容
+// 变量名 routerConfig 为 iceworks 检测关键字,请不要修改名称
+
+import HeaderAsideFooterLayout from './layouts/HeaderAsideFooterLayout';
+import Dashboard from './pages/Dashboard';
+
+const routerConfig = [
+ {
+ path: '/',
+ layout: HeaderAsideFooterLayout,
+ component: Dashboard,
+ }
+];
+
+export default routerConfig;
+
+```
+
+## 新建 `menuConfig.js` 文件
+
+在 `src` 目录下新建 `menuConfig.js` 文件,将 `nav.js` 文件的代码按照约定的标准数据协议写入 `menuConfig.js` 后删除 `navs.js`。
+
+
+**之前:navs.js**
+```
+//
+const autoGenHeaderNavs = [];
+const autoGenAsideNavs = [];
+//
+
+const customHeaderNavs = [
+ {
+ text: '首页',
+ to: '/',
+ icon: 'home',
+ }
+];
+
+const customAsideNavs = [
+ {
+ text: 'Dashboard',
+ to: '/',
+ icon: 'home',
+ }
+];
+
+function transform(navs) {
+ // custom logical
+ return [...navs];
+}
+
+export const headerNavs = transform([
+ ...autoGenHeaderNavs,
+ ...customHeaderNavs,
+]);
+
+export const asideNavs = transform([...autoGenAsideNavs, ...customAsideNavs]);
+```
+
+**现在:menuConfig.js**
+
+```jsx
+// 菜单配置
+// headerMenuConfig:头部导航配置
+// asideMenuConfig:侧边导航配置
+
+const headerMenuConfig = [
+ {
+ name: '首页',
+ path: '/',
+ icon: 'home',
+ }
+];
+
+const asideMenuConfig = [
+ {
+ name: 'Dashboard',
+ path: '/',
+ icon: 'home',
+ }
+];
+
+export { headerMenuConfig, asideMenuConfig };
+```
+
+
+## 新建 `router.jsx` 文件
+
+根据 `routerConfig.js` 数据协议实现对应的路由信息,目前飞冰支持 `react-router` 和 `vue-router` 的转换,具体实现参考:
+
+* [根据 routerConfig.js 转换到 react-router v4 的路由实现](https://github.com/ReactTraining/react-router/blob/v3/docs/guides/RouteConfiguration.md#configuration-with-plain-routes)
+* [根据 routerConfig.js 转换到 vue-router 的路由实现](https://github.com/alibaba/ice/blob/master/vue-materials/scaffolds/admin-lite/src/router.js)
+
+## 其他
+
+* 将使用 `react-router` 改成使用 `react-router-dom`
+
+```jsx
+ import { Link } from 'react-router';
+
+ =>
+
+ import { Link } from 'react-router-dom';
+```
+
+* 将使用 `this.props.location` 改成使用 `this.props.match`
+```jsx
+ const { location } = this.props;
+
+ =>
+
+ @withRouter
+ class Page extends Component {
+ ...
+ const { match } = this.props;
+ ...
+ }
+```
+
+* 导航菜单字段修改
+ * 将 `text` 改成 `name`
+ * 将 `to` 改成 `path`
+
+* 其他请参考 react-router v4 [迁移文档](https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/migrating.md)
+
+至此,如果你按照上诉步骤进行迁移,即可完成 react-router v3 迁移到 react-router v4,如果在迁移过程中遇到问题,可以通过飞冰答疑群联系我们。
+
diff --git a/docs/others/qa.md b/docs/others/qa.md
new file mode 100644
index 0000000000..cf3bc01713
--- /dev/null
+++ b/docs/others/qa.md
@@ -0,0 +1,97 @@
+---
+title: 常见问题 QA
+category: 其它
+order: 1
+---
+
+> 持续更新中...
+> 如有问题可以到 反馈
+
+## ICE 的浏览器兼容策略是什么
+
+由于 ICE 优先使用 React 16+,其需要的最低 IE 版本为 11,如果您需要在以下的版本使用,您可能需要引入一些 polyfill 来支持 `Map`, `Set` 等特性。参考[React 官网说明](https://reactjs.org/blog/2017/09/26/react-v16.0.html#javascript-environment-requirements)。
+
+以下代码可以帮助你在低版本 IE 下自动跳转到我们提供的提示浏览器升级页面。当然您也可以使用自定义的浏览器升级页面。
+
+```
+
+```
+
+添加如上代码后,如果使用 IE11 及以下浏览器访问页面,则会自动跳转到统一引导升级浏览器的页面。
+
+## WebStorm/IDEA 编辑器卡顿现象
+
+由于项目在安装依赖后,产生文件夹 `node_modules` 含有较多的碎小文件,编辑器在索引文件引起的卡顿。
+WebStorm 中尤为明显,可通过 exclude `node_modules` 目录,不需要检索该文件夹下的内容。
+
+## 如何设置网页在浏览器 Tab 上面的 Icon (favicon)
+
+细心的同学可能会看到页面在浏览器 Tab 上面会有自定义的 Icon:
+
+
+
+如果你想要在自己站点上面加上这个 Icon 可以按照如下步骤添加:
+
+1. 准备一个 Icon,文件格式可以为 `.png` 或者 `.ico`,正方形,分辨率可以是 32x32px 或者 64x64px 文件体积要求尽可能小。
+2. 上传 CDN 拿到一个 url 或者在自己服务器配置静态资源服务
+3. 在 HTML 页面 `` 标签里面添加如下代码:` `
+ 
+
+这样就添加成功啦!
+
+## 如何在页面显示原始的 HTML 内容
+
+出于安全方面的考虑,React 默认会将节点中 html 代码进行转义,比如:
+
+```jsx
+class Demo extends Component {
+ render() {
+ const content = 'hello world ';
+ return {content}
;
+ }
+}
+
+// 输出 hello world
+```
+
+如上,`` 标签并不会在页面上被解析,而是被当成字符串输出了。React 提供了 `dangerouslySetInnerHTML` 属性帮助我们进行类似 `innerHTML` 的操作:
+
+```jsx
+class Demo extends Component {
+ render() {
+ const content = 'hello world ';
+ return
;
+ }
+}
+
+// 输出 hello world
+```
+
+更多内容请参考 [Dangerously Set innerHTML](https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml)
+
+## 之前创建的项目,遇到如下报错怎么办
+
+
+
+这是由于 ES6 Modules 的标准在物料中不兼容导致的。您可以把 `src/navs.js` 中最后一行修改为:
+
+```js
+export const headerNavs = transform([
+ ...autoGenHeaderNavs,
+ ...customHeaderNavs,
+]);
+
+export const asideNavs = transform([...autoGenAsideNavs, ...customAsideNavs]);
+```
+
+## 在 Iceworks 下载页面点击下载没反应怎么办?
+
+请检查是否安装 Adguard、AdBlock、xxx 安全助手等工具并被其拦截?因为 Iceworks 是二进制可安装程序,可能会被安全软件拦截,如有拦截请点击确认或者临时关闭相关拦截功能。
+
+## 出现端口已占用启动失败应该如何处理?
+
+当你出现类似 `Something is already running on port 4444.` 或类似的报错时,可能是由于 Hosts 配置缺少 `localhost` 等相关配置。
+
+详细修复方法请参见:https://github.com/alibaba/ice/issues/233
diff --git a/docs/others/version-rules.md b/docs/others/version-rules.md
new file mode 100644
index 0000000000..b49d78b9d0
--- /dev/null
+++ b/docs/others/version-rules.md
@@ -0,0 +1,91 @@
+---
+title: 组件版本号规则
+order: 2
+category: 其它
+---
+
+ICE 的 npm 包默认遵守 [Semver](https://semver.org/) 语义化版本 2.0 的规则。
+
+## 版本号规则
+
+组件的版本以 `major.minor.patch` 形式表示 `主版本号.次版本号.修订号` 比如: `0.1.0` `0.3.1`。
+
+版本号递增规则如下:
+
+1. 主版本号:不兼容的 API 修改,
+2. 次版本号:向下兼容的功能性新增,
+3. 修订号:向下兼容的问题修正。
+
+## 版本控制规范
+
+目前项目内用到的主要有以下两种规则:
+
+### patch 位自动升级
+
+标识符:`~`
+
+依赖版本表示为 `~0.1.0`
+
+如:
+
+```js
+{
+ "dependencies": {
+ "foo": "~2.0.0"
+ }
+}
+```
+
+当 `foo` 发布了 `2.0.30` 版本,表示做了向下兼容的问题修正(BUG fix 等), 在开发与构建时则会安装 `2.0.30`。
+
+如果 `foo` 存在 `2.1.0` 版本,根据标识符 `~` 也不会安装此版本。
+
+#### 优点:
+
+自动更新升级项目内组件依赖版本(patch),当组件开发者发布了新版本修复存在的现有问题,可自动升级。
+
+### minor 位自动升级
+
+标识符:`^`
+
+依赖版本表示为 `^0.1.0`
+
+> 温馨提示:包含 patch 自动升级
+
+如:
+
+```js
+{
+ "dependencies": {
+ "foo": "^2.0.0"
+ }
+}
+```
+
+当 `foo` 发布了 `2.0.30` 版本,表示做了向下兼容的问题修正(BUG fix 等), 在开发与构建时则会安装 `2.0.30`
+
+如果 `foo` 存在 `2.1.0` 版本,根据标识符 `^` 则会安装 `2.1.0`。
+
+#### 优点:
+
+自动更新升级项目内组件依赖版本(minor),当组件开发者发布了新的特性、API 等,可升级到相应的版本。同时也包含升级 (patch)的功能。
+
+### 固定版本号
+
+固定版本号则需要项目开发者维护版本依赖,无标识符。
+
+如:
+
+```js
+{
+ "dependencies": {
+ "foo": "2.0.0"
+ }
+}
+```
+
+表示只安装 `foo` `2.0.0` 版本,不会在开发与构建时安装其他版本。
+
+#### 优点:
+
+项目内的组件依赖都是固定的版本,完全保证项目代码一致性。如当组件含有 BUG 时,需开发者手动刚更新组件依赖的版本。
diff --git a/examples/app-config/.browserslistrc b/examples/app-config/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/app-config/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/app-config/ice.config.mts b/examples/app-config/ice.config.mts
deleted file mode 100644
index b89aefa7cb..0000000000
--- a/examples/app-config/ice.config.mts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { defineConfig } from '@ice/app';
-import externals from '@ice/plugin-externals';
-
-export default defineConfig(() => ({
- plugins: [externals({ preset: 'react' })]
-}));
diff --git a/examples/app-config/package.json b/examples/app-config/package.json
deleted file mode 100644
index 8be59abe78..0000000000
--- a/examples/app-config/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "@examples/app-config",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build",
- "build:splitChunks": "ice build --config splitChunks.config.mts"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-externals": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/app-config/src/app.tsx b/examples/app-config/src/app.tsx
deleted file mode 100644
index c32590e655..0000000000
--- a/examples/app-config/src/app.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- strict: true,
- errorBoundary: true,
- },
- router: {
- type: 'browser',
- basename: '/ice',
- },
-}));
diff --git a/examples/app-config/src/document.tsx b/examples/app-config/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/app-config/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/app-config/src/global.css b/examples/app-config/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/app-config/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/app-config/src/pages/error.tsx b/examples/app-config/src/pages/error.tsx
deleted file mode 100644
index 3d13384933..0000000000
--- a/examples/app-config/src/pages/error.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function Error() {
- // @ts-ignore
- window.test();
- return <>error>;
-}
diff --git a/examples/app-config/src/pages/index.tsx b/examples/app-config/src/pages/index.tsx
deleted file mode 100644
index bb72815361..0000000000
--- a/examples/app-config/src/pages/index.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function Home() {
- return home ;
-}
diff --git a/examples/app-config/src/typings.d.ts b/examples/app-config/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/app-config/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/app-config/tsconfig.json b/examples/app-config/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/app-config/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/basic-project/.browserslistrc b/examples/basic-project/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/basic-project/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/basic-project/.env b/examples/basic-project/.env
deleted file mode 100644
index ee3853f0b6..0000000000
--- a/examples/basic-project/.env
+++ /dev/null
@@ -1 +0,0 @@
-ICE_ENV=common
\ No newline at end of file
diff --git a/examples/basic-project/.env.development b/examples/basic-project/.env.development
deleted file mode 100644
index 13da131385..0000000000
--- a/examples/basic-project/.env.development
+++ /dev/null
@@ -1 +0,0 @@
-ICE_ENV=development
\ No newline at end of file
diff --git a/examples/basic-project/compatHtml.config.mts b/examples/basic-project/compatHtml.config.mts
deleted file mode 100644
index e039dcaadd..0000000000
--- a/examples/basic-project/compatHtml.config.mts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineConfig } from '@ice/app';
-import defaultConfig from './ice.config.mjs';
-
-export default defineConfig(() => ({
- ...defaultConfig,
- htmlGenerating: {
- mode: 'compat'
- }
-}));
diff --git a/examples/basic-project/ice.config.mts b/examples/basic-project/ice.config.mts
deleted file mode 100644
index e3040539bd..0000000000
--- a/examples/basic-project/ice.config.mts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { defineConfig } from '@ice/app';
-import SpeedMeasurePlugin from 'speed-measure-webpack-plugin';
-import customPlugin from './plugin';
-
-export default defineConfig(() => ({
- ssr: true,
- publicPath: '/',
- polyfill: 'entry',
- syntaxFeatures: {
- exportDefaultFrom: true,
- },
- featurePolyfill: {
- abortcontroller: false,
- },
- server: {
- onDemand: true,
- format: 'esm',
- },
- alias: {
- '@comp': './src/components',
- },
- define: {
- HAHA: JSON.stringify('HAHA'),
- 'process.env.HAHA': JSON.stringify(true),
- 'process.env': JSON.stringify({}),
- },
- transform: (code, id) => {
- if (id.includes('src/pages') && id.endsWith('.js')) {
- return code;
- }
- return null;
- },
- webpack: (webpackConfig) => {
- if (process.env.NODE_ENV !== 'test') {
- webpackConfig.plugins?.push(new SpeedMeasurePlugin());
- }
- return webpackConfig;
- },
- dropLogLevel: process.env.ICE_ENV === 'common' ? 'warn' : 'error',
- plugins: [
- customPlugin(),
- ],
- eslint: true,
- cssModules: {
- localIdentName: '[hash:8]',
- },
-}));
diff --git a/examples/basic-project/mock/foo.ts b/examples/basic-project/mock/foo.ts
deleted file mode 100644
index a963ecd28d..0000000000
--- a/examples/basic-project/mock/foo.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export default {
- '/api/foo': { foo: 'foo' },
-};
\ No newline at end of file
diff --git a/examples/basic-project/mock/user.ts b/examples/basic-project/mock/user.ts
deleted file mode 100644
index b4632a26ab..0000000000
--- a/examples/basic-project/mock/user.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { Request, Response } from '@ice/app';
-
-export default {
- 'GET /api/users': ['a', 'b'],
- 'POST /api/users/:id': (request: Request, response: Response) => {
- const { id } = request.params;
- response.send({ id: id });
- },
-};
diff --git a/examples/basic-project/package.json b/examples/basic-project/package.json
deleted file mode 100644
index 0f0b6fb5cc..0000000000
--- a/examples/basic-project/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "@examples/basic-project",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build",
- "build:splitChunks": "ice build --config splitChunks.config.mts"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-rax-compat": "workspace:*",
- "@ice/runtime": "workspace:*",
- "@uni/env": "^1.1.0",
- "ahooks": "^3.3.8",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "speed-measure-webpack-plugin": "^1.5.0",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/basic-project/plugin.ts b/examples/basic-project/plugin.ts
deleted file mode 100644
index 46bd54e1a1..0000000000
--- a/examples/basic-project/plugin.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import fs from 'fs';
-
-export default function createPlugin() {
- return {
- name: 'custom-plugin',
- setup({ onGetConfig }) {
- onGetConfig((config) => {
- config.transformPlugins = [...(config.transformPlugins || []), {
- name: 'custom-transform',
- transformInclude(id) {
- return !!id.match(/app.tsx$/);
- },
- loadInclude(id) {
- return !!id.match(/app.tsx$/);
- },
- load(id) {
- return fs.readFileSync(id, 'utf-8');
- },
- transform(code) {
- return code;
- },
- }];
- });
- },
- };
-}
diff --git a/examples/basic-project/splitChunks.config.mts b/examples/basic-project/splitChunks.config.mts
deleted file mode 100644
index 19cb9689d2..0000000000
--- a/examples/basic-project/splitChunks.config.mts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineConfig } from '@ice/app';
-import defaultConfig from './ice.config.mjs';
-
-export default defineConfig(() => ({
- ...defaultConfig,
- splitChunks: false,
- minify: false,
-}));
diff --git a/examples/basic-project/src/app.tsx b/examples/basic-project/src/app.tsx
deleted file mode 100644
index 68e939f26a..0000000000
--- a/examples/basic-project/src/app.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { defineAppConfig, defineDataLoader, defineRunApp } from 'ice';
-import { isWeb, isNode } from '@uni/env';
-
-if (process.env.ICE_CORE_ERROR_BOUNDARY === 'true') {
- console.error('__REMOVED__');
-}
-
-console.log('__LOG__');
-console.warn('__WARN__');
-console.error('__ERROR__');
-
-console.log('process.env.HAHA', process.env.HAHA);
-console.log('HAHA', HAHA);
-console.log('process.env.NODE_ENV', process.env.ICE_ENV);
-console.log('process.env.undefinedEnv', process.env.undefinedEnv);
-console.log('import.meta.target', import.meta.target);
-console.log('process.env', process.env);
-
-import('./standard-module')
- .then((mod) => {
- mod.printOne();
- });
-
-if (isWeb) {
- console.error('__IS_WEB__');
-}
-
-if (isNode) {
- console.error('__IS_NODE__');
-}
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- resolve({
- title: 'gogogogo',
- });
- });
-});
-
-export const runApp = defineRunApp((render) => {
- render();
-});
diff --git a/examples/basic-project/src/assets/robot.txt b/examples/basic-project/src/assets/robot.txt
deleted file mode 100644
index f3a34851d4..0000000000
--- a/examples/basic-project/src/assets/robot.txt
+++ /dev/null
@@ -1 +0,0 @@
-text
\ No newline at end of file
diff --git a/examples/basic-project/src/components/PageUrl.tsx b/examples/basic-project/src/components/PageUrl.tsx
deleted file mode 100644
index 8207d3a3e7..0000000000
--- a/examples/basic-project/src/components/PageUrl.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function PageUrl() {
- return page url is {window.location.href} ;
-}
diff --git a/examples/basic-project/src/components/bar.tsx b/examples/basic-project/src/components/bar.tsx
deleted file mode 100644
index fbebaf88b2..0000000000
--- a/examples/basic-project/src/components/bar.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import style from './cssWithEscapedSymbols.module.css';
-
-console.log('style', style.test);
-
-export default function Bar() {
- return (
-
- bar
-
- );
-}
diff --git a/examples/basic-project/src/components/cssWithEscapedSymbols.module.css b/examples/basic-project/src/components/cssWithEscapedSymbols.module.css
deleted file mode 100644
index 2c2ffbc98e..0000000000
--- a/examples/basic-project/src/components/cssWithEscapedSymbols.module.css
+++ /dev/null
@@ -1,114 +0,0 @@
-.test {
- background: red;
-}
-
- ._test {
- background: blue;
-}
-
-.className {
- background: red;
-}
-
-#someId {
- background: green;
-}
-
-.className .subClass {
- color: green;
-}
-
-#someId .subClass {
- color: blue;
-}
-
-.-a0-34a___f {
- color: red;
-}
-
-.m_x_\@ {
- margin-left: auto !important;
- margin-right: auto !important;
-}
-
-.B\&W\? {
- margin-left: auto !important;
- margin-right: auto !important;
-}
-
-/* matches elements with class=":`(" */
-.\3A \`\( {
- color: aqua;
-}
-
-/* matches elements with class="1a2b3c" */
-.\31 a2b3c {
- color: aliceblue;
-}
-
-/* matches the element with id="#fake-id" */
-#\#fake-id {
- color: antiquewhite;
-}
-
-/* matches the element with id="-a-b-c-" */
-#-a-b-c- {
- color: azure;
-}
-
-/* matches the element with id="©" */
-#© {
- color: black;
-}
-
-.♥ { background: lime; }
-.© { background: lime; }
-.😍 { background: lime; }
-.“‘’” { background: lime; }
-.☺☃ { background: lime; }
-.⌘⌥ { background: lime; }
-.𝄞♪♩♫♬ { background: lime; }
-.💩 { background: lime; }
-.\? { background: lime; }
-.\@ { background: lime; }
-.\. { background: lime; }
-.\3A \) { background: lime; }
-.\3A \`\( { background: lime; }
-.\31 23 { background: lime; }
-.\31 a2b3c { background: lime; }
-.\ { background: lime; }
-.\<\>\<\<\<\>\>\<\> { background: lime; }
-.\+\+\+\+\+\+\+\+\+\+\[\>\+\+\+\+\+\+\+\>\+\+\+\+\+\+\+\+\+\+\>\+\+\+\>\+\<\<\<\<\-\]\>\+\+\.\>\+\.\+\+\+\+\+\+\+\.\.\+\+\+\.\>\+\+\.\<\<\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\.\>\.\+\+\+\.\-\-\-\-\-\-\.\-\-\-\-\-\-\-\-\.\>\+\.\>\. { background: lime; }
-.\# { background: lime; }
-.\#\# { background: lime; }
-.\#\.\#\.\# { background: lime; }
-.\_ { background: lime; }
-.\{\} { background: lime; }
-.\#fake\-id { background: lime; }
-.foo\.bar { background: lime; }
-.\3A hover { background: lime; }
-.\3A hover\3A focus\3A active { background: lime; }
-.\[attr\=value\] { background: lime; }
-.f\/o\/o { background: lime; }
-.f\\o\\o { background: lime; }
-.f\*o\*o { background: lime; }
-.f\!o\!o { background: lime; }
-.f\'o\'o { background: lime; }
-.f\~o\~o { background: lime; }
-.f\+o\+o { background: lime; }
-
-.foo\/bar {
- background: hotpink;
-}
-
-.foo\\bar {
- background: hotpink;
-}
-
-.foo\/bar\/baz {
- background: hotpink;
-}
-
-.foo\\bar\\baz {
- background: hotpink;
-}
diff --git a/examples/basic-project/src/document.tsx b/examples/basic-project/src/document.tsx
deleted file mode 100644
index 79ee7f4ef1..0000000000
--- a/examples/basic-project/src/document.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-// eslint-disable-next-line
-import { Meta, Title, Links, Main, Scripts, useAppData, defineDataLoader, unstable_useDocumentData } from 'ice';
-import type { AppData } from '@/types';
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- title: 'documentData',
- });
- // ATTENTION: This async call will pause rendering document.
- }, 1000);
- });
-});
-
-function Document() {
- const appData = useAppData();
- // Get document data when fallback to document only.
- const documentData = unstable_useDocumentData();
-
- console.log('document data', documentData);
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Document Data
-
- {JSON.stringify(documentData, null, 2)}
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/basic-project/src/global.css b/examples/basic-project/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/basic-project/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/basic-project/src/pages/about.tsx b/examples/basic-project/src/pages/about.tsx
deleted file mode 100644
index a87e13f67a..0000000000
--- a/examples/basic-project/src/pages/about.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { Link, useData, useConfig, history, definePageConfig, defineDataLoader } from 'ice';
-import type { PageConfig } from 'ice';
-import { isWeb } from '@uni/env';
-import url from './ice.png';
-
-interface Data {
- name: string;
-}
-
-export default function About() {
- const data = useData();
- const config = useConfig();
-
- console.log('render About', 'data', data, 'config', config);
- console.log('history in component', history);
-
- return (
- <>
- About Page
- home
-
- new
- isWeb: {isWeb ? 'true' : 'false'}
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'About',
- meta: [
- {
- name: 'theme-color',
- content: '#eee',
- },
- ],
- links: [{
- href: 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css',
- rel: 'stylesheet',
- }],
- scripts: [{
- src: 'https://cdn.jsdelivr.net/npm/lodash@2.4.1/dist/lodash.min.js',
- }],
- };
-});
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'About',
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/basic-project/src/pages/blog.tsx b/examples/basic-project/src/pages/blog.tsx
deleted file mode 100644
index 483bef42f9..0000000000
--- a/examples/basic-project/src/pages/blog.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { Link, useData, useConfig, definePageConfig } from 'ice';
-import { isWeb } from '@uni/env';
-
-
-console.log('isWeb', isWeb);
-export default function Blog() {
- const data = useData();
- const config = useConfig();
-
- console.log('render Blog', 'data', data, 'config', config);
-
- return (
- <>
- Blog Page
- home
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Blog',
- };
-});
\ No newline at end of file
diff --git a/examples/basic-project/src/pages/client-only.tsx b/examples/basic-project/src/pages/client-only.tsx
deleted file mode 100644
index 78d7d5bccd..0000000000
--- a/examples/basic-project/src/pages/client-only.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { lazy, Suspense } from 'react';
-import { ClientOnly, useMounted } from 'ice';
-
-export default function ClientOnlyComponent() {
- const mounted = useMounted();
-
- return (
- <>
- {mounted ? 'Client' : 'Server'}
-
- {() => {
- const PageUrl = lazy(() => import('@/components/PageUrl'));
- return (
-
-
-
- );
- }}
-
- >
- );
-}
diff --git a/examples/basic-project/src/pages/downgrade.tsx b/examples/basic-project/src/pages/downgrade.tsx
deleted file mode 100644
index 89b8f9b03d..0000000000
--- a/examples/basic-project/src/pages/downgrade.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { definePageConfig } from 'ice';
-
-export default function Downgrade() {
- const isNode = typeof process !== 'undefined' && !!(process.versions && process.versions.node);
-
- if (isNode) {
- throw new Error('Downgrade to CSR.');
- }
-
- return (
- <>
- Page Downgrade to CSR.
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'hello',
- };
-});
diff --git a/examples/basic-project/src/pages/ice.png b/examples/basic-project/src/pages/ice.png
deleted file mode 100644
index e5e98fac1e..0000000000
Binary files a/examples/basic-project/src/pages/ice.png and /dev/null differ
diff --git a/examples/basic-project/src/pages/index.css b/examples/basic-project/src/pages/index.css
deleted file mode 100644
index c712d6d936..0000000000
--- a/examples/basic-project/src/pages/index.css
+++ /dev/null
@@ -1,3 +0,0 @@
-h2 {
- color: #000;
-}
\ No newline at end of file
diff --git a/examples/basic-project/src/pages/index.module.css b/examples/basic-project/src/pages/index.module.css
deleted file mode 100644
index 679273d44d..0000000000
--- a/examples/basic-project/src/pages/index.module.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
-
-.data {
- margin-top: 10px;
-}
-
-.homeContainer {
- align-items: center;
- margin-top: 200rpx;
-}
-
-.homeTitle {
- font-size: 45rpx;
- font-weight: bold;
- margin: 20rpx 0;
-}
-
-.homeInfo {
- font-size: 36rpx;
- margin: 8rpx 0;
- color: #555;
-}
diff --git a/examples/basic-project/src/pages/index.module.less b/examples/basic-project/src/pages/index.module.less
deleted file mode 100644
index 71f0de02af..0000000000
--- a/examples/basic-project/src/pages/index.module.less
+++ /dev/null
@@ -1,3 +0,0 @@
-.data {
- margin-top: 10px;
-}
\ No newline at end of file
diff --git a/examples/basic-project/src/pages/index.module.scss b/examples/basic-project/src/pages/index.module.scss
deleted file mode 100644
index 999a61e098..0000000000
--- a/examples/basic-project/src/pages/index.module.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-@import "http://github.com/var.scss";
-
-.data {
- margin-top: 10px;
-}
\ No newline at end of file
diff --git a/examples/basic-project/src/pages/index.tsx b/examples/basic-project/src/pages/index.tsx
deleted file mode 100644
index 25078dd9c3..0000000000
--- a/examples/basic-project/src/pages/index.tsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import { Suspense, lazy } from 'react';
-import { Link, useData, useAppData, useConfig, definePageConfig, defineDataLoader, defineStaticDataLoader, defineServerDataLoader } from 'ice';
-// Not recommended but works.
-import { useAppContext } from '@ice/runtime';
-import { useRequest } from 'ahooks';
-import textContext from '../assets/robot.txt?raw';
-import textUrl from '../assets/robot.txt?url';
-import './index.css';
-import styles from './index.module.css';
-import lessStyles from './index.module.less';
-import sassStyles from './index.module.scss';
-import type { AppData } from '@/types';
-
-const Bar = lazy(() => import('@comp/bar'));
-
-export default function Home(props) {
- const appContext = useAppContext();
- const appData = useAppData();
- const data = useData();
- const config = useConfig();
- if (typeof window !== 'undefined') {
- console.log('render Home', props);
- console.log('get AppData', appData);
- console.log('get AppContext', appContext);
- console.log('render Home', 'data', data, 'config', config);
- }
-
- const { data: foo } = useRequest(() => fetch('http://github.com/api/foo').then(res => res.json()));
- const { data: users } = useRequest(() => fetch('http://github.com/api/users').then(res => res.json()));
- const { data: userInfo } = useRequest(() => fetch('http://github.com/api/users/a', { method: 'POST' }).then(res => res.json()));
- return (
- <>
- Home Page
- about
- count: {data.count}
- hello}>
-
-
-
-
foo: {JSON.stringify(foo)}
-
users: {JSON.stringify(users)}
-
userInfo: {JSON.stringify(userInfo)}
-
data from: {data.from}
-
assets content: {textContext}
-
assets url: {textUrl}
-
- >
- );
-}
-
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Home',
- meta: [
- {
- name: 'theme-color',
- content: '#000',
- },
- {
- name: 'title-color',
- content: '#f00',
- },
- ],
- };
-});
-
-export const dataLoader = defineDataLoader(({ pathname, query }) => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'Home',
- count: 100,
- pathname,
- query,
- from: 'client',
- });
- }, 1 * 100);
- });
-});
-
-export const serverDataLoader = defineServerDataLoader(() => {
- return {
- name: 'Home',
- count: 100,
- from: 'getServerData',
- };
-});
-
-export const staticDataLoader = defineStaticDataLoader(() => {
- return {
- name: 'Home',
- count: 100,
- from: 'getStaticData',
- };
-});
diff --git a/examples/basic-project/src/pages/layout.tsx b/examples/basic-project/src/pages/layout.tsx
deleted file mode 100644
index 618740508c..0000000000
--- a/examples/basic-project/src/pages/layout.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Outlet, useData, useConfig, definePageConfig, defineDataLoader } from 'ice';
-
-export default function Layout() {
- const data = useData();
- const config = useConfig();
-
- console.log('render Layout', 'data', data, 'config', config);
-
- return (
-
-
ICE 3.0 Layout
-
-
- );
-}
-
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Layout',
- meta: [
- {
- name: 'layout-color',
- content: '#f00',
- },
- ],
- };
-});
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- layout: true,
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/basic-project/src/pages/var.scss b/examples/basic-project/src/pages/var.scss
deleted file mode 100644
index c9c817a79d..0000000000
--- a/examples/basic-project/src/pages/var.scss
+++ /dev/null
@@ -1 +0,0 @@
-$color-1 : #fff;
\ No newline at end of file
diff --git a/examples/basic-project/src/standard-module.ts b/examples/basic-project/src/standard-module.ts
deleted file mode 100644
index 71d902b5d8..0000000000
--- a/examples/basic-project/src/standard-module.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function printOne() {
- console.log(1);
-}
diff --git a/examples/basic-project/src/types.ts b/examples/basic-project/src/types.ts
deleted file mode 100644
index cce4218222..0000000000
--- a/examples/basic-project/src/types.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export interface AppData {
- title: string;
-}
diff --git a/examples/basic-project/src/typings.d.ts b/examples/basic-project/src/typings.d.ts
deleted file mode 100644
index 78b38be824..0000000000
--- a/examples/basic-project/src/typings.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-///
-
-declare const HAHA: string;
\ No newline at end of file
diff --git a/examples/basic-project/tsconfig.json b/examples/basic-project/tsconfig.json
deleted file mode 100644
index 28b2e34aeb..0000000000
--- a/examples/basic-project/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "ESNext",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
diff --git a/examples/cavans-project/.browserslistrc b/examples/cavans-project/.browserslistrc
deleted file mode 100644
index df80bf2c0f..0000000000
--- a/examples/cavans-project/.browserslistrc
+++ /dev/null
@@ -1,2 +0,0 @@
-defaults
-ios_saf 9
diff --git a/examples/cavans-project/ice.config.mts b/examples/cavans-project/ice.config.mts
deleted file mode 100644
index ec70568bd5..0000000000
--- a/examples/cavans-project/ice.config.mts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineConfig } from '@ice/app';
-import canvasPlugin from '@ice/plugin-canvas';
-
-export default defineConfig(() => ({
- plugins: [
- canvasPlugin(),
- ],
- ssr: true,
- ssg: false,
-}));
diff --git a/examples/cavans-project/package.json b/examples/cavans-project/package.json
deleted file mode 100644
index b4a62878ab..0000000000
--- a/examples/cavans-project/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "@examples/canvas-project",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-canvas": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0",
- "@ice/cache-canvas": "workspace:*"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/cavans-project/src/app.tsx b/examples/cavans-project/src/app.tsx
deleted file mode 100644
index b84dfd61c1..0000000000
--- a/examples/cavans-project/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/cavans-project/src/components/bar.tsx b/examples/cavans-project/src/components/bar.tsx
deleted file mode 100644
index 7861bf5cb4..0000000000
--- a/examples/cavans-project/src/components/bar.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Bar() {
- return (
-
- bar
-
- );
-}
diff --git a/examples/cavans-project/src/document.tsx b/examples/cavans-project/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/cavans-project/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/cavans-project/src/pages/home.tsx b/examples/cavans-project/src/pages/home.tsx
deleted file mode 100644
index b27b8efec8..0000000000
--- a/examples/cavans-project/src/pages/home.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { definePageConfig, CacheCanvas } from 'ice';
-import { useRef } from 'react';
-import styles from './index.module.css';
-
-export type RefCacheCanvas = {
- cacheCanvasToStorage: () => void;
-};
-
-const GAME_CANVAS_ID = 'canvas-id';
-
-export default function Home() {
- const childRef = useRef();
- const initFunc = () => {
- return new Promise((resolve) => {
- const canvas: HTMLCanvasElement | null = document.getElementById(GAME_CANVAS_ID) as HTMLCanvasElement;
- if (canvas && typeof canvas.getContext === 'function') {
- let ctx: CanvasRenderingContext2D | null = canvas.getContext('2d');
-
- ctx?.fillRect(25, 25, 100, 100);
- ctx?.clearRect(45, 45, 60, 60);
- ctx?.strokeRect(50, 50, 50, 50);
- }
-
- setTimeout(() => {
- console.log('canvas paint ready!');
- resolve(true);
- }, 10000);
- });
- };
-
- return (
- <>
- Home Page
- fallback
}
- />
- {
- console.log('active cache!');
- childRef.current?.cacheCanvasToStorage();
- }}
- >cache canvas
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Home',
- meta: [
- {
- name: 'theme-color',
- content: '#000',
- },
- {
- name: 'title-color',
- content: '#f00',
- },
- ],
- auth: ['admin'],
- };
-});
diff --git a/examples/cavans-project/src/pages/ice.png b/examples/cavans-project/src/pages/ice.png
deleted file mode 100644
index e5e98fac1e..0000000000
Binary files a/examples/cavans-project/src/pages/ice.png and /dev/null differ
diff --git a/examples/cavans-project/src/pages/index.module.css b/examples/cavans-project/src/pages/index.module.css
deleted file mode 100644
index ef450095a5..0000000000
--- a/examples/cavans-project/src/pages/index.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.title {
- color: red;
-}
\ No newline at end of file
diff --git a/examples/cavans-project/src/types.ts b/examples/cavans-project/src/types.ts
deleted file mode 100644
index 9f8f9f11e9..0000000000
--- a/examples/cavans-project/src/types.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export interface AppData {
- title: string;
-}
\ No newline at end of file
diff --git a/examples/cavans-project/src/typings.d.ts b/examples/cavans-project/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/cavans-project/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/cavans-project/tsconfig.json b/examples/cavans-project/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/cavans-project/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/csr-project/.browserslistrc b/examples/csr-project/.browserslistrc
deleted file mode 100644
index df80bf2c0f..0000000000
--- a/examples/csr-project/.browserslistrc
+++ /dev/null
@@ -1,2 +0,0 @@
-defaults
-ios_saf 9
diff --git a/examples/csr-project/ice.config.mts b/examples/csr-project/ice.config.mts
deleted file mode 100644
index b327d52248..0000000000
--- a/examples/csr-project/ice.config.mts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { defineConfig } from '@ice/app';
-import auth from '@ice/plugin-auth';
-import SpeedMeasurePlugin from 'speed-measure-webpack-plugin';
-
-export default defineConfig(() => ({
- publicPath: '/',
- webpack: (webpackConfig) => {
- if (process.env.NODE_ENV !== 'test') {
- webpackConfig.plugins?.push(new SpeedMeasurePlugin());
- }
- return webpackConfig;
- },
- server: {
- onDemand: true,
- format: 'esm',
- },
- dropLogLevel: 'warn',
- plugins: [
- auth(),
- ],
- eslint: true,
- ssr: false,
- ssg: false,
-}));
diff --git a/examples/csr-project/package.json b/examples/csr-project/package.json
deleted file mode 100644
index 764e864b54..0000000000
--- a/examples/csr-project/package.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "name": "@examples/basic-project",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-auth": "workspace:*",
- "@ice/runtime": "workspace:*",
- "antd-mobile": "^5.12.6",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "speed-measure-webpack-plugin": "^1.5.0",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/csr-project/src/app.tsx b/examples/csr-project/src/app.tsx
deleted file mode 100644
index ca63767920..0000000000
--- a/examples/csr-project/src/app.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { defineAppConfig } from 'ice';
-import { defineAuthConfig } from '@ice/plugin-auth/types';
-
-console.log('__LOG__');
-console.warn('__WARN__');
-console.error('__ERROR__');
-
-export const authConfig = defineAuthConfig(() => {
- return {
- initialAuth: {
- admin: true,
- },
- };
-});
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/csr-project/src/components/bar.tsx b/examples/csr-project/src/components/bar.tsx
deleted file mode 100644
index 7861bf5cb4..0000000000
--- a/examples/csr-project/src/components/bar.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Bar() {
- return (
-
- bar
-
- );
-}
diff --git a/examples/csr-project/src/document.tsx b/examples/csr-project/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/csr-project/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/csr-project/src/pages/about.tsx b/examples/csr-project/src/pages/about.tsx
deleted file mode 100644
index a636e1ea85..0000000000
--- a/examples/csr-project/src/pages/about.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-// @ts-expect-error
-import { Link, useData, useConfig, definePageConfig, defineDataLoader } from 'ice';
-import url from './ice.png';
-
-interface Data {
- name: string;
-}
-
-export default function About() {
- const data = useData();
- const config = useConfig();
-
- console.log('render About', 'data', data, 'config', config);
-
- return (
- <>
- About Page
- home
-
- new
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'About',
- meta: [
- {
- name: 'theme-color',
- content: '#eee',
- },
- ],
- links: [{
- href: 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css',
- rel: 'stylesheet',
- }],
- scripts: [{
- src: 'https://cdn.jsdelivr.net/npm/lodash@2.4.1/dist/lodash.min.js',
- }],
- auth: ['admin'],
- };
-});
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'About',
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/csr-project/src/pages/blog.tsx b/examples/csr-project/src/pages/blog.tsx
deleted file mode 100644
index 237031bc49..0000000000
--- a/examples/csr-project/src/pages/blog.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Link, useData, useConfig, definePageConfig } from 'ice';
-
-interface Data {
- name: string;
-}
-
-export default function Blog() {
- const data = useData();
- const config = useConfig();
-
- console.log('render Blog', 'data', data, 'config', config);
-
- return (
- <>
- Blog Page
- home
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Blog',
- auth: ['guest'],
- };
-});
diff --git a/examples/csr-project/src/pages/ice.png b/examples/csr-project/src/pages/ice.png
deleted file mode 100644
index e5e98fac1e..0000000000
Binary files a/examples/csr-project/src/pages/ice.png and /dev/null differ
diff --git a/examples/csr-project/src/pages/index.module.css b/examples/csr-project/src/pages/index.module.css
deleted file mode 100644
index ef450095a5..0000000000
--- a/examples/csr-project/src/pages/index.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.title {
- color: red;
-}
\ No newline at end of file
diff --git a/examples/csr-project/src/pages/index.tsx b/examples/csr-project/src/pages/index.tsx
deleted file mode 100644
index 08e2264925..0000000000
--- a/examples/csr-project/src/pages/index.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import { Suspense, lazy } from 'react';
-import { Link, useData, useConfig, definePageConfig, defineDataLoader } from 'ice';
-// Not recommended but works.
-import { useAppContext } from '@ice/runtime';
-import { Button } from 'antd-mobile';
-import styles from './index.module.css';
-
-const Bar = lazy(() => import('../components/bar'));
-
-export default function Home(props) {
- console.log('render Home', props);
-
- const appContext = useAppContext();
- console.log('get AppContext', appContext);
-
- const data = useData();
- const config = useConfig();
-
- console.log('render Home', 'data', data, 'config', config);
-
- return (
- <>
- Home Page
- about
- hello}>
-
- alert('Hello ICE.')}>Click Me
-
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Home',
- meta: [
- {
- name: 'theme-color',
- content: '#000',
- },
- {
- name: 'title-color',
- content: '#f00',
- },
- ],
- auth: ['admin'],
- };
-});
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'Home',
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/csr-project/src/pages/layout.tsx b/examples/csr-project/src/pages/layout.tsx
deleted file mode 100644
index 6361a03aa6..0000000000
--- a/examples/csr-project/src/pages/layout.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Outlet, useData, useConfig, definePageConfig, defineDataLoader } from 'ice';
-
-export default () => {
- const data = useData();
- const config = useConfig();
-
- console.log('render Layout', 'data', data, 'config', config);
-
- return (
-
-
Layout
-
-
- );
-};
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Layout',
- meta: [
- {
- name: 'layout-color',
- content: '#f00',
- },
- ],
- auth: ['admin'],
- };
-});
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- layout: true,
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/csr-project/src/types.ts b/examples/csr-project/src/types.ts
deleted file mode 100644
index 2b7ee052a3..0000000000
--- a/examples/csr-project/src/types.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export interface AppData {
- title: string;
- auth: {
- [key: string]: boolean;
- };
-}
\ No newline at end of file
diff --git a/examples/csr-project/src/typings.d.ts b/examples/csr-project/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/csr-project/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/csr-project/tsconfig.json b/examples/csr-project/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/csr-project/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/disable-data-loader/ice.config.mts b/examples/disable-data-loader/ice.config.mts
deleted file mode 100644
index 3ba68d975f..0000000000
--- a/examples/disable-data-loader/ice.config.mts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- dataLoader: false,
-}));
diff --git a/examples/disable-data-loader/package.json b/examples/disable-data-loader/package.json
deleted file mode 100644
index fe046e8e25..0000000000
--- a/examples/disable-data-loader/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "name": "@examples/disable-data-loader",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build",
- "build:splitChunks": "ice build --config splitChunks.config.mts"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-auth": "workspace:*",
- "@ice/plugin-rax-compat": "workspace:*",
- "@ice/runtime": "workspace:*",
- "@uni/env": "^1.1.0",
- "ahooks": "^3.3.8",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "speed-measure-webpack-plugin": "^1.5.0",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/disable-data-loader/src/app.tsx b/examples/disable-data-loader/src/app.tsx
deleted file mode 100644
index ddc80c0232..0000000000
--- a/examples/disable-data-loader/src/app.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { defineAppConfig, defineDataLoader } from 'ice';
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- resolve({
- title: 'gogogogo',
- auth: {
- admin: true,
- },
- });
- });
-});
diff --git a/examples/disable-data-loader/src/document.tsx b/examples/disable-data-loader/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/disable-data-loader/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/disable-data-loader/src/pages/index.tsx b/examples/disable-data-loader/src/pages/index.tsx
deleted file mode 100644
index af9a52214d..0000000000
--- a/examples/disable-data-loader/src/pages/index.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { defineDataLoader } from 'ice';
-
-export default function Home() {
- return (
- <>
- Home Page
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- meta: [
- {
- name: 'theme-color',
- content: '#000',
- },
- {
- name: 'title-color',
- content: '#f00',
- },
- ],
- auth: ['admin'],
- };
-}
-
-export const dataLoader = defineDataLoader(({ pathname, query }) => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'Home',
- count: 100,
- pathname,
- query,
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/disable-data-loader/tsconfig.json b/examples/disable-data-loader/tsconfig.json
deleted file mode 100644
index 7f2f2ffce9..0000000000
--- a/examples/disable-data-loader/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/hash-router/ice.config.mts b/examples/hash-router/ice.config.mts
deleted file mode 100644
index 02ac1b6d1f..0000000000
--- a/examples/hash-router/ice.config.mts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- ssr: false,
- ssg: false,
-}));
diff --git a/examples/hash-router/package.json b/examples/hash-router/package.json
deleted file mode 100644
index fa954b243f..0000000000
--- a/examples/hash-router/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "@examples/hash-router-demo",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- }
-}
\ No newline at end of file
diff --git a/examples/hash-router/src/app.tsx b/examples/hash-router/src/app.tsx
deleted file mode 100644
index b407f0795c..0000000000
--- a/examples/hash-router/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- router: {
- type: 'hash',
- },
-}));
diff --git a/examples/hash-router/src/document.tsx b/examples/hash-router/src/document.tsx
deleted file mode 100644
index 89a9f1af81..0000000000
--- a/examples/hash-router/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
\ No newline at end of file
diff --git a/examples/hash-router/src/pages/about.tsx b/examples/hash-router/src/pages/about.tsx
deleted file mode 100644
index 9e189d83b9..0000000000
--- a/examples/hash-router/src/pages/about.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- About Page
- Home
- >
- );
-}
diff --git a/examples/hash-router/src/pages/index.tsx b/examples/hash-router/src/pages/index.tsx
deleted file mode 100644
index dbc8578e50..0000000000
--- a/examples/hash-router/src/pages/index.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- Home
- about
- >
- );
-}
diff --git a/examples/hash-router/src/pages/layout.tsx b/examples/hash-router/src/pages/layout.tsx
deleted file mode 100644
index 27290b878e..0000000000
--- a/examples/hash-router/src/pages/layout.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Outlet, useConfig } from 'ice';
-
-export default () => {
- const config = useConfig();
- return (
-
-
Layout
- {config.title}
-
-
- );
-};
-
-export function pageConfig() {
- return {
- title: 'Hash Router Demo',
- };
-}
diff --git a/examples/hash-router/tsconfig.json b/examples/hash-router/tsconfig.json
deleted file mode 100644
index 7f2f2ffce9..0000000000
--- a/examples/hash-router/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/icestark-child/ice.config.mts b/examples/icestark-child/ice.config.mts
deleted file mode 100644
index 363f7d68f1..0000000000
--- a/examples/icestark-child/ice.config.mts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineConfig } from '@ice/app';
-import icestark from '@ice/plugin-icestark';
-
-export default defineConfig(() => ({
- plugins: [
- icestark({
- type: 'child',
- }),
- ]
-}));
diff --git a/examples/icestark-child/package.json b/examples/icestark-child/package.json
deleted file mode 100644
index 57265c2a30..0000000000
--- a/examples/icestark-child/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@examples/icestarkchild",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-icestark": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/icestark-child/public/favicon.ico b/examples/icestark-child/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/icestark-child/public/favicon.ico and /dev/null differ
diff --git a/examples/icestark-child/src/app.tsx b/examples/icestark-child/src/app.tsx
deleted file mode 100644
index a5ce60b9fe..0000000000
--- a/examples/icestark-child/src/app.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { defineAppConfig } from 'ice';
-import { defineChildConfig } from '@ice/plugin-icestark/types';
-
-export const icestark = defineChildConfig(() => {
- return {
- mount: () => {
- console.log('mount');
- },
- unmount: () => {
- console.log('unmount');
- },
- };
-});
-
-let basename = '/';
-
-if (typeof window !== 'undefined') {
- if (window.ICESTARK?.basename) {
- basename = window.ICESTARK.basename;
- } else if (window.__POWERED_BY_QIANKUN__) {
- basename = '/child';
- }
-}
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
- router: {
- basename,
- },
-}));
diff --git a/examples/icestark-child/src/document.tsx b/examples/icestark-child/src/document.tsx
deleted file mode 100644
index 5a3d61e38d..0000000000
--- a/examples/icestark-child/src/document.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Meta, Title, Links, Main, Scripts, useAppData } from 'ice';
-import type { AppData } from '@/types';
-
-function Document() {
- const appData = useAppData();
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/icestark-child/src/pages/about.tsx b/examples/icestark-child/src/pages/about.tsx
deleted file mode 100644
index 78d823e59a..0000000000
--- a/examples/icestark-child/src/pages/about.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function About() {
- return (
- <>
- About Page
- home
- >
- );
-}
\ No newline at end of file
diff --git a/examples/icestark-child/src/pages/index.tsx b/examples/icestark-child/src/pages/index.tsx
deleted file mode 100644
index 791622efa7..0000000000
--- a/examples/icestark-child/src/pages/index.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- Home Page
- about
- >
- );
-}
diff --git a/examples/icestark-child/src/typings.d.ts b/examples/icestark-child/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/icestark-child/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/icestark-child/tsconfig.json b/examples/icestark-child/tsconfig.json
deleted file mode 100644
index 6584fa600c..0000000000
--- a/examples/icestark-child/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "ESNext",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/icestark-layout/ice.config.mts b/examples/icestark-layout/ice.config.mts
deleted file mode 100644
index fdf90cd82b..0000000000
--- a/examples/icestark-layout/ice.config.mts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { defineConfig } from '@ice/app';
-import icestark from '@ice/plugin-icestark';
-
-export default defineConfig(() => ({
- ssr: false,
- ssg: false,
- plugins: [
- icestark({
- type: 'framework',
- }),
- {
- setup({ onGetConfig }) {
- // Enable option `enableCopyPlugin`, so devserver can access public folder when run test.
- if (process.env.NODE_ENV === 'test') {
- onGetConfig((config) => {
- return {
- ...config,
- enableCopyPlugin: true,
- }
- });
- }
- }
- }
- ]
-}));
diff --git a/examples/icestark-layout/package.json b/examples/icestark-layout/package.json
deleted file mode 100644
index f5ac39e924..0000000000
--- a/examples/icestark-layout/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "@examples/icestark-framework",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/stark-app": "^1.5.0",
- "@ice/plugin-icestark": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/icestark-layout/public/favicon.ico b/examples/icestark-layout/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/icestark-layout/public/favicon.ico and /dev/null differ
diff --git a/examples/icestark-layout/public/page-seller/assets/index.css b/examples/icestark-layout/public/page-seller/assets/index.css
deleted file mode 100644
index eb914507a6..0000000000
--- a/examples/icestark-layout/public/page-seller/assets/index.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.next-icon-alibaba:before{content:"\e7bf"}.next-icon-ic_dashboard:before{content:"\e7e2"}.next-icon-ic_form:before{content:"\e7e1"}.next-icon-ic_formbeifen:before{content:"\e7e0"}.next-icon-ic_language:before{content:"\e7da"}.next-icon-ic_logo:before{content:"\e79d"}.next-icon-ic_tongzhi:before{content:"\e749"}.next-icon-ic_yusuanguanli:before{content:"\e745"}.next-icon-taobao:before{content:"\e7be"}body{margin:0}.icestark-child-app .next-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;top:0;margin:-1px}.icestark-child-app html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}.icestark-child-app body{margin:0}.icestark-child-app article,.icestark-child-app aside,.icestark-child-app footer,.icestark-child-app header,.icestark-child-app nav,.icestark-child-app section{display:block}.icestark-child-app h1{font-size:2em;margin:.67em 0}.icestark-child-app figcaption,.icestark-child-app figure,.icestark-child-app main{display:block}.icestark-child-app figure{margin:1em 40px}.icestark-child-app hr{box-sizing:content-box;height:0;overflow:visible}.icestark-child-app pre{font-family:monospace,monospace;font-size:1em}.icestark-child-app a{background-color:transparent;-webkit-text-decoration-skip:objects}.icestark-child-app abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}.icestark-child-app b,.icestark-child-app strong{font-weight:inherit}.icestark-child-app b,.icestark-child-app strong{font-weight:bolder}.icestark-child-app code,.icestark-child-app kbd,.icestark-child-app samp{font-family:monospace,monospace;font-size:1em}.icestark-child-app dfn{font-style:italic}.icestark-child-app mark{background-color:#ff0;color:#000}.icestark-child-app small{font-size:80%}.icestark-child-app sub,.icestark-child-app sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.icestark-child-app sub{bottom:-.25em}.icestark-child-app sup{top:-.5em}.icestark-child-app audio,.icestark-child-app video{display:inline-block}.icestark-child-app audio:not([controls]){display:none;height:0}.icestark-child-app img{border-style:none}.icestark-child-app svg:not(:root){overflow:hidden}.icestark-child-app button,.icestark-child-app input,.icestark-child-app optgroup,.icestark-child-app select,.icestark-child-app textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.icestark-child-app button,.icestark-child-app input{overflow:visible}.icestark-child-app button,.icestark-child-app select{text-transform:none}.icestark-child-app button,.icestark-child-app html [type=button],.icestark-child-app [type=reset],.icestark-child-app [type=submit]{-webkit-appearance:button}.icestark-child-app button::-moz-focus-inner,.icestark-child-app [type=button]::-moz-focus-inner,.icestark-child-app [type=reset]::-moz-focus-inner,.icestark-child-app [type=submit]::-moz-focus-inner{border-style:none;padding:0}.icestark-child-app button:-moz-focusring,.icestark-child-app [type=button]:-moz-focusring,.icestark-child-app [type=reset]:-moz-focusring,.icestark-child-app [type=submit]:-moz-focusring{outline:1px dotted ButtonText}.icestark-child-app fieldset{padding:.35em .75em .625em}.icestark-child-app legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.icestark-child-app progress{display:inline-block;vertical-align:baseline}.icestark-child-app textarea{overflow:auto}.icestark-child-app [type=checkbox],.icestark-child-app [type=radio]{box-sizing:border-box;padding:0}.icestark-child-app [type=number]::-webkit-inner-spin-button,.icestark-child-app [type=number]::-webkit-outer-spin-button{height:auto}.icestark-child-app [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.icestark-child-app [type=search]::-webkit-search-cancel-button,.icestark-child-app [type=search]::-webkit-search-decoration{-webkit-appearance:none}.icestark-child-app ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.icestark-child-app details,.icestark-child-app menu{display:block}.icestark-child-app summary{display:list-item}.icestark-child-app canvas{display:inline-block}.icestark-child-app template{display:none}.icestark-child-app [hidden]{display:none}.icestark-child-app *,.icestark-child-app *:before,.icestark-child-app *:after{box-sizing:border-box}.icestark-child-app ul,.icestark-child-app ol{list-style:none;margin:0;padding:0}.icestark-child-app li{margin-left:0}.icestark-child-app hr{border:0 solid #E6E6E6;border-top-width:1px}.icestark-child-app a{text-decoration:none}.icestark-child-app a:link{color:#298dff}.icestark-child-app a:visited{color:#4a83c5}.icestark-child-app a:hover{color:#2580e7}.icestark-child-app a:active{text-decoration:underline;color:#2580e7}@font-face{.icestark-child-app {font-family: "Roboto"; src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.eot); src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.eot?#iefix) format("embedded-opentype"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.woff2) format("woff2"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.woff) format("woff"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.ttf) format("truetype"); font-weight: 200;}}@font-face{.icestark-child-app {font-family: "Roboto"; src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-light.eot); src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-light.eot?#iefix) format("embedded-opentype"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-light.woff2) format("woff2"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-light.woff) format("woff"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-light.ttf) format("truetype"); font-weight: 300;}}@font-face{.icestark-child-app {font-family: "Roboto"; src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.eot); src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.eot?#iefix) format("embedded-opentype"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.woff2) format("woff2"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.woff) format("woff"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.ttf) format("truetype"); font-weight: 400;}}@font-face{.icestark-child-app {font-family: "Roboto"; src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.eot); src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.eot?#iefix) format("embedded-opentype"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.woff2) format("woff2"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.woff) format("woff"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.ttf) format("truetype"); font-weight: 500;}}@font-face{.icestark-child-app {font-family: "Roboto"; src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.eot); src: url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.eot?#iefix) format("embedded-opentype"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.woff2) format("woff2"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.woff) format("woff"),url(http://i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.ttf) format("truetype"); font-weight: 700;}}.icestark-child-app html{font-size:100%}.icestark-child-app body{font-family:Roboto,"Helvetica Neue",Helvetica,Tahoma,Arial,"PingFang SC","Microsoft YaHei";font-size:14px;line-height:1.2857142;color:#333}.icestark-child-app button,.icestark-child-app input,.icestark-child-app optgroup,.icestark-child-app select,.icestark-child-app textarea{font-family:inherit}.icestark-child-app h1 a,.icestark-child-app h2 a,.icestark-child-app h3 a,.icestark-child-app h4 a,.icestark-child-app h5 a,.icestark-child-app h6 a{font-weight:inherit}.icestark-child-app h1{margin-bottom:calc(24px * .5);font-size:24px;font-weight:500;line-height:36px}.icestark-child-app h2{margin-bottom:calc(20px * .5);font-size:20px;font-weight:500;line-height:30px}.icestark-child-app h3{margin-bottom:calc(16px * .5);font-size:16px;font-weight:normal;line-height:24px}.icestark-child-app h4{margin-bottom:calc(16px * .5);font-size:16px;font-weight:normal;line-height:24px}.icestark-child-app h5{margin-bottom:calc(14px * .5);font-size:14px;font-weight:normal;line-height:24px}.icestark-child-app h6{margin-bottom:calc(14px * .5);font-size:14px;font-weight:500;line-height:20px}.icestark-child-app p{margin-bottom:calc(14px * .5);font-size:14px;font-weight:normal;line-height:20px}.icestark-child-app strong{font-weight:500}.icestark-child-app small{font-size:75%}._title_57gr7_20{margin:20px 20px 0}.next-row{box-sizing:border-box;display:flex}.next-row *,.next-row *:before,.next-row *:after{box-sizing:border-box}.next-row.next-row-wrap{flex-wrap:wrap}@media (min-width: 320px){.next-row.next-row-fixed{width:320px}}@media (min-width: 480px){.next-row.next-row-fixed{width:480px}}@media (min-width: 720px){.next-row.next-row-fixed{width:720px}}@media (min-width: 990px){.next-row.next-row-fixed{width:990px}}@media (min-width: 1200px){.next-row.next-row-fixed{width:1200px}}@media (min-width: 1500px){.next-row.next-row-fixed{width:1500px}}.next-row.next-row-fixed-xxs{width:320px}.next-row.next-row-fixed-xs{width:480px}.next-row.next-row-fixed-s{width:720px}.next-row.next-row-fixed-m{width:990px}.next-row.next-row-fixed-l{width:1200px}.next-row.next-row-fixed-xl{width:1500px}.next-row.next-row-justify-start{justify-content:flex-start}.next-row.next-row-justify-end{justify-content:flex-end}.next-row.next-row-justify-center{justify-content:center}.next-row.next-row-justify-space-between{justify-content:space-between}.next-row.next-row-justify-space-around{justify-content:space-around}.next-row.next-row-align-top{align-items:flex-start}.next-row.next-row-align-bottom{align-items:flex-end}.next-row.next-row-align-center{align-items:center}.next-row.next-row-align-baseline{align-items:baseline}.next-row.next-row-align-stretch{align-items:stretch}.next-col{flex:1}.next-col.next-col-top{align-self:flex-start}.next-col.next-col-bottom{align-self:flex-end}.next-col.next-col-center{align-self:center}@media all and (min-width: 0\fffd) and (min-resolution: .001dpcm){.next-row{display:table;width:100%}.next-col{display:table-cell;vertical-align:top}}.next-col-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-24{flex:0 0 100%;width:100%;max-width:100%}@media (min-width: 320px){.next-col-xxs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xxs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xxs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xxs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xxs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xxs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xxs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xxs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xxs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xxs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xxs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xxs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xxs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xxs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xxs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xxs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xxs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xxs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xxs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xxs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xxs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xxs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xxs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xxs-24{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 480px){.next-col-xs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xs-24{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 720px){.next-col-s-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-s-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-s-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-s-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-s-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-s-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-s-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-s-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-s-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-s-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-s-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-s-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-s-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-s-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-s-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-s-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-s-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-s-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-s-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-s-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-s-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-s-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-s-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-s-24{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 990px){.next-col-m-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-m-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-m-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-m-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-m-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-m-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-m-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-m-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-m-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-m-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-m-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-m-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-m-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-m-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-m-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-m-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-m-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-m-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-m-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-m-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-m-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-m-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-m-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-m-24{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 1200px){.next-col-l-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-l-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-l-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-l-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-l-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-l-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-l-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-l-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-l-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-l-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-l-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-l-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-l-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-l-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-l-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-l-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-l-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-l-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-l-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-l-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-l-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-l-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-l-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-l-24{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 1500px){.next-col-xl-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xl-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xl-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xl-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xl-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xl-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xl-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xl-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xl-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xl-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xl-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xl-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xl-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xl-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xl-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xl-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xl-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xl-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xl-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xl-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xl-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xl-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xl-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xl-24{flex:0 0 100%;width:100%;max-width:100%}}.next-col-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-5p5{flex:0 0 100%;width:100%;max-width:100%}@media (min-width: 320px){.next-col-xxs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xxs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xxs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xxs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xxs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 480px){.next-col-xs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 720px){.next-col-s-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-s-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-s-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-s-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-s-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 990px){.next-col-m-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-m-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-m-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-m-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-m-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 1200px){.next-col-l-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-l-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-l-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-l-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-l-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media (min-width: 1500px){.next-col-xl-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xl-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xl-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xl-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xl-5p5{flex:0 0 100%;width:100%;max-width:100%}}.next-col-fixed-1{flex:0 0 calc(1 * 20px);width:calc(1 * 20px);max-width:calc(1 * 20px)}.next-col-fixed-2{flex:0 0 calc(2 * 20px);width:calc(2 * 20px);max-width:calc(2 * 20px)}.next-col-fixed-3{flex:0 0 calc(3 * 20px);width:calc(3 * 20px);max-width:calc(3 * 20px)}.next-col-fixed-4{flex:0 0 calc(4 * 20px);width:calc(4 * 20px);max-width:calc(4 * 20px)}.next-col-fixed-5{flex:0 0 calc(5 * 20px);width:calc(5 * 20px);max-width:calc(5 * 20px)}.next-col-fixed-6{flex:0 0 calc(6 * 20px);width:calc(6 * 20px);max-width:calc(6 * 20px)}.next-col-fixed-7{flex:0 0 calc(7 * 20px);width:calc(7 * 20px);max-width:calc(7 * 20px)}.next-col-fixed-8{flex:0 0 calc(8 * 20px);width:calc(8 * 20px);max-width:calc(8 * 20px)}.next-col-fixed-9{flex:0 0 calc(9 * 20px);width:calc(9 * 20px);max-width:calc(9 * 20px)}.next-col-fixed-10{flex:0 0 calc(10 * 20px);width:calc(10 * 20px);max-width:calc(10 * 20px)}.next-col-fixed-11{flex:0 0 calc(11 * 20px);width:calc(11 * 20px);max-width:calc(11 * 20px)}.next-col-fixed-12{flex:0 0 calc(12 * 20px);width:calc(12 * 20px);max-width:calc(12 * 20px)}.next-col-fixed-13{flex:0 0 calc(13 * 20px);width:calc(13 * 20px);max-width:calc(13 * 20px)}.next-col-fixed-14{flex:0 0 calc(14 * 20px);width:calc(14 * 20px);max-width:calc(14 * 20px)}.next-col-fixed-15{flex:0 0 calc(15 * 20px);width:calc(15 * 20px);max-width:calc(15 * 20px)}.next-col-fixed-16{flex:0 0 calc(16 * 20px);width:calc(16 * 20px);max-width:calc(16 * 20px)}.next-col-fixed-17{flex:0 0 calc(17 * 20px);width:calc(17 * 20px);max-width:calc(17 * 20px)}.next-col-fixed-18{flex:0 0 calc(18 * 20px);width:calc(18 * 20px);max-width:calc(18 * 20px)}.next-col-fixed-19{flex:0 0 calc(19 * 20px);width:calc(19 * 20px);max-width:calc(19 * 20px)}.next-col-fixed-20{flex:0 0 calc(20 * 20px);width:calc(20 * 20px);max-width:calc(20 * 20px)}.next-col-fixed-21{flex:0 0 calc(21 * 20px);width:calc(21 * 20px);max-width:calc(21 * 20px)}.next-col-fixed-22{flex:0 0 calc(22 * 20px);width:calc(22 * 20px);max-width:calc(22 * 20px)}.next-col-fixed-23{flex:0 0 calc(23 * 20px);width:calc(23 * 20px);max-width:calc(23 * 20px)}.next-col-fixed-24{flex:0 0 calc(24 * 20px);width:calc(24 * 20px);max-width:calc(24 * 20px)}.next-col-fixed-25{flex:0 0 calc(25 * 20px);width:calc(25 * 20px);max-width:calc(25 * 20px)}.next-col-fixed-26{flex:0 0 calc(26 * 20px);width:calc(26 * 20px);max-width:calc(26 * 20px)}.next-col-fixed-27{flex:0 0 calc(27 * 20px);width:calc(27 * 20px);max-width:calc(27 * 20px)}.next-col-fixed-28{flex:0 0 calc(28 * 20px);width:calc(28 * 20px);max-width:calc(28 * 20px)}.next-col-fixed-29{flex:0 0 calc(29 * 20px);width:calc(29 * 20px);max-width:calc(29 * 20px)}.next-col-fixed-30{flex:0 0 calc(30 * 20px);width:calc(30 * 20px);max-width:calc(30 * 20px)}.next-col-offset-1{margin-left:4.1666666667%}.next-col-offset-2{margin-left:8.3333333333%}.next-col-offset-3{margin-left:12.5%}.next-col-offset-4{margin-left:16.6666666667%}.next-col-offset-5{margin-left:20.8333333333%}.next-col-offset-6{margin-left:25%}.next-col-offset-7{margin-left:29.1666666667%}.next-col-offset-8{margin-left:33.3333333333%}.next-col-offset-9{margin-left:37.5%}.next-col-offset-10{margin-left:41.6666666667%}.next-col-offset-11{margin-left:45.8333333333%}.next-col-offset-12{margin-left:50%}.next-col-offset-13{margin-left:54.1666666667%}.next-col-offset-14{margin-left:58.3333333333%}.next-col-offset-15{margin-left:62.5%}.next-col-offset-16{margin-left:66.6666666667%}.next-col-offset-17{margin-left:70.8333333333%}.next-col-offset-18{margin-left:75%}.next-col-offset-19{margin-left:79.1666666667%}.next-col-offset-20{margin-left:83.3333333333%}.next-col-offset-21{margin-left:87.5%}.next-col-offset-22{margin-left:91.6666666667%}.next-col-offset-23{margin-left:95.8333333333%}.next-col-offset-24{margin-left:100%}@media (min-width: 320px){.next-col-xxs-offset-1{margin-left:4.1666666667%}.next-col-xxs-offset-2{margin-left:8.3333333333%}.next-col-xxs-offset-3{margin-left:12.5%}.next-col-xxs-offset-4{margin-left:16.6666666667%}.next-col-xxs-offset-5{margin-left:20.8333333333%}.next-col-xxs-offset-6{margin-left:25%}.next-col-xxs-offset-7{margin-left:29.1666666667%}.next-col-xxs-offset-8{margin-left:33.3333333333%}.next-col-xxs-offset-9{margin-left:37.5%}.next-col-xxs-offset-10{margin-left:41.6666666667%}.next-col-xxs-offset-11{margin-left:45.8333333333%}.next-col-xxs-offset-12{margin-left:50%}.next-col-xxs-offset-13{margin-left:54.1666666667%}.next-col-xxs-offset-14{margin-left:58.3333333333%}.next-col-xxs-offset-15{margin-left:62.5%}.next-col-xxs-offset-16{margin-left:66.6666666667%}.next-col-xxs-offset-17{margin-left:70.8333333333%}.next-col-xxs-offset-18{margin-left:75%}.next-col-xxs-offset-19{margin-left:79.1666666667%}.next-col-xxs-offset-20{margin-left:83.3333333333%}.next-col-xxs-offset-21{margin-left:87.5%}.next-col-xxs-offset-22{margin-left:91.6666666667%}.next-col-xxs-offset-23{margin-left:95.8333333333%}.next-col-xxs-offset-24{margin-left:100%}}@media (min-width: 480px){.next-col-xs-offset-1{margin-left:4.1666666667%}.next-col-xs-offset-2{margin-left:8.3333333333%}.next-col-xs-offset-3{margin-left:12.5%}.next-col-xs-offset-4{margin-left:16.6666666667%}.next-col-xs-offset-5{margin-left:20.8333333333%}.next-col-xs-offset-6{margin-left:25%}.next-col-xs-offset-7{margin-left:29.1666666667%}.next-col-xs-offset-8{margin-left:33.3333333333%}.next-col-xs-offset-9{margin-left:37.5%}.next-col-xs-offset-10{margin-left:41.6666666667%}.next-col-xs-offset-11{margin-left:45.8333333333%}.next-col-xs-offset-12{margin-left:50%}.next-col-xs-offset-13{margin-left:54.1666666667%}.next-col-xs-offset-14{margin-left:58.3333333333%}.next-col-xs-offset-15{margin-left:62.5%}.next-col-xs-offset-16{margin-left:66.6666666667%}.next-col-xs-offset-17{margin-left:70.8333333333%}.next-col-xs-offset-18{margin-left:75%}.next-col-xs-offset-19{margin-left:79.1666666667%}.next-col-xs-offset-20{margin-left:83.3333333333%}.next-col-xs-offset-21{margin-left:87.5%}.next-col-xs-offset-22{margin-left:91.6666666667%}.next-col-xs-offset-23{margin-left:95.8333333333%}.next-col-xs-offset-24{margin-left:100%}}@media (min-width: 720px){.next-col-s-offset-1{margin-left:4.1666666667%}.next-col-s-offset-2{margin-left:8.3333333333%}.next-col-s-offset-3{margin-left:12.5%}.next-col-s-offset-4{margin-left:16.6666666667%}.next-col-s-offset-5{margin-left:20.8333333333%}.next-col-s-offset-6{margin-left:25%}.next-col-s-offset-7{margin-left:29.1666666667%}.next-col-s-offset-8{margin-left:33.3333333333%}.next-col-s-offset-9{margin-left:37.5%}.next-col-s-offset-10{margin-left:41.6666666667%}.next-col-s-offset-11{margin-left:45.8333333333%}.next-col-s-offset-12{margin-left:50%}.next-col-s-offset-13{margin-left:54.1666666667%}.next-col-s-offset-14{margin-left:58.3333333333%}.next-col-s-offset-15{margin-left:62.5%}.next-col-s-offset-16{margin-left:66.6666666667%}.next-col-s-offset-17{margin-left:70.8333333333%}.next-col-s-offset-18{margin-left:75%}.next-col-s-offset-19{margin-left:79.1666666667%}.next-col-s-offset-20{margin-left:83.3333333333%}.next-col-s-offset-21{margin-left:87.5%}.next-col-s-offset-22{margin-left:91.6666666667%}.next-col-s-offset-23{margin-left:95.8333333333%}.next-col-s-offset-24{margin-left:100%}}@media (min-width: 990px){.next-col-m-offset-1{margin-left:4.1666666667%}.next-col-m-offset-2{margin-left:8.3333333333%}.next-col-m-offset-3{margin-left:12.5%}.next-col-m-offset-4{margin-left:16.6666666667%}.next-col-m-offset-5{margin-left:20.8333333333%}.next-col-m-offset-6{margin-left:25%}.next-col-m-offset-7{margin-left:29.1666666667%}.next-col-m-offset-8{margin-left:33.3333333333%}.next-col-m-offset-9{margin-left:37.5%}.next-col-m-offset-10{margin-left:41.6666666667%}.next-col-m-offset-11{margin-left:45.8333333333%}.next-col-m-offset-12{margin-left:50%}.next-col-m-offset-13{margin-left:54.1666666667%}.next-col-m-offset-14{margin-left:58.3333333333%}.next-col-m-offset-15{margin-left:62.5%}.next-col-m-offset-16{margin-left:66.6666666667%}.next-col-m-offset-17{margin-left:70.8333333333%}.next-col-m-offset-18{margin-left:75%}.next-col-m-offset-19{margin-left:79.1666666667%}.next-col-m-offset-20{margin-left:83.3333333333%}.next-col-m-offset-21{margin-left:87.5%}.next-col-m-offset-22{margin-left:91.6666666667%}.next-col-m-offset-23{margin-left:95.8333333333%}.next-col-m-offset-24{margin-left:100%}}@media (min-width: 1200px){.next-col-l-offset-1{margin-left:4.1666666667%}.next-col-l-offset-2{margin-left:8.3333333333%}.next-col-l-offset-3{margin-left:12.5%}.next-col-l-offset-4{margin-left:16.6666666667%}.next-col-l-offset-5{margin-left:20.8333333333%}.next-col-l-offset-6{margin-left:25%}.next-col-l-offset-7{margin-left:29.1666666667%}.next-col-l-offset-8{margin-left:33.3333333333%}.next-col-l-offset-9{margin-left:37.5%}.next-col-l-offset-10{margin-left:41.6666666667%}.next-col-l-offset-11{margin-left:45.8333333333%}.next-col-l-offset-12{margin-left:50%}.next-col-l-offset-13{margin-left:54.1666666667%}.next-col-l-offset-14{margin-left:58.3333333333%}.next-col-l-offset-15{margin-left:62.5%}.next-col-l-offset-16{margin-left:66.6666666667%}.next-col-l-offset-17{margin-left:70.8333333333%}.next-col-l-offset-18{margin-left:75%}.next-col-l-offset-19{margin-left:79.1666666667%}.next-col-l-offset-20{margin-left:83.3333333333%}.next-col-l-offset-21{margin-left:87.5%}.next-col-l-offset-22{margin-left:91.6666666667%}.next-col-l-offset-23{margin-left:95.8333333333%}.next-col-l-offset-24{margin-left:100%}}@media (min-width: 1500px){.next-col-xl-offset-1{margin-left:4.1666666667%}.next-col-xl-offset-2{margin-left:8.3333333333%}.next-col-xl-offset-3{margin-left:12.5%}.next-col-xl-offset-4{margin-left:16.6666666667%}.next-col-xl-offset-5{margin-left:20.8333333333%}.next-col-xl-offset-6{margin-left:25%}.next-col-xl-offset-7{margin-left:29.1666666667%}.next-col-xl-offset-8{margin-left:33.3333333333%}.next-col-xl-offset-9{margin-left:37.5%}.next-col-xl-offset-10{margin-left:41.6666666667%}.next-col-xl-offset-11{margin-left:45.8333333333%}.next-col-xl-offset-12{margin-left:50%}.next-col-xl-offset-13{margin-left:54.1666666667%}.next-col-xl-offset-14{margin-left:58.3333333333%}.next-col-xl-offset-15{margin-left:62.5%}.next-col-xl-offset-16{margin-left:66.6666666667%}.next-col-xl-offset-17{margin-left:70.8333333333%}.next-col-xl-offset-18{margin-left:75%}.next-col-xl-offset-19{margin-left:79.1666666667%}.next-col-xl-offset-20{margin-left:83.3333333333%}.next-col-xl-offset-21{margin-left:87.5%}.next-col-xl-offset-22{margin-left:91.6666666667%}.next-col-xl-offset-23{margin-left:95.8333333333%}.next-col-xl-offset-24{margin-left:100%}}.next-col-offset-fixed-1{margin-left:calc(1 * 20px)}.next-col-offset-fixed-2{margin-left:calc(2 * 20px)}.next-col-offset-fixed-3{margin-left:calc(3 * 20px)}.next-col-offset-fixed-4{margin-left:calc(4 * 20px)}.next-col-offset-fixed-5{margin-left:calc(5 * 20px)}.next-col-offset-fixed-6{margin-left:calc(6 * 20px)}.next-col-offset-fixed-7{margin-left:calc(7 * 20px)}.next-col-offset-fixed-8{margin-left:calc(8 * 20px)}.next-col-offset-fixed-9{margin-left:calc(9 * 20px)}.next-col-offset-fixed-10{margin-left:calc(10 * 20px)}.next-col-offset-fixed-11{margin-left:calc(11 * 20px)}.next-col-offset-fixed-12{margin-left:calc(12 * 20px)}.next-col-offset-fixed-13{margin-left:calc(13 * 20px)}.next-col-offset-fixed-14{margin-left:calc(14 * 20px)}.next-col-offset-fixed-15{margin-left:calc(15 * 20px)}.next-col-offset-fixed-16{margin-left:calc(16 * 20px)}.next-col-offset-fixed-17{margin-left:calc(17 * 20px)}.next-col-offset-fixed-18{margin-left:calc(18 * 20px)}.next-col-offset-fixed-19{margin-left:calc(19 * 20px)}.next-col-offset-fixed-20{margin-left:calc(20 * 20px)}.next-col-offset-fixed-21{margin-left:calc(21 * 20px)}.next-col-offset-fixed-22{margin-left:calc(22 * 20px)}.next-col-offset-fixed-23{margin-left:calc(23 * 20px)}.next-col-offset-fixed-24{margin-left:calc(24 * 20px)}.next-col-offset-fixed-25{margin-left:calc(25 * 20px)}.next-col-offset-fixed-26{margin-left:calc(26 * 20px)}.next-col-offset-fixed-27{margin-left:calc(27 * 20px)}.next-col-offset-fixed-28{margin-left:calc(28 * 20px)}.next-col-offset-fixed-29{margin-left:calc(29 * 20px)}.next-col-offset-fixed-30{margin-left:calc(30 * 20px)}.next-col-offset-fixed-xxs-1{margin-left:calc(1 * 20px)}.next-col-offset-fixed-xxs-2{margin-left:calc(2 * 20px)}.next-col-offset-fixed-xxs-3{margin-left:calc(3 * 20px)}.next-col-offset-fixed-xxs-4{margin-left:calc(4 * 20px)}.next-col-offset-fixed-xxs-5{margin-left:calc(5 * 20px)}.next-col-offset-fixed-xxs-6{margin-left:calc(6 * 20px)}.next-col-offset-fixed-xxs-7{margin-left:calc(7 * 20px)}.next-col-offset-fixed-xxs-8{margin-left:calc(8 * 20px)}.next-col-offset-fixed-xxs-9{margin-left:calc(9 * 20px)}.next-col-offset-fixed-xxs-10{margin-left:calc(10 * 20px)}.next-col-offset-fixed-xxs-11{margin-left:calc(11 * 20px)}.next-col-offset-fixed-xxs-12{margin-left:calc(12 * 20px)}.next-col-offset-fixed-xxs-13{margin-left:calc(13 * 20px)}.next-col-offset-fixed-xxs-14{margin-left:calc(14 * 20px)}.next-col-offset-fixed-xxs-15{margin-left:calc(15 * 20px)}.next-col-offset-fixed-xxs-16{margin-left:calc(16 * 20px)}.next-col-offset-fixed-xxs-17{margin-left:calc(17 * 20px)}.next-col-offset-fixed-xxs-18{margin-left:calc(18 * 20px)}.next-col-offset-fixed-xxs-19{margin-left:calc(19 * 20px)}.next-col-offset-fixed-xxs-20{margin-left:calc(20 * 20px)}.next-col-offset-fixed-xxs-21{margin-left:calc(21 * 20px)}.next-col-offset-fixed-xxs-22{margin-left:calc(22 * 20px)}.next-col-offset-fixed-xxs-23{margin-left:calc(23 * 20px)}.next-col-offset-fixed-xxs-24{margin-left:calc(24 * 20px)}.next-col-offset-fixed-xxs-25{margin-left:calc(25 * 20px)}.next-col-offset-fixed-xxs-26{margin-left:calc(26 * 20px)}.next-col-offset-fixed-xxs-27{margin-left:calc(27 * 20px)}.next-col-offset-fixed-xxs-28{margin-left:calc(28 * 20px)}.next-col-offset-fixed-xxs-29{margin-left:calc(29 * 20px)}.next-col-offset-fixed-xxs-30{margin-left:calc(30 * 20px)}.next-col-offset-fixed-xs-1{margin-left:calc(1 * 20px)}.next-col-offset-fixed-xs-2{margin-left:calc(2 * 20px)}.next-col-offset-fixed-xs-3{margin-left:calc(3 * 20px)}.next-col-offset-fixed-xs-4{margin-left:calc(4 * 20px)}.next-col-offset-fixed-xs-5{margin-left:calc(5 * 20px)}.next-col-offset-fixed-xs-6{margin-left:calc(6 * 20px)}.next-col-offset-fixed-xs-7{margin-left:calc(7 * 20px)}.next-col-offset-fixed-xs-8{margin-left:calc(8 * 20px)}.next-col-offset-fixed-xs-9{margin-left:calc(9 * 20px)}.next-col-offset-fixed-xs-10{margin-left:calc(10 * 20px)}.next-col-offset-fixed-xs-11{margin-left:calc(11 * 20px)}.next-col-offset-fixed-xs-12{margin-left:calc(12 * 20px)}.next-col-offset-fixed-xs-13{margin-left:calc(13 * 20px)}.next-col-offset-fixed-xs-14{margin-left:calc(14 * 20px)}.next-col-offset-fixed-xs-15{margin-left:calc(15 * 20px)}.next-col-offset-fixed-xs-16{margin-left:calc(16 * 20px)}.next-col-offset-fixed-xs-17{margin-left:calc(17 * 20px)}.next-col-offset-fixed-xs-18{margin-left:calc(18 * 20px)}.next-col-offset-fixed-xs-19{margin-left:calc(19 * 20px)}.next-col-offset-fixed-xs-20{margin-left:calc(20 * 20px)}.next-col-offset-fixed-xs-21{margin-left:calc(21 * 20px)}.next-col-offset-fixed-xs-22{margin-left:calc(22 * 20px)}.next-col-offset-fixed-xs-23{margin-left:calc(23 * 20px)}.next-col-offset-fixed-xs-24{margin-left:calc(24 * 20px)}.next-col-offset-fixed-xs-25{margin-left:calc(25 * 20px)}.next-col-offset-fixed-xs-26{margin-left:calc(26 * 20px)}.next-col-offset-fixed-xs-27{margin-left:calc(27 * 20px)}.next-col-offset-fixed-xs-28{margin-left:calc(28 * 20px)}.next-col-offset-fixed-xs-29{margin-left:calc(29 * 20px)}.next-col-offset-fixed-xs-30{margin-left:calc(30 * 20px)}.next-col-offset-fixed-s-1{margin-left:calc(1 * 20px)}.next-col-offset-fixed-s-2{margin-left:calc(2 * 20px)}.next-col-offset-fixed-s-3{margin-left:calc(3 * 20px)}.next-col-offset-fixed-s-4{margin-left:calc(4 * 20px)}.next-col-offset-fixed-s-5{margin-left:calc(5 * 20px)}.next-col-offset-fixed-s-6{margin-left:calc(6 * 20px)}.next-col-offset-fixed-s-7{margin-left:calc(7 * 20px)}.next-col-offset-fixed-s-8{margin-left:calc(8 * 20px)}.next-col-offset-fixed-s-9{margin-left:calc(9 * 20px)}.next-col-offset-fixed-s-10{margin-left:calc(10 * 20px)}.next-col-offset-fixed-s-11{margin-left:calc(11 * 20px)}.next-col-offset-fixed-s-12{margin-left:calc(12 * 20px)}.next-col-offset-fixed-s-13{margin-left:calc(13 * 20px)}.next-col-offset-fixed-s-14{margin-left:calc(14 * 20px)}.next-col-offset-fixed-s-15{margin-left:calc(15 * 20px)}.next-col-offset-fixed-s-16{margin-left:calc(16 * 20px)}.next-col-offset-fixed-s-17{margin-left:calc(17 * 20px)}.next-col-offset-fixed-s-18{margin-left:calc(18 * 20px)}.next-col-offset-fixed-s-19{margin-left:calc(19 * 20px)}.next-col-offset-fixed-s-20{margin-left:calc(20 * 20px)}.next-col-offset-fixed-s-21{margin-left:calc(21 * 20px)}.next-col-offset-fixed-s-22{margin-left:calc(22 * 20px)}.next-col-offset-fixed-s-23{margin-left:calc(23 * 20px)}.next-col-offset-fixed-s-24{margin-left:calc(24 * 20px)}.next-col-offset-fixed-s-25{margin-left:calc(25 * 20px)}.next-col-offset-fixed-s-26{margin-left:calc(26 * 20px)}.next-col-offset-fixed-s-27{margin-left:calc(27 * 20px)}.next-col-offset-fixed-s-28{margin-left:calc(28 * 20px)}.next-col-offset-fixed-s-29{margin-left:calc(29 * 20px)}.next-col-offset-fixed-s-30{margin-left:calc(30 * 20px)}.next-col-offset-fixed-m-1{margin-left:calc(1 * 20px)}.next-col-offset-fixed-m-2{margin-left:calc(2 * 20px)}.next-col-offset-fixed-m-3{margin-left:calc(3 * 20px)}.next-col-offset-fixed-m-4{margin-left:calc(4 * 20px)}.next-col-offset-fixed-m-5{margin-left:calc(5 * 20px)}.next-col-offset-fixed-m-6{margin-left:calc(6 * 20px)}.next-col-offset-fixed-m-7{margin-left:calc(7 * 20px)}.next-col-offset-fixed-m-8{margin-left:calc(8 * 20px)}.next-col-offset-fixed-m-9{margin-left:calc(9 * 20px)}.next-col-offset-fixed-m-10{margin-left:calc(10 * 20px)}.next-col-offset-fixed-m-11{margin-left:calc(11 * 20px)}.next-col-offset-fixed-m-12{margin-left:calc(12 * 20px)}.next-col-offset-fixed-m-13{margin-left:calc(13 * 20px)}.next-col-offset-fixed-m-14{margin-left:calc(14 * 20px)}.next-col-offset-fixed-m-15{margin-left:calc(15 * 20px)}.next-col-offset-fixed-m-16{margin-left:calc(16 * 20px)}.next-col-offset-fixed-m-17{margin-left:calc(17 * 20px)}.next-col-offset-fixed-m-18{margin-left:calc(18 * 20px)}.next-col-offset-fixed-m-19{margin-left:calc(19 * 20px)}.next-col-offset-fixed-m-20{margin-left:calc(20 * 20px)}.next-col-offset-fixed-m-21{margin-left:calc(21 * 20px)}.next-col-offset-fixed-m-22{margin-left:calc(22 * 20px)}.next-col-offset-fixed-m-23{margin-left:calc(23 * 20px)}.next-col-offset-fixed-m-24{margin-left:calc(24 * 20px)}.next-col-offset-fixed-m-25{margin-left:calc(25 * 20px)}.next-col-offset-fixed-m-26{margin-left:calc(26 * 20px)}.next-col-offset-fixed-m-27{margin-left:calc(27 * 20px)}.next-col-offset-fixed-m-28{margin-left:calc(28 * 20px)}.next-col-offset-fixed-m-29{margin-left:calc(29 * 20px)}.next-col-offset-fixed-m-30{margin-left:calc(30 * 20px)}.next-col-offset-fixed-l-1{margin-left:calc(1 * 20px)}.next-col-offset-fixed-l-2{margin-left:calc(2 * 20px)}.next-col-offset-fixed-l-3{margin-left:calc(3 * 20px)}.next-col-offset-fixed-l-4{margin-left:calc(4 * 20px)}.next-col-offset-fixed-l-5{margin-left:calc(5 * 20px)}.next-col-offset-fixed-l-6{margin-left:calc(6 * 20px)}.next-col-offset-fixed-l-7{margin-left:calc(7 * 20px)}.next-col-offset-fixed-l-8{margin-left:calc(8 * 20px)}.next-col-offset-fixed-l-9{margin-left:calc(9 * 20px)}.next-col-offset-fixed-l-10{margin-left:calc(10 * 20px)}.next-col-offset-fixed-l-11{margin-left:calc(11 * 20px)}.next-col-offset-fixed-l-12{margin-left:calc(12 * 20px)}.next-col-offset-fixed-l-13{margin-left:calc(13 * 20px)}.next-col-offset-fixed-l-14{margin-left:calc(14 * 20px)}.next-col-offset-fixed-l-15{margin-left:calc(15 * 20px)}.next-col-offset-fixed-l-16{margin-left:calc(16 * 20px)}.next-col-offset-fixed-l-17{margin-left:calc(17 * 20px)}.next-col-offset-fixed-l-18{margin-left:calc(18 * 20px)}.next-col-offset-fixed-l-19{margin-left:calc(19 * 20px)}.next-col-offset-fixed-l-20{margin-left:calc(20 * 20px)}.next-col-offset-fixed-l-21{margin-left:calc(21 * 20px)}.next-col-offset-fixed-l-22{margin-left:calc(22 * 20px)}.next-col-offset-fixed-l-23{margin-left:calc(23 * 20px)}.next-col-offset-fixed-l-24{margin-left:calc(24 * 20px)}.next-col-offset-fixed-l-25{margin-left:calc(25 * 20px)}.next-col-offset-fixed-l-26{margin-left:calc(26 * 20px)}.next-col-offset-fixed-l-27{margin-left:calc(27 * 20px)}.next-col-offset-fixed-l-28{margin-left:calc(28 * 20px)}.next-col-offset-fixed-l-29{margin-left:calc(29 * 20px)}.next-col-offset-fixed-l-30{margin-left:calc(30 * 20px)}.next-col-offset-fixed-xl-1{margin-left:calc(1 * 20px)}.next-col-offset-fixed-xl-2{margin-left:calc(2 * 20px)}.next-col-offset-fixed-xl-3{margin-left:calc(3 * 20px)}.next-col-offset-fixed-xl-4{margin-left:calc(4 * 20px)}.next-col-offset-fixed-xl-5{margin-left:calc(5 * 20px)}.next-col-offset-fixed-xl-6{margin-left:calc(6 * 20px)}.next-col-offset-fixed-xl-7{margin-left:calc(7 * 20px)}.next-col-offset-fixed-xl-8{margin-left:calc(8 * 20px)}.next-col-offset-fixed-xl-9{margin-left:calc(9 * 20px)}.next-col-offset-fixed-xl-10{margin-left:calc(10 * 20px)}.next-col-offset-fixed-xl-11{margin-left:calc(11 * 20px)}.next-col-offset-fixed-xl-12{margin-left:calc(12 * 20px)}.next-col-offset-fixed-xl-13{margin-left:calc(13 * 20px)}.next-col-offset-fixed-xl-14{margin-left:calc(14 * 20px)}.next-col-offset-fixed-xl-15{margin-left:calc(15 * 20px)}.next-col-offset-fixed-xl-16{margin-left:calc(16 * 20px)}.next-col-offset-fixed-xl-17{margin-left:calc(17 * 20px)}.next-col-offset-fixed-xl-18{margin-left:calc(18 * 20px)}.next-col-offset-fixed-xl-19{margin-left:calc(19 * 20px)}.next-col-offset-fixed-xl-20{margin-left:calc(20 * 20px)}.next-col-offset-fixed-xl-21{margin-left:calc(21 * 20px)}.next-col-offset-fixed-xl-22{margin-left:calc(22 * 20px)}.next-col-offset-fixed-xl-23{margin-left:calc(23 * 20px)}.next-col-offset-fixed-xl-24{margin-left:calc(24 * 20px)}.next-col-offset-fixed-xl-25{margin-left:calc(25 * 20px)}.next-col-offset-fixed-xl-26{margin-left:calc(26 * 20px)}.next-col-offset-fixed-xl-27{margin-left:calc(27 * 20px)}.next-col-offset-fixed-xl-28{margin-left:calc(28 * 20px)}.next-col-offset-fixed-xl-29{margin-left:calc(29 * 20px)}.next-col-offset-fixed-xl-30{margin-left:calc(30 * 20px)}.next-col.next-col-hidden{display:none}@media (min-width: 320px) and (max-width: 479px){.next-col.next-col-xxs-hidden{display:none}}@media (min-width: 480px) and (max-width: 719px){.next-col.next-col-xs-hidden{display:none}}@media (min-width: 720px) and (max-width: 989px){.next-col.next-col-s-hidden{display:none}}@media (min-width: 990px) and (max-width: 1199px){.next-col.next-col-m-hidden{display:none}}@media (min-width: 1200px) and (max-width: 1499px){.next-col.next-col-l-hidden{display:none}}@media (min-width: 1500px){.next-col.next-col-xl-hidden{display:none}}.next-row.next-row-hidden{display:none}@media (min-width: 320px) and (max-width: 479px){.next-row.next-row-xxs-hidden{display:none}}@media (min-width: 480px) and (max-width: 719px){.next-row.next-row-xs-hidden{display:none}}@media (min-width: 720px) and (max-width: 989px){.next-row.next-row-s-hidden{display:none}}@media (min-width: 990px) and (max-width: 1199px){.next-row.next-row-m-hidden{display:none}}@media (min-width: 1200px) and (max-width: 1499px){.next-row.next-row-l-hidden{display:none}}@media (min-width: 1500px){.next-row.next-row-xl-hidden{display:none}}.next-col-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}@media (min-width: 320px){.next-col-xxs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xxs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xxs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xxs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xxs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xxs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xxs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xxs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xxs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xxs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xxs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xxs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xxs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xxs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xxs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xxs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xxs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xxs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xxs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xxs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xxs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xxs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xxs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xxs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media (min-width: 480px){.next-col-xs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media (min-width: 720px){.next-col-s-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-s-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-s-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-s-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-s-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-s-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-s-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-s-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-s-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-s-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-s-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-s-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-s-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-s-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-s-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-s-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-s-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-s-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-s-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-s-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-s-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-s-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-s-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-s-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media (min-width: 990px){.next-col-m-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-m-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-m-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-m-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-m-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-m-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-m-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-m-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-m-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-m-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-m-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-m-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-m-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-m-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-m-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-m-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-m-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-m-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-m-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-m-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-m-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-m-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-m-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-m-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media (min-width: 1200px){.next-col-l-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-l-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-l-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-l-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-l-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-l-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-l-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-l-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-l-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-l-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-l-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-l-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-l-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-l-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-l-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-l-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-l-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-l-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-l-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-l-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-l-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-l-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-l-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-l-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media (min-width: 1500px){.next-col-xl-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xl-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xl-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xl-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xl-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xl-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xl-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xl-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xl-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xl-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xl-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xl-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xl-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xl-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xl-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xl-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xl-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xl-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xl-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xl-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xl-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xl-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xl-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xl-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}.next-col-offset-fixed-1[dir=rtl]{margin-right:calc(1 * 20px);margin-left:auto}.next-col-offset-fixed-2[dir=rtl]{margin-right:calc(2 * 20px);margin-left:auto}.next-col-offset-fixed-3[dir=rtl]{margin-right:calc(3 * 20px);margin-left:auto}.next-col-offset-fixed-4[dir=rtl]{margin-right:calc(4 * 20px);margin-left:auto}.next-col-offset-fixed-5[dir=rtl]{margin-right:calc(5 * 20px);margin-left:auto}.next-col-offset-fixed-6[dir=rtl]{margin-right:calc(6 * 20px);margin-left:auto}.next-col-offset-fixed-7[dir=rtl]{margin-right:calc(7 * 20px);margin-left:auto}.next-col-offset-fixed-8[dir=rtl]{margin-right:calc(8 * 20px);margin-left:auto}.next-col-offset-fixed-9[dir=rtl]{margin-right:calc(9 * 20px);margin-left:auto}.next-col-offset-fixed-10[dir=rtl]{margin-right:calc(10 * 20px);margin-left:auto}.next-col-offset-fixed-11[dir=rtl]{margin-right:calc(11 * 20px);margin-left:auto}.next-col-offset-fixed-12[dir=rtl]{margin-right:calc(12 * 20px);margin-left:auto}.next-col-offset-fixed-13[dir=rtl]{margin-right:calc(13 * 20px);margin-left:auto}.next-col-offset-fixed-14[dir=rtl]{margin-right:calc(14 * 20px);margin-left:auto}.next-col-offset-fixed-15[dir=rtl]{margin-right:calc(15 * 20px);margin-left:auto}.next-col-offset-fixed-16[dir=rtl]{margin-right:calc(16 * 20px);margin-left:auto}.next-col-offset-fixed-17[dir=rtl]{margin-right:calc(17 * 20px);margin-left:auto}.next-col-offset-fixed-18[dir=rtl]{margin-right:calc(18 * 20px);margin-left:auto}.next-col-offset-fixed-19[dir=rtl]{margin-right:calc(19 * 20px);margin-left:auto}.next-col-offset-fixed-20[dir=rtl]{margin-right:calc(20 * 20px);margin-left:auto}.next-col-offset-fixed-21[dir=rtl]{margin-right:calc(21 * 20px);margin-left:auto}.next-col-offset-fixed-22[dir=rtl]{margin-right:calc(22 * 20px);margin-left:auto}.next-col-offset-fixed-23[dir=rtl]{margin-right:calc(23 * 20px);margin-left:auto}.next-col-offset-fixed-24[dir=rtl]{margin-right:calc(24 * 20px);margin-left:auto}.next-col-offset-fixed-25[dir=rtl]{margin-right:calc(25 * 20px);margin-left:auto}.next-col-offset-fixed-26[dir=rtl]{margin-right:calc(26 * 20px);margin-left:auto}.next-col-offset-fixed-27[dir=rtl]{margin-right:calc(27 * 20px);margin-left:auto}.next-col-offset-fixed-28[dir=rtl]{margin-right:calc(28 * 20px);margin-left:auto}.next-col-offset-fixed-29[dir=rtl]{margin-right:calc(29 * 20px);margin-left:auto}.next-col-offset-fixed-30[dir=rtl]{margin-right:calc(30 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-1[dir=rtl]{margin-right:calc(1 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-2[dir=rtl]{margin-right:calc(2 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-3[dir=rtl]{margin-right:calc(3 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-4[dir=rtl]{margin-right:calc(4 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-5[dir=rtl]{margin-right:calc(5 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-6[dir=rtl]{margin-right:calc(6 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-7[dir=rtl]{margin-right:calc(7 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-8[dir=rtl]{margin-right:calc(8 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-9[dir=rtl]{margin-right:calc(9 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-10[dir=rtl]{margin-right:calc(10 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-11[dir=rtl]{margin-right:calc(11 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-12[dir=rtl]{margin-right:calc(12 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-13[dir=rtl]{margin-right:calc(13 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-14[dir=rtl]{margin-right:calc(14 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-15[dir=rtl]{margin-right:calc(15 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-16[dir=rtl]{margin-right:calc(16 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-17[dir=rtl]{margin-right:calc(17 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-18[dir=rtl]{margin-right:calc(18 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-19[dir=rtl]{margin-right:calc(19 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-20[dir=rtl]{margin-right:calc(20 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-21[dir=rtl]{margin-right:calc(21 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-22[dir=rtl]{margin-right:calc(22 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-23[dir=rtl]{margin-right:calc(23 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-24[dir=rtl]{margin-right:calc(24 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-25[dir=rtl]{margin-right:calc(25 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-26[dir=rtl]{margin-right:calc(26 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-27[dir=rtl]{margin-right:calc(27 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-28[dir=rtl]{margin-right:calc(28 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-29[dir=rtl]{margin-right:calc(29 * 20px);margin-left:auto}.next-col-offset-fixed-xxs-30[dir=rtl]{margin-right:calc(30 * 20px);margin-left:auto}.next-col-offset-fixed-xs-1[dir=rtl]{margin-right:calc(1 * 20px);margin-left:auto}.next-col-offset-fixed-xs-2[dir=rtl]{margin-right:calc(2 * 20px);margin-left:auto}.next-col-offset-fixed-xs-3[dir=rtl]{margin-right:calc(3 * 20px);margin-left:auto}.next-col-offset-fixed-xs-4[dir=rtl]{margin-right:calc(4 * 20px);margin-left:auto}.next-col-offset-fixed-xs-5[dir=rtl]{margin-right:calc(5 * 20px);margin-left:auto}.next-col-offset-fixed-xs-6[dir=rtl]{margin-right:calc(6 * 20px);margin-left:auto}.next-col-offset-fixed-xs-7[dir=rtl]{margin-right:calc(7 * 20px);margin-left:auto}.next-col-offset-fixed-xs-8[dir=rtl]{margin-right:calc(8 * 20px);margin-left:auto}.next-col-offset-fixed-xs-9[dir=rtl]{margin-right:calc(9 * 20px);margin-left:auto}.next-col-offset-fixed-xs-10[dir=rtl]{margin-right:calc(10 * 20px);margin-left:auto}.next-col-offset-fixed-xs-11[dir=rtl]{margin-right:calc(11 * 20px);margin-left:auto}.next-col-offset-fixed-xs-12[dir=rtl]{margin-right:calc(12 * 20px);margin-left:auto}.next-col-offset-fixed-xs-13[dir=rtl]{margin-right:calc(13 * 20px);margin-left:auto}.next-col-offset-fixed-xs-14[dir=rtl]{margin-right:calc(14 * 20px);margin-left:auto}.next-col-offset-fixed-xs-15[dir=rtl]{margin-right:calc(15 * 20px);margin-left:auto}.next-col-offset-fixed-xs-16[dir=rtl]{margin-right:calc(16 * 20px);margin-left:auto}.next-col-offset-fixed-xs-17[dir=rtl]{margin-right:calc(17 * 20px);margin-left:auto}.next-col-offset-fixed-xs-18[dir=rtl]{margin-right:calc(18 * 20px);margin-left:auto}.next-col-offset-fixed-xs-19[dir=rtl]{margin-right:calc(19 * 20px);margin-left:auto}.next-col-offset-fixed-xs-20[dir=rtl]{margin-right:calc(20 * 20px);margin-left:auto}.next-col-offset-fixed-xs-21[dir=rtl]{margin-right:calc(21 * 20px);margin-left:auto}.next-col-offset-fixed-xs-22[dir=rtl]{margin-right:calc(22 * 20px);margin-left:auto}.next-col-offset-fixed-xs-23[dir=rtl]{margin-right:calc(23 * 20px);margin-left:auto}.next-col-offset-fixed-xs-24[dir=rtl]{margin-right:calc(24 * 20px);margin-left:auto}.next-col-offset-fixed-xs-25[dir=rtl]{margin-right:calc(25 * 20px);margin-left:auto}.next-col-offset-fixed-xs-26[dir=rtl]{margin-right:calc(26 * 20px);margin-left:auto}.next-col-offset-fixed-xs-27[dir=rtl]{margin-right:calc(27 * 20px);margin-left:auto}.next-col-offset-fixed-xs-28[dir=rtl]{margin-right:calc(28 * 20px);margin-left:auto}.next-col-offset-fixed-xs-29[dir=rtl]{margin-right:calc(29 * 20px);margin-left:auto}.next-col-offset-fixed-xs-30[dir=rtl]{margin-right:calc(30 * 20px);margin-left:auto}.next-col-offset-fixed-s-1[dir=rtl]{margin-right:calc(1 * 20px);margin-left:auto}.next-col-offset-fixed-s-2[dir=rtl]{margin-right:calc(2 * 20px);margin-left:auto}.next-col-offset-fixed-s-3[dir=rtl]{margin-right:calc(3 * 20px);margin-left:auto}.next-col-offset-fixed-s-4[dir=rtl]{margin-right:calc(4 * 20px);margin-left:auto}.next-col-offset-fixed-s-5[dir=rtl]{margin-right:calc(5 * 20px);margin-left:auto}.next-col-offset-fixed-s-6[dir=rtl]{margin-right:calc(6 * 20px);margin-left:auto}.next-col-offset-fixed-s-7[dir=rtl]{margin-right:calc(7 * 20px);margin-left:auto}.next-col-offset-fixed-s-8[dir=rtl]{margin-right:calc(8 * 20px);margin-left:auto}.next-col-offset-fixed-s-9[dir=rtl]{margin-right:calc(9 * 20px);margin-left:auto}.next-col-offset-fixed-s-10[dir=rtl]{margin-right:calc(10 * 20px);margin-left:auto}.next-col-offset-fixed-s-11[dir=rtl]{margin-right:calc(11 * 20px);margin-left:auto}.next-col-offset-fixed-s-12[dir=rtl]{margin-right:calc(12 * 20px);margin-left:auto}.next-col-offset-fixed-s-13[dir=rtl]{margin-right:calc(13 * 20px);margin-left:auto}.next-col-offset-fixed-s-14[dir=rtl]{margin-right:calc(14 * 20px);margin-left:auto}.next-col-offset-fixed-s-15[dir=rtl]{margin-right:calc(15 * 20px);margin-left:auto}.next-col-offset-fixed-s-16[dir=rtl]{margin-right:calc(16 * 20px);margin-left:auto}.next-col-offset-fixed-s-17[dir=rtl]{margin-right:calc(17 * 20px);margin-left:auto}.next-col-offset-fixed-s-18[dir=rtl]{margin-right:calc(18 * 20px);margin-left:auto}.next-col-offset-fixed-s-19[dir=rtl]{margin-right:calc(19 * 20px);margin-left:auto}.next-col-offset-fixed-s-20[dir=rtl]{margin-right:calc(20 * 20px);margin-left:auto}.next-col-offset-fixed-s-21[dir=rtl]{margin-right:calc(21 * 20px);margin-left:auto}.next-col-offset-fixed-s-22[dir=rtl]{margin-right:calc(22 * 20px);margin-left:auto}.next-col-offset-fixed-s-23[dir=rtl]{margin-right:calc(23 * 20px);margin-left:auto}.next-col-offset-fixed-s-24[dir=rtl]{margin-right:calc(24 * 20px);margin-left:auto}.next-col-offset-fixed-s-25[dir=rtl]{margin-right:calc(25 * 20px);margin-left:auto}.next-col-offset-fixed-s-26[dir=rtl]{margin-right:calc(26 * 20px);margin-left:auto}.next-col-offset-fixed-s-27[dir=rtl]{margin-right:calc(27 * 20px);margin-left:auto}.next-col-offset-fixed-s-28[dir=rtl]{margin-right:calc(28 * 20px);margin-left:auto}.next-col-offset-fixed-s-29[dir=rtl]{margin-right:calc(29 * 20px);margin-left:auto}.next-col-offset-fixed-s-30[dir=rtl]{margin-right:calc(30 * 20px);margin-left:auto}.next-col-offset-fixed-m-1[dir=rtl]{margin-right:calc(1 * 20px);margin-left:auto}.next-col-offset-fixed-m-2[dir=rtl]{margin-right:calc(2 * 20px);margin-left:auto}.next-col-offset-fixed-m-3[dir=rtl]{margin-right:calc(3 * 20px);margin-left:auto}.next-col-offset-fixed-m-4[dir=rtl]{margin-right:calc(4 * 20px);margin-left:auto}.next-col-offset-fixed-m-5[dir=rtl]{margin-right:calc(5 * 20px);margin-left:auto}.next-col-offset-fixed-m-6[dir=rtl]{margin-right:calc(6 * 20px);margin-left:auto}.next-col-offset-fixed-m-7[dir=rtl]{margin-right:calc(7 * 20px);margin-left:auto}.next-col-offset-fixed-m-8[dir=rtl]{margin-right:calc(8 * 20px);margin-left:auto}.next-col-offset-fixed-m-9[dir=rtl]{margin-right:calc(9 * 20px);margin-left:auto}.next-col-offset-fixed-m-10[dir=rtl]{margin-right:calc(10 * 20px);margin-left:auto}.next-col-offset-fixed-m-11[dir=rtl]{margin-right:calc(11 * 20px);margin-left:auto}.next-col-offset-fixed-m-12[dir=rtl]{margin-right:calc(12 * 20px);margin-left:auto}.next-col-offset-fixed-m-13[dir=rtl]{margin-right:calc(13 * 20px);margin-left:auto}.next-col-offset-fixed-m-14[dir=rtl]{margin-right:calc(14 * 20px);margin-left:auto}.next-col-offset-fixed-m-15[dir=rtl]{margin-right:calc(15 * 20px);margin-left:auto}.next-col-offset-fixed-m-16[dir=rtl]{margin-right:calc(16 * 20px);margin-left:auto}.next-col-offset-fixed-m-17[dir=rtl]{margin-right:calc(17 * 20px);margin-left:auto}.next-col-offset-fixed-m-18[dir=rtl]{margin-right:calc(18 * 20px);margin-left:auto}.next-col-offset-fixed-m-19[dir=rtl]{margin-right:calc(19 * 20px);margin-left:auto}.next-col-offset-fixed-m-20[dir=rtl]{margin-right:calc(20 * 20px);margin-left:auto}.next-col-offset-fixed-m-21[dir=rtl]{margin-right:calc(21 * 20px);margin-left:auto}.next-col-offset-fixed-m-22[dir=rtl]{margin-right:calc(22 * 20px);margin-left:auto}.next-col-offset-fixed-m-23[dir=rtl]{margin-right:calc(23 * 20px);margin-left:auto}.next-col-offset-fixed-m-24[dir=rtl]{margin-right:calc(24 * 20px);margin-left:auto}.next-col-offset-fixed-m-25[dir=rtl]{margin-right:calc(25 * 20px);margin-left:auto}.next-col-offset-fixed-m-26[dir=rtl]{margin-right:calc(26 * 20px);margin-left:auto}.next-col-offset-fixed-m-27[dir=rtl]{margin-right:calc(27 * 20px);margin-left:auto}.next-col-offset-fixed-m-28[dir=rtl]{margin-right:calc(28 * 20px);margin-left:auto}.next-col-offset-fixed-m-29[dir=rtl]{margin-right:calc(29 * 20px);margin-left:auto}.next-col-offset-fixed-m-30[dir=rtl]{margin-right:calc(30 * 20px);margin-left:auto}.next-col-offset-fixed-l-1[dir=rtl]{margin-right:calc(1 * 20px);margin-left:auto}.next-col-offset-fixed-l-2[dir=rtl]{margin-right:calc(2 * 20px);margin-left:auto}.next-col-offset-fixed-l-3[dir=rtl]{margin-right:calc(3 * 20px);margin-left:auto}.next-col-offset-fixed-l-4[dir=rtl]{margin-right:calc(4 * 20px);margin-left:auto}.next-col-offset-fixed-l-5[dir=rtl]{margin-right:calc(5 * 20px);margin-left:auto}.next-col-offset-fixed-l-6[dir=rtl]{margin-right:calc(6 * 20px);margin-left:auto}.next-col-offset-fixed-l-7[dir=rtl]{margin-right:calc(7 * 20px);margin-left:auto}.next-col-offset-fixed-l-8[dir=rtl]{margin-right:calc(8 * 20px);margin-left:auto}.next-col-offset-fixed-l-9[dir=rtl]{margin-right:calc(9 * 20px);margin-left:auto}.next-col-offset-fixed-l-10[dir=rtl]{margin-right:calc(10 * 20px);margin-left:auto}.next-col-offset-fixed-l-11[dir=rtl]{margin-right:calc(11 * 20px);margin-left:auto}.next-col-offset-fixed-l-12[dir=rtl]{margin-right:calc(12 * 20px);margin-left:auto}.next-col-offset-fixed-l-13[dir=rtl]{margin-right:calc(13 * 20px);margin-left:auto}.next-col-offset-fixed-l-14[dir=rtl]{margin-right:calc(14 * 20px);margin-left:auto}.next-col-offset-fixed-l-15[dir=rtl]{margin-right:calc(15 * 20px);margin-left:auto}.next-col-offset-fixed-l-16[dir=rtl]{margin-right:calc(16 * 20px);margin-left:auto}.next-col-offset-fixed-l-17[dir=rtl]{margin-right:calc(17 * 20px);margin-left:auto}.next-col-offset-fixed-l-18[dir=rtl]{margin-right:calc(18 * 20px);margin-left:auto}.next-col-offset-fixed-l-19[dir=rtl]{margin-right:calc(19 * 20px);margin-left:auto}.next-col-offset-fixed-l-20[dir=rtl]{margin-right:calc(20 * 20px);margin-left:auto}.next-col-offset-fixed-l-21[dir=rtl]{margin-right:calc(21 * 20px);margin-left:auto}.next-col-offset-fixed-l-22[dir=rtl]{margin-right:calc(22 * 20px);margin-left:auto}.next-col-offset-fixed-l-23[dir=rtl]{margin-right:calc(23 * 20px);margin-left:auto}.next-col-offset-fixed-l-24[dir=rtl]{margin-right:calc(24 * 20px);margin-left:auto}.next-col-offset-fixed-l-25[dir=rtl]{margin-right:calc(25 * 20px);margin-left:auto}.next-col-offset-fixed-l-26[dir=rtl]{margin-right:calc(26 * 20px);margin-left:auto}.next-col-offset-fixed-l-27[dir=rtl]{margin-right:calc(27 * 20px);margin-left:auto}.next-col-offset-fixed-l-28[dir=rtl]{margin-right:calc(28 * 20px);margin-left:auto}.next-col-offset-fixed-l-29[dir=rtl]{margin-right:calc(29 * 20px);margin-left:auto}.next-col-offset-fixed-l-30[dir=rtl]{margin-right:calc(30 * 20px);margin-left:auto}.next-col-offset-fixed-xl-1[dir=rtl]{margin-right:calc(1 * 20px);margin-left:auto}.next-col-offset-fixed-xl-2[dir=rtl]{margin-right:calc(2 * 20px);margin-left:auto}.next-col-offset-fixed-xl-3[dir=rtl]{margin-right:calc(3 * 20px);margin-left:auto}.next-col-offset-fixed-xl-4[dir=rtl]{margin-right:calc(4 * 20px);margin-left:auto}.next-col-offset-fixed-xl-5[dir=rtl]{margin-right:calc(5 * 20px);margin-left:auto}.next-col-offset-fixed-xl-6[dir=rtl]{margin-right:calc(6 * 20px);margin-left:auto}.next-col-offset-fixed-xl-7[dir=rtl]{margin-right:calc(7 * 20px);margin-left:auto}.next-col-offset-fixed-xl-8[dir=rtl]{margin-right:calc(8 * 20px);margin-left:auto}.next-col-offset-fixed-xl-9[dir=rtl]{margin-right:calc(9 * 20px);margin-left:auto}.next-col-offset-fixed-xl-10[dir=rtl]{margin-right:calc(10 * 20px);margin-left:auto}.next-col-offset-fixed-xl-11[dir=rtl]{margin-right:calc(11 * 20px);margin-left:auto}.next-col-offset-fixed-xl-12[dir=rtl]{margin-right:calc(12 * 20px);margin-left:auto}.next-col-offset-fixed-xl-13[dir=rtl]{margin-right:calc(13 * 20px);margin-left:auto}.next-col-offset-fixed-xl-14[dir=rtl]{margin-right:calc(14 * 20px);margin-left:auto}.next-col-offset-fixed-xl-15[dir=rtl]{margin-right:calc(15 * 20px);margin-left:auto}.next-col-offset-fixed-xl-16[dir=rtl]{margin-right:calc(16 * 20px);margin-left:auto}.next-col-offset-fixed-xl-17[dir=rtl]{margin-right:calc(17 * 20px);margin-left:auto}.next-col-offset-fixed-xl-18[dir=rtl]{margin-right:calc(18 * 20px);margin-left:auto}.next-col-offset-fixed-xl-19[dir=rtl]{margin-right:calc(19 * 20px);margin-left:auto}.next-col-offset-fixed-xl-20[dir=rtl]{margin-right:calc(20 * 20px);margin-left:auto}.next-col-offset-fixed-xl-21[dir=rtl]{margin-right:calc(21 * 20px);margin-left:auto}.next-col-offset-fixed-xl-22[dir=rtl]{margin-right:calc(22 * 20px);margin-left:auto}.next-col-offset-fixed-xl-23[dir=rtl]{margin-right:calc(23 * 20px);margin-left:auto}.next-col-offset-fixed-xl-24[dir=rtl]{margin-right:calc(24 * 20px);margin-left:auto}.next-col-offset-fixed-xl-25[dir=rtl]{margin-right:calc(25 * 20px);margin-left:auto}.next-col-offset-fixed-xl-26[dir=rtl]{margin-right:calc(26 * 20px);margin-left:auto}.next-col-offset-fixed-xl-27[dir=rtl]{margin-right:calc(27 * 20px);margin-left:auto}.next-col-offset-fixed-xl-28[dir=rtl]{margin-right:calc(28 * 20px);margin-left:auto}.next-col-offset-fixed-xl-29[dir=rtl]{margin-right:calc(29 * 20px);margin-left:auto}.next-col-offset-fixed-xl-30[dir=rtl]{margin-right:calc(30 * 20px);margin-left:auto}.next-icon[dir=rtl]:before{transform:rotateY(180deg)}@font-face{font-family:NextIcon;src:url(http://at.alicdn.com/t/font_1533967_slipq25tezj.eot);src:url(http://at.alicdn.com/t/font_1533967_slipq25tezj.eot?#iefix) format("embedded-opentype"),url(http://at.alicdn.com/t/font_1533967_slipq25tezj.woff2) format("woff2"),url(http://at.alicdn.com/t/font_1533967_slipq25tezj.woff) format("woff"),url(http://at.alicdn.com/t/font_1533967_slipq25tezj.ttf) format("truetype"),url(http://at.alicdn.com/t/font_1533967_slipq25tezj.svg#NextIcon) format("svg")}.next-icon{display:inline-block;font-family:NextIcon;font-style:normal;font-weight:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.next-icon:before{display:inline-block;vertical-align:middle;text-align:center}.next-icon-smile:before{content:"\e65f"}.next-icon-cry:before{content:"\e65d"}.next-icon-success:before{content:"\e60a"}.next-icon-warning:before{content:"\e60b"}.next-icon-prompt:before{content:"\e60c"}.next-icon-error:before{content:"\e60d"}.next-icon-help:before{content:"\e673"}.next-icon-clock:before{content:"\e621"}.next-icon-success-filling:before{content:"\e63a"}.next-icon-delete-filling:before{content:"\e623"}.next-icon-favorites-filling:before{content:"\e60e"}.next-icon-add:before{content:"\e655"}.next-icon-minus:before{content:"\e601"}.next-icon-arrow-up:before{content:"\e625"}.next-icon-arrow-down:before{content:"\e63d"}.next-icon-arrow-left:before{content:"\e61d"}.next-icon-arrow-right:before{content:"\e619"}.next-icon-arrow-double-left:before{content:"\e659"}.next-icon-arrow-double-right:before{content:"\e65e"}.next-icon-switch:before{content:"\e6b3"}.next-icon-sorting:before{content:"\e634"}.next-icon-descending:before{content:"\e61f"}.next-icon-ascending:before{content:"\e61e"}.next-icon-select:before{content:"\e632"}.next-icon-semi-select:before{content:"\e633"}.next-icon-search:before{content:"\e656"}.next-icon-close:before{content:"\e626"}.next-icon-ellipsis:before{content:"\e654"}.next-icon-picture:before{content:"\e631"}.next-icon-calendar:before{content:"\e607"}.next-icon-ashbin:before{content:"\e639"}.next-icon-upload:before{content:"\e7ee"}.next-icon-download:before{content:"\e628"}.next-icon-set:before{content:"\e683"}.next-icon-edit:before{content:"\e63b"}.next-icon-refresh:before{content:"\e677"}.next-icon-filter:before{content:"\e627"}.next-icon-attachment:before{content:"\e665"}.next-icon-account:before{content:"\e608"}.next-icon-email:before{content:"\e605"}.next-icon-atm:before{content:"\e606"}.next-icon-loading:before{content:"\e646";animation:loadingCircle 1s infinite linear}.next-icon-eye:before{content:"\e611"}.next-icon-copy:before{content:"\e60f"}.next-icon-toggle-left:before{content:"\e602"}.next-icon-toggle-right:before{content:"\e603"}.next-icon-eye-close:before{content:"\e600"}.next-icon-unlock:before{content:"\e615"}.next-icon-lock:before{content:"\e617"}.next-icon-exit:before{content:"\e616"}.next-icon-chart-bar:before{content:"\e612"}.next-icon-chart-pie:before{content:"\e613"}.next-icon-form:before{content:"\e7fb"}.next-icon-detail:before{content:"\e7f8"}.next-icon-list:before{content:"\e7f9"}.next-icon-dashboard:before{content:"\e7fa"}@keyframes loadingCircle{0%{transform-origin:50% 50%;transform:rotate(0)}to{transform-origin:50% 50%;transform:rotate(360deg)}}.next-icon.next-xxs:before,.next-icon.next-xxs .next-icon-remote{width:8px;font-size:8px;line-height:inherit}@media all and (-webkit-min-device-pixel-ratio: 0) and (min-resolution: .001dpcm){.next-icon.next-xxs{transform:scale(.5);margin-left:calc(0px - (16px - 8px) / 2);margin-right:calc(0px - (16px - 8px) / 2)}.next-icon.next-xxs:before{width:16px;font-size:16px}}.next-icon.next-xs:before,.next-icon.next-xs .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-icon.next-small:before,.next-icon.next-small .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-icon.next-medium:before,.next-icon.next-medium .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-icon.next-large:before,.next-icon.next-large .next-icon-remote{width:24px;font-size:24px;line-height:inherit}.next-icon.next-xl:before,.next-icon.next-xl .next-icon-remote{width:32px;font-size:32px;line-height:inherit}.next-icon.next-xxl:before,.next-icon.next-xxl .next-icon-remote{width:48px;font-size:48px;line-height:inherit}.next-icon.next-xxxl:before,.next-icon.next-xxxl .next-icon-remote{width:64px;font-size:64px;line-height:inherit}.next-icon.next-inherit:before,.next-icon.next-inherit .next-icon-remote{width:inherit;font-size:inherit;line-height:inherit}.next-icon.next-inherit .next-icon-remote,.next-icon .next-icon-remote{width:1em;height:1em;vertical-align:middle;fill:currentColor}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-moz-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-ms-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-o-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-moz-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-ms-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-o-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-moz-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-ms-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-o-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-moz-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-ms-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-o-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-moz-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-ms-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-o-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}}@-moz-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}}@-ms-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}}@-o-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translate(-20px)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}}@-moz-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}}@-ms-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}}@-o-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translate(20px)}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-moz-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-ms-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-o-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-webkit-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-moz-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-ms-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-o-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-moz-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-ms-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-o-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translate(-2000px)}}@-moz-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translate(-2000px)}}@-ms-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translate(-2000px)}}@-o-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translate(-2000px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translate(-2000px)}}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translate(2000px)}}@-moz-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translate(2000px)}}@-ms-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translate(2000px)}}@-o-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translate(2000px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translate(2000px)}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-moz-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-ms-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-o-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-webkit-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translate(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-moz-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translate(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-ms-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translate(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-o-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translate(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translate(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translate(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-moz-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translate(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-ms-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translate(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-o-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translate(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translate(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translate(0)}}@-webkit-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-moz-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-ms-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-o-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-moz-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-ms-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-o-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-webkit-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-moz-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-ms-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-o-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-moz-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-ms-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-o-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-moz-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-ms-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-o-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-moz-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-ms-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-o-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-webkit-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-moz-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-ms-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-o-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-moz-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-ms-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-o-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-moz-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-ms-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-o-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.fadeIn{-webkit-animation-name:fadeIn;-moz-animation-name:fadeIn;-ms-animation-name:fadeIn;-o-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInDown{-webkit-animation-name:fadeInDown;-moz-animation-name:fadeInDown;-ms-animation-name:fadeInDown;-o-animation-name:fadeInDown;animation-name:fadeInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInLeft{-webkit-animation-name:fadeInLeft;-moz-animation-name:fadeInLeft;-ms-animation-name:fadeInLeft;-o-animation-name:fadeInLeft;animation-name:fadeInLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInRight{-webkit-animation-name:fadeInRight;-moz-animation-name:fadeInRight;-ms-animation-name:fadeInRight;-o-animation-name:fadeInRight;animation-name:fadeInRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInUp{-webkit-animation-name:fadeInUp;-moz-animation-name:fadeInUp;-ms-animation-name:fadeInUp;-o-animation-name:fadeInUp;animation-name:fadeInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOut{-webkit-animation-name:fadeOut;-moz-animation-name:fadeOut;-ms-animation-name:fadeOut;-o-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutDown{-webkit-animation-name:fadeOutDown;-moz-animation-name:fadeOutDown;-ms-animation-name:fadeOutDown;-o-animation-name:fadeOutDown;animation-name:fadeOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;-moz-animation-name:fadeOutLeft;-ms-animation-name:fadeOutLeft;-o-animation-name:fadeOutLeft;animation-name:fadeOutLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutRight{-webkit-animation-name:fadeOutRight;-moz-animation-name:fadeOutRight;-ms-animation-name:fadeOutRight;-o-animation-name:fadeOutRight;animation-name:fadeOutRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutUp{-webkit-animation-name:fadeOutUp;-moz-animation-name:fadeOutUp;-ms-animation-name:fadeOutUp;-o-animation-name:fadeOutUp;animation-name:fadeOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInUp{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;-ms-animation-name:slideInUp;-o-animation-name:slideInUp;animation-name:slideInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInDown{-webkit-animation-name:slideInDown;-moz-animation-name:slideInDown;-ms-animation-name:slideInDown;-o-animation-name:slideInDown;animation-name:slideInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInLeft{-webkit-animation-name:slideInLeft;-moz-animation-name:slideInLeft;-ms-animation-name:slideInLeft;-o-animation-name:slideInLeft;animation-name:slideInLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInRight{-webkit-animation-name:slideInRight;-moz-animation-name:slideInRight;-ms-animation-name:slideInRight;-o-animation-name:slideInRight;animation-name:slideInRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutUp{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;-ms-animation-name:slideOutUp;-o-animation-name:slideOutUp;animation-name:slideOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutRight{-webkit-animation-name:slideOutRight;-moz-animation-name:slideOutRight;-ms-animation-name:slideOutRight;-o-animation-name:slideOutRight;animation-name:slideOutRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutLeft{-webkit-animation-name:slideOutLeft;-moz-animation-name:slideOutLeft;-ms-animation-name:slideOutLeft;-o-animation-name:slideOutLeft;animation-name:slideOutLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutDown{-webkit-animation-name:slideOutDown;-moz-animation-name:slideOutDown;-ms-animation-name:slideOutDown;-o-animation-name:slideOutDown;animation-name:slideOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomIn{-webkit-animation-name:zoomIn;-moz-animation-name:zoomIn;-ms-animation-name:zoomIn;-o-animation-name:zoomIn;animation-name:zoomIn;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomOut{-webkit-animation-name:zoomOut;-moz-animation-name:zoomOut;-ms-animation-name:zoomOut;-o-animation-name:zoomOut;animation-name:zoomOut;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandInDown{-webkit-animation-name:expandInDown;-moz-animation-name:expandInDown;-ms-animation-name:expandInDown;-o-animation-name:expandInDown;animation-name:expandInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandOutUp{-webkit-animation-name:expandOutUp;-moz-animation-name:expandOutUp;-ms-animation-name:expandOutUp;-o-animation-name:expandOutUp;animation-name:expandOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;-moz-animation-duration:.15s;-ms-animation-duration:.15s;-o-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandInUp{-webkit-animation-name:expandInUp;-moz-animation-name:expandInUp;-ms-animation-name:expandInUp;-o-animation-name:expandInUp;animation-name:expandInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandOutDown{-webkit-animation-name:expandOutDown;-moz-animation-name:expandOutDown;-ms-animation-name:expandOutDown;-o-animation-name:expandOutDown;animation-name:expandOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;-moz-animation-duration:.15s;-ms-animation-duration:.15s;-o-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInDownSmall{-webkit-animation-name:fadeInDownSmall;-moz-animation-name:fadeInDownSmall;-ms-animation-name:fadeInDownSmall;-o-animation-name:fadeInDownSmall;animation-name:fadeInDownSmall;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutUpSmall{-webkit-animation-name:fadeOutUpSmall;-moz-animation-name:fadeOutUpSmall;-ms-animation-name:fadeOutUpSmall;-o-animation-name:fadeOutUpSmall;animation-name:fadeOutUpSmall;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomInBig{-webkit-animation-name:zoomInBig;-moz-animation-name:zoomInBig;-ms-animation-name:zoomInBig;-o-animation-name:zoomInBig;animation-name:zoomInBig;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-ms-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomOutBig{-webkit-animation-name:zoomOutBig;-moz-animation-name:zoomOutBig;-ms-animation-name:zoomOutBig;-o-animation-name:zoomOutBig;animation-name:zoomOutBig;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-ms-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.pulse{-webkit-animation-name:pulse;-moz-animation-name:pulse;-ms-animation-name:pulse;-o-animation-name:pulse;animation-name:pulse;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expand-enter{overflow:hidden}.expand-enter-active{transition:all .3s ease-out}.expand-enter-active>*{-webkit-animation-name:expandInWithFade;-moz-animation-name:expandInWithFade;-ms-animation-name:expandInWithFade;-o-animation-name:expandInWithFade;animation-name:expandInWithFade;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expand-leave{overflow:hidden}.expand-leave-active{transition:all .2s ease-out}.expand-leave-active>*{-webkit-animation-name:expandOutWithFade;-moz-animation-name:expandOutWithFade;-ms-animation-name:expandOutWithFade;-o-animation-name:expandOutWithFade;animation-name:expandOutWithFade;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.next-overlay-wrapper .next-overlay-inner{z-index:1001}.next-overlay-wrapper .next-overlay-backdrop{position:fixed;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:#0000004d;transition:opacity .3s cubic-bezier(.4,0,.2,1);opacity:0}.next-overlay-wrapper.opened .next-overlay-backdrop{opacity:1}.next-loading-fusion-reactor[dir=rtl]{-webkit-animation-name:nextVectorRouteRTL;-moz-animation-name:nextVectorRouteRTL;-ms-animation-name:nextVectorRouteRTL;-o-animation-name:nextVectorRouteRTL;animation-name:nextVectorRouteRTL}@-webkit-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}to{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}}@-moz-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}to{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}}@-ms-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}to{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}}@-o-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}to{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}to{-webkit-transform:rotate(-360deg);-moz-transform:rotate(-360deg);-ms-transform:rotate(-360deg);-o-transform:rotate(-360deg);transform:rotate(-360deg)}}.next-loading{position:relative}.next-loading.next-open{pointer-events:none}.next-loading .next-loading-component{opacity:.7;-webkit-filter:blur(1px);filter:blur(1px);filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=1, MakeShadow=false)";position:relative;pointer-events:none}.next-loading-masker{position:absolute;top:0;bottom:0;left:0;right:0;z-index:99;opacity:.2;background:#FFF}.next-loading-inline{display:inline-block}.next-loading-tip{display:block;position:absolute;top:50%;left:50%;z-index:4;transform:translate(-50%,-50%);text-align:center}.next-loading-tip-fullscreen{top:inherit;left:inherit;transform:inherit}.next-loading-tip-placeholder{display:none}.next-loading-right-tip .next-loading-indicator{display:inline-block}.next-loading-right-tip .next-loading-tip-content{position:absolute;display:block;top:50%;right:0;transform:translateY(-50%)}.next-loading-right-tip .next-loading-tip-placeholder{display:inline-block;visibility:hidden;margin-left:1em}.next-loading-fusion-reactor{display:inline-block;width:40px;height:40px;position:relative;margin:0;-webkit-animation-duration:5.6s;-moz-animation-duration:5.6s;-ms-animation-duration:5.6s;-o-animation-duration:5.6s;animation-duration:5.6s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:nextVectorRoute;-moz-animation-name:nextVectorRoute;-ms-animation-name:nextVectorRoute;-o-animation-name:nextVectorRoute;animation-name:nextVectorRoute}.next-loading-fusion-reactor .next-loading-dot{position:absolute;margin:auto;width:12px;height:12px;border-radius:50%;background:#209BFA;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;-ms-animation-timing-function:ease-in-out;-o-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-duration:1.4s;-moz-animation-duration:1.4s;-ms-animation-duration:1.4s;-o-animation-duration:1.4s;animation-duration:1.4s}.next-loading-fusion-reactor .next-loading-dot:nth-child(1){top:0;bottom:0;left:0;-webkit-animation-name:nextVectorDotsX;-moz-animation-name:nextVectorDotsX;-ms-animation-name:nextVectorDotsX;-o-animation-name:nextVectorDotsX;animation-name:nextVectorDotsX}.next-loading-fusion-reactor .next-loading-dot:nth-child(2){left:0;right:0;top:0;opacity:.8;-webkit-animation-name:nextVectorDotsY;-moz-animation-name:nextVectorDotsY;-ms-animation-name:nextVectorDotsY;-o-animation-name:nextVectorDotsY;animation-name:nextVectorDotsY}.next-loading-fusion-reactor .next-loading-dot:nth-child(3){top:0;bottom:0;right:0;opacity:.6;-webkit-animation-name:nextVectorDotsXR;-moz-animation-name:nextVectorDotsXR;-ms-animation-name:nextVectorDotsXR;-o-animation-name:nextVectorDotsXR;animation-name:nextVectorDotsXR}.next-loading-fusion-reactor .next-loading-dot:nth-child(4){left:0;right:0;bottom:0;opacity:.2;-webkit-animation-name:nextVectorDotsYR;-moz-animation-name:nextVectorDotsYR;-ms-animation-name:nextVectorDotsYR;-o-animation-name:nextVectorDotsYR;animation-name:nextVectorDotsYR}.next-loading-medium-fusion-reactor{width:24px;height:24px}.next-loading-medium-fusion-reactor .next-loading-dot{width:8px;height:8px}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(1){-webkit-animation-name:nextVectorDotsX-medium;-moz-animation-name:nextVectorDotsX-medium;-ms-animation-name:nextVectorDotsX-medium;-o-animation-name:nextVectorDotsX-medium;animation-name:nextVectorDotsX-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(2){-webkit-animation-name:nextVectorDotsY-medium;-moz-animation-name:nextVectorDotsY-medium;-ms-animation-name:nextVectorDotsY-medium;-o-animation-name:nextVectorDotsY-medium;animation-name:nextVectorDotsY-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(3){-webkit-animation-name:nextVectorDotsXR-medium;-moz-animation-name:nextVectorDotsXR-medium;-ms-animation-name:nextVectorDotsXR-medium;-o-animation-name:nextVectorDotsXR-medium;animation-name:nextVectorDotsXR-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(4){-webkit-animation-name:nextVectorDotsYR-medium;-moz-animation-name:nextVectorDotsYR-medium;-ms-animation-name:nextVectorDotsYR-medium;-o-animation-name:nextVectorDotsYR-medium;animation-name:nextVectorDotsYR-medium}@-webkit-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{bottom:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{bottom:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{bottom:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{bottom:0;height:12px;width:12px}}@keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{bottom:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{top:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{top:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{top:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{top:0;height:12px;width:12px}}@keyframes nextVectorDotsY{25%{top:0}45%,50%{top:calc(40px / 2 - 12px * 1.2 / 2);height:calc(12px * 1.2);width:calc(12px * 1.2)}90%{top:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{left:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{left:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{left:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{left:0;height:12px;width:12px}}@keyframes nextVectorDotsX{25%{left:0}45%,50%{left:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{left:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{right:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{right:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{right:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{right:0;height:12px;width:12px}}@keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:calc(40px / 2 - 12px * 1.2 / 2);width:calc(12px * 1.2);height:calc(12px * 1.2)}90%{right:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{bottom:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{bottom:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{bottom:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{bottom:0;height:8px;width:8px}}@keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{bottom:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{top:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{top:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{top:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{top:0;height:8px;width:8px}}@keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:calc(24px / 2 - 8px * 1.2 / 2);height:calc(8px * 1.2);width:calc(8px * 1.2)}90%{top:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{left:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{left:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{left:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{left:0;height:8px;width:8px}}@keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{left:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{right:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{right:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{right:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{right:0;height:8px;width:8px}}@keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:calc(24px / 2 - 8px * 1.2 / 2);width:calc(8px * 1.2);height:calc(8px * 1.2)}90%{right:0;height:8px;width:8px}}.container-block{overflow:hidden}._title_1jx4z_20{margin:0 0 16px;padding:0;font-weight:500;font-size:14px}._basicDetailTitle_errf8_20{margin:10px 0;color:#333;font-size:16px}._infoColumn_errf8_26{margin-left:16px}._infoColumnTitle_errf8_30{height:22px;margin:20px 0;padding-left:10px;line-height:22px;border-left:4px solid #2077ff}._infoItems_errf8_38{margin-left:25px!important;padding:0!important}._infoItem_errf8_38{margin-bottom:18px!important;font-size:14px!important;list-style:none!important}._infoItemLabel_errf8_49{min-width:70px;color:#999}._infoItemValue_errf8_54{color:#333}._attachLabel_errf8_58{float:left;min-width:70px;color:#999}._attachPics_errf8_64{width:80px;height:80px;margin-right:10px;border:1px solid #eee}.next-btn{box-sizing:border-box}.next-btn *,.next-btn *:before,.next-btn *:after{box-sizing:border-box}.next-btn::-moz-focus-inner{border:0;padding:0}.next-btn,.next-btn:active,.next-btn:focus,.next-btn:hover{outline:0}@keyframes loadingCircle{0%{transform-origin:50% 50%;transform:rotate(0)}to{transform-origin:50% 50%;transform:rotate(360deg)}}.next-btn{position:relative;display:inline-block;box-shadow:none;text-decoration:none;text-align:center;text-transform:none;white-space:nowrap;vertical-align:middle;user-select:none;transition:all .1s linear;line-height:1;cursor:pointer}.next-btn:after{text-align:center;position:absolute;opacity:0;visibility:hidden;transition:opacity .1s linear}.next-btn:before{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.next-btn .next-icon{display:inline-block;font-size:0;vertical-align:middle}.next-btn>span,.next-btn>div{display:inline-block;vertical-align:middle}.next-btn>.next-btn-helper{text-decoration:inherit;display:inline-block;vertical-align:middle}.next-btn.hover,.next-btn:hover{box-shadow:none}.next-btn.next-small{border-radius:3px;padding:0 16px;height:24px;font-size:12px;border-width:1px}.next-btn.next-small>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-small>.next-btn-icon.next-icon-first:before,.next-btn.next-small>.next-btn-icon.next-icon-first .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-small>.next-btn-icon.next-icon-last:before,.next-btn.next-small>.next-btn-icon.next-icon-last .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-small>.next-btn-icon.next-icon-alone:before,.next-btn.next-small>.next-btn-icon.next-icon-alone .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:16px;top:50%;text-align:center;margin-right:4px}.next-btn.next-small.next-btn-loading>.next-icon{display:none}.next-btn.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-medium{border-radius:3px;padding:0 20px;height:32px;font-size:14px;border-width:1px}.next-btn.next-medium>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-medium>.next-btn-icon.next-icon-first:before,.next-btn.next-medium>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-medium>.next-btn-icon.next-icon-last:before,.next-btn.next-medium>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:20px;top:50%;text-align:center;margin-right:4px}.next-btn.next-medium.next-btn-loading>.next-icon{display:none}.next-btn.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-large{border-radius:3px;padding:0 24px;height:40px;font-size:16px;border-width:1px}.next-btn.next-large>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-large>.next-btn-icon.next-icon-first:before,.next-btn.next-large>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-large>.next-btn-icon.next-icon-last:before,.next-btn.next-large>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-large>.next-btn-icon.next-icon-alone:before,.next-btn.next-large>.next-btn-icon.next-icon-alone .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:24px;top:50%;text-align:center;margin-right:4px}.next-btn.next-large.next-btn-loading>.next-icon{display:none}.next-btn.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-btn-normal{border-style:solid;background:#FFFFFF;border-color:#ddd}.next-btn.next-btn-normal,.next-btn.next-btn-normal:link,.next-btn.next-btn-normal:visited,.next-btn.next-btn-normal.visited{color:#333}.next-btn.next-btn-normal:focus,.next-btn.next-btn-normal:hover,.next-btn.next-btn-normal.hover{color:#333;background:#F9F9F9;border-color:#ccc;text-decoration:none}.next-btn.next-btn-normal:active,.next-btn.next-btn-normal.active{color:#333;background:#F9F9F9;border-color:#ccc;text-decoration:none}.next-btn.next-btn-primary{border-style:solid;background:#209BFA;border-color:transparent}.next-btn.next-btn-primary,.next-btn.next-btn-primary:link,.next-btn.next-btn-primary:visited,.next-btn.next-btn-primary.visited{color:#fff}.next-btn.next-btn-primary:focus,.next-btn.next-btn-primary:hover,.next-btn.next-btn-primary.hover{color:#fff;background:#1274E7;border-color:transparent;text-decoration:none}.next-btn.next-btn-primary:active,.next-btn.next-btn-primary.active{color:#fff;background:#1274E7;border-color:transparent;text-decoration:none}.next-btn.next-btn-secondary{border-style:solid;background:#FFFFFF;border-color:#209bfa}.next-btn.next-btn-secondary,.next-btn.next-btn-secondary:link,.next-btn.next-btn-secondary:visited,.next-btn.next-btn-secondary.visited{color:#209bfa}.next-btn.next-btn-secondary:focus,.next-btn.next-btn-secondary:hover,.next-btn.next-btn-secondary.hover{color:#fff;background:#1274E7;border-color:#1274e7;text-decoration:none}.next-btn.next-btn-secondary:active,.next-btn.next-btn-secondary.active{color:#fff;background:#1274E7;border-color:#1274e7;text-decoration:none}.next-btn.disabled,.next-btn[disabled]{cursor:not-allowed}.next-btn.disabled.next-btn-normal,.next-btn[disabled].next-btn-normal{background:#FAFAFA;border-color:#eee}.next-btn.disabled.next-btn-normal,.next-btn.disabled.next-btn-normal:link,.next-btn.disabled.next-btn-normal:visited,.next-btn.disabled.next-btn-normal.visited,.next-btn[disabled].next-btn-normal,.next-btn[disabled].next-btn-normal:link,.next-btn[disabled].next-btn-normal:visited,.next-btn[disabled].next-btn-normal.visited{color:#ccc}.next-btn.disabled.next-btn-normal:focus,.next-btn.disabled.next-btn-normal:hover,.next-btn.disabled.next-btn-normal.hover,.next-btn[disabled].next-btn-normal:focus,.next-btn[disabled].next-btn-normal:hover,.next-btn[disabled].next-btn-normal.hover{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-normal:active,.next-btn.disabled.next-btn-normal.active,.next-btn[disabled].next-btn-normal:active,.next-btn[disabled].next-btn-normal.active{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-primary,.next-btn[disabled].next-btn-primary{background:#FAFAFA;border-color:#eee}.next-btn.disabled.next-btn-primary,.next-btn.disabled.next-btn-primary:link,.next-btn.disabled.next-btn-primary:visited,.next-btn.disabled.next-btn-primary.visited,.next-btn[disabled].next-btn-primary,.next-btn[disabled].next-btn-primary:link,.next-btn[disabled].next-btn-primary:visited,.next-btn[disabled].next-btn-primary.visited{color:#ccc}.next-btn.disabled.next-btn-primary:focus,.next-btn.disabled.next-btn-primary:hover,.next-btn.disabled.next-btn-primary.hover,.next-btn[disabled].next-btn-primary:focus,.next-btn[disabled].next-btn-primary:hover,.next-btn[disabled].next-btn-primary.hover{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-primary:active,.next-btn.disabled.next-btn-primary.active,.next-btn[disabled].next-btn-primary:active,.next-btn[disabled].next-btn-primary.active{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-secondary,.next-btn[disabled].next-btn-secondary{background:#FAFAFA;border-color:#eee}.next-btn.disabled.next-btn-secondary,.next-btn.disabled.next-btn-secondary:link,.next-btn.disabled.next-btn-secondary:visited,.next-btn.disabled.next-btn-secondary.visited,.next-btn[disabled].next-btn-secondary,.next-btn[disabled].next-btn-secondary:link,.next-btn[disabled].next-btn-secondary:visited,.next-btn[disabled].next-btn-secondary.visited{color:#ccc}.next-btn.disabled.next-btn-secondary:focus,.next-btn.disabled.next-btn-secondary:hover,.next-btn.disabled.next-btn-secondary.hover,.next-btn[disabled].next-btn-secondary:focus,.next-btn[disabled].next-btn-secondary:hover,.next-btn[disabled].next-btn-secondary.hover{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-secondary:active,.next-btn.disabled.next-btn-secondary.active,.next-btn[disabled].next-btn-secondary:active,.next-btn[disabled].next-btn-secondary.active{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn-warning{border-style:solid}.next-btn-warning.next-btn-primary{background:#D23C26;border-color:#d23c26}.next-btn-warning.next-btn-primary,.next-btn-warning.next-btn-primary:link,.next-btn-warning.next-btn-primary:visited,.next-btn-warning.next-btn-primary.visited{color:#fff}.next-btn-warning.next-btn-primary:focus,.next-btn-warning.next-btn-primary:hover,.next-btn-warning.next-btn-primary.hover{color:#fff;background:#B7321E;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-primary:active,.next-btn-warning.next-btn-primary.active{color:#fff;background:#B7321E;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary[disabled]{background:#FAFAFA;border-color:#e6e6e6}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary.disabled:link,.next-btn-warning.next-btn-primary.disabled:visited,.next-btn-warning.next-btn-primary.disabled.visited,.next-btn-warning.next-btn-primary[disabled],.next-btn-warning.next-btn-primary[disabled]:link,.next-btn-warning.next-btn-primary[disabled]:visited,.next-btn-warning.next-btn-primary[disabled].visited{color:#ccc}.next-btn-warning.next-btn-primary.disabled:focus,.next-btn-warning.next-btn-primary.disabled:hover,.next-btn-warning.next-btn-primary.disabled.hover,.next-btn-warning.next-btn-primary[disabled]:focus,.next-btn-warning.next-btn-primary[disabled]:hover,.next-btn-warning.next-btn-primary[disabled].hover{color:#ccc;background:#FAFAFA;border-color:#e6e6e6;text-decoration:none}.next-btn-warning.next-btn-primary.disabled:active,.next-btn-warning.next-btn-primary.disabled.active,.next-btn-warning.next-btn-primary[disabled]:active,.next-btn-warning.next-btn-primary[disabled].active{color:#ccc;background:#FAFAFA;border-color:#e6e6e6;text-decoration:none}.next-btn-warning.next-btn-normal{background:#FFFFFF;border-color:#d23c26}.next-btn-warning.next-btn-normal,.next-btn-warning.next-btn-normal:link,.next-btn-warning.next-btn-normal:visited,.next-btn-warning.next-btn-normal.visited{color:#d23c26}.next-btn-warning.next-btn-normal:focus,.next-btn-warning.next-btn-normal:hover,.next-btn-warning.next-btn-normal.hover{color:#fff;background:#B7321E;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-normal:active,.next-btn-warning.next-btn-normal.active{color:#fff;background:#B7321E;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal[disabled]{background:#FAFAFA;border-color:#eee}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal.disabled:link,.next-btn-warning.next-btn-normal.disabled:visited,.next-btn-warning.next-btn-normal.disabled.visited,.next-btn-warning.next-btn-normal[disabled],.next-btn-warning.next-btn-normal[disabled]:link,.next-btn-warning.next-btn-normal[disabled]:visited,.next-btn-warning.next-btn-normal[disabled].visited{color:#ccc}.next-btn-warning.next-btn-normal.disabled:focus,.next-btn-warning.next-btn-normal.disabled:hover,.next-btn-warning.next-btn-normal.disabled.hover,.next-btn-warning.next-btn-normal[disabled]:focus,.next-btn-warning.next-btn-normal[disabled]:hover,.next-btn-warning.next-btn-normal[disabled].hover{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn-warning.next-btn-normal.disabled:active,.next-btn-warning.next-btn-normal.disabled.active,.next-btn-warning.next-btn-normal[disabled]:active,.next-btn-warning.next-btn-normal[disabled].active{color:#ccc;background:#FAFAFA;border-color:#eee;text-decoration:none}.next-btn-text{box-shadow:none;border-radius:0;user-select:text}.next-btn-text.hover,.next-btn-text:hover{box-shadow:none}.next-btn-text.next-btn-primary{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary,.next-btn-text.next-btn-primary:link,.next-btn-text.next-btn-primary:visited,.next-btn-text.next-btn-primary.visited{color:#298dff}.next-btn-text.next-btn-primary:focus,.next-btn-text.next-btn-primary:hover,.next-btn-text.next-btn-primary.hover{color:#1274e7;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-primary:active,.next-btn-text.next-btn-primary.active{color:#1274e7;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary.disabled:link,.next-btn-text.next-btn-primary.disabled:visited,.next-btn-text.next-btn-primary.disabled.visited,.next-btn-text.next-btn-primary[disabled],.next-btn-text.next-btn-primary[disabled]:link,.next-btn-text.next-btn-primary[disabled]:visited,.next-btn-text.next-btn-primary[disabled].visited{color:#ccc}.next-btn-text.next-btn-primary.disabled:focus,.next-btn-text.next-btn-primary.disabled:hover,.next-btn-text.next-btn-primary.disabled.hover,.next-btn-text.next-btn-primary[disabled]:focus,.next-btn-text.next-btn-primary[disabled]:hover,.next-btn-text.next-btn-primary[disabled].hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-primary.disabled:active,.next-btn-text.next-btn-primary.disabled.active,.next-btn-text.next-btn-primary[disabled]:active,.next-btn-text.next-btn-primary[disabled].active{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary,.next-btn-text.next-btn-secondary:link,.next-btn-text.next-btn-secondary:visited,.next-btn-text.next-btn-secondary.visited{color:#666}.next-btn-text.next-btn-secondary:focus,.next-btn-text.next-btn-secondary:hover,.next-btn-text.next-btn-secondary.hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary:active,.next-btn-text.next-btn-secondary.active{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary.disabled:link,.next-btn-text.next-btn-secondary.disabled:visited,.next-btn-text.next-btn-secondary.disabled.visited,.next-btn-text.next-btn-secondary[disabled],.next-btn-text.next-btn-secondary[disabled]:link,.next-btn-text.next-btn-secondary[disabled]:visited,.next-btn-text.next-btn-secondary[disabled].visited{color:#ccc}.next-btn-text.next-btn-secondary.disabled:focus,.next-btn-text.next-btn-secondary.disabled:hover,.next-btn-text.next-btn-secondary.disabled.hover,.next-btn-text.next-btn-secondary[disabled]:focus,.next-btn-text.next-btn-secondary[disabled]:hover,.next-btn-text.next-btn-secondary[disabled].hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary.disabled:active,.next-btn-text.next-btn-secondary.disabled.active,.next-btn-text.next-btn-secondary[disabled]:active,.next-btn-text.next-btn-secondary[disabled].active{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal,.next-btn-text.next-btn-normal:link,.next-btn-text.next-btn-normal:visited,.next-btn-text.next-btn-normal.visited{color:#333}.next-btn-text.next-btn-normal:focus,.next-btn-text.next-btn-normal:hover,.next-btn-text.next-btn-normal.hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal:active,.next-btn-text.next-btn-normal.active{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal.disabled:link,.next-btn-text.next-btn-normal.disabled:visited,.next-btn-text.next-btn-normal.disabled.visited,.next-btn-text.next-btn-normal[disabled],.next-btn-text.next-btn-normal[disabled]:link,.next-btn-text.next-btn-normal[disabled]:visited,.next-btn-text.next-btn-normal[disabled].visited{color:#ccc}.next-btn-text.next-btn-normal.disabled:focus,.next-btn-text.next-btn-normal.disabled:hover,.next-btn-text.next-btn-normal.disabled.hover,.next-btn-text.next-btn-normal[disabled]:focus,.next-btn-text.next-btn-normal[disabled]:hover,.next-btn-text.next-btn-normal[disabled].hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal.disabled:active,.next-btn-text.next-btn-normal.disabled.active,.next-btn-text.next-btn-normal[disabled]:active,.next-btn-text.next-btn-normal[disabled].active{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-large{border-radius:0;padding:0;height:24px;font-size:14px;border-width:0}.next-btn-text.next-large>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-large>.next-btn-icon.next-icon-first:before,.next-btn-text.next-large>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-large>.next-btn-icon.next-icon-last:before,.next-btn-text.next-large>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-large>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-large>.next-btn-icon.next-icon-alone .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0px;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-large.next-btn-loading>.next-icon{display:none}.next-btn-text.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-medium{border-radius:0;padding:0;height:20px;font-size:14px;border-width:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-last:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0px;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-medium.next-btn-loading>.next-icon{display:none}.next-btn-text.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-small{border-radius:0;padding:0;height:16px;font-size:12px;border-width:0}.next-btn-text.next-small>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-small>.next-btn-icon.next-icon-first:before,.next-btn-text.next-small>.next-btn-icon.next-icon-first .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-small>.next-btn-icon.next-icon-last:before,.next-btn-text.next-small>.next-btn-icon.next-icon-last .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-small>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-small>.next-btn-icon.next-icon-alone .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:0px;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-small.next-btn-loading>.next-icon{display:none}.next-btn-text.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-btn-loading{background:transparent;border-color:transparent}.next-btn-text.next-btn-loading,.next-btn-text.next-btn-loading:link,.next-btn-text.next-btn-loading:visited,.next-btn-text.next-btn-loading.visited{color:#333}.next-btn-text.next-btn-loading:focus,.next-btn-text.next-btn-loading:hover,.next-btn-text.next-btn-loading.hover{color:#333;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-loading:active,.next-btn-text.next-btn-loading.active{color:#333;background:transparent;border-color:transparent;text-decoration:none}.next-btn-loading{pointer-events:none}.next-btn-loading:before{font-family:NextIcon;content:"\e646";opacity:1;visibility:visible;animation:loadingCircle 2s infinite linear}.next-btn-loading:after{content:"";display:inline-block;position:static;height:100%;width:0;vertical-align:middle}.next-btn-custom-loading{pointer-events:none}.next-btn-ghost{box-shadow:none;border-style:solid}.next-btn-ghost.next-btn-dark{background:rgba(0,0,0,0);border-color:#fff}.next-btn-ghost.next-btn-dark,.next-btn-ghost.next-btn-dark:link,.next-btn-ghost.next-btn-dark:visited,.next-btn-ghost.next-btn-dark.visited{color:#fff}.next-btn-ghost.next-btn-dark:focus,.next-btn-ghost.next-btn-dark:hover,.next-btn-ghost.next-btn-dark.hover{color:#fff;background:rgba(255,255,255,.8);border-color:#fff;text-decoration:none}.next-btn-ghost.next-btn-dark:active,.next-btn-ghost.next-btn-dark.active{color:#fff;background:rgba(255,255,255,.8);border-color:#fff;text-decoration:none}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark[disabled]{background:transparent;border-color:#fff6}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark.disabled:link,.next-btn-ghost.next-btn-dark.disabled:visited,.next-btn-ghost.next-btn-dark.disabled.visited,.next-btn-ghost.next-btn-dark[disabled],.next-btn-ghost.next-btn-dark[disabled]:link,.next-btn-ghost.next-btn-dark[disabled]:visited,.next-btn-ghost.next-btn-dark[disabled].visited{color:#fff6}.next-btn-ghost.next-btn-dark.disabled:focus,.next-btn-ghost.next-btn-dark.disabled:hover,.next-btn-ghost.next-btn-dark.disabled.hover,.next-btn-ghost.next-btn-dark[disabled]:focus,.next-btn-ghost.next-btn-dark[disabled]:hover,.next-btn-ghost.next-btn-dark[disabled].hover{color:#fff6;background:transparent;border-color:#fff6;text-decoration:none}.next-btn-ghost.next-btn-dark.disabled:active,.next-btn-ghost.next-btn-dark.disabled.active,.next-btn-ghost.next-btn-dark[disabled]:active,.next-btn-ghost.next-btn-dark[disabled].active{color:#fff6;background:transparent;border-color:#fff6;text-decoration:none}.next-btn-ghost.next-btn-light{background:rgba(0,0,0,0);border-color:#333}.next-btn-ghost.next-btn-light,.next-btn-ghost.next-btn-light:link,.next-btn-ghost.next-btn-light:visited,.next-btn-ghost.next-btn-light.visited{color:#333}.next-btn-ghost.next-btn-light:focus,.next-btn-ghost.next-btn-light:hover,.next-btn-ghost.next-btn-light.hover{color:#999;background:rgba(0,0,0,.92);border-color:#333;text-decoration:none}.next-btn-ghost.next-btn-light:active,.next-btn-ghost.next-btn-light.active{color:#999;background:rgba(0,0,0,.92);border-color:#333;text-decoration:none}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light[disabled]{background:transparent;border-color:#0000001a}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light.disabled:link,.next-btn-ghost.next-btn-light.disabled:visited,.next-btn-ghost.next-btn-light.disabled.visited,.next-btn-ghost.next-btn-light[disabled],.next-btn-ghost.next-btn-light[disabled]:link,.next-btn-ghost.next-btn-light[disabled]:visited,.next-btn-ghost.next-btn-light[disabled].visited{color:#0000001a}.next-btn-ghost.next-btn-light.disabled:focus,.next-btn-ghost.next-btn-light.disabled:hover,.next-btn-ghost.next-btn-light.disabled.hover,.next-btn-ghost.next-btn-light[disabled]:focus,.next-btn-ghost.next-btn-light[disabled]:hover,.next-btn-ghost.next-btn-light[disabled].hover{color:#0000001a;background:transparent;border-color:#0000001a;text-decoration:none}.next-btn-ghost.next-btn-light.disabled:active,.next-btn-ghost.next-btn-light.disabled.active,.next-btn-ghost.next-btn-light[disabled]:active,.next-btn-ghost.next-btn-light[disabled].active{color:#0000001a;background:transparent;border-color:#0000001a;text-decoration:none}.next-btn-group{position:relative;display:inline-block;vertical-align:middle}.next-btn-group>.next-btn{position:relative;float:left;box-shadow:none}.next-btn-group>.next-btn:hover,.next-btn-group>.next-btn:focus,.next-btn-group>.next-btn:active,.next-btn-group>.next-btn.active{z-index:1}.next-btn-group>.next-btn.disabled,.next-btn-group>.next-btn[disabled]{z-index:0}.next-btn-group .next-btn.next-btn{margin:0 0 0 -1px}.next-btn-group .next-btn:not(:first-child):not(:last-child){border-radius:0}.next-btn-group>.next-btn:first-child{margin:0}.next-btn-group>.next-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group>.next-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group>.next-btn-primary:not(:first-child){border-left-color:#fff3}.next-btn-group>.next-btn-primary:not(:first-child):hover{border-left-color:transparent}.next-btn-group>.next-btn-primary:not(:first-child).disabled,.next-btn-group>.next-btn-primary:not(:first-child)[disabled]{border-left-color:#eee}.next-btn-group[dir=rtl]>.next-btn{float:right}.next-btn-group[dir=rtl] .next-btn.next-btn{margin:0 -1px 0 0}.next-btn-group[dir=rtl]>.next-btn:first-child:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group[dir=rtl]>.next-btn:last-child:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child){border-right-color:#fff3}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child):hover{border-right-color:transparent}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child).disabled,.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child)[disabled]{border-right-color:#eee}.next-btn.next-small[dir=rtl]{border-radius:3px}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last:before,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl].next-btn-loading{padding-left:16px;padding-right:calc(16px + 12px + 4px)}.next-btn.next-small[dir=rtl].next-btn-loading:after{right:16px;top:50%;margin-right:0;margin-left:4px}.next-btn.next-medium[dir=rtl]{border-radius:3px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last:before,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl].next-btn-loading{padding-left:20px;padding-right:calc(20px + 20px + 4px)}.next-btn.next-medium[dir=rtl].next-btn-loading:after{right:20px;top:50%;margin-right:0;margin-left:4px}.next-btn.next-large[dir=rtl]{border-radius:3px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last:before,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl].next-btn-loading{padding-left:24px;padding-right:calc(24px + 20px + 4px)}.next-btn.next-large[dir=rtl].next-btn-loading:after{right:24px;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-large{border-radius:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last:before,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large.next-btn-loading{padding-left:0;padding-right:calc(0px + 20px + 4px)}.next-btn-text[dir=rtl].next-large.next-btn-loading:after{right:0px;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-medium{border-radius:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last:before,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium.next-btn-loading{padding-left:0;padding-right:calc(0px + 20px + 4px)}.next-btn-text[dir=rtl].next-medium.next-btn-loading:after{right:0px;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-small{border-radius:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last:before,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small.next-btn-loading{padding-left:0;padding-right:calc(0px + 12px + 4px)}.next-btn-text[dir=rtl].next-small.next-btn-loading:after{right:0px;top:50%;margin-right:0;margin-left:4px}._app_1723s_20{text-align:center}._logo_1723s_24{height:40vmin;pointer-events:none}._header_1723s_29 p{display:flex;align-items:center;justify-content:center;font-size:24px;color:#000}._link_1723s_37{color:#61dafb;margin:0 10px}@media (prefers-reduced-motion: no-preference){._logo_1723s_24{animation:_App-logo-spin_1723s_1 infinite 20s linear}}@keyframes _App-logo-spin_1723s_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.next-checkbox-wrapper[dir=rtl]{margin-right:8px;margin-left:0}.next-checkbox-wrapper[dir=rtl]:first-child{margin-right:0}.next-checkbox-wrapper[dir=rtl]>.next-checkbox-label{margin-right:4px;margin-left:0}.next-checkbox-wrapper{box-sizing:border-box;display:inline-block}.next-checkbox-wrapper *,.next-checkbox-wrapper *:before,.next-checkbox-wrapper *:after{box-sizing:border-box}.next-checkbox-wrapper .next-checkbox{display:inline-block;position:relative;line-height:1;vertical-align:middle}.next-checkbox-wrapper input[type=checkbox]{opacity:0;position:absolute;top:0;left:0;width:16px;height:16px;margin:0;cursor:pointer}.next-checkbox-wrapper .next-checkbox-inner{display:block;width:16px;height:16px;background:#FFFFFF;border-radius:3px;border:1px solid #DDDDDD;transition:all .1s linear;text-align:left;box-shadow:none}.next-checkbox-wrapper .next-checkbox-inner>.next-icon{transform:scale(0);position:absolute;top:0;opacity:0;line-height:16px;transition:all .1s linear;color:#fff;left:calc((16px - 12px) / 2);margin-left:0}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper .next-checkbox-inner>.next-icon .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{vertical-align:top;margin-top:0}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-select-icon:before{content:"\e632"}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-semi-select-icon:before{content:"\e633"}.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner{border-color:transparent;background-color:#209bfa}.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner.hovered{border-color:transparent}.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;transform:scale(1);margin-left:0}.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner{border-color:transparent;background-color:#209bfa}.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner.hovered{border-color:transparent}.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;transform:scale(1);margin-left:0}.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper:not(.disabled):hover>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.hovered>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.focused>.next-checkbox>.next-checkbox-inner{border-color:#209bfa;background-color:#add9ff}.next-checkbox-wrapper:not(.disabled):hover .next-checkbox-label,.next-checkbox-wrapper.hovered .next-checkbox-label,.next-checkbox-wrapper.focused .next-checkbox-label{cursor:pointer}.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner{border-color:transparent;background-color:#1274e7}.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon{color:#fff;opacity:1}.next-checkbox-wrapper.disabled input[type=checkbox]{cursor:not-allowed}.next-checkbox-wrapper.disabled .next-checkbox-inner{border-color:#eee;background:#FAFAFA}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner{border-color:#eee;background:#FAFAFA}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.checked .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner.hovered{border-color:#eee}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner>.next-icon{color:#ccc;opacity:1}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner{border-color:#eee;background:#FAFAFA}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner>.next-icon{color:#ccc;opacity:1}.next-checkbox-wrapper.disabled .next-checkbox-label{color:#ccc;cursor:not-allowed}.next-checkbox-group .next-checkbox-wrapper{display:inline-block;margin-right:12px}.next-checkbox-group .next-checkbox-wrapper:last-child{margin-right:0}.next-checkbox-group-ver .next-checkbox-wrapper{display:block;margin-left:0;margin-right:0;margin-bottom:8px}.next-checkbox-label{font-size:14px;color:#333;vertical-align:middle;margin:0 4px;line-height:1}.next-radio-button-large[dir=rtl]>label:first-child{margin-left:-1px;border-radius:0 3px 3px 0}.next-radio-button-large[dir=rtl]>label:last-child{margin-left:0;border-radius:3px 0 0 3px}.next-radio-button-large[dir=rtl] .next-radio-label{height:calc(40px - 2px);line-height:calc(40px - 2px);font-size:16px}.next-radio-button-medium[dir=rtl]>label:first-child{margin-left:-1px;border-radius:0 3px 3px 0}.next-radio-button-medium[dir=rtl]>label:last-child{margin-left:0;border-radius:3px 0 0 3px}.next-radio-button-small[dir=rtl]>label:first-child{margin-left:-1px;border-radius:0 3px 3px 0}.next-radio-button-small[dir=rtl]>label:last-child{margin-left:0;border-radius:3px 0 0 3px}.next-radio-wrapper[dir=rtl] .next-radio-label{margin-left:0;margin-right:4px}.next-radio-group[dir=rtl] .next-radio-label{margin-right:4px;margin-left:16px}.next-radio-button[dir=rtl]>label .next-radio-label{margin:0}.next-radio-wrapper{outline:0;display:inline-block}.next-radio-wrapper .next-radio{box-sizing:border-box;display:inline-block;vertical-align:middle;position:relative;line-height:1}.next-radio-wrapper .next-radio *,.next-radio-wrapper .next-radio *:before,.next-radio-wrapper .next-radio *:after{box-sizing:border-box}.next-radio-wrapper .next-radio input[type=radio]{opacity:0;position:absolute;vertical-align:middle;top:0;left:0;width:16px;height:16px;margin:0;cursor:pointer}.next-radio-wrapper .next-radio-inner{display:block;width:16px;height:16px;background:#FFFFFF;border-radius:50%;border:1px solid #DDDDDD;transition:all .1s linear;box-shadow:none}.next-radio-wrapper .next-radio-inner:after{transform:scale(0);position:absolute;border-radius:50%;top:50%;margin-top:calc(0px - (4px / 2));left:50%;margin-left:calc(0px - (4px / 2));background:#FFFFFF;content:"";transition:all .1s linear}.next-radio-wrapper.checked .next-radio-inner{border-color:#209bfa;background:#209BFA}.next-radio-wrapper.checked .next-radio-inner:after{width:4px;height:4px;font-weight:bold;background:#FFFFFF;transform:scale(1)}.next-radio-wrapper.checked:hover .next-radio-inner,.next-radio-wrapper.checked.hovered .next-radio-inner{border-color:transparent}.next-radio-wrapper.disabled input[type=radio]{cursor:not-allowed}.next-radio-wrapper.disabled .next-radio-inner{border-color:#eee;background:#FAFAFA}.next-radio-wrapper.disabled .next-radio-inner:after{background:#CCCCCC}.next-radio-wrapper.disabled .next-radio-inner:hover,.next-radio-wrapper.disabled .next-radio-inner.hovered{border-color:#eee}.next-radio-wrapper.disabled.checked .next-radio-inner{border-color:#eee;background:#FAFAFA}.next-radio-wrapper.disabled.checked .next-radio-inner:after{background:#CCCCCC}.next-radio-wrapper.disabled .next-radio-label{color:#ccc}.next-radio-wrapper:not(.disabled):hover .next-radio-inner,.next-radio-wrapper:not(.disabled).hovered .next-radio-inner{border-color:#209bfa;background-color:#add9ff}.next-radio-wrapper:not(.disabled):hover .next-radio-label,.next-radio-wrapper:not(.disabled).hovered .next-radio-label{cursor:pointer}.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner,.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner{border-color:transparent;background:#1274E7}.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner:after,.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner:after{background:#FFFFFF}.next-radio-button .next-radio{width:0;height:0}.next-radio-button input[type=radio]{width:0;height:0}.next-radio-button>label{display:inline-block;box-sizing:border-box;position:relative;z-index:1;margin:0 0 0 -1px;border:1px solid #DDDDDD;background-color:#fff;transition:all .1s linear;vertical-align:middle}.next-radio-button>label .next-radio-label{display:block;color:#333;margin:0;transition:all .1s linear}.next-radio-button>label:hover,.next-radio-button>label.hovered{z-index:10;border-color:#ccc;background-color:#f9f9f9}.next-radio-button>label:hover .next-radio-label,.next-radio-button>label.hovered .next-radio-label{color:#333}.next-radio-button>label.checked{z-index:11;border-color:#209bfa;background-color:#fff}.next-radio-button>label.checked .next-radio-label{color:#209bfa}.next-radio-button>label.disabled{z-index:0;cursor:not-allowed;border-color:#eee;background-color:#fafafa}.next-radio-button>label.disabled .next-radio-label{color:#ccc}.next-radio-button>label.checked.disabled{z-index:0;border-color:#eee;background-color:#f9f9f9}.next-radio-button>label.checked.disabled .next-radio-label{color:#ccc}.next-radio-button-large>label{padding:0 8px;height:40px;line-height:40px}.next-radio-button-large>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-large>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-large .next-radio-label{height:calc(40px - 2px);line-height:calc(40px - 2px);font-size:16px}.next-radio-button-medium>label{padding:0 8px;height:32px;line-height:32px}.next-radio-button-medium>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-medium>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-medium .next-radio-label{height:calc(32px - 2px);line-height:calc(32px - 2px);font-size:14px}.next-radio-button-small>label{padding:0 8px;height:20px;line-height:20px}.next-radio-button-small>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-small>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-small .next-radio-label{height:calc(20px - 2px);line-height:calc(20px - 2px);font-size:12px}.next-radio-single-input input[type=radio]{opacity:0;position:absolute;top:0;left:0;margin:0}.next-radio-group{display:inline-block}.next-radio-group .next-radio-wrapper{margin-right:12px}.next-radio-group .next-radio-wrapper:last-child{margin-right:0}.next-radio-group .next-radio-label{color:#333}.next-radio-group.disabled .next-radio-label{color:#ccc}.next-radio-group.next-radio-button .next-radio-wrapper{margin-right:0}.next-radio-group-ver .next-radio-wrapper{display:block;margin-bottom:8px}.next-radio-label{margin:0 4px;font-size:14px;vertical-align:middle;line-height:1;color:#333}@-moz-document url-prefix(){.next-radio{margin-top:-1px}@supports (animation: calc(0s)){.next-radio{margin-top:-3px}}}.next-menu[dir=rtl] .next-menu-item-helper{float:left}.next-menu[dir=rtl] .next-menu-item .next-checkbox,.next-menu[dir=rtl] .next-menu-item .next-radio{margin-left:4px;margin-right:0}.next-menu[dir=rtl] .next-menu-hoz-right{float:left}.next-menu[dir=rtl] .next-menu-hoz-icon-arrow.next-icon{left:6px;right:auto}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon{margin-left:0;margin-right:calc(0px - (20px + 16px) / 2)}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon:before,.next-menu[dir=rtl] .next-menu-icon-selected.next-icon .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon.next-menu-icon-right{right:auto;left:4px}.next-menu[dir=rtl] .next-menu-icon-arrow.next-icon{left:10px;right:auto}.next-menu{box-sizing:border-box;position:relative;min-width:100px;margin:0;list-style:none;border:1px solid #E6E6E6;border-radius:3px;box-shadow:none;background:#FFFFFF;line-height:32px;font-size:14px;animation-duration:.3s;animation-timing-function:ease}.next-menu *,.next-menu *:before,.next-menu *:after{box-sizing:border-box}.next-menu:focus,.next-menu *:focus{outline:0}.next-menu-spacing-lr{padding:0}.next-menu-spacing-lr.next-menu-outside>.next-menu{height:100%;overflow-y:auto}.next-menu-spacing-tb{padding:0}.next-menu.next-ver{padding:8px 0}.next-menu.next-ver .next-menu-item{padding:0 20px}.next-menu.next-hoz{padding:8px 0}.next-menu.next-hoz .next-menu-item{padding:0 20px}.next-menu-embeddable,.next-menu-embeddable .next-menu-item.next-disabled,.next-menu-embeddable .next-menu-item.next-disabled .next-menu-item-text>a{background:transparent;border:none}.next-menu-embeddable{box-shadow:none}.next-menu-embeddable .next-menu-item-inner{height:100%}.next-menu-content{position:relative;padding:0;margin:0;list-style:none}.next-menu-sub-menu{padding:0;margin:0;list-style:none}.next-menu-sub-menu.next-expand-enter{overflow:hidden}.next-menu-sub-menu.next-expand-enter-active{transition:height .3s ease}.next-menu-sub-menu.next-expand-leave{overflow:hidden}.next-menu-sub-menu.next-expand-leave-active{transition:height .3s ease}.next-menu-item{position:relative;transition:background .1s linear;color:#333;cursor:pointer}.next-menu-item-helper{float:right;color:#999;font-style:normal;font-size:14px}.next-menu-item .next-checkbox,.next-menu-item .next-radio{margin-right:4px}.next-menu-item.next-selected{color:#333;background-color:#fff}.next-menu-item.next-selected .next-menu-icon-arrow{color:#666}.next-menu-item.next-selected .next-menu-icon-selected{color:#209bfa}.next-menu-item.next-disabled,.next-menu-item.next-disabled .next-menu-item-text>a{color:#ccc;background-color:#fff;cursor:not-allowed}.next-menu-item.next-disabled .next-menu-icon-arrow,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow{color:#ccc}.next-menu-item.next-disabled .next-menu-icon-selected,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#ccc}.next-menu-item:not(.next-disabled):hover,.next-menu-item:not(.next-disabled).next-selected:hover,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover,.next-menu-item:not(.next-disabled).next-selected:focus:hover,.next-menu-item:not(.next-disabled).next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused,.next-menu-item:not(.next-disabled).next-selected:focus{color:#333;background-color:#f9f9f9}.next-menu-item:not(.next-disabled):hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-arrow{color:#333}.next-menu-item:not(.next-disabled):hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-selected{color:#209bfa}.next-menu-item-inner{height:32px;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.next-menu-item .next-menu-item-text{vertical-align:middle}.next-menu-item .next-menu-item-text>a{display:inline-block;text-decoration:none;color:#333}.next-menu-item .next-menu-item-text>a:before{position:absolute;background-color:transparent;top:0;left:0;bottom:0;right:0;content:""}.next-menu.next-hoz{padding:0}.next-menu.next-hoz.next-menu-nowrap{overflow:hidden;white-space:nowrap}.next-menu.next-hoz.next-menu-nowrap .next-menu-more{text-align:center}.next-menu.next-hoz>.next-menu-item,.next-menu.next-hoz>.next-menu-sub-menu-wrapper,.next-menu.next-hoz .next-menu-content>.next-menu-item{display:inline-block;vertical-align:top}.next-menu.next-hoz .next-menu-header,.next-menu.next-hoz .next-menu-content,.next-menu.next-hoz .next-menu-footer{display:inline-block}.next-menu-hoz-right{float:right}.next-menu-group-label{padding:0 12px;color:#999}.next-menu-divider{margin:8px 12px;border-bottom:1px solid #EEEEEE}.next-menu .next-menu-icon-selected.next-icon{position:absolute;top:0;margin-left:calc(0px - (20px - 4px))}.next-menu .next-menu-icon-selected.next-icon:before,.next-menu .next-menu-icon-selected.next-icon .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-menu .next-menu-icon-selected.next-icon.next-menu-icon-right{right:4px}.next-menu .next-menu-symbol-icon-selected.next-menu-icon-selected:before{content:"\e632"}.next-menu .next-menu-icon-arrow.next-icon{position:absolute;top:0;right:10px;color:#666;transition:all .1s linear}.next-menu .next-menu-icon-arrow.next-icon:before,.next-menu .next-menu-icon-arrow.next-icon .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-icon-arrow-down:before{content:"\e63d"}.next-menu .next-menu-icon-arrow-down.next-open{transform:rotate(180deg)}.next-menu .next-menu-icon-arrow-down.next-open:before,.next-menu .next-menu-icon-arrow-down.next-open .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-symbol-popupfold:before{content:"\e619"}.next-menu .next-menu-icon-arrow-right.next-open{transform:rotate(-90deg)}.next-menu .next-menu-icon-arrow-right.next-open:before,.next-menu .next-menu-icon-arrow-right.next-open .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon{position:absolute;top:0;right:6px;color:#666;transition:all .1s linear}.next-menu .next-menu-hoz-icon-arrow.next-icon:before,.next-menu .next-menu-hoz-icon-arrow.next-icon .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon:before{content:"\e63d"}.next-menu-unfold-icon:before{content:""}.next-menu .next-menu-hoz-icon-arrow.next-open{transform:rotate(180deg)}.next-menu .next-menu-hoz-icon-arrow.next-open:before,.next-menu .next-menu-hoz-icon-arrow.next-open .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-menu.next-context{line-height:24px}.next-menu.next-context .next-menu-item-inner{height:24px}.next-table{box-sizing:border-box;position:relative;border-top:1px solid #E6E6E6;border-left:1px solid #E6E6E6}.next-table *,.next-table *:before,.next-table *:after{box-sizing:border-box}.next-table .next-table-header tr:first-child th:first-child{border-top-left-radius:0}.next-table .next-table-header tr:first-child th:last-child{border-top-right-radius:0}.next-table .next-table-header tr:last-child th:first-child{border-bottom-left-radius:0}.next-table .next-table-header tr:last-child th:last-child{border-bottom-right-radius:0}.next-table.next-table-layout-fixed{overflow:auto}.next-table.next-table-layout-fixed table{table-layout:fixed}.next-table.next-table-layout-auto table{table-layout:auto}.next-table.next-table-small th .next-table-cell-wrapper{padding:8px}.next-table.next-table-small td .next-table-cell-wrapper{padding:8px}.next-table.next-table-small .next-table-prerow .next-table-cell-wrapper{padding:8px}.next-table table{border-collapse:separate;border-spacing:0;width:100%;background:#FFFFFF}.next-table table tr:first-child td{border-top-width:0}.next-table th{padding:0;background:#F5F5F5;color:#333;text-align:left;font-weight:normal;border-right:1px solid #E6E6E6;border-bottom:1px solid #E6E6E6}.next-table th .next-table-cell-wrapper{padding:12px 16px;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table th.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table th.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table th.next-table-fix-left,.next-table th.next-table-fix-right{z-index:1}.next-table-affix{z-index:1;overflow:hidden}.next-table-stickylock .next-table-affix{z-index:9}.next-table-header-resizable{position:relative}.next-table-header-resizable .next-table-resize-handler{position:absolute;right:0;top:0;bottom:0;width:3px;background:transparent;cursor:ew-resize}.next-table td{padding:0;border-right:1px solid #E6E6E6;border-bottom:1px solid #E6E6E6}.next-table td .next-table-cell-wrapper{padding:12px 16px;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-table-tree-placeholder{margin-right:8px;outline:0;cursor:pointer}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before{content:"\e619"}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before,.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before{content:"\e63d"}.next-table td.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table td.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table .next-table-expanded .next-table-cell-wrapper,.next-table .next-table-selection .next-table-cell-wrapper{overflow:visible}.next-table.no-header table tr:first-child td{border-top-width:1px}.next-table.only-bottom-border{border-width:0}.next-table.only-bottom-border th{border-width:0 0 1px 0}.next-table.only-bottom-border td{border-width:0 0 1px 0}.next-table.only-bottom-border table tr td:first-child,.next-table.only-bottom-border table tr th:first-child{border-left-width:0}.next-table.only-bottom-border .next-table-header tr th:last-child{border-right-width:0}.next-table.only-bottom-border .next-table-body tr td:last-child{border-right-width:0}.next-table-loading{display:block}.next-table.zebra tr:nth-child(odd) td{background:#FFFFFF}.next-table.zebra tr:nth-child(even) td{background:#FAFAFA}.next-table.zebra .next-table-row.hovered td{background:#FAFAFA;color:#333}.next-table.zebra .next-table-cell.hovered{background:#FAFAFA;color:#333}.next-table.zebra .next-table-row.selected td{background:#F9F9F9;color:#333}.next-table-empty{color:#ccc;padding:32px 0;text-align:center}.next-table-expanded-row>td{border-width:0 0 1px 0}.next-table-expanded-row>td:first-child{border-left-width:1px}.next-table-expanded-row>td:last-child{border-right-width:1px}.next-table-expanded-row:last-child>td{border-bottom-width:1px}.next-table-expanded-row .next-table{border-top:0;border-left:0}.next-table-expanded-row .next-table th,.next-table-expanded-row .next-table td{border-right:1px solid #E6E6E6}.next-table-expanded-row .next-table.only-bottom-border th,.next-table-expanded-row .next-table.only-bottom-border td{border-right:0}.next-table-expanded-row .next-table .last td{border-bottom:0}.next-table-expanded-row .next-table td.last,.next-table-expanded-row .next-table th:last-child{border-right:0}.next-table-filter-footer{margin:10px 10px 0}.next-table-filter-footer button{margin-right:5px}.next-table-row{transition:all .1s linear;background:#FFFFFF;color:#333}.next-table-row.hidden{display:none}.next-table-row.hovered{background:#FAFAFA;color:#333}.next-table-row.selected{background:#F9F9F9;color:#333}.next-table-cell.hovered{background:#FAFAFA;color:#333}.next-table-tree-placeholder{display:inline-block;width:12px}.last .next-table-expanded-row td{border-bottom-width:1px}.next-table-body,.next-table-header{overflow:auto;font-size:14px}.next-table-header{margin-bottom:-20px;padding-bottom:20px;overflow:-moz-scrollbars-none;-ms-overflow-style:none;scrollbar-width:none}.next-table-header::-webkit-scrollbar{display:none}.next-table-body{font-size:14px;position:relative}.next-table-fixed{border-bottom:1px solid #E6E6E6}.next-table-fixed table{table-layout:fixed}.next-table-fixed .next-table-header{background:#F5F5F5}.next-table-fixed table tr td:first-child,.next-table-fixed table tr th:first-child{border-left-width:0}.next-table-fixed .next-table-header th{border-top-width:0}.next-table-fixed .next-table-header tr th:last-child{border-right-width:0}.next-table-fixed .next-table-body td{border-top-width:0}.next-table-fixed .next-table-body tr:last-child td{border-bottom-width:0}.next-table-fixed .next-table-body tr td:last-child{border-right-width:0}.next-table-fixed .next-table-header tr th:last-child{border-right-width:1px}.next-table-fixed .next-table-body tr td:last-child{border-right-width:1px}.next-table-fixed.next-table-group table tr td:first-child,.next-table-fixed.next-table-group table tr th:first-child{border-left-width:1px}.next-table-fixed.next-table-group .next-table-header th{border-top-width:1px}.next-table-fixed.next-table-group .next-table-header tr th:last-child{border-right-width:1px}.next-table-fixed.next-table-group .next-table-body td{border-top-width:1px}.next-table-fixed.next-table-group .next-table-body tr:last-child td{border-bottom-width:1px}.next-table-fixed.next-table-group .next-table-body tr td:last-child{border-right-width:1px}.next-table-lock .next-table-body{overflow-x:auto;overflow-y:visible}.next-table-group{border-width:0}.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-header table{border-left:0}.next-table-group.only-bottom-border .next-table-header table,.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-body table.next-table-row{border-top:0}.next-table-group.only-bottom-border .next-table-body table>tbody>tr:nth-last-child(2) td,.next-table-group.only-bottom-border .next-table-body .next-table-group-footer td{border-bottom:0}.next-table-group .next-table-body{margin-top:8px}.next-table-group .next-table-body table{border-top:1px solid #E6E6E6;border-left:1px solid #E6E6E6;margin-bottom:8px}.next-table-group .next-table-body table tr:first-child td{border-top-width:1px}.next-table-group .next-table-body table:last-of-type{margin-bottom:0}.next-table-group .next-table-header table{border-top:1px solid #E6E6E6;border-left:1px solid #E6E6E6}.next-table-group .next-table-group-header td{background:#F5F5F5;color:#333}.next-table-group .next-table-group-header td:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.next-table-group .next-table-group-header td:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.next-table-group .next-table-group-footer td{background:#F5F5F5;color:#333}.next-table-group .next-table-group-footer td:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.next-table-group .next-table-group-footer td:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.next-table-group .next-table-row.hovered,.next-table-group .next-table-row.selected{background:#FFFFFF;color:#333}.next-table-lock{position:relative}.next-table-lock table{table-layout:fixed}.next-table-header-inner{overflow:unset}.next-table-wrap-empty .next-table-lock-left td,.next-table-wrap-empty .next-table-lock-right td{border:none}.next-table-wrap-empty .next-table-lock-left .next-table-empty,.next-table-wrap-empty .next-table-lock-right .next-table-empty{display:none}.next-table-wrap-empty>.next-table-inner>.next-table-body>table{table-layout:fixed}.next-table-lock-left,.next-table-lock-right{position:absolute;left:0;top:0;z-index:1;border:0;transition:box-shadow .3s ease;overflow:hidden}.next-table-lock-left table,.next-table-lock-right table{width:auto}.next-table-lock-left .next-table-body,.next-table-lock-right .next-table-body{overflow-y:scroll;overflow-x:hidden;margin-right:-20px;padding-right:0}.next-table-lock-left.shadow .next-table-header tr th:last-child,.next-table-lock-right.shadow .next-table-header tr th:last-child{border-right-width:0}.next-table-lock-left.shadow .next-table-body tr td:last-child,.next-table-lock-right.shadow .next-table-body tr td:last-child{border-right-width:0}.next-table-lock-right{right:0;left:auto}.next-table-lock-right table tr td:first-child,.next-table-lock-right table tr th:first-child{border-left-width:1px}.next-table-lock-right.shadow{box-shadow:-2px 0 3px #0000001f}.next-table-lock-left.shadow{box-shadow:2px 0 3px #0000001f}.next-table-filter{line-height:1}.next-table-sort{cursor:pointer;position:relative;width:16px;display:inline-block;line-height:1}.next-table-sort:focus{outline:0}.next-table-sort>a:before{content:" ";display:inline-block;vertical-align:middle}.next-table-sort .next-icon{position:absolute;left:-2px;color:#333}.next-table-sort .next-icon:before,.next-table-sort .next-icon .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-table-sort .current .next-icon{color:#209bfa}.next-table-sort .next-icon-ascending{left:2px}.next-table-filter{cursor:pointer;width:20px;display:inline-block}.next-table-filter:focus{outline:0}.next-table-filter .next-icon{color:#333}.next-table-filter .next-icon:before,.next-table-filter .next-icon .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-table-filter .next-table-filter-active{color:#209bfa}.next-table-filter-menu .next-menu-content{max-height:220px;overflow:auto}.next-table-header-icon{margin-left:8px}.next-table-expanded-ctrl{cursor:pointer}.next-table-expanded-ctrl:focus{outline:0}.next-table-expanded-ctrl.disabled{color:#999}.next-table-expanded-ctrl .next-table-expand-unfold:before,.next-table-expanded-ctrl .next-table-expand-unfold .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-unfold:before{content:"\e601"}.next-table-expanded-ctrl .next-table-expand-fold:before,.next-table-expanded-ctrl .next-table-expand-fold .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-fold:before{content:"\e655"}.next-table-fix-left,.next-table-fix-right{background:inherit;position:sticky;z-index:1;background-clip:padding-box}.next-table-ping-left .next-table-expanded-area .next-table-fix-left-last:after{content:none}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last,.next-table-ping-left .next-table-fix-left-last{border-right-width:0}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last:after,.next-table-ping-left .next-table-fix-left-last:after{box-shadow:inset 10px 0 8px -8px #00000026;position:absolute;top:0;right:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translate(100%)}.next-table-ping-right .next-table-expanded-area .next-table-fix-right-first:after{content:none}.next-table-ping-right .next-table-expanded-area .next-table-ping-right .next-table-fix-right-first:after,.next-table-ping-right .next-table-fix-right-first:after{box-shadow:inset -10px 0 8px -8px #00000026;position:absolute;top:0;left:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translate(-100%)}.next-table-fixed.next-table-scrolling-to-right:after,.next-table-lock.next-table-scrolling-to-right:after{box-shadow:inset -10px 0 8px -8px #00000026;position:absolute;top:0;right:-30px;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translate(-100%)}.next-table-fixed.next-table-scrolling-to-right .next-table-lock-right,.next-table-lock.next-table-scrolling-to-right .next-table-lock-right{border-right:1px solid #E6E6E6}.next-table-fixed.next-table-ping-right,.next-table-fixed.only-bottom-border,.next-table-lock.next-table-ping-right,.next-table-lock.only-bottom-border{border-right:0}.next-table[dir=rtl] th{text-align:right}.next-table[dir=rtl] .next-table-header-resizable .next-table-resize-handler{right:auto;left:0}.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-table-tree-placeholder{margin-left:3px;margin-right:0;float:right}.next-table[dir=rtl] .next-table-expanded-row td:first-child{border-left-width:0;border-right-width:1px}.next-table[dir=rtl] .next-table-expanded-row td:last-child{border-left-width:1px;border-right-width:0}.next-table[dir=rtl].only-bottom-border .next-table-expanded-row th{border-width:0 0 1px 0}.next-table[dir=rtl].only-bottom-border .next-table-expanded-row td{border-width:0 0 1px 0}.next-table[dir=rtl] .next-table-filter-footer button{margin-left:5px;margin-right:0}.next-table[dir=rtl] .next-table-lock-left,.next-table[dir=rtl] .next-table-lock-right{left:auto;right:0}.next-table[dir=rtl] .next-table-lock-right{right:auto;left:0}.next-table[dir=rtl] .next-table-lock-right table tr td:first-child,.next-table[dir=rtl] .next-table-lock-right table tr th:first-child{border-right-width:1px}.next-table[dir=rtl] .next-table-lock-right.shadow{box-shadow:2px 0 3px #0000001f}.next-table[dir=rtl] .next-table-lock-left.shadow{box-shadow:-2px 0 3px #0000001f}.next-table[dir=rtl] .next-table-sort .next-icon{right:0;left:auto}.next-table[dir=rtl] .next-table-sort .next-icon-ascending{right:4px;left:auto}.next-table[dir=rtl] .next-table-filter{margin-right:5px;margin-left:0}.next-table-fixed[dir=rtl] table tr td:first-child,.next-table-fixed[dir=rtl] table tr th:first-child{border-left-width:1px;border-right-width:0}.next-table-fixed[dir=rtl] .next-table-header tr th:last-child{border-left-width:1px}.next-table-fixed[dir=rtl] .next-table-body tr td:last-child{border-left-width:1px}.next-input{box-sizing:border-box;vertical-align:middle;display:inline-table;border-collapse:separate;font-size:0;line-height:1;width:200px;border-spacing:0;transition:all .1s linear;border:1px solid #DDDDDD;background-color:#fff}.next-input *,.next-input *:before,.next-input *:after{box-sizing:border-box}.next-input input{height:100%}.next-input input[type=reset],.next-input input[type=submit]{-webkit-appearance:button;cursor:pointer}.next-input input::-moz-focus-inner{border:0;padding:0}.next-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #FFFFFF inset;border-radius:3px}.next-input textarea{resize:none}.next-input input,.next-input textarea{width:100%;border:none;outline:none;padding:0;margin:0;font-weight:normal;vertical-align:middle;background-color:transparent;color:#333}.next-input input::-ms-clear,.next-input textarea::-ms-clear{display:none}.next-input.next-small{height:24px;border-radius:3px}.next-input.next-small .next-input-label{padding-left:8px;font-size:12px}.next-input.next-small .next-input-inner{font-size:12px}.next-input.next-small .next-input-control{padding-right:4px}.next-input.next-small input{height:calc(24px - 1px * 2);line-height:calc((24px - 1px*2)) \fffd;padding:0 4px;font-size:12px}.next-input.next-small input::placeholder{font-size:12px}.next-input.next-small .next-input-text-field{padding:0 4px;font-size:12px;height:calc(24px - 1px * 2);line-height:calc(24px - 1px * 2)}.next-input.next-small .next-icon:before,.next-input.next-small .next-icon .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-input.next-small .next-input-control{border-radius:0 3px 3px 0}.next-input.next-medium{height:32px;border-radius:3px}.next-input.next-medium .next-input-label{padding-left:8px;font-size:14px}.next-input.next-medium .next-input-inner{font-size:14px}.next-input.next-medium .next-input-control{padding-right:8px}.next-input.next-medium input{height:calc(32px - 1px * 2);line-height:calc((32px - 1px*2)) \fffd;padding:0 8px;font-size:14px}.next-input.next-medium input::placeholder{font-size:14px}.next-input.next-medium .next-input-text-field{padding:0 8px;font-size:14px;height:calc(32px - 1px * 2);line-height:calc(32px - 1px * 2)}.next-input.next-medium .next-icon:before,.next-input.next-medium .next-icon .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-input.next-medium .next-input-control{border-radius:0 3px 3px 0}.next-input.next-large{height:40px;border-radius:3px}.next-input.next-large .next-input-label{padding-left:12px;font-size:16px}.next-input.next-large .next-input-inner{font-size:16px}.next-input.next-large .next-input-control{padding-right:8px}.next-input.next-large input{height:calc(40px - 1px * 2);line-height:calc((40px - 1px*2)) \fffd;padding:0 12px;font-size:16px}.next-input.next-large input::placeholder{font-size:16px}.next-input.next-large .next-input-text-field{padding:0 12px;font-size:16px;height:calc(40px - 1px * 2);line-height:calc(40px - 1px * 2)}.next-input.next-large .next-icon:before,.next-input.next-large .next-icon .next-icon-remote{width:20px;font-size:20px;line-height:inherit}.next-input.next-large .next-input-control{border-radius:0 3px 3px 0}.next-input.next-input-textarea{height:auto;border-radius:3px;font-size:0}.next-input.next-input-textarea textarea{color:#333;padding:4px 8px;font-size:14px;border-radius:3px}.next-input.next-input-textarea.next-small textarea{font-size:14px}.next-input.next-input-textarea.next-large textarea{font-size:16px}.next-input.next-input-textarea .next-input-control{display:block;width:auto;border-radius:3px}.next-input.next-input-textarea .next-input-len{padding:0 8px 4px;display:block;text-align:right;width:auto}.next-input-hint-wrap{color:#999;position:relative}.next-input-hint-wrap .next-input-clear{opacity:0;z-index:1;position:absolute}.next-input-hint-wrap .next-input-hint{opacity:1}.next-input .next-input-clear-icon:hover,.next-input .next-icon-eye:hover,.next-input .next-icon-eye-close:hover{cursor:pointer;color:#666}.next-input:hover,.next-input.next-focus{border-color:#ccc;background-color:#fff}.next-input:hover .next-input-clear,.next-input.next-focus .next-input-clear{opacity:1}.next-input:hover .next-input-clear+.next-input-hint,.next-input.next-focus .next-input-clear+.next-input-hint{opacity:0}.next-input .next-input-clear:focus{opacity:1}.next-input .next-input-clear:focus+.next-input-hint{opacity:0}.next-input.next-focus{border-color:#209bfa;background-color:#fff;box-shadow:0 0 0 2px #209bfa33}.next-input.next-warning{border-color:#f1c826;background-color:#fff}.next-input.next-warning.next-focus,.next-input.next-warning:hover{border-color:#f1c826}.next-input.next-warning.next-focus{box-shadow:0 0 0 2px #f1c82633}.next-input.next-error{border-color:#d23c26;background-color:#fff}.next-input.next-error.next-focus,.next-input.next-error:hover{border-color:#d23c26}.next-input.next-error.next-focus{box-shadow:0 0 0 2px #d23c2633}.next-input.next-hidden{display:none}.next-input.next-noborder{border:none;box-shadow:none}.next-input-control .next-input-len{font-size:12px;line-height:12px;color:#999;display:table-cell;width:1px;vertical-align:bottom}.next-input-control .next-input-len.next-error{color:#d23c26}.next-input-control .next-input-len.next-warning{color:#f1c826}.next-input-control>*{display:table-cell;width:1%;top:0}.next-input-control>*:not(:last-child){padding-right:4px}.next-input-control .next-icon{transition:all .1s linear;color:#999}.next-input-control .next-input-warning-icon{color:#f1c826}.next-input-control .next-input-warning-icon:before{content:"\e60b"}.next-input-control .next-input-success-icon{color:#1ad78c}.next-input-control .next-input-success-icon:before{content:"\e63a"}.next-input-control .next-input-loading-icon{color:#298dff}.next-input-control .next-input-loading-icon:before{content:"\e646";animation:loadingCircle 1s infinite linear}.next-input-control .next-input-clear-icon:before{content:"\e623"}.next-input-label{color:#666}.next-input input::-moz-placeholder,.next-input textarea::-moz-placeholder{color:#ccc;opacity:1}.next-input input:-ms-input-placeholder,.next-input textarea:-ms-input-placeholder{color:#ccc}.next-input input::-webkit-input-placeholder,.next-input textarea::-webkit-input-placeholder{color:#ccc}.next-input.next-disabled{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-input.next-disabled:hover{border-color:#eee;background-color:#fafafa}.next-input.next-disabled input,.next-input.next-disabled textarea{-webkit-text-fill-color:#CCCCCC;color:#ccc}.next-input.next-disabled input::-moz-placeholder,.next-input.next-disabled textarea::-moz-placeholder{color:#ccc;opacity:1}.next-input.next-disabled input:-ms-input-placeholder,.next-input.next-disabled textarea:-ms-input-placeholder{color:#ccc}.next-input.next-disabled input::-webkit-input-placeholder,.next-input.next-disabled textarea::-webkit-input-placeholder{color:#ccc}.next-input.next-disabled .next-input-label{color:#ccc}.next-input.next-disabled .next-input-len{color:#ccc}.next-input.next-disabled .next-input-hint-wrap{color:#ccc}.next-input.next-disabled .next-input-hint-wrap .next-input-clear{opacity:0}.next-input.next-disabled .next-input-hint-wrap .next-input-hint{opacity:1}.next-input.next-disabled .next-input-hint-wrap .next-input-clear-icon:hover{cursor:not-allowed;color:#ccc}.next-input.next-disabled .next-icon{color:#ccc}.next-input-inner,.next-input-control,.next-input-label{display:table-cell;width:1px;vertical-align:middle;line-height:1;background-color:transparent;white-space:nowrap}.next-input-group{box-sizing:border-box;display:inline-table;border-collapse:separate;border-spacing:0;line-height:0;width:100%}.next-input-group *,.next-input-group *:before,.next-input-group *:after{box-sizing:border-box}.next-input-group-auto-width{width:100%;border-radius:0!important}.next-input-group>.next-input{border-radius:0}.next-input-group>.next-input.next-focus{position:relative;z-index:1}.next-input-group>.next-input:first-child.next-small{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.next-input-group>.next-input:first-child.next-medium{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.next-input-group>.next-input:first-child.next-large{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.next-input-group>.next-input:last-child.next-small{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-input-group>.next-input:last-child.next-medium{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-input-group>.next-input:last-child.next-large{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-input-group-addon{width:1px;display:table-cell;vertical-align:middle;white-space:nowrap}.next-input-group-addon:first-child{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*{margin-right:calc(0px - 1px);border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*.next-focus{position:relative;z-index:1}.next-input-group-addon:first-child>*>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*>.next-input.next-focus{position:relative;z-index:1}.next-input-group-addon:last-child{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-addon:last-child>*{margin-left:calc(0px - 1px);border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-addon:last-child>*>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-text{color:#999;background-color:#f9f9f9;text-align:center;border:1px solid #DDDDDD;padding:0 8px}.next-input-group-text:first-child{border-right-width:0}.next-input-group-text:last-child{border-left-width:0}.next-input-group-text.next-disabled{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-input-group-text.next-disabled:hover{border-color:#eee;background-color:#fafafa}.next-input-group-text.next-small{font-size:12px;border-radius:3px}.next-input-group-text.next-medium{font-size:14px;border-radius:3px}.next-input-group-text.next-large{font-size:16px;border-radius:3px}.next-input[dir=rtl].next-small .next-input-label{padding-left:0;padding-right:8px}.next-input[dir=rtl].next-small .next-input-control{padding-right:0;padding-left:4px}.next-input[dir=rtl].next-medium .next-input-label{padding-left:0;padding-right:8px}.next-input[dir=rtl].next-medium .next-input-control{padding-right:0;padding-left:8px}.next-input[dir=rtl].next-large .next-input-label{padding-left:0;padding-right:12px}.next-input[dir=rtl].next-large .next-input-control{padding-right:0;padding-left:8px}.next-input[dir=rtl].next-input-textarea .next-input-len{text-align:left}.next-input[dir=rtl] .next-input-control>*:not(:last-child){padding-left:4px;padding-right:0}.next-input-group[dir=rtl]>.next-input:first-child.next-small{border-radius:0 3px 3px 0!important}.next-input-group[dir=rtl]>.next-input:first-child.next-medium{border-radius:0 3px 3px 0!important}.next-input-group[dir=rtl]>.next-input:first-child.next-large{border-radius:0 3px 3px 0!important}.next-input-group[dir=rtl]>.next-input:last-child.next-small{border-radius:3px 0 0 3px!important}.next-input-group[dir=rtl]>.next-input:last-child.next-medium{border-radius:3px 0 0 3px!important}.next-input-group[dir=rtl]>.next-input:last-child.next-large{border-radius:3px 0 0 3px!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-small{border-bottom-right-radius:3px!important;border-top-right-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-medium{border-bottom-right-radius:3px!important;border-top-right-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-large{border-bottom-right-radius:3px!important;border-top-right-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child>*{margin-left:calc(0px - 1px);border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-small{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-medium{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-large{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child>*{margin-right:calc(0px - 1px);border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-text:first-child{border-right-width:1px;border-left:0}.next-input-group[dir=rtl] .next-input-group-text:last-child{border-left-width:1px;border-right:0}@keyframes fadeInRightForTag{0%{opacity:0;transform:rotate(45deg) translate(20px)}to{opacity:1;transform:rotate(45deg) translate(0)}}.next-tag>.next-tag-body{overflow:hidden;text-overflow:ellipsis}.next-tag-checkable.next-tag-level-secondary{color:#333;border-color:transparent;background-color:transparent}.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]):hover,.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]).hover{color:#209bfa}.next-tag-default.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn{color:#333}[disabled].next-tag-default.next-tag-level-primary,.disabled.next-tag-default.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}[disabled].next-tag-default.next-tag-level-primary>.next-tag-close-btn,.disabled.next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-closable.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn{color:#333}[disabled].next-tag-closable.next-tag-level-primary,.disabled.next-tag-closable.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}[disabled].next-tag-closable.next-tag-level-primary>.next-tag-close-btn,.disabled.next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn{color:#333}[disabled].next-tag-checkable.next-tag-level-primary,.disabled.next-tag-checkable.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}[disabled].next-tag-checkable.next-tag-level-primary>.next-tag-close-btn,.disabled.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-primary.checked{color:#fff;border-color:#209bfa;background-color:#209bfa}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover{color:#fff;border-color:#1274e7;background-color:#1274e7}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover>.next-tag-close-btn{color:#fff}[disabled].next-tag-checkable.next-tag-level-primary.checked,.disabled.next-tag-checkable.next-tag-level-primary.checked{color:#ccc;border-color:#fafafa;background-color:#fafafa}[disabled].next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,.disabled.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn{color:#fff}.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn{color:#fff}.next-tag-default.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover{color:#333;border-color:#ccc;background-color:transparent}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn{color:#333}[disabled].next-tag-default.next-tag-level-normal,.disabled.next-tag-default.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:#fafafa}[disabled].next-tag-default.next-tag-level-normal>.next-tag-close-btn,.disabled.next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#666}.next-tag-closable.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover{color:#333;border-color:#ccc;background-color:transparent}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn{color:#333}[disabled].next-tag-closable.next-tag-level-normal,.disabled.next-tag-closable.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:transparent}[disabled].next-tag-closable.next-tag-level-normal>.next-tag-close-btn,.disabled.next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-normal.checked{color:#209bfa;border-color:#209bfa;background-color:transparent}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover{color:#1274e7;border-color:#1274e7;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked{color:#209bfa;border-color:#209bfa;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover{color:#1274e7;border-color:#1274e7;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;transform:rotate(45deg)}.next-tag-checkable.next-tag-level-secondary.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"\e632";transform:scale(.6);color:#fff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:before,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:before{background-color:#1274e7}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:after,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:after{color:#fff}[disabled].next-tag-checkable.next-tag-level-secondary.checked:before,.next-tag-checkable.next-tag-level-secondary.checked:disabled:before{background-color:#eee}[disabled].next-tag-checkable.next-tag-level-secondary.checked:after,.next-tag-checkable.next-tag-level-secondary.checked:disabled:after{color:#fff}.next-tag-checkable.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]):hover,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]).hover{color:#333;border-color:#ddd;background-color:transparent}[disabled].next-tag-checkable.next-tag-level-normal,.disabled.next-tag-checkable.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:#fafafa}.next-tag-checkable.next-tag-level-normal.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;transform:rotate(45deg)}.next-tag-checkable.next-tag-level-normal.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"\e632";transform:scale(.6);color:#fff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:before,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:before{background-color:#1274e7}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:after,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:after{color:#fff}[disabled].next-tag-checkable.next-tag-level-normal.checked:before,.next-tag-checkable.next-tag-level-normal.checked:disabled:before{background-color:#eee}[disabled].next-tag-checkable.next-tag-level-normal.checked:after,.next-tag-checkable.next-tag-level-normal.checked:disabled:after{color:#fff}.next-tag-closable.next-tag-level-normal:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#ddd;transform:rotate(45deg)}.next-tag-closable.next-tag-level-normal:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"\e626";transform:scale(.6);color:#fff}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:before,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:before{background-color:#ccc}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:after,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:after{color:#fff}[disabled].next-tag-closable.next-tag-level-normal:before,.next-tag-closable.next-tag-level-normal:disabled:before{background-color:#eee}[disabled].next-tag-closable.next-tag-level-normal:after,.next-tag-closable.next-tag-level-normal:disabled:after{color:#fff}.next-tag-group .next-tag-medium,.next-tag-group .next-tag-large{margin-right:8px;margin-bottom:8px}.next-tag-group .next-tag-small{margin-right:4px;margin-bottom:4px}.next-tag{box-sizing:border-box;display:inline-block;max-width:100%;vertical-align:middle;border-width:1px;border-radius:3px;box-shadow:none;border-style:solid;overflow:hidden;white-space:nowrap;transition:all .1s linear;font-size:0;outline:0}.next-tag *,.next-tag *:before,.next-tag *:after{box-sizing:border-box}.next-tag>.next-tag-body{position:relative;display:inline-block;height:100%;text-align:center;vertical-align:middle;max-width:100%;cursor:default}.next-tag>.next-tag-body>a{text-decoration:none;color:inherit}.next-tag>.next-tag-body>a:before{content:" ";position:absolute;display:block;top:0;left:0;right:0;bottom:0}.next-tag>.next-tag-body .next-icon{line-height:1;vertical-align:baseline}.next-tag>.next-tag-body .next-icon:before{font-size:inherit}.next-tag.next-tag-body-pointer{cursor:pointer}.next-tag[disabled],.next-tag.disabled{cursor:not-allowed;pointer-events:none}.next-tag-blue{background-color:#4494f9;border-color:#4494f9;color:#fff}.next-tag-blue-inverse{background-color:#4494f940;border-color:#4494f9;color:#4494f9}.next-tag-green{background-color:#46bc15;border-color:#46bc15;color:#fff}.next-tag-green-inverse{background-color:#46bc1540;border-color:#46bc15;color:#46bc15}.next-tag-orange{background-color:#ff9300;border-color:#ff9300;color:#fff}.next-tag-orange-inverse{background-color:#ff930040;border-color:#ff9300;color:#ff9300}.next-tag-red{background-color:#ff3000;border-color:#ff3000;color:#fff}.next-tag-red-inverse{background-color:#ff300040;border-color:#ff3000;color:#ff3000}.next-tag-turquoise{background-color:#01c1b2;border-color:#01c1b2;color:#fff}.next-tag-turquoise-inverse{background-color:#01c1b240;border-color:#01c1b2;color:#01c1b2}.next-tag-yellow{background-color:#fccc12;border-color:#fccc12;color:#fff}.next-tag-yellow-inverse{background-color:#fccc1240;border-color:#fccc12;color:#fccc12}.next-tag-large{height:40px;padding:0;line-height:calc(40px - 1px * 2);font-size:0}.next-tag-large>.next-tag-body{font-size:16px;padding:0 16px;min-width:48px}.next-tag-large.next-tag-closable>.next-tag-body{padding:0 0 0 16px;max-width:calc(100% - (16px + 16px + 16px))}.next-tag-large[dir=rtl].next-tag-closable>.next-tag-body{padding:0 16px 0 0}.next-tag-large.next-tag-closable>.next-tag-close-btn{margin-left:16px;padding-right:16px}.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon:before,.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-tag-large[dir=rtl]>.next-tag-close-btn{margin-right:16px;margin-left:0;padding-right:0;padding-left:16px}.next-tag-medium{height:32px;padding:0;line-height:calc(32px - 1px * 2);font-size:0}.next-tag-medium>.next-tag-body{font-size:14px;padding:0 12px;min-width:40px}.next-tag-medium.next-tag-closable>.next-tag-body{padding:0 0 0 12px;max-width:calc(100% - (12px + 12px + 12px))}.next-tag-medium[dir=rtl].next-tag-closable>.next-tag-body{padding:0 12px 0 0}.next-tag-medium.next-tag-closable>.next-tag-close-btn{margin-left:12px;padding-right:12px}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before,.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-tag-medium[dir=rtl]>.next-tag-close-btn{margin-right:12px;margin-left:0;padding-right:0;padding-left:12px}.next-tag-small{height:24px;padding:0;line-height:calc(24px - 1px * 2);font-size:0}.next-tag-small>.next-tag-body{font-size:12px;padding:0 8px;min-width:28px}.next-tag-small.next-tag-closable>.next-tag-body{padding:0 0 0 8px;max-width:calc(100% - (8px + 8px + 8px))}.next-tag-small[dir=rtl].next-tag-closable>.next-tag-body{padding:0 8px 0 0}.next-tag-small.next-tag-closable>.next-tag-close-btn{margin-left:8px;padding-right:8px}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before,.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote{width:8px;font-size:8px;line-height:inherit}@media all and (-webkit-min-device-pixel-ratio: 0) and (min-resolution: .001dpcm){.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon{transform:scale(.5);margin-left:calc(0px - (16px - 8px) / 2);margin-right:calc(0px - (16px - 8px) / 2)}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-small[dir=rtl]>.next-tag-close-btn{margin-right:8px;margin-left:0;padding-right:0;padding-left:8px}.next-tag-default{cursor:default}.next-tag-closable{position:relative}.next-tag-closable>.next-tag-close-btn{display:inline-block;vertical-align:middle;height:100%;text-align:center;cursor:pointer}.next-tag-checkable{cursor:pointer;position:relative;border-radius:3px}.next-tag-checkable.checked:before{animation:fadeInRightForTag .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.checked:after{animation:zoomIn .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):before{right:calc(0px - 20px / 2);bottom:calc(0px - 20px / 2);width:20px;height:20px}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):after{font-size:8px;line-height:8px;right:0;bottom:0}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):before{right:calc(0px - 28px / 2);bottom:calc(0px - 28px / 2);width:28px;height:28px}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):after{font-size:12px;line-height:12px;right:0;bottom:0}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):before{right:calc(0px - 36px / 2);bottom:calc(0px - 36px / 2);width:36px;height:36px}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):after{font-size:16px;line-height:16px;right:0;bottom:0}.next-tag-checkable.next-tag-level-secondary[disabled],.next-tag-checkable.next-tag-level-secondary.disabled{color:#ccc;border-color:#eee;background-color:#fafafa}.next-tag-zoom-enter,.next-tag-zoom-appear{animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);animation-fill-mode:both}.next-tag-zoom-leave{animation:zoomOut .3s ease-in;animation-fill-mode:both}.next-select{box-sizing:border-box;display:inline-block;position:relative;font-size:0;vertical-align:middle}.next-select *,.next-select *:before,.next-select *:after{box-sizing:border-box}.next-select-trigger{min-width:100px;outline:0;transition:all .1s linear}.next-select-trigger .next-input-label{flex:0 0 auto;width:auto}.next-select-trigger .next-select-values{display:block;width:100%;flex:1 1 0;overflow:hidden}.next-select-trigger .next-select-values>em{font-style:inherit}.next-select-trigger .next-select-values input{padding-left:0;padding-right:0}.next-select-trigger .next-input-control{flex:0 0 auto;width:auto}.next-select-trigger .next-input-control>*{display:inline-block;width:auto}.next-select-trigger .next-input-control>.next-select-arrow{padding-right:0}.next-select-trigger .next-input.next-disabled em{color:#ccc}.next-select-trigger .next-input.next-disabled .next-select-arrow{cursor:not-allowed}.next-select-trigger .next-select-clear{display:none}.next-select-trigger.next-has-clear:hover .next-select-clear{display:inline-block}.next-select-trigger.next-has-clear:hover .next-select-arrow{display:none}.next-select .next-select-inner{display:inline-flex;align-items:center;width:100%;min-width:100px;outline:0;color:#333}.next-select .next-select-inner .next-tag{line-height:1;margin-right:4px;margin-bottom:3px;padding-left:0;padding-right:0}.next-select .next-select-inner .next-input-inner{width:auto}.next-select-trigger-search{position:relative;display:inline-block;vertical-align:top;overflow:hidden;width:100%;max-width:100%}.next-select-trigger-search>input,.next-select-trigger-search>span{display:block;font-size:inherit;font-family:inherit;letter-spacing:inherit;white-space:nowrap;overflow:hidden}.next-select-trigger-search input{position:absolute;background-color:transparent;width:100%;height:100%!important;z-index:1;left:0;border:0;outline:0;margin:0;padding:0;cursor:inherit}.next-select-trigger-search>span{position:relative;visibility:hidden;white-space:pre;max-width:100%;z-index:-1}.next-select-single.next-no-search{cursor:pointer}.next-select-single.next-has-search.next-active .next-select-values>em{display:none}.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search,.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search{width:1px;opacity:0;filter:alpha(opacity=0)}.next-select-single .next-select-values{display:inline-flex;align-items:center}.next-select-single .next-select-values>em{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.next-select-multiple .next-select-compact{position:relative;white-space:nowrap}.next-select-multiple .next-select-compact .next-select-trigger-search{width:auto}.next-select-multiple .next-select-compact .next-select-tag-compact{position:absolute;top:0;right:0;z-index:1;padding:0 4px 0 16px;color:#333;background:linear-gradient(90deg,transparent,#FFFFFF 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,transparent,#FAFAFA 10px)}.next-select-multiple .next-select-values,.next-select-tag .next-select-values{margin-bottom:calc(0px - 3px);height:auto!important}.next-select-multiple .next-select-trigger-search,.next-select-tag .next-select-trigger-search{margin-bottom:3px}.next-select-multiple .next-tag+.next-select-trigger-search,.next-select-tag .next-tag+.next-select-trigger-search{width:auto;min-width:1px}.next-select-multiple .next-input,.next-select-tag .next-input{height:auto;align-items:start}.next-select-multiple.next-small .next-select-values,.next-select-tag.next-small .next-select-values{min-height:calc(24px - 2px);padding-top:calc((24px - 14px - 2px) / 2);padding-bottom:calc((24px - 14px - 2px) / 2);line-height:14px}.next-select-multiple.next-small .next-select-values-compact,.next-select-tag.next-small .next-select-values-compact{height:24px!important}.next-select-multiple.next-small .next-tag,.next-select-tag.next-small .next-tag{border:0;padding-top:calc((14px - 16px - calc(0px - 1px) * 2) / 2);padding-bottom:calc((14px - 16px - calc(0px - 1px) * 2) / 2);height:14px}.next-select-multiple.next-small .next-tag .next-tag-body,.next-select-multiple.next-small .next-tag .next-tag-close-btn,.next-select-tag.next-small .next-tag .next-tag-body,.next-select-tag.next-small .next-tag .next-tag-close-btn{line-height:calc(14px - calc((14px - 16px - calc(0px - 1px) * 2) / 2) * 2)}.next-select-multiple.next-small .next-tag-body,.next-select-tag.next-small .next-tag-body{line-height:14px}.next-select-multiple.next-small .next-input-label,.next-select-multiple.next-small .next-input-control,.next-select-multiple.next-small .next-select-tag-compact,.next-select-tag.next-small .next-input-label,.next-select-tag.next-small .next-input-control,.next-select-tag.next-small .next-select-tag-compact{line-height:calc(24px - 2px)}.next-select-multiple.next-medium .next-select-values,.next-select-tag.next-medium .next-select-values{min-height:calc(32px - 2px);padding-top:calc((32px - 20px - 2px) / 2);padding-bottom:calc((32px - 20px - 2px) / 2);line-height:20px}.next-select-multiple.next-medium .next-select-values-compact,.next-select-tag.next-medium .next-select-values-compact{height:32px!important}.next-select-multiple.next-medium .next-tag,.next-select-tag.next-medium .next-tag{padding-top:calc((20px - 16px - 1px * 2) / 2);padding-bottom:calc((20px - 16px - 1px * 2) / 2);height:20px}.next-select-multiple.next-medium .next-tag .next-tag-body,.next-select-multiple.next-medium .next-tag .next-tag-close-btn,.next-select-tag.next-medium .next-tag .next-tag-body,.next-select-tag.next-medium .next-tag .next-tag-close-btn{line-height:calc(20px - calc((20px - 16px - 1px * 2) / 2) * 2)}.next-select-multiple.next-medium .next-input-label,.next-select-multiple.next-medium .next-input-control,.next-select-multiple.next-medium .next-select-tag-compact,.next-select-tag.next-medium .next-input-label,.next-select-tag.next-medium .next-input-control,.next-select-tag.next-medium .next-select-tag-compact{line-height:calc(32px - 2px)}.next-select-multiple.next-large .next-select-values,.next-select-tag.next-large .next-select-values{min-height:calc(40px - 2px);padding-top:calc((40px - 24px - 2px) / 2);padding-bottom:calc((40px - 24px - 2px) / 2);line-height:24px}.next-select-multiple.next-large .next-select-values-compact,.next-select-tag.next-large .next-select-values-compact{height:40px!important}.next-select-multiple.next-large .next-tag,.next-select-tag.next-large .next-tag{padding-top:calc((24px - 16px - 1px * 2) / 2);padding-bottom:calc((24px - 16px - 1px * 2) / 2);height:24px}.next-select-multiple.next-large .next-tag .next-tag-body,.next-select-multiple.next-large .next-tag .next-tag-close-btn,.next-select-tag.next-large .next-tag .next-tag-body,.next-select-tag.next-large .next-tag .next-tag-close-btn{line-height:calc(24px - calc((24px - 16px - 1px * 2) / 2) * 2)}.next-select-multiple.next-large .next-input-label,.next-select-multiple.next-large .next-input-control,.next-select-multiple.next-large .next-select-tag-compact,.next-select-tag.next-large .next-input-label,.next-select-tag.next-large .next-input-control,.next-select-tag.next-large .next-select-tag-compact{line-height:calc(40px - 2px)}.next-select-auto-complete{width:160px}.next-select-auto-complete .next-input{width:100%}.next-select-auto-complete .next-input .next-input-hint-wrap{padding-right:1px}.next-select-auto-complete .next-input .next-select-arrow{padding-left:0}.next-select.next-active .next-select-arrow .next-icon-arrow-down{transform:rotate(180deg)}.next-select .next-select-unfold-icon:before{content:""}.next-select-symbol-fold:before{content:"\e63d"}.next-select-arrow{cursor:pointer;width:auto!important;text-align:center;transition:all .1s linear}.next-select-popup-wrap{animation-duration:.3s;animation-timing-function:ease;padding:0}.next-select-spacing-tb{padding:0}.next-select-menu-wrapper{max-height:260px;overflow:auto;border:1px solid #E6E6E6;border-radius:3px;box-shadow:none}.next-select-menu-wrapper .next-select-menu{max-height:none;border:none}.next-select-menu{max-height:260px;overflow:auto}.next-select-menu .next-select-menu-empty-content{padding-left:8px;padding-right:8px;color:#999}.next-select-menu.next-select-auto-complete-menu.next-select-menu-empty{display:none}.next-select-menu .next-menu-item-text .next-icon{vertical-align:middle}.next-select-all{display:block;cursor:pointer;padding:0 8px;margin:0 12px 8px;border-bottom:1px solid #E6E6E6}.next-select-all:hover{color:#2580e7}.next-select-all .next-menu-icon-selected.next-icon{display:inline-block!important;top:initial;color:#209bfa}.next-select-highlight{color:#209bfa;font-size:14px}.next-select-in-ie.next-select-trigger .next-select-values{overflow:visible}.next-select-in-ie.next-select-trigger .next-input-control,.next-select-in-ie.next-select-trigger .next-input-label{width:1px}.next-select-in-ie.next-select-trigger .next-input-control>*{display:table-cell;width:1%}.next-select-in-ie.next-select-trigger .next-select-arrow{display:table-cell}.next-select-in-ie.next-select-trigger .next-select-clear{display:none}.next-select-in-ie.next-select-trigger.next-select-multiple .next-select-inner,.next-select-in-ie.next-select-trigger.next-select-tag .next-select-inner{vertical-align:top}.next-select-in-ie.next-select-trigger .next-select-inner{display:inline-table}.next-select-in-ie.next-select-trigger.next-select-single .next-select-values{display:inline-table}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-small .next-select-values{line-height:24px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-medium .next-select-values{line-height:32px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-large .next-select-values{line-height:40px}.next-select-in-ie.next-select-trigger .next-select-trigger-search>span{max-width:100px}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values{position:relative}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values>em{position:absolute;display:inline-block;height:100%;line-height:1;vertical-align:middle;overflow:hidden;left:4px;right:0;top:30%}.next-select-in-ie.next-select-trigger.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search,.next-select-in-ie.next-select-trigger.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search{filter:alpha(opacity=0);font-size:0}.next-select-in-ie.next-select-trigger.next-no-search .next-select-trigger-search input{color:inherit}@media screen and (-webkit-min-device-pixel-ratio: 0){.next-select-multiple .next-select-compact .next-select-tag-compact{background:linear-gradient(90deg,rgba(255,255,255,0),#FFFFFF 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,rgba(255,255,255,0),#FAFAFA 10px)}}.next-select.next-select-multiple[dir=rtl] .next-select-compact .next-select-tag-compact{left:0;right:auto;padding:0 16px 0 4px;background:linear-gradient(270deg,rgba(255,255,255,0),#FFFFFF 10px)}.next-pagination[dir=rtl] .next-pagination-total{margin-right:0;margin-left:16px}.next-pagination[dir=rtl] .next-pagination-jump-go{margin-left:0;margin-right:4px}.next-pagination[dir=rtl] .next-pagination-size-selector-title{margin-right:0;margin-left:4px}.next-pagination[dir=rtl] .next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:none;border-right:1px solid #E6E6E6}.next-pagination[dir=rtl] .next-pagination-pages+.next-pagination-size-selector,.next-pagination[dir=rtl] .next-pagination-size-selector+.next-pagination-pages{margin-left:0;margin-right:40px}.next-pagination[dir=rtl].next-start .next-pagination-pages{float:left}.next-pagination[dir=rtl].next-start .next-pagination-size-selector{float:right}.next-pagination[dir=rtl].next-end .next-pagination-pages{float:right}.next-pagination[dir=rtl].next-end .next-pagination-size-selector{float:left}.next-pagination[dir=rtl].next-small .next-pagination-list{margin:0 4px}.next-pagination[dir=rtl].next-small .next-pagination-total{line-height:24px;vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-item{padding:0 calc(8px - 2px);border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-small .next-pagination-item+.next-pagination-item{margin:0 4px 0 0}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis{height:24px;line-height:24px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis:before,.next-pagination[dir=rtl].next-small .next-pagination-ellipsis .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-pagination[dir=rtl].next-small .next-pagination-display{font-size:12px}.next-pagination[dir=rtl].next-small .next-pagination-display em{font-size:12px}.next-pagination[dir=rtl].next-small .next-pagination-jump-text{font-size:12px}.next-pagination[dir=rtl].next-small .next-pagination-jump-input{width:28px}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-title{height:24px;line-height:24px;font-size:12px;vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-btn{padding:0 8px}.next-pagination[dir=rtl].next-small .next-pagination-item.next-prev:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item.next-next:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-prev:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-next:not([disabled]) i{color:#333}.next-pagination[dir=rtl].next-medium .next-pagination-list{margin:0 4px}.next-pagination[dir=rtl].next-medium .next-pagination-total{line-height:32px;vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-item{padding:0 calc(12px - 2px);border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-medium .next-pagination-item+.next-pagination-item{margin:0 4px 0 0}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis{height:32px;line-height:32px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis:before,.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-pagination[dir=rtl].next-medium .next-pagination-display{font-size:14px}.next-pagination[dir=rtl].next-medium .next-pagination-display em{font-size:14px}.next-pagination[dir=rtl].next-medium .next-pagination-jump-text{font-size:14px}.next-pagination[dir=rtl].next-medium .next-pagination-jump-input{width:36px}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-title{height:32px;line-height:32px;font-size:14px;vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-btn{padding:0 12px}.next-pagination[dir=rtl].next-medium .next-pagination-item.next-prev:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item.next-next:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-prev:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-next:not([disabled]) i{color:#333}.next-pagination[dir=rtl].next-large .next-pagination-list{margin:0 8px}.next-pagination[dir=rtl].next-large .next-pagination-total{line-height:40px;vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-item{padding:0 calc(16px - 1px);border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-large .next-pagination-item+.next-pagination-item{margin:0 8px 0 0}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis{height:40px;line-height:40px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis:before,.next-pagination[dir=rtl].next-large .next-pagination-ellipsis .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-pagination[dir=rtl].next-large .next-pagination-display{font-size:16px}.next-pagination[dir=rtl].next-large .next-pagination-display em{font-size:16px}.next-pagination[dir=rtl].next-large .next-pagination-jump-text{font-size:16px}.next-pagination[dir=rtl].next-large .next-pagination-jump-input{width:48px}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-title{height:40px;line-height:40px;font-size:16px;vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-btn{padding:0 16px}.next-pagination[dir=rtl].next-large .next-pagination-item.next-prev:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item.next-next:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-prev:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-next:not([disabled]) i{color:#333}.next-pagination{box-sizing:border-box;font-size:0}.next-pagination *,.next-pagination *:before,.next-pagination *:after{box-sizing:border-box}.next-pagination:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-pagination-total{display:inline-block;font-size:14px;margin-right:16px}.next-pagination-pages{display:inline-block}.next-pagination-list{display:inline-block;vertical-align:top}.next-pagination .next-pagination-item:not([disabled]){display:inline-block;border-style:solid;border-color:#ddd;background:#FFFFFF;color:#333;box-shadow:none}.next-pagination .next-pagination-item{transition:none}.next-pagination .next-pagination-item.next-current{border-color:#209bfa;background:#209BFA;color:#fff;box-shadow:none}.next-pagination .next-pagination-item.next-current:hover,.next-pagination .next-pagination-item.next-current:focus{border-color:#209bfa;background:#FFFFFF;color:#209bfa;box-shadow:none}.next-pagination-ellipsis{display:inline-block;color:#999;vertical-align:top}.next-pagination-display{display:inline-block;margin:0 16px;color:#333;vertical-align:middle}.next-pagination-display em{font-style:normal;color:#209bfa}.next-pagination-jump-text{display:inline-block;vertical-align:middle;color:#999}.next-pagination-jump-input{margin:0 4px;vertical-align:top}.next-pagination-jump-go{margin-left:4px;vertical-align:top}.next-pagination-size-selector{display:inline-block;position:relative}.next-pagination-size-selector-title{margin-right:4px;color:#999}.next-pagination-size-selector-filter{display:inline-block;vertical-align:middle}.next-pagination-size-selector-dropdown{vertical-align:top;min-width:64px}.next-pagination-size-selector-dropdown .next-select-inner{min-width:64px}.next-pagination-size-selector-popup{min-width:64px}.next-pagination-size-selector-btn.next-btn-text{height:initial;line-height:initial;color:#666;border-radius:0}.next-pagination-size-selector-btn.next-btn-text.next-current{color:#209bfa}.next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:1px solid #E6E6E6}.next-pagination-pages+.next-pagination-size-selector,.next-pagination-size-selector+.next-pagination-pages{margin-left:40px}.next-pagination.next-hide{display:none}.next-pagination.next-start .next-pagination-pages{float:right}.next-pagination.next-start .next-pagination-size-selector{float:left}.next-pagination.next-end .next-pagination-pages{float:left}.next-pagination.next-end .next-pagination-size-selector{float:right}.next-pagination.next-small .next-pagination-list{margin:0 4px}.next-pagination.next-small .next-pagination-total{line-height:24px;vertical-align:middle}.next-pagination.next-small .next-pagination-item{padding:0 6px;border-width:1px;border-radius:3px}.next-pagination.next-small .next-pagination-item+.next-pagination-item{margin:0 0 0 4px}.next-pagination.next-small .next-pagination-ellipsis{height:24px;line-height:24px;margin-left:8px;margin-right:8px}.next-pagination.next-small .next-pagination-ellipsis:before,.next-pagination.next-small .next-pagination-ellipsis .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-pagination.next-small .next-pagination-display{font-size:12px}.next-pagination.next-small .next-pagination-display em{font-size:12px}.next-pagination.next-small .next-pagination-jump-text{font-size:12px}.next-pagination.next-small .next-pagination-jump-input{width:28px}.next-pagination.next-small .next-pagination-size-selector-title{height:24px;line-height:24px;font-size:12px;vertical-align:middle}.next-pagination.next-small .next-pagination-size-selector-btn{padding:0 8px}.next-pagination.next-small .next-pagination-item.next-prev:not([disabled]) i,.next-pagination.next-small .next-pagination-item.next-next:not([disabled]) i{color:#666}.next-pagination.next-small .next-pagination-item:hover.next-prev:not([disabled]) i,.next-pagination.next-small .next-pagination-item:hover.next-next:not([disabled]) i{color:#333}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next{width:20px;padding:0}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev .next-icon,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next .next-icon{margin:0 auto}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev{width:20px;padding:0}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-small.next-no-border .next-pagination-item.next-prev,.next-pagination.next-small.next-no-border .next-pagination-item.next-next{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-small.next-no-border .next-pagination-item.next-prev .next-icon,.next-pagination.next-small.next-no-border .next-pagination-item.next-next .next-icon{margin:0}.next-pagination.next-small.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i,.next-pagination.next-small.next-no-border .next-pagination-item.next-next:not([disabled]):hover i{color:#209bfa}.next-pagination.next-small.next-no-border .next-pagination-display{margin:0 8px}.next-pagination.next-small.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-small.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-medium .next-pagination-list{margin:0 4px}.next-pagination.next-medium .next-pagination-total{line-height:32px;vertical-align:middle}.next-pagination.next-medium .next-pagination-item{padding:0 10px;border-width:1px;border-radius:3px}.next-pagination.next-medium .next-pagination-item+.next-pagination-item{margin:0 0 0 4px}.next-pagination.next-medium .next-pagination-ellipsis{height:32px;line-height:32px;margin-left:8px;margin-right:8px}.next-pagination.next-medium .next-pagination-ellipsis:before,.next-pagination.next-medium .next-pagination-ellipsis .next-icon-remote{width:12px;font-size:12px;line-height:inherit}.next-pagination.next-medium .next-pagination-display{font-size:14px}.next-pagination.next-medium .next-pagination-display em{font-size:14px}.next-pagination.next-medium .next-pagination-jump-text{font-size:14px}.next-pagination.next-medium .next-pagination-jump-input{width:36px}.next-pagination.next-medium .next-pagination-size-selector-title{height:32px;line-height:32px;font-size:14px;vertical-align:middle}.next-pagination.next-medium .next-pagination-size-selector-btn{padding:0 12px}.next-pagination.next-medium .next-pagination-item.next-prev:not([disabled]) i,.next-pagination.next-medium .next-pagination-item.next-next:not([disabled]) i{color:#666}.next-pagination.next-medium .next-pagination-item:hover.next-prev:not([disabled]) i,.next-pagination.next-medium .next-pagination-item:hover.next-next:not([disabled]) i{color:#333}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next{width:28px;padding:0}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev .next-icon,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next .next-icon{margin:0 auto}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev{width:28px;padding:0}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev,.next-pagination.next-medium.next-no-border .next-pagination-item.next-next{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev .next-icon,.next-pagination.next-medium.next-no-border .next-pagination-item.next-next .next-icon{margin:0}.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i,.next-pagination.next-medium.next-no-border .next-pagination-item.next-next:not([disabled]):hover i{color:#209bfa}.next-pagination.next-medium.next-no-border .next-pagination-display{margin:0 12px}.next-pagination.next-medium.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-medium.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-large .next-pagination-list{margin:0 8px}.next-pagination.next-large .next-pagination-total{line-height:40px;vertical-align:middle}.next-pagination.next-large .next-pagination-item{padding:0 15px;border-width:1px;border-radius:3px}.next-pagination.next-large .next-pagination-item+.next-pagination-item{margin:0 0 0 8px}.next-pagination.next-large .next-pagination-ellipsis{height:40px;line-height:40px;margin-left:8px;margin-right:8px}.next-pagination.next-large .next-pagination-ellipsis:before,.next-pagination.next-large .next-pagination-ellipsis .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-pagination.next-large .next-pagination-display{font-size:16px}.next-pagination.next-large .next-pagination-display em{font-size:16px}.next-pagination.next-large .next-pagination-jump-text{font-size:16px}.next-pagination.next-large .next-pagination-jump-input{width:48px}.next-pagination.next-large .next-pagination-size-selector-title{height:40px;line-height:40px;font-size:16px;vertical-align:middle}.next-pagination.next-large .next-pagination-size-selector-btn{padding:0 16px}.next-pagination.next-large .next-pagination-item.next-prev:not([disabled]) i,.next-pagination.next-large .next-pagination-item.next-next:not([disabled]) i{color:#666}.next-pagination.next-large .next-pagination-item:hover.next-prev:not([disabled]) i,.next-pagination.next-large .next-pagination-item:hover.next-next:not([disabled]) i{color:#333}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next{width:40px;padding:0}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev .next-icon,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next .next-icon{margin:0 auto}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev{width:40px;padding:0}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-large.next-no-border .next-pagination-item.next-prev,.next-pagination.next-large.next-no-border .next-pagination-item.next-next{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-large.next-no-border .next-pagination-item.next-prev .next-icon,.next-pagination.next-large.next-no-border .next-pagination-item.next-next .next-icon{margin:0}.next-pagination.next-large.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i,.next-pagination.next-large.next-no-border .next-pagination-item.next-next:not([disabled]):hover i{color:#209bfa}.next-pagination.next-large.next-no-border .next-pagination-display{margin:0 16px}.next-pagination.next-large.next-mini .next-pagination-item.next-prev{margin-right:8px}.next-pagination.next-large.next-mini .next-pagination-item.next-next{margin-left:8px}.next-pagination-icon-prev:before{content:"\e61d"}.next-pagination-icon-next:before{content:"\e619"}.next-pagination-icon-ellipsis:before{content:"\e654"}.next-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;top:0;margin:-1px}.next-message{box-sizing:border-box;position:relative;display:block;vertical-align:baseline;animation-duration:.3s;animation-timing-function:ease-in-out}.next-message *,.next-message *:before,.next-message *:after{box-sizing:border-box}.next-message:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-message .next-message-close{color:#999;font-size:0;position:absolute;cursor:pointer}.next-message .next-message-close .next-icon-close{width:12px;height:12px;line-height:1em}.next-message .next-message-close .next-icon-close:before{width:12px;height:12px;font-size:12px;line-height:1em}.next-message .next-message-close:hover{color:#666}.next-message.next-message-success.next-inline{background-color:#e5fff5;border-color:#e5fff5;box-shadow:none;border-style:solid}.next-message.next-message-success.next-inline .next-message-title{color:#333}.next-message.next-message-success.next-inline .next-message-content{color:#666}.next-message.next-message-success.next-inline .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-inline .next-message-symbol-icon:before{content:"\e60a"}.next-message.next-message-success.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-success.next-addon .next-message-title{color:#333}.next-message.next-message-success.next-addon .next-message-content{color:#666}.next-message.next-message-success.next-addon .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-addon .next-message-symbol-icon:before{content:"\e60a"}.next-message.next-message-success.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px #0000001f;border-style:solid}.next-message.next-message-success.next-toast .next-message-title{color:#333}.next-message.next-message-success.next-toast .next-message-content{color:#666}.next-message.next-message-success.next-toast .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-toast .next-message-symbol-icon:before{content:"\e60a"}.next-message.next-message-warning.next-inline{background-color:#fff9e0;border-color:#fff9e0;box-shadow:none;border-style:solid}.next-message.next-message-warning.next-inline .next-message-title{color:#333}.next-message.next-message-warning.next-inline .next-message-content{color:#666}.next-message.next-message-warning.next-inline .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-inline .next-message-symbol-icon:before{content:"\e60b"}.next-message.next-message-warning.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-warning.next-addon .next-message-title{color:#333}.next-message.next-message-warning.next-addon .next-message-content{color:#666}.next-message.next-message-warning.next-addon .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-addon .next-message-symbol-icon:before{content:"\e60b"}.next-message.next-message-warning.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px #0000001f;border-style:solid}.next-message.next-message-warning.next-toast .next-message-title{color:#333}.next-message.next-message-warning.next-toast .next-message-content{color:#666}.next-message.next-message-warning.next-toast .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-toast .next-message-symbol-icon:before{content:"\e60b"}.next-message.next-message-error.next-inline{background-color:#ffece4;border-color:#ffece4;box-shadow:none;border-style:solid}.next-message.next-message-error.next-inline .next-message-title{color:#333}.next-message.next-message-error.next-inline .next-message-content{color:#666}.next-message.next-message-error.next-inline .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-inline .next-message-symbol-icon:before{content:"\e60d"}.next-message.next-message-error.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-error.next-addon .next-message-title{color:#333}.next-message.next-message-error.next-addon .next-message-content{color:#666}.next-message.next-message-error.next-addon .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-addon .next-message-symbol-icon:before{content:"\e60d"}.next-message.next-message-error.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px #0000001f;border-style:solid}.next-message.next-message-error.next-toast .next-message-title{color:#333}.next-message.next-message-error.next-toast .next-message-content{color:#666}.next-message.next-message-error.next-toast .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-toast .next-message-symbol-icon:before{content:"\e60d"}.next-message.next-message-notice.next-inline{background-color:#e4f3fe;border-color:#e4f3fe;box-shadow:none;border-style:solid}.next-message.next-message-notice.next-inline .next-message-title{color:#333}.next-message.next-message-notice.next-inline .next-message-content{color:#666}.next-message.next-message-notice.next-inline .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-inline .next-message-symbol-icon:before{content:"\e60c"}.next-message.next-message-notice.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-notice.next-addon .next-message-title{color:#333}.next-message.next-message-notice.next-addon .next-message-content{color:#666}.next-message.next-message-notice.next-addon .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-addon .next-message-symbol-icon:before{content:"\e60c"}.next-message.next-message-notice.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px #0000001f;border-style:solid}.next-message.next-message-notice.next-toast .next-message-title{color:#333}.next-message.next-message-notice.next-toast .next-message-content{color:#666}.next-message.next-message-notice.next-toast .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-toast .next-message-symbol-icon:before{content:"\e60c"}.next-message.next-message-help.next-inline{background-color:#fff9e0;border-color:#fff9e0;box-shadow:none;border-style:solid}.next-message.next-message-help.next-inline .next-message-title{color:#333}.next-message.next-message-help.next-inline .next-message-content{color:#666}.next-message.next-message-help.next-inline .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-inline .next-message-symbol-icon:before{content:"\e673"}.next-message.next-message-help.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-help.next-addon .next-message-title{color:#333}.next-message.next-message-help.next-addon .next-message-content{color:#666}.next-message.next-message-help.next-addon .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-addon .next-message-symbol-icon:before{content:"\e673"}.next-message.next-message-help.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px #0000001f;border-style:solid}.next-message.next-message-help.next-toast .next-message-title{color:#333}.next-message.next-message-help.next-toast .next-message-content{color:#666}.next-message.next-message-help.next-toast .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-toast .next-message-symbol-icon:before{content:"\e673"}.next-message.next-message-loading.next-inline{background-color:#fff;border-color:#fff;box-shadow:none;border-style:solid}.next-message.next-message-loading.next-inline .next-message-title{color:#333}.next-message.next-message-loading.next-inline .next-message-content{color:#666}.next-message.next-message-loading.next-inline .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-inline .next-message-symbol-icon:before{content:"\e646";animation:loadingCircle 1s infinite linear}.next-message.next-message-loading.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-loading.next-addon .next-message-title{color:#333}.next-message.next-message-loading.next-addon .next-message-content{color:#666}.next-message.next-message-loading.next-addon .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-addon .next-message-symbol-icon:before{content:"\e646";animation:loadingCircle 1s infinite linear}.next-message.next-message-loading.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px #0000001f;border-style:solid}.next-message.next-message-loading.next-toast .next-message-title{color:#333}.next-message.next-message-loading.next-toast .next-message-content{color:#666}.next-message.next-message-loading.next-toast .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-toast .next-message-symbol-icon:before{content:"\e646";animation:loadingCircle 1s infinite linear}.next-message.next-medium{border-width:1px;padding:12px}.next-message.next-medium .next-message-symbol{float:left;line-height:16px}.next-message.next-medium .next-message-symbol:before,.next-message.next-medium .next-message-symbol .next-icon-remote{width:16px;font-size:16px;line-height:inherit}.next-message.next-medium .next-message-title{padding:0 20px 0 calc(8px + 16px);font-size:16px;line-height:16px}.next-message.next-medium .next-message-content{margin-top:8px;padding:0 20px 0 calc(8px + 16px);font-size:14px;line-height:14px}.next-message.next-medium .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-medium.next-title-content .next-message-title{line-height:16px}.next-message.next-medium.next-only-content .next-message-content{line-height:16px}.next-message.next-medium .next-message-close{top:12px;right:12px}.next-message.next-medium.next-inline{border-radius:3px}.next-message.next-medium.next-toast{border-radius:3px}.next-message.next-large{border-width:2px;padding:16px;line-height:18px}.next-message.next-large .next-message-symbol{float:left;line-height:24px}.next-message.next-large .next-message-symbol:before,.next-message.next-large .next-message-symbol .next-icon-remote{width:24px;font-size:24px;line-height:inherit}.next-message.next-large .next-message-title{padding:0 20px 0 calc(12px + 24px);font-size:20px;line-height:20px}.next-message.next-large .next-message-content{margin-top:8px;padding:0 20px 0 calc(12px + 24px);font-size:14px;line-height:14px}.next-message.next-large .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-large.next-title-content .next-message-title{line-height:24px}.next-message.next-large.next-only-content .next-message-content{line-height:24px}.next-message.next-large .next-message-close{top:16px;right:16px}.next-message.next-large.next-inline{border-radius:3px}.next-message.next-large.next-toast{border-radius:3px}.next-message[dir=rtl] .next-message-symbol{float:right}.next-message[dir=rtl].next-medium .next-message-title{padding:0 calc(8px + 16px) 0 20px}.next-message[dir=rtl].next-medium .next-message-close{left:12px;right:auto}.next-message[dir=rtl].next-large .next-message-title{padding:0 calc(12px + 24px) 0 20px}.next-message[dir=rtl].next-large .next-message-close{left:16px;right:auto}._customTable_1837q_20{min-height:500px}._customTable_1837q_20 .next-table-header table th{background:#f4f4f4}._stateText_1837q_27{display:inline-block;padding:5px 10px;color:#52c41a;background:#f6ffed;border:1px solid #b7eb8f;border-radius:4px}._link_1837q_36{margin:0 5px;color:#3180fda6;text-decoration:none;cursor:pointer}._link_1837q_36:link,._link_1837q_36:visited{color:#3180fda6}._separator_1837q_46{display:inline-block;width:1px;height:12px;margin:0 8px;vertical-align:middle;background:#e8e8e8}._pagination_1837q_55{margin:20px 0;text-align:center}
diff --git a/examples/icestark-layout/public/page-seller/assets/index.js b/examples/icestark-layout/public/page-seller/assets/index.js
deleted file mode 100644
index ad8e20c919..0000000000
--- a/examples/icestark-layout/public/page-seller/assets/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var e=Object.defineProperty,t=Object.defineProperties,n=Object.getOwnPropertyDescriptors,o=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable,a=(t,n,o)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o,s=(e,t)=>{for(var n in t||(t={}))r.call(t,n)&&a(e,n,t[n]);if(o)for(var n of o(t))i.call(t,n)&&a(e,n,t[n]);return e},l=(e,o)=>t(e,n(o)),c=(e,t)=>{var n={};for(var a in e)r.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&o)for(var a of o(e))t.indexOf(a)<0&&i.call(e,a)&&(n[a]=e[a]);return n};import{_ as p,R as u,a as d,c as f,P as h,h as m,b as y,g,d as v,e as b,L as x,l as C,f as w,i as S,j as E,S as k,k as T,m as N,n as O,o as _,p as P,q as M,A as R,r as D,s as L,t as A,u as I,v as j,w as F,x as z,y as H}from"./vendor.js";var B="";const K={},W={default:p.create(K)};function V(e){if(e){if(W[e])return W;W[e]=p.create(K)}return W}const U=({appConfig:e})=>{if(e.request){const{request:t={}}=e;if("[object Array]"===Object.prototype.toString.call(t))t.forEach((e=>{const t=e.instanceName?e.instanceName:"default";if(t){const n=undefined;$(e,V(t)[t])}}));else{const e=undefined;$(t,V().default)}}};function $(e,t){const n=e,{interceptors:o={}}=n,r=c(n,["interceptors"]);Object.keys(r).forEach((e=>{t.defaults[e]=r[e]})),o.request&&t.interceptors.request.use(o.request.onConfig||function(e){return e},o.request.onError||function(e){return Promise.reject(e)}),o.response&&t.interceptors.response.use(o.response.onConfig||function(e){return e},o.response.onError||function(e){return Promise.reject(e)})}function Y(e){U({appConfig:e})}const G=({addProvider:e,appConfig:t})=>{t.app&&t.app.addProvider&&e(t.app.addProvider)},q=(e,t)=>`${e.toString()}\n\nThis is located at:${t}`,X={display:"flex",flexDirection:"column",alignItems:"center",margin:"100px 0",color:"#ed3131"},Z=({componentStack:e,error:t})=>u.createElement("div",{style:X,title:q(t,e)},u.createElement("svg",{viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg","p-id":"843",width:"60",height:"60"},u.createElement("path",{d:"M1024 512C1024 229.23 794.77 0 512 0S0 229.23 0 512s229.23 512 512 512c117.41 0 228.826-39.669 318.768-111.313 10.79-8.595 12.569-24.308 3.975-35.097-8.594-10.789-24.308-12.568-35.097-3.974C718.47 938.277 618.002 974.049 512 974.049 256.818 974.049 49.951 767.182 49.951 512S256.818 49.951 512 49.951 974.049 256.818 974.049 512c0 87.493-24.334 171.337-69.578 243.96-7.294 11.708-3.716 27.112 7.992 34.405 11.707 7.294 27.11 3.716 34.405-7.991C997.014 701.88 1024 608.898 1024 512z","p-id":"844",fill:"#cdcdcd"}),u.createElement("path",{d:"M337.17 499.512c34.485 0 62.44-27.955 62.44-62.439s-27.955-62.439-62.44-62.439c-34.483 0-62.438 27.955-62.438 62.44 0 34.483 27.955 62.438 62.439 62.438z m374.635 0c34.484 0 62.439-27.955 62.439-62.439s-27.955-62.439-62.44-62.439c-34.483 0-62.438 27.955-62.438 62.44 0 34.483 27.955 62.438 62.439 62.438zM352.788 704.785c43.377-34.702 100.364-55.425 171.7-55.425 71.336 0 128.322 20.723 171.7 55.425 26.513 21.21 42.695 42.786 50.444 58.284 6.168 12.337 1.168 27.34-11.17 33.508-12.337 6.169-27.34 1.168-33.508-11.17-0.918-1.834-3.462-6.024-7.788-11.793-7.564-10.084-17.239-20.269-29.183-29.824-34.671-27.737-80.71-44.478-140.495-44.478-59.786 0-105.824 16.74-140.496 44.478-11.944 9.555-21.619 19.74-29.182 29.824-4.327 5.769-6.87 9.959-7.788 11.794-6.169 12.337-21.171 17.338-33.509 11.17-12.337-6.17-17.338-21.172-11.169-33.509 7.75-15.498 23.931-37.074 50.444-58.284z","p-id":"845",fill:"#cdcdcd"})),u.createElement("h3",null,"Oops! Something went wrong."));class J extends d.exports.Component{constructor(e){super(e),this.state={error:null,info:{componentStack:""}}}componentDidCatch(e,t){const{onError:n}=this.props;if("function"==typeof n)try{n.call(this,e,t.componentStack)}catch(o){}this.setState({error:e,info:t})}render(){const{children:e,Fallback:t}=this.props,{error:n,info:o}=this.state;return null!==n&&"function"==typeof t?u.createElement(t,{componentStack:o&&o.componentStack,error:n}):e||null}}J.defaultProps={Fallback:Z};const Q=undefined;var ee="_title_57gr7_20",te=e=>u.createElement("div",{className:"icestark-child-app"},u.createElement("h3",{className:ee},"\u5546\u5bb6\u5e73\u53f0"),e.children),ne={exports:{}},oe={exports:{}},re=oe.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=re);var ie={exports:{}},ae=ie.exports={version:"2.6.12"};"number"==typeof __e&&(__e=ae);var se,le=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},ce=function(e,t,n){if(le(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,o){return e.call(t,n,o)};case 3:return function(n,o,r){return e.call(t,n,o,r)}}return function(){return e.apply(t,arguments)}},pe={},ue=function(e){return"object"==typeof e?null!==e:"function"==typeof e},de=ue,fe=function(e){if(!de(e))throw TypeError(e+" is not an object!");return e},he=function(e){try{return!!e()}catch(t){return!0}},me=!he((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})),ye=ue,ge=oe.exports.document,ve=ye(ge)&&ye(ge.createElement),be=function(e){return ve?ge.createElement(e):{}},xe=!me&&!he((function(){return 7!=Object.defineProperty(be("div"),"a",{get:function(){return 7}}).a})),Ce=ue,we=function(e,t){if(!Ce(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!Ce(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!Ce(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!Ce(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")},Se=fe,Ee=xe,ke=we,Te=Object.defineProperty;pe.f=me?Object.defineProperty:function e(t,n,o){if(Se(t),n=ke(n,!0),Se(o),Ee)try{return Te(t,n,o)}catch(r){}if("get"in o||"set"in o)throw TypeError("Accessors not supported!");return"value"in o&&(t[n]=o.value),t};var Ne=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},Oe=pe,_e=Ne,Pe=me?function(e,t,n){return Oe.f(e,t,_e(1,n))}:function(e,t,n){return e[t]=n,e},Me={}.hasOwnProperty,Re=function(e,t){return Me.call(e,t)},De=oe.exports,Le=ie.exports,Ae=ce,Ie=Pe,je=Re,Fe="prototype",ze=function(e,t,n){var o=e&ze.F,r=e&ze.G,i=e&ze.S,a=e&ze.P,s=e&ze.B,l=e&ze.W,c=r?Le:Le[t]||(Le[t]={}),p=c.prototype,u=r?De:i?De[t]:(De[t]||{}).prototype,d,f,h;for(d in r&&(n=t),n)(f=!o&&u&&void 0!==u[d])&&je(c,d)||(h=f?u[d]:n[d],c[d]=r&&"function"!=typeof u[d]?n[d]:s&&f?Ae(h,De):l&&u[d]==h?function(e){var t=function(t,n,o){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,o)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(h):a&&"function"==typeof h?Ae(Function.call,h):h,a&&((c.virtual||(c.virtual={}))[d]=h,e&ze.R&&p&&!p[d]&&Ie(p,d,h)))};ze.F=1,ze.G=2,ze.S=4,ze.P=8,ze.B=16,ze.W=32,ze.U=64,ze.R=128;var He=ze,Be={}.toString,Ke=function(e){return Be.call(e).slice(8,-1)},We=Ke,Ve=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==We(e)?e.split(""):Object(e)},Ue=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},$e=Ve,Ye=Ue,Ge=function(e){return $e(Ye(e))},qe=Math.ceil,Xe=Math.floor,Ze=function(e){return isNaN(e=+e)?0:(e>0?Xe:qe)(e)},Je=Ze,Qe=Math.min,et=function(e){return e>0?Qe(Je(e),9007199254740991):0},tt=Ze,nt=Math.max,ot=Math.min,rt,it=Ge,at=et,st=function(e,t){return(e=tt(e))<0?nt(e+t,0):ot(e,t)},lt=function(e){return function(t,n,o){var r=it(t),i=at(r.length),a=st(o,i),s;if(e&&n!=n){for(;i>a;)if((s=r[a++])!=s)return!0}else for(;i>a;a++)if((e||a in r)&&r[a]===n)return e||a||0;return!e&&-1}},ct={exports:{}},pt=!0,ut=ie.exports,dt=oe.exports,ft="__core-js_shared__",ht=dt[ft]||(dt[ft]={});(ct.exports=function(e,t){return ht[e]||(ht[e]=void 0!==t?t:{})})("versions",[]).push({version:ut.version,mode:"pure",copyright:"\xa9 2020 Denis Pushkarev (zloirock.ru)"});var mt=0,yt=Math.random(),gt=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++mt+yt).toString(36))},vt=ct.exports("keys"),bt=gt,xt=function(e){return vt[e]||(vt[e]=bt(e))},Ct=Re,wt=Ge,St=lt(!1),Et=xt("IE_PROTO"),kt=function(e,t){var n=wt(e),o=0,r=[],i;for(i in n)i!=Et&&Ct(n,i)&&r.push(i);for(;t.length>o;)Ct(n,i=t[o++])&&(~St(r,i)||r.push(i));return r},Tt="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),Nt=kt,Ot=Tt,_t=Object.keys||function e(t){return Nt(t,Ot)},Pt={};Pt.f=Object.getOwnPropertySymbols;var Mt={};Mt.f={}.propertyIsEnumerable;var Rt=Ue,Dt=function(e){return Object(Rt(e))},Lt=me,At=_t,It=Pt,jt=Mt,Ft=Dt,zt=Ve,Ht=Object.assign,Bt=!Ht||he((function(){var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=Ht({},e)[n]||Object.keys(Ht({},t)).join("")!=o}))?function e(t,n){for(var o=Ft(t),r=arguments.length,i=1,a=It.f,s=jt.f;r>i;)for(var l=zt(arguments[i++]),c=a?At(l).concat(a(l)):At(l),p=c.length,u=0,d;p>u;)d=c[u++],Lt&&!s.call(l,d)||(o[d]=l[d]);return o}:Ht,Kt=He;Kt(Kt.S+Kt.F,"Object",{assign:Bt});var Wt=ie.exports.Object.assign,Vt,Ut,$t;function Yt(e){return e&&e.__esModule?e:{default:e}}(Vt=ne).exports={default:Wt,__esModule:!0};var Gt=Yt(ne.exports).default||function(e){for(var t=1;t=i?e?"":void 0:(a=o.charCodeAt(r))<55296||a>56319||r+1===i||(s=o.charCodeAt(r+1))<56320||s>57343?e?o.charAt(r):a:e?o.slice(r,r+2):s-56320+(a-55296<<10)+65536}},tn=Pe,nn={},on=pe,rn=fe,an=_t,sn=me?Object.defineProperties:function e(t,n){rn(t);for(var o=an(n),r=o.length,i=0,a;r>i;)on.f(t,a=o[i++],n[a]);return t},ln=oe.exports.document,cn=ln&&ln.documentElement,pn=fe,un=sn,dn=Tt,fn=xt("IE_PROTO"),hn=function(){},mn="prototype",yn=function(){var e=be("iframe"),t=dn.length,n="<",o=">",r;for(e.style.display="none",cn.appendChild(e),e.src="/service/javascript:",(r=e.contentWindow.document).open(),r.write("
diff --git a/examples/icestark-layout/public/page-waiter/assets/main.css b/examples/icestark-layout/public/page-waiter/assets/main.css
deleted file mode 100644
index 86b38b6bc5..0000000000
--- a/examples/icestark-layout/public/page-waiter/assets/main.css
+++ /dev/null
@@ -1 +0,0 @@
-.wrapper[data-v-123114aa]{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}a[data-v-3cf51fd6]{color:#42b983}label[data-v-3cf51fd6]{margin:0 .5em;font-weight:700}code[data-v-3cf51fd6]{background-color:#eee;padding:2px 4px;border-radius:4px;color:#304455}
diff --git a/examples/icestark-layout/public/page-waiter/assets/main.js b/examples/icestark-layout/public/page-waiter/assets/main.js
deleted file mode 100644
index d8c4872a54..0000000000
--- a/examples/icestark-layout/public/page-waiter/assets/main.js
+++ /dev/null
@@ -1 +0,0 @@
-import{d as f,r as h,o as a,c,a as i,w as m,b as e,p as v,e as g,_ as b,f as p,g as H,t as k,h as C,i as d,j as F,k as V,l as I,m as x}from"./vendor.js";var _=(t,o)=>{const u=t.__vccOpts||t;for(const[s,r]of o)u[s]=r;return u};const l=t=>(v("data-v-123114aa"),t=t(),g(),t),N={class:"wrapper"},D=l(()=>e("img",{alt:"Vue logo",src:"https://gw.alicdn.com/imgextra/i2/O1CN01y9FKOg1f0OnH6Hew8_!!6000000003944-2-tps-200-200.png"},null,-1)),L=l(()=>e("br",null,null,-1)),P=p(" Home "),S=l(()=>e("br",null,null,-1)),j=p(" List "),A=l(()=>e("br",null,null,-1)),O=f({setup(t){const o=()=>{b.push("/")};return(u,s)=>{const r=h("router-link"),w=h("router-view");return a(),c("div",N,[D,L,i(r,{to:"/"},{default:m(()=>[P]),_:1}),S,i(r,{to:"/list"},{default:m(()=>[j]),_:1}),A,e("button",{onClick:o},"\u5FAE\u5E94\u7528\u95F4\u8DF3\u8F6C"),i(w)])}}});var y=_(O,[["__scopeId","data-v-123114aa"]]);const B=t=>(v("data-v-3cf51fd6"),t=t(),g(),t),E=B(()=>e("p",null,[e("a",{href:"https://v3.vuejs.org/",target:"_blank"}," Learn Vue 3 "),p(" | "),e("a",{href:"https://micro-frontends.ice.work/",target:"_blank"},"icestark Docs")],-1)),W=f({props:{msg:null},setup(t){const o=H(0);return(u,s)=>(a(),c("div",null,[e("h1",null,k(t.msg||"Hello Vite + icestark + Vue3!"),1),E,e("button",{type:"button",onClick:s[0]||(s[0]=r=>o.value++)},"count is: "+k(o.value),1)]))}});var R=_(W,[["__scopeId","data-v-3cf51fd6"]]);const T={};function K(t,o){return a(),c("h1",null,"List Page")}var M=_(T,[["render",K]]);const q={};function z(t,o){return a(),c("h1",null,"Detail Page")}var G=_(q,[["render",z]]);const J={};function Q(t,o){return a(),c("h1",null,"404 Page")}var U=_(J,[["render",Q]]);const X=()=>new Promise(t=>{F(),t(!0)}),$=()=>{const t=V(d()?I():"/");return C({history:t,routes:[{path:"/",component:R},{path:"/list",component:M},{path:"/detail",component:G},{path:"/:pathMatch(.*)",component:d()?()=>X():U}]})};let n=null;d()||(n=x(y),n.use($()),n.mount("#app"));function Z({container:t}){n=x(y),n.use($()),n.mount(t)}function tt(){n&&n.unmount()}export{Z as mount,tt as unmount};
diff --git a/examples/icestark-layout/public/page-waiter/assets/vendor.js b/examples/icestark-layout/public/page-waiter/assets/vendor.js
deleted file mode 100644
index 3cac6ad05d..0000000000
--- a/examples/icestark-layout/public/page-waiter/assets/vendor.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function Cn(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const Ho="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",$o=Cn(Ho);function Or(e){return!!e||e===""}function xn(e){if($(e)){const t={};for(let n=0;n{if(n){const r=n.split(ko);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Pn(e){let t="";if(ae(e))t=e;else if($(e))for(let n=0;ne==null?"":$(e)||ie(e)&&(e.toString===Sr||!k(e.toString))?JSON.stringify(e,Tr,2):String(e),Tr=(e,t)=>t&&t.__v_isRef?Tr(e,t.value):dt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:Mr(t)?{[`Set(${t.size})`]:[...t.values()]}:ie(t)&&!$(t)&&!Fr(t)?String(t):t,G={},at=[],Pe=()=>{},Uo=()=>!1,Ko=/^on[^a-z]/,zt=e=>Ko.test(e),An=e=>e.startsWith("onUpdate:"),fe=Object.assign,Rn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Do=Object.prototype.hasOwnProperty,W=(e,t)=>Do.call(e,t),$=Array.isArray,dt=e=>Wt(e)==="[object Map]",Mr=e=>Wt(e)==="[object Set]",k=e=>typeof e=="function",ae=e=>typeof e=="string",On=e=>typeof e=="symbol",ie=e=>e!==null&&typeof e=="object",Ir=e=>ie(e)&&k(e.then)&&k(e.catch),Sr=Object.prototype.toString,Wt=e=>Sr.call(e),zo=e=>Wt(e).slice(8,-1),Fr=e=>Wt(e)==="[object Object]",Tn=e=>ae(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,qt=Cn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Vt=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Wo=/-(\w)/g,Me=Vt(e=>e.replace(Wo,(t,n)=>n?n.toUpperCase():"")),qo=/\B([A-Z])/g,ht=Vt(e=>e.replace(qo,"-$1").toLowerCase()),Yt=Vt(e=>e.charAt(0).toUpperCase()+e.slice(1)),Mn=Vt(e=>e?`on${Yt(e)}`:""),Tt=(e,t)=>!Object.is(e,t),In=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Vo=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Nr;const Yo=()=>Nr||(Nr=typeof globalThis!="undefined"?globalThis:typeof self!="undefined"?self:typeof window!="undefined"?window:typeof global!="undefined"?global:{});let Je;const Jt=[];class Qo{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Je&&(this.parent=Je,this.index=(Je.scopes||(Je.scopes=[])).push(this)-1)}run(t){if(this.active)try{return this.on(),t()}finally{this.off()}}on(){this.active&&(Jt.push(this),Je=this)}off(){this.active&&(Jt.pop(),Je=Jt[Jt.length-1])}stop(t){if(this.active){if(this.effects.forEach(n=>n.stop()),this.cleanups.forEach(n=>n()),this.scopes&&this.scopes.forEach(n=>n.stop(!0)),this.parent&&!t){const n=this.parent.scopes.pop();n&&n!==this&&(this.parent.scopes[this.index]=n,n.index=this.index)}this.active=!1}}}function Jo(e,t){t=t||Je,t&&t.active&&t.effects.push(e)}const Sn=e=>{const t=new Set(e);return t.w=0,t.n=0,t},Lr=e=>(e.w&Be)>0,Hr=e=>(e.n&Be)>0,Xo=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r0?It[t-1]:void 0}}stop(){this.active&&($r(this),this.onStop&&this.onStop(),this.active=!1)}}function $r(e){const{deps:t}=e;if(t.length){for(let n=0;n{(f==="length"||f>=r)&&c.push(l)});else switch(n!==void 0&&c.push(i.get(n)),t){case"add":$(e)?Tn(n)&&c.push(i.get("length")):(c.push(i.get(Ze)),dt(e)&&c.push(i.get(Ln)));break;case"delete":$(e)||(c.push(i.get(Ze)),dt(e)&&c.push(i.get(Ln)));break;case"set":dt(e)&&c.push(i.get(Ze));break}if(c.length===1)c[0]&&jn(c[0]);else{const l=[];for(const f of c)f&&l.push(...f);jn(Sn(l))}}function jn(e,t){for(const n of $(e)?e:[...e])(n!==Xe||n.allowRecurse)&&(n.scheduler?n.scheduler():n.run())}const ei=Cn("__proto__,__v_isRef,__isVue"),Br=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(On)),ti=kn(),ni=kn(!1,!0),ri=kn(!0),Ur=si();function si(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=q(this);for(let o=0,i=this.length;o{e[t]=function(...n){gt();const r=q(this)[t].apply(this,n);return Ge(),r}}),e}function kn(e=!1,t=!1){return function(r,s,o){if(s==="__v_isReactive")return!e;if(s==="__v_isReadonly")return e;if(s==="__v_raw"&&o===(e?t?vi:Jr:t?Qr:Yr).get(r))return r;const i=$(r);if(!e&&i&&W(Ur,s))return Reflect.get(Ur,s,o);const c=Reflect.get(r,s,o);return(On(s)?Br.has(s):ei(s))||(e||be(r,"get",s),t)?c:he(c)?!i||!Tn(s)?c.value:c:ie(c)?e?Xr(c):St(c):c}}const oi=Kr(),ii=Kr(!0);function Kr(e=!1){return function(n,r,s,o){let i=n[r];if(!e&&!Dn(s)&&(s=q(s),i=q(i),!$(n)&&he(i)&&!he(s)))return i.value=s,!0;const c=$(n)&&Tn(r)?Number(r)e,Xt=e=>Reflect.getPrototypeOf(e);function Zt(e,t,n=!1,r=!1){e=e.__v_raw;const s=q(e),o=q(t);t!==o&&!n&&be(s,"get",t),!n&&be(s,"get",o);const{has:i}=Xt(s),c=r?Bn:n?zn:Ft;if(i.call(s,t))return c(e.get(t));if(i.call(s,o))return c(e.get(o));e!==s&&e.get(t)}function Gt(e,t=!1){const n=this.__v_raw,r=q(n),s=q(e);return e!==s&&!t&&be(r,"has",e),!t&&be(r,"has",s),e===s?n.has(e):n.has(e)||n.has(s)}function en(e,t=!1){return e=e.__v_raw,!t&&be(q(e),"iterate",Ze),Reflect.get(e,"size",e)}function zr(e){e=q(e);const t=q(this);return Xt(t).has.call(t,e)||(t.add(e),He(t,"add",e,e)),this}function Wr(e,t){t=q(t);const n=q(this),{has:r,get:s}=Xt(n);let o=r.call(n,e);o||(e=q(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?Tt(t,i)&&He(n,"set",e,t):He(n,"add",e,t),this}function qr(e){const t=q(this),{has:n,get:r}=Xt(t);let s=n.call(t,e);s||(e=q(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&He(t,"delete",e,void 0),o}function Vr(){const e=q(this),t=e.size!==0,n=e.clear();return t&&He(e,"clear",void 0,void 0),n}function tn(e,t){return function(r,s){const o=this,i=o.__v_raw,c=q(i),l=t?Bn:e?zn:Ft;return!e&&be(c,"iterate",Ze),i.forEach((f,a)=>r.call(s,l(f),l(a),o))}}function nn(e,t,n){return function(...r){const s=this.__v_raw,o=q(s),i=dt(o),c=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,f=s[e](...r),a=n?Bn:t?zn:Ft;return!t&&be(o,"iterate",l?Ln:Ze),{next(){const{value:p,done:h}=f.next();return h?{value:p,done:h}:{value:c?[a(p[0]),a(p[1])]:a(p),done:h}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:this}}function di(){const e={get(o){return Zt(this,o)},get size(){return en(this)},has:Gt,add:zr,set:Wr,delete:qr,clear:Vr,forEach:tn(!1,!1)},t={get(o){return Zt(this,o,!1,!0)},get size(){return en(this)},has:Gt,add:zr,set:Wr,delete:qr,clear:Vr,forEach:tn(!1,!0)},n={get(o){return Zt(this,o,!0)},get size(){return en(this,!0)},has(o){return Gt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:tn(!0,!1)},r={get(o){return Zt(this,o,!0,!0)},get size(){return en(this,!0)},has(o){return Gt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:tn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=nn(o,!1,!1),n[o]=nn(o,!0,!1),t[o]=nn(o,!1,!0),r[o]=nn(o,!0,!0)}),[e,n,t,r]}const[hi,pi,gi,mi]=di();function Un(e,t){const n=t?e?mi:gi:e?pi:hi;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(W(n,s)&&s in r?n:r,s,o)}const _i={get:Un(!1,!1)},bi={get:Un(!1,!0)},yi={get:Un(!0,!1)},Yr=new WeakMap,Qr=new WeakMap,Jr=new WeakMap,vi=new WeakMap;function Ei(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function wi(e){return e.__v_skip||!Object.isExtensible(e)?0:Ei(zo(e))}function St(e){return e&&e.__v_isReadonly?e:Kn(e,!1,Dr,_i,Yr)}function Ci(e){return Kn(e,!1,ai,bi,Qr)}function Xr(e){return Kn(e,!0,fi,yi,Jr)}function Kn(e,t,n,r,s){if(!ie(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=wi(e);if(i===0)return e;const c=new Proxy(e,i===2?r:n);return s.set(e,c),c}function mt(e){return Dn(e)?mt(e.__v_raw):!!(e&&e.__v_isReactive)}function Dn(e){return!!(e&&e.__v_isReadonly)}function Zr(e){return mt(e)||Dn(e)}function q(e){const t=e&&e.__v_raw;return t?q(t):e}function Gr(e){return Qt(e,"__v_skip",!0),e}const Ft=e=>ie(e)?St(e):e,zn=e=>ie(e)?Xr(e):e;function es(e){jr()&&(e=q(e),e.dep||(e.dep=Sn()),kr(e.dep))}function ts(e,t){e=q(e),e.dep&&jn(e.dep)}function he(e){return Boolean(e&&e.__v_isRef===!0)}function xi(e){return ns(e,!1)}function Pi(e){return ns(e,!0)}function ns(e,t){return he(e)?e:new Ai(e,t)}class Ai{constructor(t,n){this._shallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:q(t),this._value=n?t:Ft(t)}get value(){return es(this),this._value}set value(t){t=this._shallow?t:q(t),Tt(t,this._rawValue)&&(this._rawValue=t,this._value=this._shallow?t:Ft(t),ts(this))}}function Nt(e){return he(e)?e.value:e}const Ri={get:(e,t,n)=>Nt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return he(s)&&!he(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function rs(e){return mt(e)?e:new Proxy(e,Ri)}class Oi{constructor(t,n,r){this._setter=n,this.dep=void 0,this._dirty=!0,this.__v_isRef=!0,this.effect=new Hn(t,()=>{this._dirty||(this._dirty=!0,ts(this))}),this.__v_isReadonly=r}get value(){const t=q(this);return es(t),t._dirty&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Ie(e,t){let n,r;const s=k(e);return s?(n=e,r=Pe):(n=e.get,r=e.set),new Oi(n,r,s||!r)}Promise.resolve();function Ti(e,t,...n){const r=e.vnode.props||G;let s=n;const o=t.startsWith("update:"),i=o&&t.slice(7);if(i&&i in r){const a=`${i==="modelValue"?"model":i}Modifiers`,{number:p,trim:h}=r[a]||G;h?s=n.map(v=>v.trim()):p&&(s=n.map(Vo))}let c,l=r[c=Mn(t)]||r[c=Mn(Me(t))];!l&&o&&(l=r[c=Mn(ht(t))]),l&&Ce(l,e,6,s);const f=r[c+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,Ce(f,e,6,s)}}function ss(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},c=!1;if(!k(e)){const l=f=>{const a=ss(f,t,!0);a&&(c=!0,fe(i,a))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!o&&!c?(r.set(e,null),null):($(o)?o.forEach(l=>i[l]=null):fe(i,o),r.set(e,i),i)}function Wn(e,t){return!e||!zt(t)?!1:(t=t.slice(2).replace(/Once$/,""),W(e,t[0].toLowerCase()+t.slice(1))||W(e,ht(t))||W(e,t))}let Ae=null,rn=null;function sn(e){const t=Ae;return Ae=e,rn=e&&e.type.__scopeId||null,t}function gu(e){rn=e}function mu(){rn=null}function Mi(e,t=Ae,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&Is(-1);const o=sn(t),i=e(...s);return sn(o),r._d&&Is(1),i};return r._n=!0,r._c=!0,r._d=!0,r}function qn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:c,attrs:l,emit:f,render:a,renderCache:p,data:h,setupState:v,ctx:A,inheritAttrs:N}=e;let R,T;const H=sn(e);try{if(n.shapeFlag&4){const z=s||r;R=Fe(a.call(z,z,p,o,v,h,A)),T=l}else{const z=t;R=Fe(z.length>1?z(o,{attrs:l,slots:c,emit:f}):z(o,null)),T=t.props?l:Ii(l)}}catch(z){Lt.length=0,gn(z,e,1),R=Re(De)}let D=R;if(T&&N!==!1){const z=Object.keys(T),{shapeFlag:re}=D;z.length&&re&(1|6)&&(i&&z.some(An)&&(T=Si(T,i)),D=_t(D,T))}return n.dirs&&(D.dirs=D.dirs?D.dirs.concat(n.dirs):n.dirs),n.transition&&(D.transition=n.transition),R=D,sn(H),R}const Ii=e=>{let t;for(const n in e)(n==="class"||n==="style"||zt(n))&&((t||(t={}))[n]=e[n]);return t},Si=(e,t)=>{const n={};for(const r in e)(!An(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Fi(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:c,patchFlag:l}=t,f=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?os(r,i,f):!!i;if(l&8){const a=t.dynamicProps;for(let p=0;pe.__isSuspense;function Hi(e,t){t&&t.pendingBranch?$(e)?t.effects.push(...e):t.effects.push(e):Ll(e)}function on(e,t){if(le){let n=le.provides;const r=le.parent&&le.parent.provides;r===n&&(n=le.provides=Object.create(r)),n[e]=t}}function Ke(e,t,n=!1){const r=le||Ae;if(r){const s=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(s&&e in s)return s[e];if(arguments.length>1)return n&&k(t)?t.call(r.proxy):t}}function $i(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return as(()=>{e.isMounted=!0}),ds(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],ji={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},setup(e,{slots:t}){const n=xl(),r=$i();let s;return()=>{const o=t.default&&cs(t.default(),!0);if(!o||!o.length)return;const i=q(e),{mode:c}=i,l=o[0];if(r.isLeaving)return Yn(l);const f=ls(l);if(!f)return Yn(l);const a=Vn(f,i,r,n);Qn(f,a);const p=n.subTree,h=p&&ls(p);let v=!1;const{getTransitionKey:A}=f.type;if(A){const N=A();s===void 0?s=N:N!==s&&(s=N,v=!0)}if(h&&h.type!==De&&(!st(f,h)||v)){const N=Vn(h,i,r,n);if(Qn(h,N),c==="out-in")return r.isLeaving=!0,N.afterLeave=()=>{r.isLeaving=!1,n.update()},Yn(l);c==="in-out"&&f.type!==De&&(N.delayLeave=(R,T,H)=>{const D=is(r,h);D[String(h.key)]=h,R._leaveCb=()=>{T(),R._leaveCb=void 0,delete a.delayedLeave},a.delayedLeave=H})}return l}}},ki=ji;function is(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Vn(e,t,n,r){const{appear:s,mode:o,persisted:i=!1,onBeforeEnter:c,onEnter:l,onAfterEnter:f,onEnterCancelled:a,onBeforeLeave:p,onLeave:h,onAfterLeave:v,onLeaveCancelled:A,onBeforeAppear:N,onAppear:R,onAfterAppear:T,onAppearCancelled:H}=t,D=String(e.key),z=is(n,e),re=(U,se)=>{U&&Ce(U,r,9,se)},ce={mode:o,persisted:i,beforeEnter(U){let se=c;if(!n.isMounted)if(s)se=N||c;else return;U._leaveCb&&U._leaveCb(!0);const ne=z[D];ne&&st(e,ne)&&ne.el._leaveCb&&ne.el._leaveCb(),re(se,[U])},enter(U){let se=l,ne=f,ge=a;if(!n.isMounted)if(s)se=R||l,ne=T||f,ge=H||a;else return;let ue=!1;const de=U._enterCb=ke=>{ue||(ue=!0,ke?re(ge,[U]):re(ne,[U]),ce.delayedLeave&&ce.delayedLeave(),U._enterCb=void 0)};se?(se(U,de),se.length<=1&&de()):de()},leave(U,se){const ne=String(e.key);if(U._enterCb&&U._enterCb(!0),n.isUnmounting)return se();re(p,[U]);let ge=!1;const ue=U._leaveCb=de=>{ge||(ge=!0,se(),de?re(A,[U]):re(v,[U]),U._leaveCb=void 0,z[ne]===e&&delete z[ne])};z[ne]=e,h?(h(U,ue),h.length<=1&&ue()):ue()},clone(U){return Vn(U,t,n,r)}};return ce}function Yn(e){if(ln(e))return e=_t(e),e.children=null,e}function ls(e){return ln(e)?e.children?e.children[0]:void 0:e}function Qn(e,t){e.shapeFlag&6&&e.component?Qn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function cs(e,t=!1){let n=[],r=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader,ln=e=>e.type.__isKeepAlive;function Bi(e,t){fs(e,"a",t)}function Ui(e,t){fs(e,"da",t)}function fs(e,t,n=le){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(cn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)ln(s.parent.vnode)&&Ki(r,t,n,s),s=s.parent}}function Ki(e,t,n,r){const s=cn(t,e,r,!0);hs(()=>{Rn(r[t],s)},n)}function cn(e,t,n=le,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;gt(),bt(n);const c=Ce(t,n,e,i);return ot(),Ge(),c});return r?s.unshift(o):s.push(o),o}}const $e=e=>(t,n=le)=>(!pn||e==="sp")&&cn(e,t,n),Di=$e("bm"),as=$e("m"),zi=$e("bu"),Wi=$e("u"),ds=$e("bum"),hs=$e("um"),qi=$e("sp"),Vi=$e("rtg"),Yi=$e("rtc");function Qi(e,t=le){cn("ec",e,t)}let Xn=!0;function Ji(e){const t=ms(e),n=e.proxy,r=e.ctx;Xn=!1,t.beforeCreate&&ps(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:c,provide:l,inject:f,created:a,beforeMount:p,mounted:h,beforeUpdate:v,updated:A,activated:N,deactivated:R,beforeDestroy:T,beforeUnmount:H,destroyed:D,unmounted:z,render:re,renderTracked:ce,renderTriggered:U,errorCaptured:se,serverPrefetch:ne,expose:ge,inheritAttrs:ue,components:de,directives:ke,filters:lt}=t;if(f&&Xi(f,r,null,e.appContext.config.unwrapInjectedRef),i)for(const X in i){const V=i[X];k(V)&&(r[X]=V.bind(n))}if(s){const X=s.call(n,n);ie(X)&&(e.data=St(X))}if(Xn=!0,o)for(const X in o){const V=o[X],ve=k(V)?V.bind(n,n):k(V.get)?V.get.bind(n,n):Pe,ut=!k(V)&&k(V.set)?V.set.bind(n):Pe,Le=Ie({get:ve,set:ut});Object.defineProperty(r,X,{enumerable:!0,configurable:!0,get:()=>Le.value,set:Oe=>Le.value=Oe})}if(c)for(const X in c)gs(c[X],r,n,X);if(l){const X=k(l)?l.call(n):l;Reflect.ownKeys(X).forEach(V=>{on(V,X[V])})}a&&ps(a,e,"c");function oe(X,V){$(V)?V.forEach(ve=>X(ve.bind(n))):V&&X(V.bind(n))}if(oe(Di,p),oe(as,h),oe(zi,v),oe(Wi,A),oe(Bi,N),oe(Ui,R),oe(Qi,se),oe(Yi,ce),oe(Vi,U),oe(ds,H),oe(hs,z),oe(qi,ne),$(ge))if(ge.length){const X=e.exposed||(e.exposed={});ge.forEach(V=>{Object.defineProperty(X,V,{get:()=>n[V],set:ve=>n[V]=ve})})}else e.exposed||(e.exposed={});re&&e.render===Pe&&(e.render=re),ue!=null&&(e.inheritAttrs=ue),de&&(e.components=de),ke&&(e.directives=ke)}function Xi(e,t,n=Pe,r=!1){$(e)&&(e=Zn(e));for(const s in e){const o=e[s];let i;ie(o)?"default"in o?i=Ke(o.from||s,o.default,!0):i=Ke(o.from||s):i=Ke(o),he(i)&&r?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:c=>i.value=c}):t[s]=i}}function ps(e,t,n){Ce($(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function gs(e,t,n,r){const s=r.includes(".")?Vs(n,r):()=>n[r];if(ae(e)){const o=t[e];k(o)&&_n(s,o)}else if(k(e))_n(s,e.bind(n));else if(ie(e))if($(e))e.forEach(o=>gs(o,t,n,r));else{const o=k(e.handler)?e.handler.bind(n):t[e.handler];k(o)&&_n(s,o,e)}}function ms(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,c=o.get(t);let l;return c?l=c:!s.length&&!n&&!r?l=t:(l={},s.length&&s.forEach(f=>un(l,f,i,!0)),un(l,t,i)),o.set(t,l),l}function un(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&un(e,o,n,!0),s&&s.forEach(i=>un(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const c=Zi[i]||n&&n[i];e[i]=c?c(e[i],t[i]):t[i]}return e}const Zi={data:_s,props:et,emits:et,methods:et,computed:et,beforeCreate:pe,created:pe,beforeMount:pe,mounted:pe,beforeUpdate:pe,updated:pe,beforeDestroy:pe,beforeUnmount:pe,destroyed:pe,unmounted:pe,activated:pe,deactivated:pe,errorCaptured:pe,serverPrefetch:pe,components:et,directives:et,watch:el,provide:_s,inject:Gi};function _s(e,t){return t?e?function(){return fe(k(e)?e.call(this,this):e,k(t)?t.call(this,this):t)}:t:e}function Gi(e,t){return et(Zn(e),Zn(t))}function Zn(e){if($(e)){const t={};for(let n=0;n0)&&!(i&16)){if(i&8){const a=e.vnode.dynamicProps;for(let p=0;p{l=!0;const[h,v]=ys(p,t,!0);fe(i,h),v&&c.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!o&&!l)return r.set(e,at),at;if($(o))for(let a=0;a-1,v[1]=N<0||A-1||W(v,"default"))&&c.push(p)}}}const f=[i,c];return r.set(e,f),f}function vs(e){return e[0]!=="$"}function Es(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function ws(e,t){return Es(e)===Es(t)}function Cs(e,t){return $(t)?t.findIndex(n=>ws(n,e)):k(t)&&ws(t,e)?0:-1}const xs=e=>e[0]==="_"||e==="$stable",er=e=>$(e)?e.map(Fe):[Fe(e)],rl=(e,t,n)=>{const r=Mi((...s)=>er(t(...s)),n);return r._c=!1,r},Ps=(e,t,n)=>{const r=e._ctx;for(const s in e){if(xs(s))continue;const o=e[s];if(k(o))t[s]=rl(s,o,r);else if(o!=null){const i=er(o);t[s]=()=>i}}},As=(e,t)=>{const n=er(t);e.slots.default=()=>n},sl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=q(t),Qt(t,"_",n)):Ps(t,e.slots={})}else e.slots={},t&&As(e,t);Qt(e.slots,an,1)},ol=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=G;if(r.shapeFlag&32){const c=t._;c?n&&c===1?o=!1:(fe(s,t),!n&&c===1&&delete s._):(o=!t.$stable,Ps(t,s)),i=t}else t&&(As(e,t),i={default:1});if(o)for(const c in s)!xs(c)&&!(c in i)&&delete s[c]};function tt(e,t,n,r){const s=e.dirs,o=t&&t.dirs;for(let i=0;itr(h,t&&($(t)?t[v]:t),n,r,s));return}if(Jn(r)&&!s)return;const o=r.shapeFlag&4?lr(r.component)||r.component.proxy:r.el,i=s?null:o,{i:c,r:l}=e,f=t&&t.r,a=c.refs===G?c.refs={}:c.refs,p=c.setupState;if(f!=null&&f!==l&&(ae(f)?(a[f]=null,W(p,f)&&(p[f]=null)):he(f)&&(f.value=null)),k(l))We(l,c,12,[i,a]);else{const h=ae(l),v=he(l);if(h||v){const A=()=>{if(e.f){const N=h?a[l]:l.value;s?$(N)&&Rn(N,o):$(N)?N.includes(o)||N.push(o):h?a[l]=[o]:(l.value=[o],e.k&&(a[e.k]=l.value))}else h?(a[l]=i,W(p,l)&&(p[l]=i)):he(l)&&(l.value=i,e.k&&(a[e.k]=i))};i?(A.id=-1,me(A,n)):A()}}}const me=Hi;function cl(e){return ul(e)}function ul(e,t){const n=Yo();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:c,createComment:l,setText:f,setElementText:a,parentNode:p,nextSibling:h,setScopeId:v=Pe,cloneNode:A,insertStaticContent:N}=e,R=(u,d,g,b=null,_=null,w=null,P=!1,E=null,C=!!d.dynamicChildren)=>{if(u===d)return;u&&!st(u,d)&&(b=I(u),Ee(u,_,w,!0),u=null),d.patchFlag===-2&&(C=!1,d.dynamicChildren=null);const{type:y,ref:S,shapeFlag:O}=d;switch(y){case nr:T(u,d,g,b);break;case De:H(u,d,g,b);break;case rr:u==null&&D(d,g,b,P);break;case Se:ke(u,d,g,b,_,w,P,E,C);break;default:O&1?ce(u,d,g,b,_,w,P,E,C):O&6?lt(u,d,g,b,_,w,P,E,C):(O&64||O&128)&&y.process(u,d,g,b,_,w,P,E,C,Z)}S!=null&&_&&tr(S,u&&u.ref,w,d||u,!d)},T=(u,d,g,b)=>{if(u==null)r(d.el=c(d.children),g,b);else{const _=d.el=u.el;d.children!==u.children&&f(_,d.children)}},H=(u,d,g,b)=>{u==null?r(d.el=l(d.children||""),g,b):d.el=u.el},D=(u,d,g,b)=>{[u.el,u.anchor]=N(u.children,d,g,b)},z=({el:u,anchor:d},g,b)=>{let _;for(;u&&u!==d;)_=h(u),r(u,g,b),u=_;r(d,g,b)},re=({el:u,anchor:d})=>{let g;for(;u&&u!==d;)g=h(u),s(u),u=g;s(d)},ce=(u,d,g,b,_,w,P,E,C)=>{P=P||d.type==="svg",u==null?U(d,g,b,_,w,P,E,C):ge(u,d,_,w,P,E,C)},U=(u,d,g,b,_,w,P,E)=>{let C,y;const{type:S,props:O,shapeFlag:F,transition:L,patchFlag:K,dirs:te}=u;if(u.el&&A!==void 0&&K===-1)C=u.el=A(u.el);else{if(C=u.el=i(u.type,w,O&&O.is,O),F&8?a(C,u.children):F&16&&ne(u.children,C,null,b,_,w&&S!=="foreignObject",P,E),te&&tt(u,null,b,"created"),O){for(const ee in O)ee!=="value"&&!qt(ee)&&o(C,ee,null,O[ee],w,u.children,b,_,x);"value"in O&&o(C,"value",null,O.value),(y=O.onVnodeBeforeMount)&&Ne(y,b,u)}se(C,u,u.scopeId,P,b)}te&&tt(u,null,b,"beforeMount");const Q=(!_||_&&!_.pendingBranch)&&L&&!L.persisted;Q&&L.beforeEnter(C),r(C,d,g),((y=O&&O.onVnodeMounted)||Q||te)&&me(()=>{y&&Ne(y,b,u),Q&&L.enter(C),te&&tt(u,null,b,"mounted")},_)},se=(u,d,g,b,_)=>{if(g&&v(u,g),b)for(let w=0;w{for(let y=C;y{const E=d.el=u.el;let{patchFlag:C,dynamicChildren:y,dirs:S}=d;C|=u.patchFlag&16;const O=u.props||G,F=d.props||G;let L;g&&nt(g,!1),(L=F.onVnodeBeforeUpdate)&&Ne(L,g,d,u),S&&tt(d,u,g,"beforeUpdate"),g&&nt(g,!0);const K=_&&d.type!=="foreignObject";if(y?ue(u.dynamicChildren,y,E,g,b,K,w):P||ve(u,d,E,null,g,b,K,w,!1),C>0){if(C&16)de(E,d,O,F,g,b,_);else if(C&2&&O.class!==F.class&&o(E,"class",null,F.class,_),C&4&&o(E,"style",O.style,F.style,_),C&8){const te=d.dynamicProps;for(let Q=0;Q{L&&Ne(L,g,d,u),S&&tt(d,u,g,"updated")},b)},ue=(u,d,g,b,_,w,P)=>{for(let E=0;E{if(g!==b){for(const E in b){if(qt(E))continue;const C=b[E],y=g[E];C!==y&&E!=="value"&&o(u,E,y,C,P,d.children,_,w,x)}if(g!==G)for(const E in g)!qt(E)&&!(E in b)&&o(u,E,g[E],null,P,d.children,_,w,x);"value"in b&&o(u,"value",g.value,b.value)}},ke=(u,d,g,b,_,w,P,E,C)=>{const y=d.el=u?u.el:c(""),S=d.anchor=u?u.anchor:c("");let{patchFlag:O,dynamicChildren:F,slotScopeIds:L}=d;L&&(E=E?E.concat(L):L),u==null?(r(y,g,b),r(S,g,b),ne(d.children,g,S,_,w,P,E,C)):O>0&&O&64&&F&&u.dynamicChildren?(ue(u.dynamicChildren,F,g,_,w,P,E),(d.key!=null||_&&d===_.subTree)&&Os(u,d,!0)):ve(u,d,g,S,_,w,P,E,C)},lt=(u,d,g,b,_,w,P,E,C)=>{d.slotScopeIds=E,u==null?d.shapeFlag&512?_.ctx.activate(d,g,b,P,C):ct(d,g,b,_,w,P,C):oe(u,d,C)},ct=(u,d,g,b,_,w,P)=>{const E=u.component=Cl(u,b,_);if(ln(u)&&(E.ctx.renderer=Z),Pl(E),E.asyncDep){if(_&&_.registerDep(E,X),!u.el){const C=E.subTree=Re(De);H(null,C,d,g)}return}X(E,u,d,g,_,w,P)},oe=(u,d,g)=>{const b=d.component=u.component;if(Fi(u,d,g))if(b.asyncDep&&!b.asyncResolved){V(b,d,g);return}else b.next=d,Fl(b.update),b.update();else d.component=u.component,d.el=u.el,b.vnode=d},X=(u,d,g,b,_,w,P)=>{const E=()=>{if(u.isMounted){let{next:S,bu:O,u:F,parent:L,vnode:K}=u,te=S,Q;nt(u,!1),S?(S.el=K.el,V(u,S,P)):S=K,O&&In(O),(Q=S.props&&S.props.onVnodeBeforeUpdate)&&Ne(Q,L,S,K),nt(u,!0);const ee=qn(u),xe=u.subTree;u.subTree=ee,R(xe,ee,p(xe.el),I(xe),u,_,w),S.el=ee.el,te===null&&Ni(u,ee.el),F&&me(F,_),(Q=S.props&&S.props.onVnodeUpdated)&&me(()=>Ne(Q,L,S,K),_)}else{let S;const{el:O,props:F}=d,{bm:L,m:K,parent:te}=u,Q=Jn(d);if(nt(u,!1),L&&In(L),!Q&&(S=F&&F.onVnodeBeforeMount)&&Ne(S,te,d),nt(u,!0),O&&j){const ee=()=>{u.subTree=qn(u),j(O,u.subTree,u,_,null)};Q?d.type.__asyncLoader().then(()=>!u.isUnmounted&&ee()):ee()}else{const ee=u.subTree=qn(u);R(null,ee,g,b,u,_,w),d.el=ee.el}if(K&&me(K,_),!Q&&(S=F&&F.onVnodeMounted)){const ee=d;me(()=>Ne(S,te,ee),_)}d.shapeFlag&256&&u.a&&me(u.a,_),u.isMounted=!0,d=g=b=null}},C=u.effect=new Hn(E,()=>Bs(u.update),u.scope),y=u.update=C.run.bind(C);y.id=u.uid,nt(u,!0),y()},V=(u,d,g)=>{d.component=u;const b=u.vnode.props;u.vnode=d,u.next=null,nl(u,d.props,b,g),ol(u,d.children,g),gt(),ar(void 0,u.update),Ge()},ve=(u,d,g,b,_,w,P,E,C=!1)=>{const y=u&&u.children,S=u?u.shapeFlag:0,O=d.children,{patchFlag:F,shapeFlag:L}=d;if(F>0){if(F&128){Le(y,O,g,b,_,w,P,E,C);return}else if(F&256){ut(y,O,g,b,_,w,P,E,C);return}}L&8?(S&16&&x(y,_,w),O!==y&&a(g,O)):S&16?L&16?Le(y,O,g,b,_,w,P,E,C):x(y,_,w,!0):(S&8&&a(g,""),L&16&&ne(O,g,b,_,w,P,E,C))},ut=(u,d,g,b,_,w,P,E,C)=>{u=u||at,d=d||at;const y=u.length,S=d.length,O=Math.min(y,S);let F;for(F=0;FS?x(u,_,w,!0,!1,O):ne(d,g,b,_,w,P,E,C,O)},Le=(u,d,g,b,_,w,P,E,C)=>{let y=0;const S=d.length;let O=u.length-1,F=S-1;for(;y<=O&&y<=F;){const L=u[y],K=d[y]=C?ze(d[y]):Fe(d[y]);if(st(L,K))R(L,K,g,null,_,w,P,E,C);else break;y++}for(;y<=O&&y<=F;){const L=u[O],K=d[F]=C?ze(d[F]):Fe(d[F]);if(st(L,K))R(L,K,g,null,_,w,P,E,C);else break;O--,F--}if(y>O){if(y<=F){const L=F+1,K=LF)for(;y<=O;)Ee(u[y],_,w,!0),y++;else{const L=y,K=y,te=new Map;for(y=K;y<=F;y++){const _e=d[y]=C?ze(d[y]):Fe(d[y]);_e.key!=null&&te.set(_e.key,y)}let Q,ee=0;const xe=F-K+1;let ft=!1,Pr=0;const Ot=new Array(xe);for(y=0;y=xe){Ee(_e,_,w,!0);continue}let Te;if(_e.key!=null)Te=te.get(_e.key);else for(Q=K;Q<=F;Q++)if(Ot[Q-K]===0&&st(_e,d[Q])){Te=Q;break}Te===void 0?Ee(_e,_,w,!0):(Ot[Te-K]=y+1,Te>=Pr?Pr=Te:ft=!0,R(_e,d[Te],g,null,_,w,P,E,C),ee++)}const Ar=ft?fl(Ot):at;for(Q=Ar.length-1,y=xe-1;y>=0;y--){const _e=K+y,Te=d[_e],Rr=_e+1{const{el:w,type:P,transition:E,children:C,shapeFlag:y}=u;if(y&6){Oe(u.component.subTree,d,g,b);return}if(y&128){u.suspense.move(d,g,b);return}if(y&64){P.move(u,d,g,Z);return}if(P===Se){r(w,d,g);for(let O=0;OE.enter(w),_);else{const{leave:O,delayLeave:F,afterLeave:L}=E,K=()=>r(w,d,g),te=()=>{O(w,()=>{K(),L&&L()})};F?F(w,K,te):te()}else r(w,d,g)},Ee=(u,d,g,b=!1,_=!1)=>{const{type:w,props:P,ref:E,children:C,dynamicChildren:y,shapeFlag:S,patchFlag:O,dirs:F}=u;if(E!=null&&tr(E,null,g,u,!0),S&256){d.ctx.deactivate(u);return}const L=S&1&&F,K=!Jn(u);let te;if(K&&(te=P&&P.onVnodeBeforeUnmount)&&Ne(te,d,u),S&6)M(u.component,g,b);else{if(S&128){u.suspense.unmount(g,b);return}L&&tt(u,null,d,"beforeUnmount"),S&64?u.type.remove(u,d,g,_,Z,b):y&&(w!==Se||O>0&&O&64)?x(y,d,g,!1,!0):(w===Se&&O&(128|256)||!_&&S&16)&&x(C,d,g),b&&wn(u)}(K&&(te=P&&P.onVnodeUnmounted)||L)&&me(()=>{te&&Ne(te,d,u),L&&tt(u,null,d,"unmounted")},g)},wn=u=>{const{type:d,el:g,anchor:b,transition:_}=u;if(d===Se){m(g,b);return}if(d===rr){re(u);return}const w=()=>{s(g),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(u.shapeFlag&1&&_&&!_.persisted){const{leave:P,delayLeave:E}=_,C=()=>P(g,w);E?E(u.el,w,C):C()}else w()},m=(u,d)=>{let g;for(;u!==d;)g=h(u),s(u),u=g;s(d)},M=(u,d,g)=>{const{bum:b,scope:_,update:w,subTree:P,um:E}=u;b&&In(b),_.stop(),w&&(w.active=!1,Ee(P,u,d,g)),E&&me(E,d),me(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},x=(u,d,g,b=!1,_=!1,w=0)=>{for(let P=w;Pu.shapeFlag&6?I(u.component.subTree):u.shapeFlag&128?u.suspense.next():h(u.anchor||u.el),Y=(u,d,g)=>{u==null?d._vnode&&Ee(d._vnode,null,null,!0):R(d._vnode||null,u,d,null,null,null,g),Ds(),d._vnode=u},Z={p:R,um:Ee,m:Oe,r:wn,mt:ct,mc:ne,pc:ve,pbc:ue,n:I,o:e};let B,j;return t&&([B,j]=t(Z)),{render:Y,hydrate:B,createApp:ll(Y,B)}}function nt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Os(e,t,n=!1){const r=e.children,s=t.children;if($(r)&&$(s))for(let o=0;o>1,e[n[c]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const al=e=>e.__isTeleport,Ts="components";function _u(e,t){return hl(Ts,e,!0,t)||e}const dl=Symbol();function hl(e,t,n=!0,r=!1){const s=Ae||le;if(s){const o=s.type;if(e===Ts){const c=Tl(o);if(c&&(c===t||c===Me(t)||c===Yt(Me(t))))return o}const i=Ms(s[e]||o[e],t)||Ms(s.appContext[e],t);return!i&&r?o:i}}function Ms(e,t){return e&&(e[t]||e[Me(t)]||e[Yt(Me(t))])}const Se=Symbol(void 0),nr=Symbol(void 0),De=Symbol(void 0),rr=Symbol(void 0),Lt=[];let rt=null;function bu(e=!1){Lt.push(rt=e?null:[])}function pl(){Lt.pop(),rt=Lt[Lt.length-1]||null}let fn=1;function Is(e){fn+=e}function gl(e){return e.dynamicChildren=fn>0?rt||at:null,pl(),fn>0&&rt&&rt.push(e),e}function yu(e,t,n,r,s,o){return gl(Fs(e,t,n,r,s,o,!0))}function sr(e){return e?e.__v_isVNode===!0:!1}function st(e,t){return e.type===t.type&&e.key===t.key}const an="__vInternal",Ss=({key:e})=>e!=null?e:null,dn=({ref:e,ref_key:t,ref_for:n})=>e!=null?ae(e)||he(e)||k(e)?{i:Ae,r:e,k:t,f:!!n}:e:null;function Fs(e,t=null,n=null,r=0,s=null,o=e===Se?0:1,i=!1,c=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ss(t),ref:t&&dn(t),scopeId:rn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null};return c?(or(l,n),o&128&&e.normalize(l)):n&&(l.shapeFlag|=ae(n)?8:16),fn>0&&!i&&rt&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&rt.push(l),l}const Re=ml;function ml(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===dl)&&(e=De),sr(e)){const c=_t(e,t,!0);return n&&or(c,n),c}if(Ml(e)&&(e=e.__vccOpts),t){t=_l(t);let{class:c,style:l}=t;c&&!ae(c)&&(t.class=Pn(c)),ie(l)&&(Zr(l)&&!$(l)&&(l=fe({},l)),t.style=xn(l))}const i=ae(e)?1:Li(e)?128:al(e)?64:ie(e)?4:k(e)?2:0;return Fs(e,t,n,r,s,i,o,!0)}function _l(e){return e?Zr(e)||an in e?fe({},e):e:null}function _t(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,c=t?yl(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Ss(c),ref:t&&t.ref?n&&s?$(s)?s.concat(dn(t)):[s,dn(t)]:dn(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Se?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&_t(e.ssContent),ssFallback:e.ssFallback&&_t(e.ssFallback),el:e.el,anchor:e.anchor}}function bl(e=" ",t=0){return Re(nr,null,e,t)}function Fe(e){return e==null||typeof e=="boolean"?Re(De):$(e)?Re(Se,null,e.slice()):typeof e=="object"?ze(e):Re(nr,null,String(e))}function ze(e){return e.el===null||e.memo?e:_t(e)}function or(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if($(t))n=16;else if(typeof t=="object")if(r&(1|64)){const s=t.default;s&&(s._c&&(s._d=!1),or(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(an in t)?t._ctx=Ae:s===3&&Ae&&(Ae.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else k(t)?(t={default:t,_ctx:Ae},n=32):(t=String(t),r&64?(n=16,t=[bl(t)]):n=8);e.children=t,e.shapeFlag|=n}function yl(...e){const t={};for(let n=0;ne?Ns(e)?lr(e)||e.proxy:ir(e.parent):null,hn=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ir(e.parent),$root:e=>ir(e.root),$emit:e=>e.emit,$options:e=>ms(e),$forceUpdate:e=>()=>Bs(e.update),$nextTick:e=>ks.bind(e.proxy),$watch:e=>Hl.bind(e)}),vl={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:c,appContext:l}=e;let f;if(t[0]!=="$"){const v=i[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(r!==G&&W(r,t))return i[t]=1,r[t];if(s!==G&&W(s,t))return i[t]=2,s[t];if((f=e.propsOptions[0])&&W(f,t))return i[t]=3,o[t];if(n!==G&&W(n,t))return i[t]=4,n[t];Xn&&(i[t]=0)}}const a=hn[t];let p,h;if(a)return t==="$attrs"&&be(e,"get",t),a(e);if((p=c.__cssModules)&&(p=p[t]))return p;if(n!==G&&W(n,t))return i[t]=4,n[t];if(h=l.config.globalProperties,W(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;if(s!==G&&W(s,t))s[t]=n;else if(r!==G&&W(r,t))r[t]=n;else if(W(e.props,t))return!1;return t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let c;return!!n[i]||e!==G&&W(e,i)||t!==G&&W(t,i)||(c=o[0])&&W(c,i)||W(r,i)||W(hn,i)||W(s.config.globalProperties,i)}},El=Rs();let wl=0;function Cl(e,t,n){const r=e.type,s=(t?t.appContext:e.appContext)||El,o={uid:wl++,vnode:e,type:r,parent:t,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,scope:new Qo(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(s.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ys(r,s),emitsOptions:ss(r,s),emit:null,emitted:null,propsDefaults:G,inheritAttrs:r.inheritAttrs,ctx:G,data:G,props:G,attrs:G,slots:G,refs:G,setupState:G,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return o.ctx={_:o},o.root=t?t.root:o,o.emit=Ti.bind(null,o),e.ce&&e.ce(o),o}let le=null;const xl=()=>le||Ae,bt=e=>{le=e,e.scope.on()},ot=()=>{le&&le.scope.off(),le=null};function Ns(e){return e.vnode.shapeFlag&4}let pn=!1;function Pl(e,t=!1){pn=t;const{props:n,children:r}=e.vnode,s=Ns(e);tl(e,n,s,t),sl(e,r);const o=s?Al(e,t):void 0;return pn=!1,o}function Al(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Gr(new Proxy(e.ctx,vl));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?Ol(e):null;bt(e),gt();const o=We(r,e,0,[e.props,s]);if(Ge(),ot(),Ir(o)){if(o.then(ot,ot),t)return o.then(i=>{Ls(e,i,t)}).catch(i=>{gn(i,e,0)});e.asyncDep=o}else Ls(e,o,t)}else $s(e,t)}function Ls(e,t,n){k(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ie(t)&&(e.setupState=rs(t)),$s(e,n)}let Hs;function $s(e,t,n){const r=e.type;if(!e.render){if(!t&&Hs&&!r.render){const s=r.template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:c,compilerOptions:l}=r,f=fe(fe({isCustomElement:o,delimiters:c},i),l);r.render=Hs(s,f)}}e.render=r.render||Pe}bt(e),gt(),Ji(e),Ge(),ot()}function Rl(e){return new Proxy(e.attrs,{get(t,n){return be(e,"get","$attrs"),t[n]}})}function Ol(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=Rl(e))},slots:e.slots,emit:e.emit,expose:t}}function lr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(rs(Gr(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in hn)return hn[n](e)}}))}function Tl(e){return k(e)&&e.displayName||e.name}function Ml(e){return k(e)&&"__vccOpts"in e}function We(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){gn(o,t,n)}return s}function Ce(e,t,n,r){if(k(e)){const o=We(e,t,n,r);return o&&Ir(o)&&o.catch(i=>{gn(i,t,n)}),o}const s=[];for(let o=0;o>>1;kt(ye[r])je&&ye.splice(t,1)}function Ks(e,t,n,r){$(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?r+1:r))&&n.push(e),Us()}function Nl(e){Ks(e,$t,Ht,yt)}function Ll(e){Ks(e,qe,jt,vt)}function ar(e,t=null){if(Ht.length){for(fr=t,$t=[...new Set(Ht)],Ht.length=0,yt=0;yt<$t.length;yt++)$t[yt]();$t=null,yt=0,fr=null,ar(e,t)}}function Ds(e){if(jt.length){const t=[...new Set(jt)];if(jt.length=0,qe){qe.push(...t);return}for(qe=t,qe.sort((n,r)=>kt(n)-kt(r)),vt=0;vte.id==null?1/0:e.id;function zs(e){cr=!1,mn=!0,ar(e),ye.sort((n,r)=>kt(n)-kt(r));const t=Pe;try{for(je=0;jee.value,f=!!e._shallow):mt(e)?(l=()=>e,r=!0):$(e)?(a=!0,f=e.some(mt),l=()=>e.map(T=>{if(he(T))return T.value;if(mt(T))return Et(T);if(k(T))return We(T,c,2)})):k(e)?t?l=()=>We(e,c,2):l=()=>{if(!(c&&c.isUnmounted))return p&&p(),Ce(e,c,3,[h])}:l=Pe,t&&r){const T=l;l=()=>Et(T())}let p,h=T=>{p=R.onStop=()=>{We(T,c,4)}};if(pn)return h=Pe,t?n&&Ce(t,c,3,[l(),a?[]:void 0,h]):l(),Pe;let v=a?[]:Ws;const A=()=>{if(!!R.active)if(t){const T=R.run();(r||f||(a?T.some((H,D)=>Tt(H,v[D])):Tt(T,v)))&&(p&&p(),Ce(t,c,3,[T,v===Ws?void 0:v,h]),v=T)}else R.run()};A.allowRecurse=!!t;let N;s==="sync"?N=A:s==="post"?N=()=>me(A,c&&c.suspense):N=()=>{!c||c.isMounted?Nl(A):A()};const R=new Hn(l,N);return t?n?A():v=R.run():s==="post"?me(R.run.bind(R),c&&c.suspense):R.run(),()=>{R.stop(),c&&c.scope&&Rn(c.scope.effects,R)}}function Hl(e,t,n){const r=this.proxy,s=ae(e)?e.includes(".")?Vs(r,e):()=>r[e]:e.bind(r,r);let o;k(t)?o=t:(o=t.handler,n=t);const i=le;bt(this);const c=qs(s,o.bind(r),n);return i?bt(i):ot(),c}function Vs(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{Et(n,t)});else if(Fr(e))for(const n in e)Et(e[n],t);return e}function Ys(e,t,n){const r=arguments.length;return r===2?ie(t)&&!$(t)?sr(t)?Re(e,null,[t]):Re(e,t):Re(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&sr(n)&&(n=[n]),Re(e,t,n))}const $l="3.2.26",jl="http://www.w3.org/2000/svg",wt=typeof document!="undefined"?document:null,Qs=new Map,kl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?wt.createElementNS(jl,e):wt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>wt.createTextNode(e),createComment:e=>wt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>wt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r){const s=n?n.previousSibling:t.lastChild;let o=Qs.get(e);if(!o){const i=wt.createElement("template");if(i.innerHTML=r?`${e} `:e,o=i.content,r){const c=o.firstChild;for(;c.firstChild;)o.appendChild(c.firstChild);o.removeChild(c)}Qs.set(e,o)}return t.insertBefore(o.cloneNode(!0),n),[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Bl(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Ul(e,t,n){const r=e.style,s=ae(n);if(n&&!s){for(const o in n)dr(r,o,n[o]);if(t&&!ae(t))for(const o in t)n[o]==null&&dr(r,o,"")}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=o)}}const Js=/\s*!important$/;function dr(e,t,n){if($(n))n.forEach(r=>dr(e,t,r));else if(t.startsWith("--"))e.setProperty(t,n);else{const r=Kl(e,t);Js.test(n)?e.setProperty(ht(r),n.replace(Js,""),"important"):e[r]=n}}const Xs=["Webkit","Moz","ms"],hr={};function Kl(e,t){const n=hr[t];if(n)return n;let r=Me(t);if(r!=="filter"&&r in e)return hr[t]=r;r=Yt(r);for(let s=0;sdocument.createEvent("Event").timeStamp&&(bn=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);Gs=!!(e&&Number(e[1])<=53)}let pr=0;const Wl=Promise.resolve(),ql=()=>{pr=0},Vl=()=>pr||(Wl.then(ql),pr=bn());function Yl(e,t,n,r){e.addEventListener(t,n,r)}function Ql(e,t,n,r){e.removeEventListener(t,n,r)}function Jl(e,t,n,r,s=null){const o=e._vei||(e._vei={}),i=o[t];if(r&&i)i.value=r;else{const[c,l]=Xl(t);if(r){const f=o[t]=Zl(r,s);Yl(e,c,f,l)}else i&&(Ql(e,c,i,l),o[t]=void 0)}}const eo=/(?:Once|Passive|Capture)$/;function Xl(e){let t;if(eo.test(e)){t={};let n;for(;n=e.match(eo);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[ht(e.slice(2)),t]}function Zl(e,t){const n=r=>{const s=r.timeStamp||bn();(Gs||s>=n.attached-1)&&Ce(Gl(r,n.value),t,5,[r])};return n.value=e,n.attached=Vl(),n}function Gl(e,t){if($(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r(s))}else return t}const to=/^on[a-z]/,ec=(e,t,n,r,s=!1,o,i,c,l)=>{t==="class"?Bl(e,r,s):t==="style"?Ul(e,n,r):zt(t)?An(t)||Jl(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):tc(e,t,r,s))?zl(e,t,r,o,i,c,l):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Dl(e,t,r,s))};function tc(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&to.test(t)&&k(n)):t==="spellcheck"||t==="draggable"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||to.test(t)&&ae(n)?!1:t in e}const nc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ki.props;const rc=fe({patchProp:ec},kl);let no;function sc(){return no||(no=cl(rc))}const vu=(...e)=>{const t=sc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=oc(r);if(!s)return;const o=t._component;!k(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t};function oc(e){return ae(e)?document.querySelector(e):e}var ro={},Ve={};Object.defineProperty(Ve,"__esModule",{value:!0});Ve.getCache=Ve.setCache=void 0;var yn="ICESTARK";Ve.setCache=function(e,t){window[yn]||(window[yn]={}),window[yn][e]=t};Ve.getCache=function(e){var t=window[yn];return t&&t[e]?t[e]:null};Object.defineProperty(ro,"__esModule",{value:!0});var ic=Ve,lc=function(){return!!ic.getCache("root")},Eu=ro.default=lc,so={},gr={};Object.defineProperty(gr,"__esModule",{value:!0});var cc=function(e,t){return t&&e.indexOf("#")===-1?"#"+e:e};gr.default=cc;var mr={};Object.defineProperty(mr,"__esModule",{value:!0});var uc=function(e,t){return typeof e=="boolean"?[{},t!=null?t:e]:typeof e=="object"?[e,t]:[{},t]};mr.default=uc;Object.defineProperty(so,"__esModule",{value:!0});var oo=gr,io=mr,fc={push:function(e,t,n){var r=io.default(t,n),s=r[0],o=r[1];window.history.pushState(s!=null?s:{},null,oo.default(e,o))},replace:function(e,t,n){var r=io.default(t,n),s=r[0],o=r[1];window.history.replaceState(s!=null?s:{},null,oo.default(e,o))}},wu=so.default=fc;/*!
- * vue-router v4.0.12
- * (c) 2021 Eduardo San Martin Morote
- * @license MIT
- */const lo=typeof Symbol=="function"&&typeof Symbol.toStringTag=="symbol",Ct=e=>lo?Symbol(e):"_vr_"+e,ac=Ct("rvlm"),co=Ct("rvd"),_r=Ct("r"),uo=Ct("rl"),br=Ct("rvl"),xt=typeof window!="undefined";function dc(e){return e.__esModule||lo&&e[Symbol.toStringTag]==="Module"}const J=Object.assign;function yr(e,t){const n={};for(const r in t){const s=t[r];n[r]=Array.isArray(s)?s.map(e):e(s)}return n}const Bt=()=>{},hc=/\/$/,pc=e=>e.replace(hc,"");function vr(e,t,n="/"){let r,s={},o="",i="";const c=t.indexOf("?"),l=t.indexOf("#",c>-1?c:0);return c>-1&&(r=t.slice(0,c),o=t.slice(c+1,l>-1?l:t.length),s=e(o)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=bc(r!=null?r:t,n),{fullPath:r+(o&&"?")+o+i,path:r,query:s,hash:i}}function gc(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function fo(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function mc(e,t,n){const r=t.matched.length-1,s=n.matched.length-1;return r>-1&&r===s&&Pt(t.matched[r],n.matched[s])&&ao(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Pt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ao(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!_c(e[n],t[n]))return!1;return!0}function _c(e,t){return Array.isArray(e)?ho(e,t):Array.isArray(t)?ho(t,e):e===t}function ho(e,t){return Array.isArray(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function bc(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/");let s=n.length-1,o,i;for(o=0;o({left:window.pageXOffset,top:window.pageYOffset});function Cc(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),s=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!s)return;t=wc(s,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function po(e,t){return(history.state?history.state.position-t:-1)+e}const Er=new Map;function xc(e,t){Er.set(e,t)}function Pc(e){const t=Er.get(e);return Er.delete(e),t}let Ac=()=>location.protocol+"//"+location.host;function go(e,t){const{pathname:n,search:r,hash:s}=t,o=e.indexOf("#");if(o>-1){let c=s.includes(e.slice(o))?e.slice(o).length:1,l=s.slice(c);return l[0]!=="/"&&(l="/"+l),fo(l,"")}return fo(n,e)+r+s}function Rc(e,t,n,r){let s=[],o=[],i=null;const c=({state:h})=>{const v=go(e,location),A=n.value,N=t.value;let R=0;if(h){if(n.value=v,t.value=h,i&&i===A){i=null;return}R=N?h.position-N.position:0}else r(v);s.forEach(T=>{T(n.value,A,{delta:R,type:Ut.pop,direction:R?R>0?Kt.forward:Kt.back:Kt.unknown})})};function l(){i=n.value}function f(h){s.push(h);const v=()=>{const A=s.indexOf(h);A>-1&&s.splice(A,1)};return o.push(v),v}function a(){const{history:h}=window;!h.state||h.replaceState(J({},h.state,{scroll:vn()}),"")}function p(){for(const h of o)h();o=[],window.removeEventListener("popstate",c),window.removeEventListener("beforeunload",a)}return window.addEventListener("popstate",c),window.addEventListener("beforeunload",a),{pauseListeners:l,listen:f,destroy:p}}function mo(e,t,n,r=!1,s=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:s?vn():null}}function Oc(e){const{history:t,location:n}=window,r={value:go(e,n)},s={value:t.state};s.value||o(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(l,f,a){const p=e.indexOf("#"),h=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+l:Ac()+e+l;try{t[a?"replaceState":"pushState"](f,"",h),s.value=f}catch(v){console.error(v),n[a?"replace":"assign"](h)}}function i(l,f){const a=J({},t.state,mo(s.value.back,l,s.value.forward,!0),f,{position:s.value.position});o(l,a,!0),r.value=l}function c(l,f){const a=J({},s.value,t.state,{forward:l,scroll:vn()});o(a.current,a,!0);const p=J({},mo(r.value,l,null),{position:a.position+1},f);o(l,p,!1),r.value=l}return{location:r,state:s,push:c,replace:i}}function Cu(e){e=yc(e);const t=Oc(e),n=Rc(e,t.state,t.location,t.replace);function r(o,i=!0){i||n.pauseListeners(),history.go(o)}const s=J({location:"",base:e,go:r,createHref:Ec.bind(null,e)},t,n);return Object.defineProperty(s,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(s,"state",{enumerable:!0,get:()=>t.state.value}),s}function Tc(e){return typeof e=="string"||e&&typeof e=="object"}function _o(e){return typeof e=="string"||typeof e=="symbol"}const Ye={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},bo=Ct("nf");var yo;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(yo||(yo={}));function At(e,t){return J(new Error,{type:e,[bo]:!0},t)}function it(e,t){return e instanceof Error&&bo in e&&(t==null||!!(e.type&t))}const vo="[^/]+?",Mc={sensitive:!1,strict:!1,start:!0,end:!0},Ic=/[.+*?^${}()[\]/\\]/g;function Sc(e,t){const n=J({},Mc,t),r=[];let s=n.start?"^":"";const o=[];for(const f of e){const a=f.length?[]:[90];n.strict&&!f.length&&(s+="/");for(let p=0;pt.length?t.length===1&&t[0]===40+40?1:-1:0}function Nc(e,t){let n=0;const r=e.score,s=t.score;for(;n1&&(l==="*"||l==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),o.push({type:1,value:f,regexp:a,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),f="")}function h(){f+=l}for(;c{i(H)}:Bt}function i(a){if(_o(a)){const p=r.get(a);p&&(r.delete(a),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(a);p>-1&&(n.splice(p,1),a.record.name&&r.delete(a.record.name),a.children.forEach(i),a.alias.forEach(i))}}function c(){return n}function l(a){let p=0;for(;p=0;)p++;n.splice(p,0,a),a.record.name&&!Eo(a)&&r.set(a.record.name,a)}function f(a,p){let h,v={},A,N;if("name"in a&&a.name){if(h=r.get(a.name),!h)throw At(1,{location:a});N=h.record.name,v=J(Bc(p.params,h.keys.filter(H=>!H.optional).map(H=>H.name)),a.params),A=h.stringify(v)}else if("path"in a)A=a.path,h=n.find(H=>H.re.test(A)),h&&(v=h.parse(A),N=h.record.name);else{if(h=p.name?r.get(p.name):n.find(H=>H.re.test(p.path)),!h)throw At(1,{location:a,currentLocation:p});N=h.record.name,v=J({},p.params,a.params),A=h.stringify(v)}const R=[];let T=h;for(;T;)R.unshift(T.record),T=T.parent;return{name:N,path:A,params:v,matched:R,meta:Dc(R)}}return e.forEach(a=>o(a)),{addRoute:o,resolve:f,removeRoute:i,getRoutes:c,getRecordMatcher:s}}function Bc(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Uc(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Kc(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||{}:{default:e.component}}}function Kc(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="boolean"?n:n[r];return t}function Eo(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Dc(e){return e.reduce((t,n)=>J(t,n.meta),{})}function wo(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}const Co=/#/g,zc=/&/g,Wc=/\//g,qc=/=/g,Vc=/\?/g,xo=/\+/g,Yc=/%5B/g,Qc=/%5D/g,Po=/%5E/g,Jc=/%60/g,Ao=/%7B/g,Xc=/%7C/g,Ro=/%7D/g,Zc=/%20/g;function wr(e){return encodeURI(""+e).replace(Xc,"|").replace(Yc,"[").replace(Qc,"]")}function Gc(e){return wr(e).replace(Ao,"{").replace(Ro,"}").replace(Po,"^")}function Cr(e){return wr(e).replace(xo,"%2B").replace(Zc,"+").replace(Co,"%23").replace(zc,"%26").replace(Jc,"`").replace(Ao,"{").replace(Ro,"}").replace(Po,"^")}function eu(e){return Cr(e).replace(qc,"%3D")}function tu(e){return wr(e).replace(Co,"%23").replace(Vc,"%3F")}function nu(e){return e==null?"":tu(e).replace(Wc,"%2F")}function En(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function ru(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;so&&Cr(o)):[r&&Cr(r)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function su(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=Array.isArray(r)?r.map(s=>s==null?null:""+s):r==null?r:""+r)}return t}function Dt(){let e=[];function t(r){return e.push(r),()=>{const s=e.indexOf(r);s>-1&&e.splice(s,1)}}function n(){e=[]}return{add:t,list:()=>e,reset:n}}function Qe(e,t,n,r,s){const o=r&&(r.enterCallbacks[s]=r.enterCallbacks[s]||[]);return()=>new Promise((i,c)=>{const l=p=>{p===!1?c(At(4,{from:n,to:t})):p instanceof Error?c(p):Tc(p)?c(At(2,{from:t,to:p})):(o&&r.enterCallbacks[s]===o&&typeof p=="function"&&o.push(p),i())},f=e.call(r&&r.instances[s],t,n,l);let a=Promise.resolve(f);e.length<3&&(a=a.then(l)),a.catch(p=>c(p))})}function xr(e,t,n,r){const s=[];for(const o of e)for(const i in o.components){let c=o.components[i];if(!(t!=="beforeRouteEnter"&&!o.instances[i]))if(ou(c)){const f=(c.__vccOpts||c)[t];f&&s.push(Qe(f,n,r,o,i))}else{let l=c();s.push(()=>l.then(f=>{if(!f)return Promise.reject(new Error(`Couldn't resolve component "${i}" at "${o.path}"`));const a=dc(f)?f.default:f;o.components[i]=a;const h=(a.__vccOpts||a)[t];return h&&Qe(h,n,r,o,i)()}))}}return s}function ou(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function To(e){const t=Ke(_r),n=Ke(uo),r=Ie(()=>t.resolve(Nt(e.to))),s=Ie(()=>{const{matched:l}=r.value,{length:f}=l,a=l[f-1],p=n.matched;if(!a||!p.length)return-1;const h=p.findIndex(Pt.bind(null,a));if(h>-1)return h;const v=Mo(l[f-2]);return f>1&&Mo(a)===v&&p[p.length-1].path!==v?p.findIndex(Pt.bind(null,l[f-2])):h}),o=Ie(()=>s.value>-1&&uu(n.params,r.value.params)),i=Ie(()=>s.value>-1&&s.value===n.matched.length-1&&ao(n.params,r.value.params));function c(l={}){return cu(l)?t[Nt(e.replace)?"replace":"push"](Nt(e.to)).catch(Bt):Promise.resolve()}return{route:r,href:Ie(()=>r.value.href),isActive:o,isExactActive:i,navigate:c}}const iu=us({name:"RouterLink",props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:To,setup(e,{slots:t}){const n=St(To(e)),{options:r}=Ke(_r),s=Ie(()=>({[Io(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Io(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&t.default(n);return e.custom?o:Ys("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:s.value},o)}}}),lu=iu;function cu(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function uu(e,t){for(const n in t){const r=t[n],s=e[n];if(typeof r=="string"){if(r!==s)return!1}else if(!Array.isArray(s)||s.length!==r.length||r.some((o,i)=>o!==s[i]))return!1}return!0}function Mo(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Io=(e,t,n)=>e!=null?e:t!=null?t:n,fu=us({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},setup(e,{attrs:t,slots:n}){const r=Ke(br),s=Ie(()=>e.route||r.value),o=Ke(co,0),i=Ie(()=>s.value.matched[o]);on(co,o+1),on(ac,i),on(br,s);const c=xi();return _n(()=>[c.value,i.value,e.name],([l,f,a],[p,h,v])=>{f&&(f.instances[a]=l,h&&h!==f&&l&&l===p&&(f.leaveGuards.size||(f.leaveGuards=h.leaveGuards),f.updateGuards.size||(f.updateGuards=h.updateGuards))),l&&f&&(!h||!Pt(f,h)||!p)&&(f.enterCallbacks[a]||[]).forEach(A=>A(l))},{flush:"post"}),()=>{const l=s.value,f=i.value,a=f&&f.components[e.name],p=e.name;if(!a)return So(n.default,{Component:a,route:l});const h=f.props[e.name],v=h?h===!0?l.params:typeof h=="function"?h(l):h:null,N=Ys(a,J({},v,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(f.instances[p]=null)},ref:c}));return So(n.default,{Component:N,route:l})||N}}});function So(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const au=fu;function xu(e){const t=kc(e.routes,e),n=e.parseQuery||ru,r=e.stringifyQuery||Oo,s=e.history,o=Dt(),i=Dt(),c=Dt(),l=Pi(Ye);let f=Ye;xt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const a=yr.bind(null,m=>""+m),p=yr.bind(null,nu),h=yr.bind(null,En);function v(m,M){let x,I;return _o(m)?(x=t.getRecordMatcher(m),I=M):I=m,t.addRoute(I,x)}function A(m){const M=t.getRecordMatcher(m);M&&t.removeRoute(M)}function N(){return t.getRoutes().map(m=>m.record)}function R(m){return!!t.getRecordMatcher(m)}function T(m,M){if(M=J({},M||l.value),typeof m=="string"){const j=vr(n,m,M.path),u=t.resolve({path:j.path},M),d=s.createHref(j.fullPath);return J(j,u,{params:h(u.params),hash:En(j.hash),redirectedFrom:void 0,href:d})}let x;if("path"in m)x=J({},m,{path:vr(n,m.path,M.path).path});else{const j=J({},m.params);for(const u in j)j[u]==null&&delete j[u];x=J({},m,{params:p(m.params)}),M.params=p(M.params)}const I=t.resolve(x,M),Y=m.hash||"";I.params=a(h(I.params));const Z=gc(r,J({},m,{hash:Gc(Y),path:I.path})),B=s.createHref(Z);return J({fullPath:Z,hash:Y,query:r===Oo?su(m.query):m.query||{}},I,{redirectedFrom:void 0,href:B})}function H(m){return typeof m=="string"?vr(n,m,l.value.path):J({},m)}function D(m,M){if(f!==m)return At(8,{from:M,to:m})}function z(m){return U(m)}function re(m){return z(J(H(m),{replace:!0}))}function ce(m){const M=m.matched[m.matched.length-1];if(M&&M.redirect){const{redirect:x}=M;let I=typeof x=="function"?x(m):x;return typeof I=="string"&&(I=I.includes("?")||I.includes("#")?I=H(I):{path:I},I.params={}),J({query:m.query,hash:m.hash,params:m.params},I)}}function U(m,M){const x=f=T(m),I=l.value,Y=m.state,Z=m.force,B=m.replace===!0,j=ce(x);if(j)return U(J(H(j),{state:Y,force:Z,replace:B}),M||x);const u=x;u.redirectedFrom=M;let d;return!Z&&mc(r,I,x)&&(d=At(16,{to:u,from:I}),ut(I,I,!0,!1)),(d?Promise.resolve(d):ne(u,I)).catch(g=>it(g)?g:X(g,u,I)).then(g=>{if(g){if(it(g,2))return U(J(H(g.to),{state:Y,force:Z,replace:B}),M||u)}else g=ue(u,I,!0,B,Y);return ge(u,I,g),g})}function se(m,M){const x=D(m,M);return x?Promise.reject(x):Promise.resolve()}function ne(m,M){let x;const[I,Y,Z]=du(m,M);x=xr(I.reverse(),"beforeRouteLeave",m,M);for(const j of I)j.leaveGuards.forEach(u=>{x.push(Qe(u,m,M))});const B=se.bind(null,m,M);return x.push(B),Rt(x).then(()=>{x=[];for(const j of o.list())x.push(Qe(j,m,M));return x.push(B),Rt(x)}).then(()=>{x=xr(Y,"beforeRouteUpdate",m,M);for(const j of Y)j.updateGuards.forEach(u=>{x.push(Qe(u,m,M))});return x.push(B),Rt(x)}).then(()=>{x=[];for(const j of m.matched)if(j.beforeEnter&&!M.matched.includes(j))if(Array.isArray(j.beforeEnter))for(const u of j.beforeEnter)x.push(Qe(u,m,M));else x.push(Qe(j.beforeEnter,m,M));return x.push(B),Rt(x)}).then(()=>(m.matched.forEach(j=>j.enterCallbacks={}),x=xr(Z,"beforeRouteEnter",m,M),x.push(B),Rt(x))).then(()=>{x=[];for(const j of i.list())x.push(Qe(j,m,M));return x.push(B),Rt(x)}).catch(j=>it(j,8)?j:Promise.reject(j))}function ge(m,M,x){for(const I of c.list())I(m,M,x)}function ue(m,M,x,I,Y){const Z=D(m,M);if(Z)return Z;const B=M===Ye,j=xt?history.state:{};x&&(I||B?s.replace(m.fullPath,J({scroll:B&&j&&j.scroll},Y)):s.push(m.fullPath,Y)),l.value=m,ut(m,M,x,B),ve()}let de;function ke(){de=s.listen((m,M,x)=>{const I=T(m),Y=ce(I);if(Y){U(J(Y,{replace:!0}),I).catch(Bt);return}f=I;const Z=l.value;xt&&xc(po(Z.fullPath,x.delta),vn()),ne(I,Z).catch(B=>it(B,4|8)?B:it(B,2)?(U(B.to,I).then(j=>{it(j,4|16)&&!x.delta&&x.type===Ut.pop&&s.go(-1,!1)}).catch(Bt),Promise.reject()):(x.delta&&s.go(-x.delta,!1),X(B,I,Z))).then(B=>{B=B||ue(I,Z,!1),B&&(x.delta?s.go(-x.delta,!1):x.type===Ut.pop&&it(B,4|16)&&s.go(-1,!1)),ge(I,Z,B)}).catch(Bt)})}let lt=Dt(),ct=Dt(),oe;function X(m,M,x){ve(m);const I=ct.list();return I.length?I.forEach(Y=>Y(m,M,x)):console.error(m),Promise.reject(m)}function V(){return oe&&l.value!==Ye?Promise.resolve():new Promise((m,M)=>{lt.add([m,M])})}function ve(m){oe||(oe=!0,ke(),lt.list().forEach(([M,x])=>m?x(m):M()),lt.reset())}function ut(m,M,x,I){const{scrollBehavior:Y}=e;if(!xt||!Y)return Promise.resolve();const Z=!x&&Pc(po(m.fullPath,0))||(I||!x)&&history.state&&history.state.scroll||null;return ks().then(()=>Y(m,M,Z)).then(B=>B&&Cc(B)).catch(B=>X(B,m,M))}const Le=m=>s.go(m);let Oe;const Ee=new Set;return{currentRoute:l,addRoute:v,removeRoute:A,hasRoute:R,getRoutes:N,resolve:T,options:e,push:z,replace:re,go:Le,back:()=>Le(-1),forward:()=>Le(1),beforeEach:o.add,beforeResolve:i.add,afterEach:c.add,onError:ct.add,isReady:V,install(m){const M=this;m.component("RouterLink",lu),m.component("RouterView",au),m.config.globalProperties.$router=M,Object.defineProperty(m.config.globalProperties,"$route",{enumerable:!0,get:()=>Nt(l)}),xt&&!Oe&&l.value===Ye&&(Oe=!0,z(s.location).catch(Y=>{}));const x={};for(const Y in Ye)x[Y]=Ie(()=>l.value[Y]);m.provide(_r,M),m.provide(uo,St(x)),m.provide(br,l);const I=m.unmount;Ee.add(m),m.unmount=function(){Ee.delete(m),Ee.size<1&&(f=Ye,de&&de(),l.value=Ye,Oe=!1,oe=!1),I()}}}}function Rt(e){return e.reduce((t,n)=>t.then(()=>n()),Promise.resolve())}function du(e,t){const n=[],r=[],s=[],o=Math.max(t.matched.length,e.matched.length);for(let i=0;iPt(f,c))?r.push(c):n.push(c));const l=e.matched[i];l&&(t.matched.find(f=>Pt(f,l))||s.push(l))}return[n,r,s]}var Fo={};Object.defineProperty(Fo,"__esModule",{value:!0});var No=Ve,Pu=Fo.default=function(){return No.getCache("basename")?No.getCache("basename"):"/"},Lo={};Object.defineProperty(Lo,"__esModule",{value:!0});var hu=Ve;(function(){if(typeof window.CustomEvent=="function")return!1;function e(t,n){n=n||{bubbles:!1,cancelable:!1,detail:null};var r=document.createEvent("CustomEvent");return r.initCustomEvent(t,n.bubbles,n.cancelable,n.detail),r}window.CustomEvent=e})();var Au=Lo.default=function(){return hu.getCache("root")?(window.dispatchEvent(new CustomEvent("icestark:not-found")),null):"Current sub-application is running independently"};export{wu as _,Re as a,Fs as b,yu as c,us as d,mu as e,bl as f,xi as g,xu as h,Eu as i,Au as j,Cu as k,Pu as l,vu as m,bu as o,gu as p,_u as r,pu as t,Mi as w};
diff --git a/examples/icestark-layout/public/page-waiter/index.html b/examples/icestark-layout/public/page-waiter/index.html
deleted file mode 100644
index 3f219b8ef2..0000000000
--- a/examples/icestark-layout/public/page-waiter/index.html
+++ /dev/null
@@ -1 +0,0 @@
-Vite App
diff --git a/examples/icestark-layout/src/app.tsx b/examples/icestark-layout/src/app.tsx
deleted file mode 100644
index 99dbd6b9f4..0000000000
--- a/examples/icestark-layout/src/app.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { defineAppConfig } from 'ice';
-import { defineFrameworkConfig } from '@ice/plugin-icestark/types';
-import FrameworkLayout from '@/components/FrameworkLayout';
-
-export const icestark = defineFrameworkConfig(() => ({
- layout: FrameworkLayout,
- getApps: () => ([{
- path: '/seller',
- title: '商家平台',
- loadScriptMode: 'import',
- entry: '/page-seller/index.html',
- }, {
- path: '/waiter',
- title: '小二平台',
- loadScriptMode: 'import',
- entry: '/page-waiter/index.html',
- }]),
-}));
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
diff --git a/examples/icestark-layout/src/components/FrameworkLayout.tsx b/examples/icestark-layout/src/components/FrameworkLayout.tsx
deleted file mode 100644
index 01a079d20d..0000000000
--- a/examples/icestark-layout/src/components/FrameworkLayout.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { AppLink } from '@ice/stark-app';
-
-export default function FrameworkLayout({ children }) {
- return (
- <>
-
- seller 应用
- waiter 应用
- 主应用
-
-
- {children}
-
- >
- );
-}
diff --git a/examples/icestark-layout/src/document.tsx b/examples/icestark-layout/src/document.tsx
deleted file mode 100644
index 5a3d61e38d..0000000000
--- a/examples/icestark-layout/src/document.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Meta, Title, Links, Main, Scripts, useAppData } from 'ice';
-import type { AppData } from '@/types';
-
-function Document() {
- const appData = useAppData();
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/icestark-layout/src/global.css b/examples/icestark-layout/src/global.css
deleted file mode 100644
index 609253955e..0000000000
--- a/examples/icestark-layout/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- margin: 0;
-}
\ No newline at end of file
diff --git a/examples/icestark-layout/src/pages/about.tsx b/examples/icestark-layout/src/pages/about.tsx
deleted file mode 100644
index 764f4847be..0000000000
--- a/examples/icestark-layout/src/pages/about.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function About() {
- return (
- <>
- About Page
- home
- >
- );
-}
diff --git a/examples/icestark-layout/src/pages/index.tsx b/examples/icestark-layout/src/pages/index.tsx
deleted file mode 100644
index 791622efa7..0000000000
--- a/examples/icestark-layout/src/pages/index.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- Home Page
- about
- >
- );
-}
diff --git a/examples/icestark-layout/src/typings.d.ts b/examples/icestark-layout/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/icestark-layout/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/icestark-layout/tsconfig.json b/examples/icestark-layout/tsconfig.json
deleted file mode 100644
index 6584fa600c..0000000000
--- a/examples/icestark-layout/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "ESNext",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/memory-router/ice.config.mts b/examples/memory-router/ice.config.mts
deleted file mode 100644
index 402fe5a427..0000000000
--- a/examples/memory-router/ice.config.mts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- publicPath: '/',
- ssr: false,
- ssg: false,
- codeSplitting: 'page',
- routes: {
- injectInitialEntry: true,
- }
-}));
diff --git a/examples/memory-router/package.json b/examples/memory-router/package.json
deleted file mode 100644
index 6c8bbaec3a..0000000000
--- a/examples/memory-router/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@examples/memory-router",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build",
- "build:optimization": "ice build --config optimization.config.mts"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- }
-}
diff --git a/examples/memory-router/src/app.tsx b/examples/memory-router/src/app.tsx
deleted file mode 100644
index 5edc1ecfd3..0000000000
--- a/examples/memory-router/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- router: {
- type: 'memory',
- },
-}));
diff --git a/examples/memory-router/src/document.tsx b/examples/memory-router/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/memory-router/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/memory-router/src/pages/about.tsx b/examples/memory-router/src/pages/about.tsx
deleted file mode 100644
index f92229ba3f..0000000000
--- a/examples/memory-router/src/pages/about.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { useState } from 'react';
-
-export default function About() {
- const [count, setCount] = useState(0);
- return (
-
-
About: {count}
-
{ setCount(count + 1); }}>+add
-
- );
-}
\ No newline at end of file
diff --git a/examples/memory-router/src/pages/dashboard/blog.tsx b/examples/memory-router/src/pages/dashboard/blog.tsx
deleted file mode 100644
index 5997e386bd..0000000000
--- a/examples/memory-router/src/pages/dashboard/blog.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { useState } from 'react';
-
-export default function Blog() {
- const [count, setCount] = useState(0);
- return (
-
-
Blog: {count}
-
{ setCount(count + 1); }}>+add
-
- );
-}
\ No newline at end of file
diff --git a/examples/memory-router/src/pages/dashboard/index.tsx b/examples/memory-router/src/pages/dashboard/index.tsx
deleted file mode 100644
index 5c968b3051..0000000000
--- a/examples/memory-router/src/pages/dashboard/index.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Dashboard() {
- return (
-
-
dashboard
-
- );
-}
diff --git a/examples/memory-router/src/pages/index.tsx b/examples/memory-router/src/pages/index.tsx
deleted file mode 100644
index 57961c6f1e..0000000000
--- a/examples/memory-router/src/pages/index.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { useState } from 'react';
-
-export default function Home() {
- const [count, setCount] = useState(0);
- return (
-
-
Home: {count}
-
{ setCount(count + 1); }}>+add
-
- );
-}
\ No newline at end of file
diff --git a/examples/memory-router/tsconfig.json b/examples/memory-router/tsconfig.json
deleted file mode 100644
index 7f2f2ffce9..0000000000
--- a/examples/memory-router/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/miniapp-project/.browserslistrc b/examples/miniapp-project/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/miniapp-project/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/miniapp-project/ice.config.mts b/examples/miniapp-project/ice.config.mts
deleted file mode 100644
index 9d64f2ee81..0000000000
--- a/examples/miniapp-project/ice.config.mts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { defineConfig } from '@ice/app';
-import miniapp from '@ice/plugin-miniapp';
-export default defineConfig({
- ssg: false,
- hash: true,
- minify: true,
- dropLogLevel: 'trace',
- outputDir: 'build/wechat',
- alias: {
- components: './src/components',
- },
- plugins: [miniapp({
- nativeConfig: {
- appid: 'tourist',
- },
- })],
- // eslint: false,
- define: {
- ASSETS_VERSION: JSON.stringify('1.0.1'),
- },
-});
diff --git a/examples/miniapp-project/mock/foo.ts b/examples/miniapp-project/mock/foo.ts
deleted file mode 100644
index a963ecd28d..0000000000
--- a/examples/miniapp-project/mock/foo.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export default {
- '/api/foo': { foo: 'foo' },
-};
\ No newline at end of file
diff --git a/examples/miniapp-project/mock/user.ts b/examples/miniapp-project/mock/user.ts
deleted file mode 100644
index e544f43de9..0000000000
--- a/examples/miniapp-project/mock/user.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { Request, Response } from '@ice/app';
-
-export default {
- 'GET /api/users': ['a', 'b'],
- 'POST /api/users/:id': (req: Request, res: Response) => {
- const { id } = req.params;
- res.send({ id: id });
- },
-};
diff --git a/examples/miniapp-project/package.json b/examples/miniapp-project/package.json
deleted file mode 100644
index 5f54d3b35b..0000000000
--- a/examples/miniapp-project/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@examples/miniapp-project",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "start:wechat": "ice start --target wechat-miniprogram",
- "start:ali": "ice start --target ali-miniapp",
- "build": "ice build",
- "build:wechat": "ice build --target wechat-miniprogram",
- "build:ali": "ice build --target ali-miniapp"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "@ice/miniapp-html-styles": "workspace:*",
- "@ice/plugin-miniapp": "workspace:*",
- "@ice/miniapp-runtime": "workspace:*",
- "ahooks": "^3.3.8",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "browserslist": "^4.19.3",
- "speed-measure-webpack-plugin": "^1.5.0",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/miniapp-project/public/favicon.ico b/examples/miniapp-project/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/miniapp-project/public/favicon.ico and /dev/null differ
diff --git a/examples/miniapp-project/src/README.md b/examples/miniapp-project/src/README.md
deleted file mode 100644
index ebe11f0f52..0000000000
--- a/examples/miniapp-project/src/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# ice.js example miniapp
-
-## feature list
-
-### App
-
-- dataLoader
-- miniappManifest
-- miniappLifecycles
-
-### Pages
-
-- index
- - Link component
- - history
- - useAppData
- - useData
-- second
- - useSearchParams
- - page config
- - page lifecycles
-- third/index
- - html tags
- - use json
- - use png
-- fourth
- - define
- - process env
- - miniapp native components
diff --git a/examples/miniapp-project/src/app.tsx b/examples/miniapp-project/src/app.tsx
deleted file mode 100644
index 646a022da7..0000000000
--- a/examples/miniapp-project/src/app.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { defineAppConfig, defineDataLoader } from 'ice';
-import { defineMiniappConfig } from '@ice/plugin-miniapp/runtime';
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- success: true,
- id: 34293,
- });
- }, 1000);
- });
-});
-
-export const miniappManifest = {
- window: {
- defaultTitle: 'miniapp test',
- },
- routes: [
- 'index',
- 'second',
- 'third/index',
- 'fourth',
- ],
-};
-
-export const miniappLifecycles = defineMiniappConfig(() => {
- return {
- onLaunch(options) {
- console.log('[App] on launch', options);
- },
- onShow(options) {
- console.log('[App] on show', options);
- },
- onShareAppMessage(options) {
- // Only works in ali miniapp
- console.log('[App] onShareAppMessage', options);
- return {
- title: 'test',
- path: 'pages/index',
- desc: '呵呵',
- };
- },
- };
-});
-
-export default defineAppConfig(() => {
- return {
- app: {
- errorBoundary: true,
- },
- };
-});
diff --git a/examples/miniapp-project/src/components/Logo/index.css b/examples/miniapp-project/src/components/Logo/index.css
deleted file mode 100644
index b84be53a96..0000000000
--- a/examples/miniapp-project/src/components/Logo/index.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.logo {
- width: 200rpx;
- height: 180rpx;
- margin-bottom: 20rpx;
-}
diff --git a/examples/miniapp-project/src/components/bar.tsx b/examples/miniapp-project/src/components/bar.tsx
deleted file mode 100644
index 889cd4ee53..0000000000
--- a/examples/miniapp-project/src/components/bar.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Bar() {
- return (
-
- bar
-
- );
-}
diff --git a/examples/miniapp-project/src/document.tsx b/examples/miniapp-project/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/miniapp-project/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/miniapp-project/src/global.less b/examples/miniapp-project/src/global.less
deleted file mode 100644
index 72966bc912..0000000000
--- a/examples/miniapp-project/src/global.less
+++ /dev/null
@@ -1,5 +0,0 @@
-@import 'http://github.com/@ice/miniapp-html-styles/html';
-
-.global {
- font-size: 14px;
-}
diff --git a/examples/miniapp-project/src/pages/fourth.tsx b/examples/miniapp-project/src/pages/fourth.tsx
deleted file mode 100644
index 5ac2dca583..0000000000
--- a/examples/miniapp-project/src/pages/fourth.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-declare const ASSETS_VERSION: string;
-
-export default function Fourth() {
- console.log('[Fourth] ASSETS_VERSION', ASSETS_VERSION);
- return (
- <>
- Fourth Page
- 我是 button 组件
- {/* @ts-ignore */}
- 我是 progress 组件
- 我是 switch 组件
- >
- );
-}
-
diff --git a/examples/miniapp-project/src/pages/ice.png b/examples/miniapp-project/src/pages/ice.png
deleted file mode 100644
index e5e98fac1e..0000000000
Binary files a/examples/miniapp-project/src/pages/ice.png and /dev/null differ
diff --git a/examples/miniapp-project/src/pages/index.scss b/examples/miniapp-project/src/pages/index.scss
deleted file mode 100644
index 679273d44d..0000000000
--- a/examples/miniapp-project/src/pages/index.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
-
-.data {
- margin-top: 10px;
-}
-
-.homeContainer {
- align-items: center;
- margin-top: 200rpx;
-}
-
-.homeTitle {
- font-size: 45rpx;
- font-weight: bold;
- margin: 20rpx 0;
-}
-
-.homeInfo {
- font-size: 36rpx;
- margin: 8rpx 0;
- color: #555;
-}
diff --git a/examples/miniapp-project/src/pages/index.tsx b/examples/miniapp-project/src/pages/index.tsx
deleted file mode 100644
index 75927bf5d5..0000000000
--- a/examples/miniapp-project/src/pages/index.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import './index.scss';
-import { useAppData, useData, defineDataLoader, history, Link } from 'ice';
-
-export default function Index() {
- const appData = useAppData();
- const data = useData();
- console.log('[Index] use app data', appData);
- console.log('[Index] use data', data);
- return (
- <>
- {/* @ts-ignore */}
-
-
- Index Page
- { history.push('/second?name=chris'); }}>history 跳转 second 页面
- { history.push('/third'); }}>history 跳转 third/index 页面
- Link 标签跳转 fourth 页面
-
- >
- );
-}
-
-export const dataLoader = defineDataLoader((options) => {
- // options comes from onLoad in miniapp page config
- console.log('[Index] data loader options', options);
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'Index',
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/miniapp-project/src/pages/second.tsx b/examples/miniapp-project/src/pages/second.tsx
deleted file mode 100644
index e463b6388d..0000000000
--- a/examples/miniapp-project/src/pages/second.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-// import './index.scss';
-import { useState } from 'react';
-import { useConfig, useSearchParams, usePageLifecycle } from 'ice';
-
-export default function Second() {
- const config = useConfig();
- console.log('[Second] use config', config);
- const [params] = useSearchParams();
- console.log('[Second] use search params', params);
- const [count, setCount] = useState(0);
-
- usePageLifecycle('onLoad', (options) => {
- console.log('[Second] page onLoad', options);
- });
- usePageLifecycle('onReady', () => {
- console.log('[Second] page onReady');
- });
- usePageLifecycle('onShow', () => {
- console.log('[Second] page onShow');
- });
- usePageLifecycle('onHide', () => {
- console.log('[Second] page onHide');
- });
- usePageLifecycle('onShareAppMessage', (options) => {
- console.log('[Second] onShareAppMessage', options);
- return {
- title: '123',
- path: 'pages/index',
- };
- });
- usePageLifecycle('onShareTimeline', (options) => {
- console.log('[Second] onShareTimeline', options);
- return {
- title: '456',
- };
- });
-
- return (
- Second Page
- {count}
- { setCount(count + 1); }}>+
-
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- nativeEvents: [
- 'onShareAppMessage',
- 'onShareTimeline',
- ],
- };
-}
diff --git a/examples/miniapp-project/src/pages/third/index.tsx b/examples/miniapp-project/src/pages/third/index.tsx
deleted file mode 100644
index f2de614755..0000000000
--- a/examples/miniapp-project/src/pages/third/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import url from '../ice.png';
-import json from './test.json';
-
-export default function Third() {
- console.log('[Third] get json', json);
- return (
- <>
- Third Page
- 我是 div 标签
- 我是 span 标签
-
- >
- );
-}
-
diff --git a/examples/miniapp-project/src/pages/third/test.json b/examples/miniapp-project/src/pages/third/test.json
deleted file mode 100644
index bfbcb776c7..0000000000
--- a/examples/miniapp-project/src/pages/third/test.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "name": "chris",
- "age": 20
-}
diff --git a/examples/miniapp-project/src/typings.d.ts b/examples/miniapp-project/src/typings.d.ts
deleted file mode 100644
index 2e8f645a53..0000000000
--- a/examples/miniapp-project/src/typings.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-declare module '*.module.less' {
- const classes: { [key: string]: string };
- export default classes;
-}
-
-declare module '*.module.css' {
- const classes: { [key: string]: string };
- export default classes;
-}
-
-declare module '*.module.scss' {
- const classes: { [key: string]: string };
- export default classes;
-}
-
-declare module '*.png' {
- const value: string;
- export default value;
-}
-
-
-declare module '*.json' {
- const value: Record;
- export default value;
-}
diff --git a/examples/miniapp-project/tsconfig.json b/examples/miniapp-project/tsconfig.json
deleted file mode 100644
index 7f2f2ffce9..0000000000
--- a/examples/miniapp-project/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/multi-target/.browserslistrc b/examples/multi-target/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/multi-target/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/multi-target/ice.config.mts b/examples/multi-target/ice.config.mts
deleted file mode 100644
index d86560cf30..0000000000
--- a/examples/multi-target/ice.config.mts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- ssr: true,
- define: {
- 'process.env.NODE_ENV': JSON.stringify(true),
- },
-}));
diff --git a/examples/multi-target/package.json b/examples/multi-target/package.json
deleted file mode 100644
index 123e5a2777..0000000000
--- a/examples/multi-target/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@examples/multi-entry",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-rax-compat": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/multi-target/public/favicon.ico b/examples/multi-target/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/multi-target/public/favicon.ico and /dev/null differ
diff --git a/examples/multi-target/src/app.tsx b/examples/multi-target/src/app.tsx
deleted file mode 100644
index ad6e4c2fd7..0000000000
--- a/examples/multi-target/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({ }));
diff --git a/examples/multi-target/src/document.tsx b/examples/multi-target/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/multi-target/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/multi-target/src/global.css b/examples/multi-target/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/multi-target/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/multi-target/src/pages/about.tsx b/examples/multi-target/src/pages/about.tsx
deleted file mode 100644
index 6358f341bf..0000000000
--- a/examples/multi-target/src/pages/about.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function About() {
- return (Target={import.meta.target} Renderer={import.meta.renderer}
);
-}
diff --git a/examples/multi-target/src/types.ts b/examples/multi-target/src/types.ts
deleted file mode 100644
index 781b22f4ee..0000000000
--- a/examples/multi-target/src/types.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export interface AppData {
- title: string;
-}
-
diff --git a/examples/multi-target/src/typings.d.ts b/examples/multi-target/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/multi-target/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/multi-target/tsconfig.json b/examples/multi-target/tsconfig.json
deleted file mode 100644
index 6584fa600c..0000000000
--- a/examples/multi-target/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "ESNext",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/rax-inline-style/.browserslistrc b/examples/rax-inline-style/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/rax-inline-style/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/rax-inline-style/ice.config.mts b/examples/rax-inline-style/ice.config.mts
deleted file mode 100644
index 743c69ce14..0000000000
--- a/examples/rax-inline-style/ice.config.mts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineConfig } from '@ice/app';
-import compatRax from '@ice/plugin-rax-compat';
-
-export default defineConfig(() => ({
- publicPath: '/',
- plugins: [compatRax({
- inlineStyle: true,
- })],
- server: {
- bundle: true,
- format: 'cjs',
- },
-}));
diff --git a/examples/rax-inline-style/package.json b/examples/rax-inline-style/package.json
deleted file mode 100644
index 1d584940d5..0000000000
--- a/examples/rax-inline-style/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "name": "@examples/rax-project",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-rax-compat": "workspace:*",
- "@ice/runtime": "workspace:*",
- "rax": "^1.2.2",
- "rax-image": "^2.4.1",
- "rax-is-valid-element": "^1.0.0",
- "rax-text": "^2.2.0",
- "rax-view": "^2.3.0",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/rax-inline-style/public/favicon.ico b/examples/rax-inline-style/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/rax-inline-style/public/favicon.ico and /dev/null differ
diff --git a/examples/rax-inline-style/src/app.tsx b/examples/rax-inline-style/src/app.tsx
deleted file mode 100644
index 38e608b8f4..0000000000
--- a/examples/rax-inline-style/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
diff --git a/examples/rax-inline-style/src/components/HybridReactComponent/index.tsx b/examples/rax-inline-style/src/components/HybridReactComponent/index.tsx
deleted file mode 100644
index 0166ca821b..0000000000
--- a/examples/rax-inline-style/src/components/HybridReactComponent/index.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-export default function HybridReactComponent() {
- return (
- HybridReactComponent in 400rpx * 200rpx red box.
- );
-}
diff --git a/examples/rax-inline-style/src/components/InlineLess/index.tsx b/examples/rax-inline-style/src/components/InlineLess/index.tsx
deleted file mode 100644
index 6fd690f107..0000000000
--- a/examples/rax-inline-style/src/components/InlineLess/index.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import moduleStyle from './x.module.less';
-// @ts-ignore
-import style from './x.less';
-
-
-export default function InlineLess() {
- return (
-
-
ModuleStyle
-
-
- {JSON.stringify(moduleStyle, null, 2)}
-
-
-
-
-
Style
-
-
- {JSON.stringify(style, null, 2)}
-
-
-
-
);
-}
diff --git a/examples/rax-inline-style/src/components/InlineLess/x.less b/examples/rax-inline-style/src/components/InlineLess/x.less
deleted file mode 100644
index 4fbf8f583b..0000000000
--- a/examples/rax-inline-style/src/components/InlineLess/x.less
+++ /dev/null
@@ -1,7 +0,0 @@
-.foo {
- color: red;
-}
-
-.foo > a {
- color: green;
-}
diff --git a/examples/rax-inline-style/src/components/InlineLess/x.module.less b/examples/rax-inline-style/src/components/InlineLess/x.module.less
deleted file mode 100644
index 4fbf8f583b..0000000000
--- a/examples/rax-inline-style/src/components/InlineLess/x.module.less
+++ /dev/null
@@ -1,7 +0,0 @@
-.foo {
- color: red;
-}
-
-.foo > a {
- color: green;
-}
diff --git a/examples/rax-inline-style/src/components/Logo/index.jsx b/examples/rax-inline-style/src/components/Logo/index.jsx
deleted file mode 100644
index 908a755c71..0000000000
--- a/examples/rax-inline-style/src/components/Logo/index.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { createElement } from 'rax';
-import Image from 'rax-image';
-
-import styles from './index.module.less';
-
-export default (props) => {
- const { uri } = props;
- const source = { uri };
- return ;
-};
diff --git a/examples/rax-inline-style/src/components/Logo/index.module.less b/examples/rax-inline-style/src/components/Logo/index.module.less
deleted file mode 100644
index b84be53a96..0000000000
--- a/examples/rax-inline-style/src/components/Logo/index.module.less
+++ /dev/null
@@ -1,5 +0,0 @@
-.logo {
- width: 200rpx;
- height: 180rpx;
- margin-bottom: 20rpx;
-}
diff --git a/examples/rax-inline-style/src/components/Title/index.jsx b/examples/rax-inline-style/src/components/Title/index.jsx
deleted file mode 100644
index d109dd24bb..0000000000
--- a/examples/rax-inline-style/src/components/Title/index.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createElement } from 'rax';
-import Text from 'rax-text';
-
-import styles from './index.module.css';
-
-export default () => {
- return Welcome to Your Rax App ;
-};
diff --git a/examples/rax-inline-style/src/components/Title/index.module.css b/examples/rax-inline-style/src/components/Title/index.module.css
deleted file mode 100644
index 8c42cb1673..0000000000
--- a/examples/rax-inline-style/src/components/Title/index.module.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.title {
- font-size: 45rpx;
- font-weight: bold;
- margin: 20rpx 0;
-}
\ No newline at end of file
diff --git a/examples/rax-inline-style/src/document.tsx b/examples/rax-inline-style/src/document.tsx
deleted file mode 100644
index ca56e07604..0000000000
--- a/examples/rax-inline-style/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/rax-inline-style/src/global.css b/examples/rax-inline-style/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/rax-inline-style/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/rax-inline-style/src/pages/index.css b/examples/rax-inline-style/src/pages/index.css
deleted file mode 100644
index 975de4a516..0000000000
--- a/examples/rax-inline-style/src/pages/index.css
+++ /dev/null
@@ -1,19 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
-
-.data {
- margin-top: 10px;
-}
-
-.homeContainer {
- align-items: center;
- margin-top: 200rpx;
-}
-
-.homeInfo {
- font-size: 36rpx;
- margin: 8rpx 0;
- color: #555;
-}
diff --git a/examples/rax-inline-style/src/pages/index.jsx b/examples/rax-inline-style/src/pages/index.jsx
deleted file mode 100644
index 11a2ce3469..0000000000
--- a/examples/rax-inline-style/src/pages/index.jsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { createElement, useEffect, useRef } from 'rax';
-import View from 'rax-view';
-import Text from 'rax-text';
-import Logo from '@/components/Logo';
-import Title from '@/components/Title';
-import HybridReactComponent from '@/components/HybridReactComponent';
-import InlineLess from '@/components/InlineLess';
-import './index.css';
-
-export default function Home() {
- const ref = useRef();
- useEffect(() => {
- if (ref.current) {
- console.log('ref for View', ref);
- }
- }, []);
- return (
- { console.log('view appear'); }}
- >
-
-
- More information about Rax
- Visit https://rax.js.org
-
-
-
- );
-}
diff --git a/examples/rax-inline-style/src/typings.d.ts b/examples/rax-inline-style/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/rax-inline-style/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/rax-inline-style/tsconfig.json b/examples/rax-inline-style/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/rax-inline-style/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/rax-project/.browserslistrc b/examples/rax-project/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/rax-project/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/rax-project/ice.config.mts b/examples/rax-project/ice.config.mts
deleted file mode 100644
index 7cca75f30c..0000000000
--- a/examples/rax-project/ice.config.mts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { defineConfig } from '@ice/app';
-import compatRax from '@ice/plugin-rax-compat';
-import jsxPlus from '@ice/plugin-jsx-plus';
-
-export default defineConfig(() => ({
- publicPath: '/',
- plugins: [
- compatRax(),
- jsxPlus(),
- ],
-}));
diff --git a/examples/rax-project/package.json b/examples/rax-project/package.json
deleted file mode 100644
index 0214043bf1..0000000000
--- a/examples/rax-project/package.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "@examples/rax-project",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-rax-compat": "workspace:*",
- "@ice/plugin-jsx-plus": "workspace:*",
- "@ice/appear": "workspace:*",
- "@ice/runtime": "workspace:*",
- "rax": "^1.2.2",
- "rax-image": "^2.4.1",
- "rax-is-valid-element": "^1.0.0",
- "rax-text": "^2.2.0",
- "rax-view": "^2.3.0",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/rax-project/public/favicon.ico b/examples/rax-project/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/rax-project/public/favicon.ico and /dev/null differ
diff --git a/examples/rax-project/src/app.tsx b/examples/rax-project/src/app.tsx
deleted file mode 100644
index 38e608b8f4..0000000000
--- a/examples/rax-project/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
diff --git a/examples/rax-project/src/components/Logo/index.jsx b/examples/rax-project/src/components/Logo/index.jsx
deleted file mode 100644
index 35e7929085..0000000000
--- a/examples/rax-project/src/components/Logo/index.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { createElement } from 'rax';
-import Image from 'rax-image';
-
-import styles from './index.module.css';
-
-export default (props) => {
- const { uri } = props;
- const source = { uri };
- return ;
-};
diff --git a/examples/rax-project/src/components/Logo/index.module.css b/examples/rax-project/src/components/Logo/index.module.css
deleted file mode 100644
index b84be53a96..0000000000
--- a/examples/rax-project/src/components/Logo/index.module.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.logo {
- width: 200rpx;
- height: 180rpx;
- margin-bottom: 20rpx;
-}
diff --git a/examples/rax-project/src/document.tsx b/examples/rax-project/src/document.tsx
deleted file mode 100644
index 5840d742d2..0000000000
--- a/examples/rax-project/src/document.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-/* @jsx createElement */
-import { createElement } from 'rax';
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/rax-project/src/global.css b/examples/rax-project/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/rax-project/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/rax-project/src/pages/index.jsx b/examples/rax-project/src/pages/index.jsx
deleted file mode 100644
index 8faeb53f6b..0000000000
--- a/examples/rax-project/src/pages/index.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { createElement, useEffect, useRef } from 'rax';
-import View from 'rax-view';
-import Text from 'rax-text';
-import styles from './index.module.css';
-import Logo from '@/components/Logo';
-
-export default function Home() {
- const ref = useRef();
- useEffect(() => {
- if (ref.current) {
- console.log('ref for View', ref);
- }
- }, []);
- return (
- { console.log('view appear'); }}
- >
-
- Welcome to Your Rax App
- More information about Rax
- Visit https://rax.js.org
-
- );
-}
diff --git a/examples/rax-project/src/pages/index.module.css b/examples/rax-project/src/pages/index.module.css
deleted file mode 100644
index 679273d44d..0000000000
--- a/examples/rax-project/src/pages/index.module.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
-
-.data {
- margin-top: 10px;
-}
-
-.homeContainer {
- align-items: center;
- margin-top: 200rpx;
-}
-
-.homeTitle {
- font-size: 45rpx;
- font-weight: bold;
- margin: 20rpx 0;
-}
-
-.homeInfo {
- font-size: 36rpx;
- margin: 8rpx 0;
- color: #555;
-}
diff --git a/examples/rax-project/src/pages/jsxplus.jsx b/examples/rax-project/src/pages/jsxplus.jsx
deleted file mode 100644
index b061d71fee..0000000000
--- a/examples/rax-project/src/pages/jsxplus.jsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { createElement } from 'rax';
-
-export default function JSXPlusDemo() {
- const list = [0, 1, 2, 3];
- const val = 'foo';
- return (
- // x-class
-
- {/* x-if */}
-
Should Show
-
Should Hide
-
- {/* x-for */}
- {/* eslint-disable-next-line */}
-
{item}
-
- {/* Fragment */}
- <>
-
Fragment 1
-
Fragment 2
-
Fragment 3
- >
-
- );
-}
diff --git a/examples/rax-project/src/typings.d.ts b/examples/rax-project/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/rax-project/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/rax-project/tsconfig.json b/examples/rax-project/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/rax-project/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/routes-config/.browserslistrc b/examples/routes-config/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/routes-config/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/routes-config/ice.config.mts b/examples/routes-config/ice.config.mts
deleted file mode 100644
index d7297e455f..0000000000
--- a/examples/routes-config/ice.config.mts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineConfig } from '@ice/app';
-import routeConfig from './src/routes';
-
-export default defineConfig({
- routes: {
- ignoreFiles: ['**'],
- config: routeConfig,
- },
-});
diff --git a/examples/routes-config/package.json b/examples/routes-config/package.json
deleted file mode 100644
index 5f97a44352..0000000000
--- a/examples/routes-config/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "@examples/routes-config",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- }
-}
diff --git a/examples/routes-config/src/app.tsx b/examples/routes-config/src/app.tsx
deleted file mode 100644
index c1664902e9..0000000000
--- a/examples/routes-config/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig({});
diff --git a/examples/routes-config/src/components/bar.tsx b/examples/routes-config/src/components/bar.tsx
deleted file mode 100644
index 7861bf5cb4..0000000000
--- a/examples/routes-config/src/components/bar.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Bar() {
- return (
-
- bar
-
- );
-}
diff --git a/examples/routes-config/src/document.tsx b/examples/routes-config/src/document.tsx
deleted file mode 100644
index 20131b9d17..0000000000
--- a/examples/routes-config/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
\ No newline at end of file
diff --git a/examples/routes-config/src/pages/index.tsx b/examples/routes-config/src/pages/index.tsx
deleted file mode 100644
index 058ac57348..0000000000
--- a/examples/routes-config/src/pages/index.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- link to sales page
- >
- );
-}
diff --git a/examples/routes-config/src/pages/sales/favorites.tsx b/examples/routes-config/src/pages/sales/favorites.tsx
deleted file mode 100644
index c070b67299..0000000000
--- a/examples/routes-config/src/pages/sales/favorites.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Favorites() {
- return (
- <>
- my favorite items
- >
- );
-}
diff --git a/examples/routes-config/src/pages/sales/index.module.css b/examples/routes-config/src/pages/sales/index.module.css
deleted file mode 100644
index 509f387dc8..0000000000
--- a/examples/routes-config/src/pages/sales/index.module.css
+++ /dev/null
@@ -1,24 +0,0 @@
-.tabs {
- display: flex;
- border-bottom: 1px solid #ccc;
-}
-
-.tabs a {
- line-height: 36px;
- color: #333;
- text-decoration: none;
- padding: 0 8px;
- margin-right: 10px;
- margin-bottom: 10px;
- border-radius: 4px;
- background-color: rgba(208, 215, 222, 0.32);
-}
-
-.tabs a:hover {
- background-color: rgba(208, 215, 222, 0.64);
-}
-
-.container {
- border-top: 1px solid #ccc;
- padding-top: 20px;
-}
\ No newline at end of file
diff --git a/examples/routes-config/src/pages/sales/layout.tsx b/examples/routes-config/src/pages/sales/layout.tsx
deleted file mode 100644
index ffd92f253b..0000000000
--- a/examples/routes-config/src/pages/sales/layout.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Outlet, Link } from 'ice';
-import styles from './index.module.css';
-
-export default () => {
- return (
-
-
Sales
-
- overview
- recommends
- favorites
-
-
-
-
-
- );
-};
diff --git a/examples/routes-config/src/pages/sales/overview.tsx b/examples/routes-config/src/pages/sales/overview.tsx
deleted file mode 100644
index e2c5f6da69..0000000000
--- a/examples/routes-config/src/pages/sales/overview.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Overview() {
- return (
-
- overview all sale items
-
- );
-}
diff --git a/examples/routes-config/src/pages/sales/recommends.tsx b/examples/routes-config/src/pages/sales/recommends.tsx
deleted file mode 100644
index 89eb7658fd..0000000000
--- a/examples/routes-config/src/pages/sales/recommends.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Recommends() {
- return (
- <>
- recommend items
- >
- );
-}
diff --git a/examples/routes-config/src/routes.ts b/examples/routes-config/src/routes.ts
deleted file mode 100644
index 4c66f3df0a..0000000000
--- a/examples/routes-config/src/routes.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-const routes = [
- {
- path: 'rewrite',
- // 从 src/page 开始计算路径,并且需要写后缀
- component: 'sales/layout.tsx',
- children: [
- {
- // Test the legacy logic. It is not recommended to add slash for children path.
- path: '/favorites',
- component: 'sales/favorites.tsx',
- },
- {
- path: 'overview',
- component: 'sales/overview.tsx',
- },
- {
- path: 'recommends',
- component: 'sales/recommends.tsx',
- },
- ],
- },
- {
- path: '/',
- component: 'index.tsx',
- },
-];
-export default routes;
diff --git a/examples/routes-config/src/types.ts b/examples/routes-config/src/types.ts
deleted file mode 100644
index 2b7ee052a3..0000000000
--- a/examples/routes-config/src/types.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export interface AppData {
- title: string;
- auth: {
- [key: string]: boolean;
- };
-}
\ No newline at end of file
diff --git a/examples/routes-config/src/typings.d.ts b/examples/routes-config/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/routes-config/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/routes-config/tsconfig.json b/examples/routes-config/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/routes-config/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/routes-generate/ice.config.mts b/examples/routes-generate/ice.config.mts
deleted file mode 100644
index 5154e56ab2..0000000000
--- a/examples/routes-generate/ice.config.mts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- codeSplitting: false,
- routes: {
- ignoreFiles: ['about.tsx', 'products.tsx'],
- defineRoutes: (route) => {
- route('/about-me', 'about.tsx');
- route('/about.html', 'about.tsx');
-
- route('/', 'layout.tsx', () => {
- route('/product', 'products.tsx');
- });
- },
- },
-}));
diff --git a/examples/routes-generate/package.json b/examples/routes-generate/package.json
deleted file mode 100644
index 162c47039b..0000000000
--- a/examples/routes-generate/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "@examples/basic-project",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- }
-}
\ No newline at end of file
diff --git a/examples/routes-generate/src/app.tsx b/examples/routes-generate/src/app.tsx
deleted file mode 100644
index b84dfd61c1..0000000000
--- a/examples/routes-generate/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/routes-generate/src/document.tsx b/examples/routes-generate/src/document.tsx
deleted file mode 100644
index 3f226adf11..0000000000
--- a/examples/routes-generate/src/document.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-/* eslint-disable react/self-closing-comp */
-import React from 'react';
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/routes-generate/src/pages/$.tsx b/examples/routes-generate/src/pages/$.tsx
deleted file mode 100644
index 46a2c5278b..0000000000
--- a/examples/routes-generate/src/pages/$.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import * as React from 'react';
-
-export default function Fallback() {
- return <>Fallback >;
-}
diff --git a/examples/routes-generate/src/pages/about.tsx b/examples/routes-generate/src/pages/about.tsx
deleted file mode 100644
index 0be794a990..0000000000
--- a/examples/routes-generate/src/pages/about.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import * as React from 'react';
-import { Link, definePageConfig } from 'ice';
-
-export default function About() {
- return <>About home>;
-}
-
-export const pageConfig = definePageConfig(() => ({
-
-}));
\ No newline at end of file
diff --git a/examples/routes-generate/src/pages/dashboard/a.tsx b/examples/routes-generate/src/pages/dashboard/a.tsx
deleted file mode 100644
index 7b5f063c5c..0000000000
--- a/examples/routes-generate/src/pages/dashboard/a.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-export default () => {
- return (
- A page
- );
-};
\ No newline at end of file
diff --git a/examples/routes-generate/src/pages/dashboard/b.tsx b/examples/routes-generate/src/pages/dashboard/b.tsx
deleted file mode 100644
index 1ce33353f8..0000000000
--- a/examples/routes-generate/src/pages/dashboard/b.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-export default () => {
- return (
- B page
- );
-};
\ No newline at end of file
diff --git a/examples/routes-generate/src/pages/dashboard/index.tsx b/examples/routes-generate/src/pages/dashboard/index.tsx
deleted file mode 100644
index e9a67fe0cc..0000000000
--- a/examples/routes-generate/src/pages/dashboard/index.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-export default () => {
- return (
- Index
- );
-};
\ No newline at end of file
diff --git a/examples/routes-generate/src/pages/dashboard/layout.tsx b/examples/routes-generate/src/pages/dashboard/layout.tsx
deleted file mode 100644
index 6c594e4326..0000000000
--- a/examples/routes-generate/src/pages/dashboard/layout.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import * as React from 'react';
-import { Outlet, Link } from 'ice';
-
-export default () => {
- return (
-
- );
-};
\ No newline at end of file
diff --git a/examples/routes-generate/src/pages/detail/$id.tsx b/examples/routes-generate/src/pages/detail/$id.tsx
deleted file mode 100644
index f0f0b99056..0000000000
--- a/examples/routes-generate/src/pages/detail/$id.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-import { useParams, Link } from 'ice';
-
-export default function DetailId() {
- const params = useParams();
-
- return (
-
-
Detail id: {params.id}
- Back to Detail
-
- );
-}
diff --git a/examples/routes-generate/src/pages/detail/index.tsx b/examples/routes-generate/src/pages/detail/index.tsx
deleted file mode 100644
index 2658ca7a2f..0000000000
--- a/examples/routes-generate/src/pages/detail/index.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react';
-import { Link } from 'ice';
-
-export default function Detail() {
- return (
-
- );
-}
\ No newline at end of file
diff --git a/examples/routes-generate/src/pages/index.tsx b/examples/routes-generate/src/pages/index.tsx
deleted file mode 100644
index 0c9f084efd..0000000000
--- a/examples/routes-generate/src/pages/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import * as React from 'react';
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- Home
-
- about
- detail
- dashboard
-
- >
- );
-}
diff --git a/examples/routes-generate/src/pages/layout.tsx b/examples/routes-generate/src/pages/layout.tsx
deleted file mode 100644
index 45c897cd4a..0000000000
--- a/examples/routes-generate/src/pages/layout.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-import { Outlet } from 'ice';
-
-export default () => {
- return (
-
-
Layout
-
-
- );
-};
\ No newline at end of file
diff --git a/examples/routes-generate/src/pages/products.tsx b/examples/routes-generate/src/pages/products.tsx
deleted file mode 100644
index ebea3a78c6..0000000000
--- a/examples/routes-generate/src/pages/products.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import * as React from 'react';
-import { Link } from 'ice';
-
-export default function Products() {
- return <>Products Page home>;
-}
diff --git a/examples/routes-generate/tsconfig.json b/examples/routes-generate/tsconfig.json
deleted file mode 100644
index 1abf2c77de..0000000000
--- a/examples/routes-generate/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/single-route/.env b/examples/single-route/.env
deleted file mode 100644
index 3ac836e388..0000000000
--- a/examples/single-route/.env
+++ /dev/null
@@ -1,2 +0,0 @@
-ICE_A=env
-ICE_VERSION=$npm_package_version
\ No newline at end of file
diff --git a/examples/single-route/.env.development b/examples/single-route/.env.development
deleted file mode 100644
index a07c3c4b26..0000000000
--- a/examples/single-route/.env.development
+++ /dev/null
@@ -1 +0,0 @@
-ICE_A=env-development
\ No newline at end of file
diff --git a/examples/single-route/ice.config.mts b/examples/single-route/ice.config.mts
deleted file mode 100644
index f928aedc71..0000000000
--- a/examples/single-route/ice.config.mts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- publicPath: '/',
- optimization: {
- router: false,
- },
- ssr: true,
-}));
diff --git a/examples/single-route/optimization.config.mts b/examples/single-route/optimization.config.mts
deleted file mode 100644
index 6ca8677635..0000000000
--- a/examples/single-route/optimization.config.mts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- publicPath: '/',
- optimization: {
- disableRouter: true,
- },
-}));
diff --git a/examples/single-route/package.json b/examples/single-route/package.json
deleted file mode 100644
index fa228eb3a8..0000000000
--- a/examples/single-route/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@examples/basic-project",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build",
- "build:optimization": "ice build --config optimization.config.mts"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- }
-}
diff --git a/examples/single-route/src/app.tsx b/examples/single-route/src/app.tsx
deleted file mode 100644
index fc15857c6b..0000000000
--- a/examples/single-route/src/app.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-if (process.env.ICE_CORE_ERROR_BOUNDARY) {
- console.log('__REMOVED__');
-}
-
-console.log('ICE_VERSION', process.env.ICE_VERSION);
-
-export default defineAppConfig(() => ({
- app: {},
-}));
diff --git a/examples/single-route/src/document.tsx b/examples/single-route/src/document.tsx
deleted file mode 100644
index d3fede44ba..0000000000
--- a/examples/single-route/src/document.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-/* eslint-disable react/self-closing-comp */
-import React from 'react';
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document(props) {
- return (
-
-
-
-
-
-
-
-
-
-
-
- {props.children}
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/single-route/src/pages/home.tsx b/examples/single-route/src/pages/home.tsx
deleted file mode 100644
index 0d646b173f..0000000000
--- a/examples/single-route/src/pages/home.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-const home = () => {
- return (
- <>home>
- );
-};
-
-export default home;
diff --git a/examples/single-route/src/pages/index.tsx b/examples/single-route/src/pages/index.tsx
deleted file mode 100644
index a9092f391e..0000000000
--- a/examples/single-route/src/pages/index.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { Link, useData, defineDataLoader, useSuspenseData, withSuspense } from 'ice';
-
-function Comments() {
- const comments = useSuspenseData(getData);
-
- console.log('Render: Comments');
-
- return (
-
- {comments.map((comment, i) => (
-
- {comment}
-
- ))}
-
- );
-}
-const StreamingComments = withSuspense(Comments);
-const fakeData = [
- "Wait, it doesn't wait for React to load?",
- 'How does this even work?',
- 'I like marshmallows',
-];
-
-async function getData() {
- await new Promise((resolve) => {
- setTimeout(() => resolve(null), 1000);
- });
- return fakeData;
-}
-
-console.log('process.env.ICE_CORE_ROUTER', process.env.ICE_CORE_ROUTER);
-console.log('Link', Link);
-
-export default function Home() {
- const data = useData();
- console.log('render About', 'data', data);
- return (
-
-
{data?.name}
- Home Page
- } />
-
- );
-}
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'home',
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/single-route/src/pages/layout.tsx b/examples/single-route/src/pages/layout.tsx
deleted file mode 100644
index fe5f6dd9d1..0000000000
--- a/examples/single-route/src/pages/layout.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Outlet, defineDataLoader, useData } from 'ice';
-
-export default function Layout() {
- const data = useData();
- console.log('layout data', data);
- return (
-
-
Layout
-
-
- );
-}
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'layout',
- });
- }, 1 * 100);
- });
-});
-
diff --git a/examples/single-route/tsconfig.json b/examples/single-route/tsconfig.json
deleted file mode 100644
index 7f2f2ffce9..0000000000
--- a/examples/single-route/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-antd-mobile/ice.config.mts b/examples/with-antd-mobile/ice.config.mts
deleted file mode 100644
index 4c4183f2c8..0000000000
--- a/examples/with-antd-mobile/ice.config.mts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- polyfill: 'usage',
- server: {
- bundle: true,
- format: 'cjs',
- },
-}));
diff --git a/examples/with-antd-mobile/package.json b/examples/with-antd-mobile/package.json
deleted file mode 100644
index c6c8169037..0000000000
--- a/examples/with-antd-mobile/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "@examples/with-antd-mobile",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "antd-mobile": "^5.12.4",
- "constate": "^3.3.2",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
\ No newline at end of file
diff --git a/examples/with-antd-mobile/public/favicon.ico b/examples/with-antd-mobile/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/with-antd-mobile/public/favicon.ico and /dev/null differ
diff --git a/examples/with-antd-mobile/src/app.tsx b/examples/with-antd-mobile/src/app.tsx
deleted file mode 100644
index b84dfd61c1..0000000000
--- a/examples/with-antd-mobile/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/with-antd-mobile/src/document.tsx b/examples/with-antd-mobile/src/document.tsx
deleted file mode 100644
index f0327dac00..0000000000
--- a/examples/with-antd-mobile/src/document.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-antd-mobile/src/pages/index.module.css b/examples/with-antd-mobile/src/pages/index.module.css
deleted file mode 100644
index 1e18ee960b..0000000000
--- a/examples/with-antd-mobile/src/pages/index.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.title {
- color: red;
-}
-
-.count {
- font-size: 18rpx;
-}
diff --git a/examples/with-antd-mobile/src/pages/index.tsx b/examples/with-antd-mobile/src/pages/index.tsx
deleted file mode 100644
index bf99ae7f31..0000000000
--- a/examples/with-antd-mobile/src/pages/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Button } from 'antd-mobile';
-import styles from './index.module.css';
-import { useCounterContext } from '@/store';
-
-export default function Home() {
- const { count, increment, decrement } = useCounterContext();
- return (
- <>
- Counter
- increment()}>+
- {count}
- decrement()}>-
- >
- );
-}
diff --git a/examples/with-antd-mobile/src/pages/layout.tsx b/examples/with-antd-mobile/src/pages/layout.tsx
deleted file mode 100644
index 852a4a8095..0000000000
--- a/examples/with-antd-mobile/src/pages/layout.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Outlet } from 'ice';
-import { StoreProvider } from '@/store';
-
-export default () => {
- return (
-
- Layout
-
-
- );
-};
diff --git a/examples/with-antd-mobile/src/store.tsx b/examples/with-antd-mobile/src/store.tsx
deleted file mode 100644
index c2a334f6b7..0000000000
--- a/examples/with-antd-mobile/src/store.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import type { ComponentWithChildren } from '@ice/runtime/types';
-import { useState } from 'react';
-import constate from 'constate';
-
-function useCounter() {
- const [count, setCount] = useState(0);
- const increment = () => setCount(prevCount => prevCount + 1);
- const decrement = () => setCount(prevCount => prevCount - 1);
-
- return { count, increment, decrement };
-}
-
-const [CounterProvider, useCounterContext] = constate(useCounter);
-
-export const StoreProvider: ComponentWithChildren = ({ children }) => {
- return { children } ;
-};
-
-export {
- useCounterContext,
-};
diff --git a/examples/with-antd-mobile/src/typings.d.ts b/examples/with-antd-mobile/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-antd-mobile/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-antd-mobile/tsconfig.json b/examples/with-antd-mobile/tsconfig.json
deleted file mode 100644
index 212e8bb11b..0000000000
--- a/examples/with-antd-mobile/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
diff --git a/examples/with-antd/ice.config.mts b/examples/with-antd/ice.config.mts
deleted file mode 100644
index 31dbbced5d..0000000000
--- a/examples/with-antd/ice.config.mts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { defineConfig } from '@ice/app';
-import antd from '@ice/plugin-antd';
-import moment from '@ice/plugin-moment-locales';
-
-export default defineConfig(() => ({
- server: {
- onDemand: true,
- format: 'esm',
- },
- plugins: [
- antd({
- importStyle: true,
- dark: true,
- compact: true,
- theme: {
- 'blue-base': '#fd8',
- },
- }),
- moment({
- locales: ['zh-cn'],
- }),
- ],
-}));
diff --git a/examples/with-antd/package.json b/examples/with-antd/package.json
deleted file mode 100644
index 4d3fc85b64..0000000000
--- a/examples/with-antd/package.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "name": "@examples/with-antd",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-antd": "workspace:*",
- "@ice/plugin-moment-locales": "workspace:*",
- "@ice/runtime": "workspace:*",
- "antd": "^4.0.0",
- "moment": "^2.29.4",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/with-antd/src/app.tsx b/examples/with-antd/src/app.tsx
deleted file mode 100644
index 38e608b8f4..0000000000
--- a/examples/with-antd/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
diff --git a/examples/with-antd/src/document.tsx b/examples/with-antd/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-antd/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-antd/src/global.css b/examples/with-antd/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/with-antd/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/with-antd/src/pages/index.less b/examples/with-antd/src/pages/index.less
deleted file mode 100644
index e2e4e7b16c..0000000000
--- a/examples/with-antd/src/pages/index.less
+++ /dev/null
@@ -1,3 +0,0 @@
-.color {
- color: @blue-base;
-}
\ No newline at end of file
diff --git a/examples/with-antd/src/pages/index.tsx b/examples/with-antd/src/pages/index.tsx
deleted file mode 100644
index 293843c686..0000000000
--- a/examples/with-antd/src/pages/index.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Button } from 'antd';
-import './index.less';
-
-export default function Home() {
- return (
-
-
antd example
- Button
-
- );
-}
\ No newline at end of file
diff --git a/examples/with-antd/src/typings.d.ts b/examples/with-antd/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-antd/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-antd/tsconfig.json b/examples/with-antd/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-antd/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-antd5/ice.config.mts b/examples/with-antd5/ice.config.mts
deleted file mode 100644
index 4bf0e20a7b..0000000000
--- a/examples/with-antd5/ice.config.mts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- ssg: false,
- optimization: {
- optimizePackageImport: true,
- }
-}));
diff --git a/examples/with-antd5/package.json b/examples/with-antd5/package.json
deleted file mode 100644
index b4b9872217..0000000000
--- a/examples/with-antd5/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "@examples/with-antd5",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "antd": "^5.0.0",
- "dayjs": "^1.11.7",
- "react": "^18.0.0",
- "react-dom": "^18.0.0",
- "react-intl": "^6.3.2"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
\ No newline at end of file
diff --git a/examples/with-antd5/src/app.tsx b/examples/with-antd5/src/app.tsx
deleted file mode 100644
index 38e608b8f4..0000000000
--- a/examples/with-antd5/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
diff --git a/examples/with-antd5/src/document.tsx b/examples/with-antd5/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-antd5/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-antd5/src/locales.ts b/examples/with-antd5/src/locales.ts
deleted file mode 100644
index f839a418ad..0000000000
--- a/examples/with-antd5/src/locales.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export const messages: Record = {
- en: {
- changeLanguageTitle: 'Change locale:',
- indexTitle: 'Index',
- },
- 'zh-cn': {
- changeLanguageTitle: '修改语言:',
- indexTitle: '首页',
- },
-};
diff --git a/examples/with-antd5/src/pages/index.tsx b/examples/with-antd5/src/pages/index.tsx
deleted file mode 100644
index cb885ff566..0000000000
--- a/examples/with-antd5/src/pages/index.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { DatePicker, Pagination } from 'antd';
-import { FormattedMessage } from 'react-intl';
-
-export default function Index() {
- return (
-
- );
-}
diff --git a/examples/with-antd5/src/pages/layout.tsx b/examples/with-antd5/src/pages/layout.tsx
deleted file mode 100644
index 31a75d9cff..0000000000
--- a/examples/with-antd5/src/pages/layout.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Outlet } from 'ice';
-import { useState } from 'react';
-import { IntlProvider, FormattedMessage } from 'react-intl';
-import { ConfigProvider, Radio } from 'antd';
-import type { RadioChangeEvent } from 'antd';
-import enUS from 'antd/locale/en_US';
-import zhCN from 'antd/locale/zh_CN';
-import type { Locale } from 'antd/es/locale';
-
-import * as dayjs from 'dayjs';
-import { messages } from '@/locales';
-import 'dayjs/locale/zh-cn';
-
-export default function Layout() {
- const [locale, setLocale] = useState(enUS);
-
- const changeLocale = (e: RadioChangeEvent) => {
- const localeValue = e.target.value;
- setLocale(localeValue);
- if (localeValue) {
- dayjs.locale('zh-cn');
- } else {
- dayjs.locale('en');
- }
- };
-
- return (
-
-
-
-
-
-
- English
-
-
- 中文
-
-
-
-
-
-
-
-
- );
-}
diff --git a/examples/with-antd5/src/typings.d.ts b/examples/with-antd5/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-antd5/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-antd5/tsconfig.json b/examples/with-antd5/tsconfig.json
deleted file mode 100644
index 55aebc3d90..0000000000
--- a/examples/with-antd5/tsconfig.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "compilerOptions": {
- "baseUrl": "./",
- "module": "ESNext",
- "target": "ESNext",
- "lib": ["DOM", "ESNext", "DOM.Iterable"],
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "strict": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice"],
-}
diff --git a/examples/with-auth/ice.config.mts b/examples/with-auth/ice.config.mts
deleted file mode 100644
index c90b2379bf..0000000000
--- a/examples/with-auth/ice.config.mts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineConfig } from '@ice/app';
-import auth from '@ice/plugin-auth';
-
-export default defineConfig({
- plugins: [
- auth(),
- ],
-});
diff --git a/examples/with-auth/package.json b/examples/with-auth/package.json
deleted file mode 100644
index 1c7ce08ec2..0000000000
--- a/examples/with-auth/package.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "@examples/with-auth",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "license": "MIT",
- "dependencies": {
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-auth": "workspace:*",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- }
-}
\ No newline at end of file
diff --git a/examples/with-auth/src/app.tsx b/examples/with-auth/src/app.tsx
deleted file mode 100644
index 0df3324bbc..0000000000
--- a/examples/with-auth/src/app.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineAppConfig, defineDataLoader, Link } from 'ice';
-import { defineAuthConfig } from '@ice/plugin-auth/types';
-
-export default defineAppConfig(() => ({}));
-
-export const authConfig = defineAuthConfig((data) => {
- // fetch auth data
- return {
- initialAuth: {
- admin: data?.auth?.admin,
- },
- NoAuthFallback: () => {
- return (
- <>
- 无权限访问
- Home
- >
- );
- },
- };
-});
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- resolve({
- auth: {
- admin: true,
- },
- });
- });
-});
diff --git a/examples/with-auth/src/components/CustomAuth.tsx b/examples/with-auth/src/components/CustomAuth.tsx
deleted file mode 100644
index 703856b7c7..0000000000
--- a/examples/with-auth/src/components/CustomAuth.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { useAuth } from 'ice';
-
-function CustomAuth({ children, authKey, fallback }) {
- const [auth] = useAuth();
- // 判断是否有权限
- const hasAuth = auth[authKey];
- // 有权限时直接渲染内容
- if (hasAuth) {
- return children;
- } else {
- // 无权限时显示指定 UI
- return fallback || (<>No Auth>);
- }
-}
-
-export default CustomAuth;
diff --git a/examples/with-auth/src/document.tsx b/examples/with-auth/src/document.tsx
deleted file mode 100644
index eed51d7891..0000000000
--- a/examples/with-auth/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-auth/src/pages/blog.tsx b/examples/with-auth/src/pages/blog.tsx
deleted file mode 100644
index c403295b13..0000000000
--- a/examples/with-auth/src/pages/blog.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { definePageConfig, Link } from 'ice';
-
-export default function Blog() {
- return (
- <>
- Blog
- Index
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Blog',
- auth: ['guest'],
- };
-});
diff --git a/examples/with-auth/src/pages/index.tsx b/examples/with-auth/src/pages/index.tsx
deleted file mode 100644
index 87c83df503..0000000000
--- a/examples/with-auth/src/pages/index.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { Link, useAuth, definePageConfig } from 'ice';
-import CustomAuth from '@/components/CustomAuth';
-
-export default function Index() {
- const [, setAuth] = useAuth();
- return (
- <>
-
- Index
- setAuth({ guest: true })}>Set Guest Auth
No Auth>}>
- I am ice.js. My auth is guest.
-
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- title: 'Index',
- auth: ['admin'],
- };
-});
diff --git a/examples/with-auth/tsconfig.json b/examples/with-auth/tsconfig.json
deleted file mode 100644
index 6f25710863..0000000000
--- a/examples/with-auth/tsconfig.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "compilerOptions": {
- "baseUrl": "./",
- "module": "ESNext",
- "target": "ESNext",
- "lib": ["DOM", "ESNext", "DOM.Iterable"],
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice"],
- "exclude": ["build"]
-}
diff --git a/examples/with-basename/ice.config.mts b/examples/with-basename/ice.config.mts
deleted file mode 100644
index eac257a13e..0000000000
--- a/examples/with-basename/ice.config.mts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
-}));
diff --git a/examples/with-basename/package.json b/examples/with-basename/package.json
deleted file mode 100644
index 3a8fa5dd38..0000000000
--- a/examples/with-basename/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "@examples/with-basename",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- }
-}
\ No newline at end of file
diff --git a/examples/with-basename/src/app.tsx b/examples/with-basename/src/app.tsx
deleted file mode 100644
index 6c9ec63e39..0000000000
--- a/examples/with-basename/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({
- router: {
- basename: '/app',
- },
-}));
diff --git a/examples/with-basename/src/document.tsx b/examples/with-basename/src/document.tsx
deleted file mode 100644
index 90a506e663..0000000000
--- a/examples/with-basename/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
\ No newline at end of file
diff --git a/examples/with-basename/src/pages/about.tsx b/examples/with-basename/src/pages/about.tsx
deleted file mode 100644
index 03620a7d8a..0000000000
--- a/examples/with-basename/src/pages/about.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- About
- Home
- >
- );
-}
diff --git a/examples/with-basename/src/pages/index.tsx b/examples/with-basename/src/pages/index.tsx
deleted file mode 100644
index dbc8578e50..0000000000
--- a/examples/with-basename/src/pages/index.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- Home
- about
- >
- );
-}
diff --git a/examples/with-basename/src/pages/layout.tsx b/examples/with-basename/src/pages/layout.tsx
deleted file mode 100644
index fd549f0e48..0000000000
--- a/examples/with-basename/src/pages/layout.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Outlet } from 'ice';
-
-export default () => {
- return (
-
-
Layout
-
-
- );
-};
-
diff --git a/examples/with-basename/tsconfig.json b/examples/with-basename/tsconfig.json
deleted file mode 100644
index 7f2f2ffce9..0000000000
--- a/examples/with-basename/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-data-loader/.browserslistrc b/examples/with-data-loader/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-data-loader/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-data-loader/ice.config.mts b/examples/with-data-loader/ice.config.mts
deleted file mode 100644
index decf1c7308..0000000000
--- a/examples/with-data-loader/ice.config.mts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig({
- ssr: false,
- ssg: false,
-});
diff --git a/examples/with-data-loader/package.json b/examples/with-data-loader/package.json
deleted file mode 100644
index 4cdfb8420e..0000000000
--- a/examples/with-data-loader/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "@examples/with-data-loader",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "ICE example with plugin-request",
- "author": "ICE Team",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.6"
- }
-}
diff --git a/examples/with-data-loader/src/app.tsx b/examples/with-data-loader/src/app.tsx
deleted file mode 100644
index 8ae11aed57..0000000000
--- a/examples/with-data-loader/src/app.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineDataLoader } from 'ice';
-
-export default {
- app: {
- rootId: 'app',
- },
-};
-
-export const dataLoader = defineDataLoader(async () => {
- return {
- id: 123,
- };
-});
diff --git a/examples/with-data-loader/src/document.tsx b/examples/with-data-loader/src/document.tsx
deleted file mode 100644
index 4f850e15c5..0000000000
--- a/examples/with-data-loader/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-data-loader/src/pages/about.tsx b/examples/with-data-loader/src/pages/about.tsx
deleted file mode 100644
index 76c47ac080..0000000000
--- a/examples/with-data-loader/src/pages/about.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { useEffect, useState } from 'react';
-import styles from './index.module.css';
-
-export default function About() {
- const [data, setData] = useState({});
-
- useEffect(() => {
- loadData();
- }, []);
-
- async function loadData() {
- const result = await fetch('http://github.com/service/https://api.github.com/repos/ice-lab/ice-next');
- const data = await result.json();
-
- setData(data);
- }
-
- return (
- <>
- With useEffect
- {JSON.stringify(data)}
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- };
-}
\ No newline at end of file
diff --git a/examples/with-data-loader/src/pages/blog1.tsx b/examples/with-data-loader/src/pages/blog1.tsx
deleted file mode 100644
index 97515101b7..0000000000
--- a/examples/with-data-loader/src/pages/blog1.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { useData, defineDataLoader, Link } from 'ice';
-import styles from './index.module.css';
-
-export default function Blog1() {
- const data = useData();
-
- return (
- <>
- Blog1 With dataLoader
- link to blog2
- {data}
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Blog',
- };
-}
-
-export const dataLoader = defineDataLoader(async () => {
- console.log('Loading data for blog 1');
- return new Date().getTime();
-});
diff --git a/examples/with-data-loader/src/pages/blog2.tsx b/examples/with-data-loader/src/pages/blog2.tsx
deleted file mode 100644
index 1f1da06bed..0000000000
--- a/examples/with-data-loader/src/pages/blog2.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { useData, defineDataLoader, Link } from 'ice';
-import styles from './index.module.css';
-
-export default function Blog2() {
- const data = useData();
-
- return (
- <>
- Blog2 With dataLoader
- link to blog1
- {data}
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Blog',
- };
-}
-
-export const dataLoader = defineDataLoader(async () => {
- console.log('Loading data for blog 2');
- return new Date().getTime();
-});
diff --git a/examples/with-data-loader/src/pages/home.tsx b/examples/with-data-loader/src/pages/home.tsx
deleted file mode 100644
index d14329df06..0000000000
--- a/examples/with-data-loader/src/pages/home.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { useData, defineDataLoader, useAppData } from 'ice';
-import styles from './index.module.css';
-
-export default function Home() {
- const data = useData();
- const appData = useAppData();
-
- console.log(appData);
-
- return (
- <>
- With dataLoader
- {JSON.stringify(data)}
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- };
-}
-
-export const dataLoader = defineDataLoader(async () => {
- console.log('Loading data for Home');
- const result = await fetch('http://github.com/service/https://api.github.com/repos/ice-lab/ice-next');
- const data = await result.json();
- console.log('target, renderer:', import.meta.target, import.meta.renderer);
- return data;
-});
diff --git a/examples/with-data-loader/src/pages/index.module.css b/examples/with-data-loader/src/pages/index.module.css
deleted file mode 100644
index 836f971af7..0000000000
--- a/examples/with-data-loader/src/pages/index.module.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
diff --git a/examples/with-data-loader/src/pages/layout.tsx b/examples/with-data-loader/src/pages/layout.tsx
deleted file mode 100644
index 21ade441a0..0000000000
--- a/examples/with-data-loader/src/pages/layout.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-
-import { Outlet, defineDataLoader, useData } from 'ice';
-
-const Layout = () => {
- const data = useData();
- return (
- <>
- {data}
-
- >
- );
-};
-
-export default Layout;
-
-export const dataLoader = defineDataLoader(() => {
- console.log('Loading data for Layout');
- return new Date().getTime();
-});
\ No newline at end of file
diff --git a/examples/with-data-loader/src/pages/with-defer-loader.tsx b/examples/with-data-loader/src/pages/with-defer-loader.tsx
deleted file mode 100644
index 0396facb93..0000000000
--- a/examples/with-data-loader/src/pages/with-defer-loader.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { useData, defineDataLoader, Await } from 'ice';
-import styles from './index.module.css';
-
-export default function Home() {
- const data = useData();
-
- return (
- <>
- With dataLoader
- Loading item info... } errorElement={Error loading!
}>
- {(itemInfo) => {
- return Item id is {itemInfo.id}
;
- }}
-
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- };
-}
-
-export const dataLoader = defineDataLoader(async () => {
- const promise = new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- id: 1233,
- });
- }, 100);
- });
- return await promise;
-}, { defer: true });
-
diff --git a/examples/with-data-loader/src/pages/with-defer-loaders.tsx b/examples/with-data-loader/src/pages/with-defer-loaders.tsx
deleted file mode 100644
index 06f7eb5cdb..0000000000
--- a/examples/with-data-loader/src/pages/with-defer-loaders.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { useData, defineDataLoader, Await } from 'ice';
-import styles from './index.module.css';
-
-export default function Home() {
- const data = useData();
-
- return (
- <>
- With dataLoader
- Loading item info... } errorElement={Error loading!
}>
- {(itemInfo) => {
- return Item id is {itemInfo.id}
;
- }}
-
- Loading item info...} errorElement={Error loading!
}>
- {(itemInfo) => {
- return Item price is {itemInfo.price}
;
- }}
-
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- };
-}
-
-export const dataLoader = defineDataLoader([
- async () => {
- const promise = new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- id: 1233,
- });
- }, 100);
- });
- return await promise;
- },
- async () => {
- const promise = new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- price: 9.99,
- });
- }, 2000);
- });
- return await promise;
- },
-], { defer: true });
-
diff --git a/examples/with-data-loader/src/pages/with-ssr.tsx b/examples/with-data-loader/src/pages/with-ssr.tsx
deleted file mode 100644
index 16c363547c..0000000000
--- a/examples/with-data-loader/src/pages/with-ssr.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useData, defineDataLoader, defineServerDataLoader, Await } from 'ice';
-import styles from './index.module.css';
-
-export default function Home() {
- const data = useData();
-
- return (
- <>
- With dataLoader
- Loading item info...} errorElement={Error loading!
}>
- {(itemInfo) => {
- return Item id is {itemInfo.id}
;
- }}
-
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- };
-}
-
-export const dataLoader = defineDataLoader(async () => {
- const promise = new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- id: 1233,
- });
- }, 100);
- });
- return await promise;
-}, { defer: true });
-
-export const serverDataLoader = defineServerDataLoader(async () => {
- const promise = new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- id: 1233,
- });
- }, 100);
- });
- return await promise;
-});
\ No newline at end of file
diff --git a/examples/with-data-loader/src/typings.d.ts b/examples/with-data-loader/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-data-loader/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-data-loader/tsconfig.json b/examples/with-data-loader/tsconfig.json
deleted file mode 100644
index e41a1f451f..0000000000
--- a/examples/with-data-loader/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "esnext",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-dynamic/.browserslistrc b/examples/with-dynamic/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-dynamic/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-dynamic/ice.config.mts b/examples/with-dynamic/ice.config.mts
deleted file mode 100644
index a1def9fd76..0000000000
--- a/examples/with-dynamic/ice.config.mts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({
- ssr: true,
-}));
diff --git a/examples/with-dynamic/package.json b/examples/with-dynamic/package.json
deleted file mode 100644
index e254ad7984..0000000000
--- a/examples/with-dynamic/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@examples/with-dynamic",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "ICE example with dynamic",
- "author": "ICE Team",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "tslib": "^2.4.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.6"
- }
-}
\ No newline at end of file
diff --git a/examples/with-dynamic/src/app.tsx b/examples/with-dynamic/src/app.tsx
deleted file mode 100644
index 74015d9cf4..0000000000
--- a/examples/with-dynamic/src/app.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export default {
- app: {
- rootId: 'app',
- type: 'browser',
- },
-};
diff --git a/examples/with-dynamic/src/components/nonssr.tsx b/examples/with-dynamic/src/components/nonssr.tsx
deleted file mode 100644
index 08637b1df9..0000000000
--- a/examples/with-dynamic/src/components/nonssr.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export default (props) => {
- window.addEventListener('load', () => {
- console.log('load');
- });
- return {props.text}
;
-};
diff --git a/examples/with-dynamic/src/components/normal.tsx b/examples/with-dynamic/src/components/normal.tsx
deleted file mode 100644
index 0f1d723444..0000000000
--- a/examples/with-dynamic/src/components/normal.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default () => {
- return normal text
;
-};
-
-export function NameExportComp() {
- return name exported
;
-}
diff --git a/examples/with-dynamic/src/document.tsx b/examples/with-dynamic/src/document.tsx
deleted file mode 100644
index 61e35a7ec2..0000000000
--- a/examples/with-dynamic/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-dynamic/src/pages/nonssr/no-ssr-fallback.tsx b/examples/with-dynamic/src/pages/nonssr/no-ssr-fallback.tsx
deleted file mode 100644
index c63a950ff7..0000000000
--- a/examples/with-dynamic/src/pages/nonssr/no-ssr-fallback.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { dynamic } from '@ice/runtime';
-
-const NonSSR = dynamic(() => import('@/components/nonssr'), {
- ssr: false,
- fallback: () => fallback
,
-});
-
-export default () => {
- return ;
-};
diff --git a/examples/with-dynamic/src/pages/nonssr/no-ssr-no-fallback.tsx b/examples/with-dynamic/src/pages/nonssr/no-ssr-no-fallback.tsx
deleted file mode 100644
index 416bf4f4c5..0000000000
--- a/examples/with-dynamic/src/pages/nonssr/no-ssr-no-fallback.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { dynamic } from '@ice/runtime';
-
-const NonSSR = dynamic(() => import('@/components/nonssr'), {
- ssr: false,
-});
-
-export default () => {
- return ;
-};
diff --git a/examples/with-dynamic/src/pages/nonssr/ssr-no-fallback.tsx b/examples/with-dynamic/src/pages/nonssr/ssr-no-fallback.tsx
deleted file mode 100644
index e6fcc6dcdf..0000000000
--- a/examples/with-dynamic/src/pages/nonssr/ssr-no-fallback.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { dynamic } from '@ice/runtime';
-
-const NonSSR = dynamic(() => import('@/components/nonssr'));
-
-export default () => {
- return ;
-};
diff --git a/examples/with-dynamic/src/pages/nonssr/without-dynamic.tsx b/examples/with-dynamic/src/pages/nonssr/without-dynamic.tsx
deleted file mode 100644
index 0a9c79c325..0000000000
--- a/examples/with-dynamic/src/pages/nonssr/without-dynamic.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import NonSsr from '@/components/nonssr';
-
-export default () => {
- return ;
-};
diff --git a/examples/with-dynamic/src/pages/normal/bare-import.tsx b/examples/with-dynamic/src/pages/normal/bare-import.tsx
deleted file mode 100644
index 58e2010194..0000000000
--- a/examples/with-dynamic/src/pages/normal/bare-import.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { dynamic } from '@ice/runtime';
-
-const Normal = dynamic(import('../../components/normal'), {
- fallback: () => bare import fallback
,
-});
-
-export default () => {
- return ;
-};
diff --git a/examples/with-dynamic/src/pages/normal/basic.tsx b/examples/with-dynamic/src/pages/normal/basic.tsx
deleted file mode 100644
index 03292de0fd..0000000000
--- a/examples/with-dynamic/src/pages/normal/basic.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { dynamic } from '@ice/runtime';
-
-const Normal = dynamic(() => import('../../components/normal'), {
- fallback: () => normal fallback
,
-});
-
-export default () => {
- return ;
-};
diff --git a/examples/with-dynamic/src/pages/normal/name-export.tsx b/examples/with-dynamic/src/pages/normal/name-export.tsx
deleted file mode 100644
index cfdeb4335a..0000000000
--- a/examples/with-dynamic/src/pages/normal/name-export.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { dynamic } from '@ice/runtime';
-
-const Normal = dynamic(
- import('../../components/normal').then((mod) => {
- return {
- default: mod.NameExportComp,
- };
- }),
-);
-
-export default () => {
- return ;
-};
diff --git a/examples/with-dynamic/src/typings.d.ts b/examples/with-dynamic/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-dynamic/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-dynamic/tsconfig.json b/examples/with-dynamic/tsconfig.json
deleted file mode 100644
index 895d41392f..0000000000
--- a/examples/with-dynamic/tsconfig.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": [
- "es6",
- "dom"
- ],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": [
- "./src/*"
- ],
- "ice": [
- ".ice"
- ]
- }
- },
- "include": [
- "src",
- ".ice", "src/pages/with-dynamic/.tsx",
- ],
- "exclude": [
- "build",
- "public"
- ]
-}
\ No newline at end of file
diff --git a/examples/with-fallback-entry/.browserslistrc b/examples/with-fallback-entry/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-fallback-entry/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-fallback-entry/ice.config.mts b/examples/with-fallback-entry/ice.config.mts
deleted file mode 100644
index 183825d80b..0000000000
--- a/examples/with-fallback-entry/ice.config.mts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineConfig } from '@ice/app';
-import plugin from './plugin';
-
-export default defineConfig(() => ({
- plugins: [plugin()],
- ssr: true,
- server: {
- format: 'cjs',
- }
-}));
diff --git a/examples/with-fallback-entry/package.json b/examples/with-fallback-entry/package.json
deleted file mode 100644
index a600d9eb7c..0000000000
--- a/examples/with-fallback-entry/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@examples/with-fallback-entry",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/with-fallback-entry/plugin.ts b/examples/with-fallback-entry/plugin.ts
deleted file mode 100644
index 8286d268b4..0000000000
--- a/examples/with-fallback-entry/plugin.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export default function createPlugin() {
- return {
- name: 'custom-plugin',
- setup({ onGetConfig }) {
- onGetConfig((config) => {
- config.server = {
- fallbackEntry: true,
- };
- });
- },
- };
-}
diff --git a/examples/with-fallback-entry/public/favicon.ico b/examples/with-fallback-entry/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/with-fallback-entry/public/favicon.ico and /dev/null differ
diff --git a/examples/with-fallback-entry/src/app.tsx b/examples/with-fallback-entry/src/app.tsx
deleted file mode 100644
index b84dfd61c1..0000000000
--- a/examples/with-fallback-entry/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/with-fallback-entry/src/document.tsx b/examples/with-fallback-entry/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-fallback-entry/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-fallback-entry/src/global.css b/examples/with-fallback-entry/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/with-fallback-entry/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/with-fallback-entry/src/pages/index.tsx b/examples/with-fallback-entry/src/pages/index.tsx
deleted file mode 100644
index bb72815361..0000000000
--- a/examples/with-fallback-entry/src/pages/index.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function Home() {
- return home ;
-}
diff --git a/examples/with-fallback-entry/src/typings.d.ts b/examples/with-fallback-entry/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-fallback-entry/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-fallback-entry/tsconfig.json b/examples/with-fallback-entry/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-fallback-entry/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-first-chunk-cache-ssr/ice.config.mts b/examples/with-first-chunk-cache-ssr/ice.config.mts
deleted file mode 100644
index 02208a54f6..0000000000
--- a/examples/with-first-chunk-cache-ssr/ice.config.mts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig({
- ssr: true,
-});
diff --git a/examples/with-first-chunk-cache-ssr/ice.png b/examples/with-first-chunk-cache-ssr/ice.png
deleted file mode 100644
index e5e98fac1e..0000000000
Binary files a/examples/with-first-chunk-cache-ssr/ice.png and /dev/null differ
diff --git a/examples/with-first-chunk-cache-ssr/package.json b/examples/with-first-chunk-cache-ssr/package.json
deleted file mode 100644
index 3e59d599f5..0000000000
--- a/examples/with-first-chunk-cache-ssr/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "@examples/with-first-chunk-cache-ssr",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "ICE example with first chunk cache ssr",
- "author": "ICE Team",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.6"
- }
-}
diff --git a/examples/with-first-chunk-cache-ssr/public/favicon.ico b/examples/with-first-chunk-cache-ssr/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/with-first-chunk-cache-ssr/public/favicon.ico and /dev/null differ
diff --git a/examples/with-first-chunk-cache-ssr/src/app.tsx b/examples/with-first-chunk-cache-ssr/src/app.tsx
deleted file mode 100644
index 1ceb78f306..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig({
- app: {
- rootId: 'app',
- },
-});
diff --git a/examples/with-first-chunk-cache-ssr/src/components/Box/index.module.css b/examples/with-first-chunk-cache-ssr/src/components/Box/index.module.css
deleted file mode 100644
index 0baf463000..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/components/Box/index.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.box {
- display: flex;
- width: 100%;
- height: 100px;
- flex-direction: row;
- background-color: white;
-}
-
-.item {
- flex: 1;
-}
\ No newline at end of file
diff --git a/examples/with-first-chunk-cache-ssr/src/components/Box/index.tsx b/examples/with-first-chunk-cache-ssr/src/components/Box/index.tsx
deleted file mode 100644
index 2777b3d067..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/components/Box/index.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useSuspenseData, withSuspense } from 'ice';
-import logo from '../../../ice.png';
-import styles from './index.module.css';
-
-const Item = withSuspense((props) => {
- console.log('Render: Item');
-
- return (
- (
-
-
)
- );
-});
-
-function Box() {
- const data = useSuspenseData(getData);
- console.log('Render: Box');
-
- return (
-
- {
- data.map((item, index) => {
- return ;
- })
- }
-
- );
-}
-
-export default withSuspense(Box);
-
-async function getData() {
- console.log('load box');
-
- await new Promise((resolve) => {
- setTimeout(() => resolve(null), 1000);
- });
-
- return [
- logo,
- logo,
- logo,
- ];
-}
\ No newline at end of file
diff --git a/examples/with-first-chunk-cache-ssr/src/components/List/index.module.css b/examples/with-first-chunk-cache-ssr/src/components/List/index.module.css
deleted file mode 100644
index 780fbce145..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/components/List/index.module.css
+++ /dev/null
@@ -1,18 +0,0 @@
-.list {
- background-color: rgba(0,0,0,.03);
-}
-
-.item{
- padding: 20px;
- background-color: aliceblue;
- margin: 20px;
- display: flex;
-}
-
-.image {
- padding: 10px;
-}
-
-.title {
- padding: 15px 0px;
-}
\ No newline at end of file
diff --git a/examples/with-first-chunk-cache-ssr/src/components/List/index.tsx b/examples/with-first-chunk-cache-ssr/src/components/List/index.tsx
deleted file mode 100644
index dd5b3ed871..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/components/List/index.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import { useSuspenseData, withSuspense } from 'ice';
-import logo from '../../../ice.png';
-import styles from './index.module.css';
-
-const Item = withSuspense((props) => {
- console.log('Render: List');
-
- return (
- (
-
-
-
{props.title}
-
{props.description}
-
-
)
- );
-});
-
-function List() {
- const data = useSuspenseData(getData);
- console.log('Render: List');
-
- return (
-
- {
- data.map(item => {
- return ( );
- })
- }
-
- );
-}
-
-export default withSuspense(List);
-
-async function getData() {
- console.log('load list');
-
- await new Promise((resolve) => {
- setTimeout(() => resolve(null), 2000);
- });
-
- return [
- {
- logo,
- title: 'ice.js',
- description: '这是 ICE 框架',
- },
- {
- logo,
- title: 'ice.js',
- description: '这是 ICE 框架',
- },
- {
- logo,
- title: 'ice.js',
- description: '这是 ICE 框架',
- },
- {
- logo,
- title: 'ice.js',
- description: '这是 ICE 框架',
- },
- {
- logo,
- title: 'ice.js',
- description: '这是 ICE 框架',
- },
- ];
-}
\ No newline at end of file
diff --git a/examples/with-first-chunk-cache-ssr/src/document.tsx b/examples/with-first-chunk-cache-ssr/src/document.tsx
deleted file mode 100644
index 0df14e14df..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/document.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Meta, Title, Links, Main, Scripts, FirstChunkCache } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-first-chunk-cache-ssr/src/pages/index.module.css b/examples/with-first-chunk-cache-ssr/src/pages/index.module.css
deleted file mode 100644
index b1c8358217..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/pages/index.module.css
+++ /dev/null
@@ -1,63 +0,0 @@
-.app {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- height: 100vh;
- overflow-x: hidden;
-}
-
-.app > header {
- display: flex;
- flex-direction: column;
- align-items: center;
-}
-
-.app > header > img {
- width: 120px;
-}
-
-.app > header > p {
- margin: 20px 0;
- text-align: center;
- font-size: 2.6rem;
-}
-
-.app > main {
- display: flex;
- flex-direction: column;
- margin: 20px 0 10px;
- font-size: 0.9rem;
-}
-
-.boxFallback {
- background: rgba(0,0,0,.03);
- border-radius: 3.2vw;
- height: 100px;
-}
-
-.header {
- background: linear-gradient(to bottom right, rgb(2, 46, 244), rgb(46, 40, 150));
- height: 100px;
- width: 100%;
- font-size: 22px;
- align-items: center;
- line-height: 100px;
- text-align: center;
- color: #FFF;
-}
-
-.link {
- font-size: 1.2rem;
- color: var(--primary);
-}
-
-.button {
- outline: none;
- border: none;
- border-radius: 8px;
- padding: 10px 35px;
- background: var(--primary);
- box-shadow: 0 5px 10px 0 #ddd;
- font-size: calc(10px + 2vmin);
-}
diff --git a/examples/with-first-chunk-cache-ssr/src/pages/index.tsx b/examples/with-first-chunk-cache-ssr/src/pages/index.tsx
deleted file mode 100644
index b5b1a08224..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/pages/index.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import styles from './index.module.css';
-import List from '@/components/List/index';
-import Box from '@/components/Box/index';
-
-
-export default function Home() {
- console.log('Render: Home');
-
- return (
-
-
-
} />
-
} />
- {/* https://github.com/xiaoxiaojx/blog/issues/37 */}
-
\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b
' }} />
-
- );
-}
-
-function Header() {
- return (
-
- First chunk Demo
-
- );
-}
\ No newline at end of file
diff --git a/examples/with-first-chunk-cache-ssr/src/typings.d.ts b/examples/with-first-chunk-cache-ssr/src/typings.d.ts
deleted file mode 100644
index 1a48695046..0000000000
--- a/examples/with-first-chunk-cache-ssr/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
\ No newline at end of file
diff --git a/examples/with-first-chunk-cache-ssr/tsconfig.json b/examples/with-first-chunk-cache-ssr/tsconfig.json
deleted file mode 100644
index e41a1f451f..0000000000
--- a/examples/with-first-chunk-cache-ssr/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "esnext",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-fusion/.browserslistrc b/examples/with-fusion/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-fusion/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-fusion/ice.config.mts b/examples/with-fusion/ice.config.mts
deleted file mode 100644
index 40cf4bdb4d..0000000000
--- a/examples/with-fusion/ice.config.mts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { defineConfig } from '@ice/app';
-import fusion from '@ice/plugin-fusion';
-import cssAssetsLocal from '@ice/plugin-css-assets-local';
-import moment from '@ice/plugin-moment-locales';
-
-export default defineConfig({
- plugins: [
- fusion({
- importStyle: true,
- theme: {
- 'primary-color': '#89d',
- },
- }),
- cssAssetsLocal(),
- moment({
- locales: ['af'],
- }),
- ],
- ssg: false,
-});
diff --git a/examples/with-fusion/package.json b/examples/with-fusion/package.json
deleted file mode 100644
index 145c92723d..0000000000
--- a/examples/with-fusion/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "@examples/with-fusion",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@alifd/next": "^1.25.49",
- "@ice/runtime": "workspace:*",
- "moment": "^2.29.4",
- "react": "^18.0.0",
- "react-dom": "^18.0.0",
- "react-intl": "^6.3.2"
- },
- "devDependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-css-assets-local": "workspace:*",
- "@ice/plugin-fusion": "workspace:*",
- "@ice/plugin-moment-locales": "workspace:*",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/with-fusion/src/app.tsx b/examples/with-fusion/src/app.tsx
deleted file mode 100644
index 7b48cb330c..0000000000
--- a/examples/with-fusion/src/app.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineAppConfig } from 'ice';
-import moment from 'moment';
-
-moment.locale('af');
-
-export default defineAppConfig(() => ({
- app: {
- rootId: 'app',
- },
-}));
diff --git a/examples/with-fusion/src/document.tsx b/examples/with-fusion/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-fusion/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-fusion/src/global.scss b/examples/with-fusion/src/global.scss
deleted file mode 100644
index 5056241a9c..0000000000
--- a/examples/with-fusion/src/global.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-body {
- font-size: 14px;
- color: $primary-color;
-}
diff --git a/examples/with-fusion/src/locales.ts b/examples/with-fusion/src/locales.ts
deleted file mode 100644
index 089b5f35dc..0000000000
--- a/examples/with-fusion/src/locales.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export const messages: Record = {
- en: {
- buttonText: 'Button',
- },
- 'zh-cn': {
- buttonText: '按钮',
- },
-};
diff --git a/examples/with-fusion/src/pages/index.tsx b/examples/with-fusion/src/pages/index.tsx
deleted file mode 100644
index 2ada9e2ec0..0000000000
--- a/examples/with-fusion/src/pages/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Button, DatePicker } from '@alifd/next';
-import '@alifd/next/dist/next.css';
-import { FormattedMessage } from 'react-intl';
-
-export default function Home() {
- return (
-
-
with fusion
-
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/examples/with-fusion/src/pages/layout.tsx b/examples/with-fusion/src/pages/layout.tsx
deleted file mode 100644
index 35151701ac..0000000000
--- a/examples/with-fusion/src/pages/layout.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { Outlet } from 'ice';
-import { useState } from 'react';
-import { ConfigProvider, Radio } from '@alifd/next';
-import enUS from '@alifd/next/lib/locale/en-us';
-import zhCN from '@alifd/next/lib/locale/zh-cn';
-import { IntlProvider } from 'react-intl';
-import { messages } from '@/locales';
-
-const localeMap = new Map([
- ['en', enUS],
- ['zh-cn', zhCN],
-]);
-
-export default function Layout() {
- const [locale, setLocale] = useState('en');
- const list = [
- {
- value: 'en',
- label: 'English',
- },
- {
- value: 'zh-cn',
- label: '中文',
- },
- ];
-
- function changeLocale(value: string) {
- setLocale(value);
- }
- return (
-
-
-
-
-
-
-
-
- );
-}
-
diff --git a/examples/with-fusion/src/typings.d.ts b/examples/with-fusion/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-fusion/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-fusion/tsconfig.json b/examples/with-fusion/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-fusion/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-i18n/ice.config.mts b/examples/with-i18n/ice.config.mts
deleted file mode 100644
index fcb7723878..0000000000
--- a/examples/with-i18n/ice.config.mts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineConfig } from '@ice/app';
-import i18n from '@ice/plugin-i18n';
-
-export default defineConfig({
- plugins: [
- i18n({
- locales: ['zh-CN', 'en-US'],
- defaultLocale: 'zh-CN',
- autoRedirect: true,
- }),
- ],
- ssr: true,
-});
diff --git a/examples/with-i18n/package.json b/examples/with-i18n/package.json
deleted file mode 100644
index 1256523ea4..0000000000
--- a/examples/with-i18n/package.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "name": "@examples/with-i18n",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build",
- "serve": "tsx server.mts"
- },
- "dependencies": {
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0",
- "react-intl": "^6.3.2"
- },
- "devDependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-i18n": "workspace:*",
- "@types/express": "^4.17.14",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "express": "^4.19.2",
- "tslib": "^2.5.0",
- "tsx": "^3.12.1"
- }
-}
\ No newline at end of file
diff --git a/examples/with-i18n/server.mts b/examples/with-i18n/server.mts
deleted file mode 100644
index 7990c499b3..0000000000
--- a/examples/with-i18n/server.mts
+++ /dev/null
@@ -1,27 +0,0 @@
-import express from 'express';
-import { renderToHTML } from './build/server/index.mjs';
-
-const app = express();
-const port = 4000;
-const basename = '/app';
-
-app.use(express.static('build', {}));
-
-app.use(async (req, res) => {
- const { statusCode, statusText, headers, value: body } = await renderToHTML({ req, res }, { basename });
- res.statusCode = statusCode;
- res.statusMessage = statusText;
- Object.entries((headers || {}) as Record).forEach(([name, value]) => {
- res.setHeader(name, value);
- });
- if (body && req.method !== 'HEAD') {
- res.end(body);
- } else {
- res.end();
- }
-});
-
-
-app.listen(port, () => {
- console.log(`App listening on http://localhost:${port}${basename}`);
-});
\ No newline at end of file
diff --git a/examples/with-i18n/src/app.tsx b/examples/with-i18n/src/app.tsx
deleted file mode 100644
index d0ddd0f9ba..0000000000
--- a/examples/with-i18n/src/app.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { defineAppConfig } from 'ice';
-import { defineI18nConfig } from '@ice/plugin-i18n/types';
-
-export default defineAppConfig(() => ({
- router: {
- basename: '/app',
- },
-}));
-
-export const i18nConfig = defineI18nConfig(() => ({
- // disabledCookie: true,
-}));
diff --git a/examples/with-i18n/src/document.tsx b/examples/with-i18n/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-i18n/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-i18n/src/locales.ts b/examples/with-i18n/src/locales.ts
deleted file mode 100644
index ab4863cc65..0000000000
--- a/examples/with-i18n/src/locales.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export const messages: Record = {
- 'en-US': {
- buttonText: 'Normal Button',
- },
- 'zh-CN': {
- buttonText: '普通按钮',
- },
-};
diff --git a/examples/with-i18n/src/pages/blog/a.tsx b/examples/with-i18n/src/pages/blog/a.tsx
deleted file mode 100644
index 0316e78bea..0000000000
--- a/examples/with-i18n/src/pages/blog/a.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Link } from 'ice';
-
-export default function BlogA() {
- return (
- <>
- Blog A
-
- >
- );
-}
diff --git a/examples/with-i18n/src/pages/blog/index.tsx b/examples/with-i18n/src/pages/blog/index.tsx
deleted file mode 100644
index ff66b3ffae..0000000000
--- a/examples/with-i18n/src/pages/blog/index.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Link } from 'ice';
-
-export default function Blog() {
- return (
- <>
- Blog
-
- >
- );
-}
diff --git a/examples/with-i18n/src/pages/index.tsx b/examples/with-i18n/src/pages/index.tsx
deleted file mode 100644
index 334e5da149..0000000000
--- a/examples/with-i18n/src/pages/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Link } from 'ice';
-import { FormattedMessage } from 'react-intl';
-
-export default function Home() {
- return (
-
-
I18n Example
- Blog
-
-
-
-
-
- );
-}
diff --git a/examples/with-i18n/src/pages/layout.tsx b/examples/with-i18n/src/pages/layout.tsx
deleted file mode 100644
index 7d3eab9868..0000000000
--- a/examples/with-i18n/src/pages/layout.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Outlet, useLocale, getAllLocales, getDefaultLocale, Link, useLocation } from 'ice';
-import { IntlProvider as ReactIntlProvider } from 'react-intl';
-import { messages } from '@/locales';
-
-export default function Layout() {
- const location = useLocation();
- const [activeLocale, setLocale] = useLocale();
-
- return (
-
- Current locale: {activeLocale}
- Default locale: {getDefaultLocale()}
- Configured locales: {JSON.stringify(getAllLocales())}
-
- Choose language:
-
- {
- getAllLocales().map((locale: string) => {
- return (
-
- setLocale(locale)}
- // state={{ locale }}
- >
- {locale}
-
-
- );
- })
- }
-
-
-
-
-
- );
-}
diff --git a/examples/with-i18n/tsconfig.json b/examples/with-i18n/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-i18n/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-intl/.browserslistrc b/examples/with-intl/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-intl/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-intl/ice.config.mts b/examples/with-intl/ice.config.mts
deleted file mode 100644
index f721ecc97b..0000000000
--- a/examples/with-intl/ice.config.mts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { defineConfig } from '@ice/app';
-import intl from '@ice/plugin-intl';
-
-export default defineConfig(() => ({
- plugins: [intl()],
-}));
diff --git a/examples/with-intl/package.json b/examples/with-intl/package.json
deleted file mode 100644
index b54a99d39a..0000000000
--- a/examples/with-intl/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@examples/with-intl",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-intl": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/with-intl/public/favicon.ico b/examples/with-intl/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/with-intl/public/favicon.ico and /dev/null differ
diff --git a/examples/with-intl/src/app.tsx b/examples/with-intl/src/app.tsx
deleted file mode 100644
index b5373fa689..0000000000
--- a/examples/with-intl/src/app.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineAppConfig } from 'ice';
-import type { LocaleConfig } from '@ice/plugin-intl/types';
-
-export default defineAppConfig(() => ({}));
-
-export const locale: LocaleConfig = {
- getLocale: () => 'en-US',
-};
diff --git a/examples/with-intl/src/document.tsx b/examples/with-intl/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-intl/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-intl/src/global.css b/examples/with-intl/src/global.css
deleted file mode 100644
index 604282adc9..0000000000
--- a/examples/with-intl/src/global.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- font-size: 14px;
-}
diff --git a/examples/with-intl/src/locales/en-US.ts b/examples/with-intl/src/locales/en-US.ts
deleted file mode 100644
index 4e07843c44..0000000000
--- a/examples/with-intl/src/locales/en-US.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export default {
- new: 'New',
-};
diff --git a/examples/with-intl/src/locales/zh-CN.json b/examples/with-intl/src/locales/zh-CN.json
deleted file mode 100644
index 05912a29f6..0000000000
--- a/examples/with-intl/src/locales/zh-CN.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "new": "新建"
-}
diff --git a/examples/with-intl/src/pages/index.tsx b/examples/with-intl/src/pages/index.tsx
deleted file mode 100644
index 3d40c8df36..0000000000
--- a/examples/with-intl/src/pages/index.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { intl } from 'ice';
-
-export default function Home() {
- return (
- <>
- home
- {intl.formatMessage({ id: 'new' })}
- >
- );
-}
diff --git a/examples/with-intl/src/typings.d.ts b/examples/with-intl/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-intl/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-intl/tsconfig.json b/examples/with-intl/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-intl/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-jest/ice.config.mts b/examples/with-jest/ice.config.mts
deleted file mode 100644
index 562d28cc1d..0000000000
--- a/examples/with-jest/ice.config.mts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({}));
diff --git a/examples/with-jest/jest-setup.ts b/examples/with-jest/jest-setup.ts
deleted file mode 100644
index 7b0828bfa8..0000000000
--- a/examples/with-jest/jest-setup.ts
+++ /dev/null
@@ -1 +0,0 @@
-import '@testing-library/jest-dom';
diff --git a/examples/with-jest/jest.config.mjs b/examples/with-jest/jest.config.mjs
deleted file mode 100644
index 7bad10aec5..0000000000
--- a/examples/with-jest/jest.config.mjs
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineJestConfig } from '@ice/app';
-
-export default defineJestConfig({
- preset: 'ts-jest',
- setupFilesAfterEnv: ['/jest-setup.ts'],
- testEnvironment: 'jest-environment-jsdom',
-});
diff --git a/examples/with-jest/package.json b/examples/with-jest/package.json
deleted file mode 100644
index cb21bb3fa5..0000000000
--- a/examples/with-jest/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "@examples/with-jest",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build",
- "test": "jest"
- },
- "dependencies": {
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@ice/app": "workspace:*",
- "@testing-library/jest-dom": "^5.16.5",
- "@testing-library/react": "^13.3.0",
- "@types/jest": "^29.0.0",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "@types/testing-library__jest-dom": "^5.14.5",
- "jest": "^28.1.3",
- "jest-environment-jsdom": "^29.0.2",
- "ts-jest": "^28.0.8",
- "typescript": "^4.8.2"
- }
-}
\ No newline at end of file
diff --git a/examples/with-jest/src/add.ts b/examples/with-jest/src/add.ts
deleted file mode 100644
index 9a9a193946..0000000000
--- a/examples/with-jest/src/add.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import log from '@/log';
-
-export default function add(a: number, b: number) {
- log();
- return a + b;
-}
-
diff --git a/examples/with-jest/src/app.tsx b/examples/with-jest/src/app.tsx
deleted file mode 100644
index b84dfd61c1..0000000000
--- a/examples/with-jest/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/with-jest/src/components/Header.tsx b/examples/with-jest/src/components/Header.tsx
deleted file mode 100644
index c6eb1b72cb..0000000000
--- a/examples/with-jest/src/components/Header.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-
-export default function Header() {
- return (
- Jest Test
- );
-}
\ No newline at end of file
diff --git a/examples/with-jest/src/document.tsx b/examples/with-jest/src/document.tsx
deleted file mode 100644
index cc414afae5..0000000000
--- a/examples/with-jest/src/document.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-jest/src/log.ts b/examples/with-jest/src/log.ts
deleted file mode 100644
index 27bb829db6..0000000000
--- a/examples/with-jest/src/log.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function log() {
- console.log('log');
-}
\ No newline at end of file
diff --git a/examples/with-jest/src/pages/index.tsx b/examples/with-jest/src/pages/index.tsx
deleted file mode 100644
index 8f59483f72..0000000000
--- a/examples/with-jest/src/pages/index.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import Header from '../components/Header';
-
-export default function Home() {
- return (
-
- );
-}
diff --git a/examples/with-jest/tests/Header.spec.tsx b/examples/with-jest/tests/Header.spec.tsx
deleted file mode 100644
index 1af37b6e08..0000000000
--- a/examples/with-jest/tests/Header.spec.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import Header from '../src/components/Header';
-
-test('test Header component', () => {
- render();
- expect(screen.getByTestId('title')).toHaveTextContent('Jest Test');
-});
diff --git a/examples/with-jest/tests/add.spec.ts b/examples/with-jest/tests/add.spec.ts
deleted file mode 100644
index e98d85150f..0000000000
--- a/examples/with-jest/tests/add.spec.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import add from '../src/add';
-
-test('add', () => {
- expect(add(1, 2)).toBe(3);
-});
diff --git a/examples/with-jest/tsconfig.json b/examples/with-jest/tsconfig.json
deleted file mode 100644
index 2f2a840cb1..0000000000
--- a/examples/with-jest/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*", "tests", "./jest-setup.ts"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-jsx-plus/.browserslistrc b/examples/with-jsx-plus/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-jsx-plus/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-jsx-plus/ice.config.mts b/examples/with-jsx-plus/ice.config.mts
deleted file mode 100644
index 4e859965e3..0000000000
--- a/examples/with-jsx-plus/ice.config.mts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineConfig } from '@ice/app';
-import jsxPlus from '@ice/plugin-jsx-plus';
-
-export default defineConfig(() => ({
- plugins: [
- jsxPlus(),
- ],
-}));
diff --git a/examples/with-jsx-plus/package.json b/examples/with-jsx-plus/package.json
deleted file mode 100644
index e4b20cce81..0000000000
--- a/examples/with-jsx-plus/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "@examples/with-jsx-plus",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "ICE example with plugin-jsx-plus",
- "author": "ICE Team",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-jsx-plus": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "tslib": "^2.4.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.6"
- }
-}
diff --git a/examples/with-jsx-plus/src/app.tsx b/examples/with-jsx-plus/src/app.tsx
deleted file mode 100644
index eb34ba5f76..0000000000
--- a/examples/with-jsx-plus/src/app.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default {
- app: {
- rootId: 'app',
- },
-};
diff --git a/examples/with-jsx-plus/src/document.tsx b/examples/with-jsx-plus/src/document.tsx
deleted file mode 100644
index 7b7d02997c..0000000000
--- a/examples/with-jsx-plus/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-jsx-plus/src/pages/home.tsx b/examples/with-jsx-plus/src/pages/home.tsx
deleted file mode 100644
index 31cad2460c..0000000000
--- a/examples/with-jsx-plus/src/pages/home.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { useState } from 'react';
-import styles from './index.module.css';
-
-export default function Home() {
- const data = [
- {
- name: 'ice.js',
- age: '7',
- },
- {
- name: 'AppDevTools',
- age: '1',
- },
- ];
- const [isShow, setShow] = useState(true);
- return (
-
-
- Name: {d.name} Age: {d.age}
-
-
setShow(!isShow)}>Toggle Show
-
- );
-}
-
-export function pageConfig() {
- return {
- title: 'JSX Plus Example',
- };
-}
diff --git a/examples/with-jsx-plus/src/pages/index.module.css b/examples/with-jsx-plus/src/pages/index.module.css
deleted file mode 100644
index 836f971af7..0000000000
--- a/examples/with-jsx-plus/src/pages/index.module.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
diff --git a/examples/with-jsx-plus/src/typings.d.ts b/examples/with-jsx-plus/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-jsx-plus/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-jsx-plus/tsconfig.json b/examples/with-jsx-plus/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-jsx-plus/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-keep-alive-react/README.md b/examples/with-keep-alive-react/README.md
deleted file mode 100644
index deab322b7a..0000000000
--- a/examples/with-keep-alive-react/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# with-keep-alive
-
-Experimental keep-alive with React 18 ` `.
-
-## How to debug
-
-First of all, publish the package to the yalc repo.
-
-```bash
-$ cd packages/ice && yalc publish --push
-
-$ cd packages/runtime && yalc publish --push
-```
-
-Then, install the example dependencies.
-
-```bash
-$ cd examples/with-keep-alive
-
-$ yalc add @ice/app @ice/runtime
-
-$ yarn install
-
-$ npm run start
-```
diff --git a/examples/with-keep-alive-react/ice.config.mts b/examples/with-keep-alive-react/ice.config.mts
deleted file mode 100644
index 562d28cc1d..0000000000
--- a/examples/with-keep-alive-react/ice.config.mts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({}));
diff --git a/examples/with-keep-alive-react/package.json b/examples/with-keep-alive-react/package.json
deleted file mode 100644
index 7e50779b8c..0000000000
--- a/examples/with-keep-alive-react/package.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "@examples/with-keep-alive-react",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "dependencies": {
- "react": "0.0.0-experimental-0cdfef19b-20231211",
- "react-dom": "0.0.0-experimental-0cdfef19b-20231211"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- },
- "resolutions": {
- "react": "0.0.0-experimental-0cdfef19b-20231211",
- "react-dom": "0.0.0-experimental-0cdfef19b-20231211"
- }
-}
diff --git a/examples/with-keep-alive-react/src/app.ts b/examples/with-keep-alive-react/src/app.ts
deleted file mode 100644
index b84dfd61c1..0000000000
--- a/examples/with-keep-alive-react/src/app.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/with-keep-alive-react/src/components/Counter.tsx b/examples/with-keep-alive-react/src/components/Counter.tsx
deleted file mode 100644
index ed3f87b772..0000000000
--- a/examples/with-keep-alive-react/src/components/Counter.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { useState } from 'react';
-
-export default function Counter() {
- const [count, setCount] = useState(0);
-
- return (
-
- count: {count}
- setCount((count) => count + 1)}>add
-
- );
-}
diff --git a/examples/with-keep-alive-react/src/document.tsx b/examples/with-keep-alive-react/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-keep-alive-react/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-keep-alive-react/src/pages/about/index.tsx b/examples/with-keep-alive-react/src/pages/about/index.tsx
deleted file mode 100644
index 44fe380544..0000000000
--- a/examples/with-keep-alive-react/src/pages/about/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Link } from 'ice';
-import Counter from '@/components/Counter';
-
-export default function About() {
- return (
- <>
- About
-
- Home
-
- About Me
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'About',
- };
-}
diff --git a/examples/with-keep-alive-react/src/pages/about/layout.tsx b/examples/with-keep-alive-react/src/pages/about/layout.tsx
deleted file mode 100644
index 79fe76a821..0000000000
--- a/examples/with-keep-alive-react/src/pages/about/layout.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Outlet } from 'ice';
-
-export default function AboutLayout() {
- return (
- <>
- About Layout
-
- >
- );
-}
diff --git a/examples/with-keep-alive-react/src/pages/about/me.tsx b/examples/with-keep-alive-react/src/pages/about/me.tsx
deleted file mode 100644
index 4dcbe9a52c..0000000000
--- a/examples/with-keep-alive-react/src/pages/about/me.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Link } from 'ice';
-
-export default function About() {
- return (
- <>
- About Me
-
-
- About
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'About Me',
- };
-}
diff --git a/examples/with-keep-alive-react/src/pages/index.tsx b/examples/with-keep-alive-react/src/pages/index.tsx
deleted file mode 100644
index a48048df1a..0000000000
--- a/examples/with-keep-alive-react/src/pages/index.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Link } from 'ice';
-import Counter from '@/components/Counter';
-
-export default function Home() {
- return (
-
- Home
-
- About
-
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- };
-}
diff --git a/examples/with-keep-alive-react/src/pages/layout.tsx b/examples/with-keep-alive-react/src/pages/layout.tsx
deleted file mode 100644
index c78efc3dd4..0000000000
--- a/examples/with-keep-alive-react/src/pages/layout.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { KeepAliveOutlet } from 'ice';
-
-export default function Layout() {
- return (
- <>
- I'm Keep Alive
-
- >
- );
-}
diff --git a/examples/with-keep-alive-react/tsconfig.json b/examples/with-keep-alive-react/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-keep-alive-react/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-keep-alive/ice.config.mts b/examples/with-keep-alive/ice.config.mts
deleted file mode 100644
index 562d28cc1d..0000000000
--- a/examples/with-keep-alive/ice.config.mts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig(() => ({}));
diff --git a/examples/with-keep-alive/package.json b/examples/with-keep-alive/package.json
deleted file mode 100644
index c25c7ddc7a..0000000000
--- a/examples/with-keep-alive/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "@examples/with-keep-alive",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2"
- }
-}
diff --git a/examples/with-keep-alive/src/app.ts b/examples/with-keep-alive/src/app.ts
deleted file mode 100644
index b84dfd61c1..0000000000
--- a/examples/with-keep-alive/src/app.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig(() => ({}));
diff --git a/examples/with-keep-alive/src/components/Count.tsx b/examples/with-keep-alive/src/components/Count.tsx
deleted file mode 100644
index 6844d6bbf4..0000000000
--- a/examples/with-keep-alive/src/components/Count.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { useState } from 'react';
-
-export default function Count() {
- const [count, setCount] = useState(0);
- return (
-
-
count: {count}
-
setCount(count + 1)}>add
-
- );
-}
diff --git a/examples/with-keep-alive/src/document.tsx b/examples/with-keep-alive/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-keep-alive/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-keep-alive/src/pages/home.tsx b/examples/with-keep-alive/src/pages/home.tsx
deleted file mode 100644
index d2ba0709c0..0000000000
--- a/examples/with-keep-alive/src/pages/home.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Link } from 'ice';
-import Count from '@/components/Count';
-
-export default function Home() {
- return (
-
-
Home
-
- Index
-
- );
-}
diff --git a/examples/with-keep-alive/src/pages/index.tsx b/examples/with-keep-alive/src/pages/index.tsx
deleted file mode 100644
index fa163afcb6..0000000000
--- a/examples/with-keep-alive/src/pages/index.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { useEffect } from 'react';
-import { useActive, Link } from 'ice';
-import Count from '@/components/Count';
-
-export default function Home() {
- const active = useActive();
-
- useEffect(() => {
- if (active) {
- console.log('Page Index is actived');
- } else {
- console.log('Page Index is deactived');
- }
- }, [active]);
-
- return (
-
-
Index
-
- Home
-
- );
-}
diff --git a/examples/with-keep-alive/src/pages/layout.tsx b/examples/with-keep-alive/src/pages/layout.tsx
deleted file mode 100644
index cef958ddfc..0000000000
--- a/examples/with-keep-alive/src/pages/layout.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { KeepAliveOutlet } from 'ice';
-
-export default function Layout() {
- return (
-
-
Layout
-
-
- );
-}
diff --git a/examples/with-keep-alive/tsconfig.json b/examples/with-keep-alive/tsconfig.json
deleted file mode 100644
index 231e480d61..0000000000
--- a/examples/with-keep-alive/tsconfig.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
diff --git a/examples/with-nested-routes/.browserslistrc b/examples/with-nested-routes/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-nested-routes/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-nested-routes/ice.config.mts b/examples/with-nested-routes/ice.config.mts
deleted file mode 100644
index e7ac2d9da2..0000000000
--- a/examples/with-nested-routes/ice.config.mts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig({
- codeSplitting: false,
-});
diff --git a/examples/with-nested-routes/package.json b/examples/with-nested-routes/package.json
deleted file mode 100644
index 689dedfca9..0000000000
--- a/examples/with-nested-routes/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "@examples/with-nested-routes",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "speed-measure-webpack-plugin": "^1.5.0",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/with-nested-routes/src/app.tsx b/examples/with-nested-routes/src/app.tsx
deleted file mode 100644
index c1664902e9..0000000000
--- a/examples/with-nested-routes/src/app.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig({});
diff --git a/examples/with-nested-routes/src/components/bar.tsx b/examples/with-nested-routes/src/components/bar.tsx
deleted file mode 100644
index 7861bf5cb4..0000000000
--- a/examples/with-nested-routes/src/components/bar.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Bar() {
- return (
-
- bar
-
- );
-}
diff --git a/examples/with-nested-routes/src/document.tsx b/examples/with-nested-routes/src/document.tsx
deleted file mode 100644
index 20131b9d17..0000000000
--- a/examples/with-nested-routes/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
\ No newline at end of file
diff --git a/examples/with-nested-routes/src/pages/about/$id[.pdf].tsx b/examples/with-nested-routes/src/pages/about/$id[.pdf].tsx
deleted file mode 100644
index 81f2979509..0000000000
--- a/examples/with-nested-routes/src/pages/about/$id[.pdf].tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function About() {
- return (
- About 111.pdf
- );
-}
diff --git a/examples/with-nested-routes/src/pages/about/[index].tsx b/examples/with-nested-routes/src/pages/about/[index].tsx
deleted file mode 100644
index c4b46759a5..0000000000
--- a/examples/with-nested-routes/src/pages/about/[index].tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function About() {
- return (
- About [Index]
- );
-}
diff --git a/examples/with-nested-routes/src/pages/about/a.b.tsx b/examples/with-nested-routes/src/pages/about/a.b.tsx
deleted file mode 100644
index 01512edbd2..0000000000
--- a/examples/with-nested-routes/src/pages/about/a.b.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function About() {
- return (
- About a/b
- );
-}
diff --git a/examples/with-nested-routes/src/pages/about/abc[.pdf].tsx b/examples/with-nested-routes/src/pages/about/abc[.pdf].tsx
deleted file mode 100644
index 23f62dad0e..0000000000
--- a/examples/with-nested-routes/src/pages/about/abc[.pdf].tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function About() {
- return (
- About abc.pdf
- );
-}
diff --git a/examples/with-nested-routes/src/pages/about/index.tsx b/examples/with-nested-routes/src/pages/about/index.tsx
deleted file mode 100644
index 18cf9bf408..0000000000
--- a/examples/with-nested-routes/src/pages/about/index.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function About() {
- return (
- About Index
- );
-}
\ No newline at end of file
diff --git a/examples/with-nested-routes/src/pages/index.tsx b/examples/with-nested-routes/src/pages/index.tsx
deleted file mode 100644
index 6e73fa390a..0000000000
--- a/examples/with-nested-routes/src/pages/index.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Link } from 'ice';
-
-export default function Home() {
- return (
- <>
- link to sales page
- >
- );
-}
diff --git a/examples/with-nested-routes/src/pages/sales/favorites.tsx b/examples/with-nested-routes/src/pages/sales/favorites.tsx
deleted file mode 100644
index c070b67299..0000000000
--- a/examples/with-nested-routes/src/pages/sales/favorites.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Favorites() {
- return (
- <>
- my favorite items
- >
- );
-}
diff --git a/examples/with-nested-routes/src/pages/sales/index.module.css b/examples/with-nested-routes/src/pages/sales/index.module.css
deleted file mode 100644
index 509f387dc8..0000000000
--- a/examples/with-nested-routes/src/pages/sales/index.module.css
+++ /dev/null
@@ -1,24 +0,0 @@
-.tabs {
- display: flex;
- border-bottom: 1px solid #ccc;
-}
-
-.tabs a {
- line-height: 36px;
- color: #333;
- text-decoration: none;
- padding: 0 8px;
- margin-right: 10px;
- margin-bottom: 10px;
- border-radius: 4px;
- background-color: rgba(208, 215, 222, 0.32);
-}
-
-.tabs a:hover {
- background-color: rgba(208, 215, 222, 0.64);
-}
-
-.container {
- border-top: 1px solid #ccc;
- padding-top: 20px;
-}
\ No newline at end of file
diff --git a/examples/with-nested-routes/src/pages/sales/layout.tsx b/examples/with-nested-routes/src/pages/sales/layout.tsx
deleted file mode 100644
index 9ecd100c51..0000000000
--- a/examples/with-nested-routes/src/pages/sales/layout.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Outlet, Link } from 'ice';
-import styles from './index.module.css';
-
-export default () => {
- return (
-
-
Sales
-
- overview
- recommends
- favorites
-
-
-
-
-
- );
-};
diff --git a/examples/with-nested-routes/src/pages/sales/overview.tsx b/examples/with-nested-routes/src/pages/sales/overview.tsx
deleted file mode 100644
index 3c3b7b6ccf..0000000000
--- a/examples/with-nested-routes/src/pages/sales/overview.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Overview() {
- return (
- <>
- overview all sale items
- >
- );
-}
diff --git a/examples/with-nested-routes/src/pages/sales/recommends.tsx b/examples/with-nested-routes/src/pages/sales/recommends.tsx
deleted file mode 100644
index 89eb7658fd..0000000000
--- a/examples/with-nested-routes/src/pages/sales/recommends.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Recommends() {
- return (
- <>
- recommend items
- >
- );
-}
diff --git a/examples/with-nested-routes/src/types.ts b/examples/with-nested-routes/src/types.ts
deleted file mode 100644
index 2b7ee052a3..0000000000
--- a/examples/with-nested-routes/src/types.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export interface AppData {
- title: string;
- auth: {
- [key: string]: boolean;
- };
-}
\ No newline at end of file
diff --git a/examples/with-nested-routes/src/typings.d.ts b/examples/with-nested-routes/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-nested-routes/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-nested-routes/tsconfig.json b/examples/with-nested-routes/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-nested-routes/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-pha/.browserslistrc b/examples/with-pha/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-pha/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-pha/ice.config.mts b/examples/with-pha/ice.config.mts
deleted file mode 100644
index e34d7540b1..0000000000
--- a/examples/with-pha/ice.config.mts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { defineConfig } from '@ice/app';
-import pha from '@ice/plugin-pha';
-
-export default defineConfig({
- plugins: [pha({ template: true })],
- server: {
- onDemand: true,
- format: 'esm',
- },
- routes: {
- defineRoutes: (route) => {
- route('/custom', 'Custom/index.tsx');
- },
- },
-});
diff --git a/examples/with-pha/package.json b/examples/with-pha/package.json
deleted file mode 100644
index 9f1bbf2a90..0000000000
--- a/examples/with-pha/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "@examples/with-pha",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "",
- "author": "",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-pha": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.2",
- "webpack": "^5.88.0"
- }
-}
diff --git a/examples/with-pha/public/favicon.ico b/examples/with-pha/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/with-pha/public/favicon.ico and /dev/null differ
diff --git a/examples/with-pha/src/app-worker.ts b/examples/with-pha/src/app-worker.ts
deleted file mode 100644
index a9c6c3c695..0000000000
--- a/examples/with-pha/src/app-worker.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-addEventListener('tabbaritemclick', (data) => {
- console.log('tabbaritemclick: ', data);
-});
\ No newline at end of file
diff --git a/examples/with-pha/src/app.tsx b/examples/with-pha/src/app.tsx
deleted file mode 100644
index ddc79fcbf7..0000000000
--- a/examples/with-pha/src/app.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import type { Manifest } from '@ice/plugin-pha/types';
-
-export const phaManifest: Manifest = {
- title: 'test',
- appWorker: {
- url: 'app-worker.ts',
- },
- routes: [
- {
- pageHeader: {},
- frames: [
- 'blog',
- 'home',
- ],
- },
- 'home',
- 'about',
- 'custom',
- ],
-};
-
-export default {
- app: {
- rootId: 'app',
- },
-};
diff --git a/examples/with-pha/src/document.tsx b/examples/with-pha/src/document.tsx
deleted file mode 100644
index 1e7b99c49d..0000000000
--- a/examples/with-pha/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-pha/src/pages/Custom/index.tsx b/examples/with-pha/src/pages/Custom/index.tsx
deleted file mode 100644
index 2a83bff59f..0000000000
--- a/examples/with-pha/src/pages/Custom/index.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Link, useData, defineDataLoader } from 'ice';
-
-export default function Custom() {
- const data = useData();
-
- return (
- <>
- Custom Page
- home
- {data}
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Custom',
- };
-}
-
-export const dataLoader = defineDataLoader({
- key: 'List_list_prefetch_key',
- prefetch_type: 'mtop',
- api: 'mtop.xxx.xx.xx.xx',
- v: '2.0',
- data: {
- id: 12345,
- params: '{"refId":"${queryParams.refId}", "namespace":1, "searchTags":true }',
- },
- prefetchKey: 'List_list_prefetch_key',
- });
\ No newline at end of file
diff --git a/examples/with-pha/src/pages/about.tsx b/examples/with-pha/src/pages/about.tsx
deleted file mode 100644
index 144482a0e0..0000000000
--- a/examples/with-pha/src/pages/about.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { Link, defineDataLoader } from 'ice';
-
-export default function About() {
- return (
- <>
- About Page
- home
- new
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'About',
- meta: [
- {
- name: 'theme-color',
- content: '#eee',
- },
- ],
- links: [{
- href: 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css',
- rel: 'stylesheet',
- }],
- scripts: [{
- src: 'https://cdn.jsdelivr.net/npm/lodash@2.4.1/dist/lodash.min.js',
- }],
- };
-}
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'About',
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/with-pha/src/pages/blog.tsx b/examples/with-pha/src/pages/blog.tsx
deleted file mode 100644
index 4113cb37d1..0000000000
--- a/examples/with-pha/src/pages/blog.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Link, useData, useConfig } from 'ice';
-
-export default function Blog() {
- const data = useData();
- const config = useConfig();
-
- console.log('render Blog', 'data', data, 'config', config);
-
- return (
- <>
- Blog Page
- home
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Blog',
- };
-}
\ No newline at end of file
diff --git a/examples/with-pha/src/pages/home.tsx b/examples/with-pha/src/pages/home.tsx
deleted file mode 100644
index f5aaf1b72b..0000000000
--- a/examples/with-pha/src/pages/home.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { definePageConfig } from 'ice';
-
-export default function Home() {
- return (
- <>
- Home Page
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => {
- return {
- queryParamsPassKeys: [
- 'questionId',
- 'source',
- 'disableNav',
- ],
- title: 'Home',
- };
-});
diff --git a/examples/with-pha/src/pages/index.module.css b/examples/with-pha/src/pages/index.module.css
deleted file mode 100644
index 679273d44d..0000000000
--- a/examples/with-pha/src/pages/index.module.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
-
-.data {
- margin-top: 10px;
-}
-
-.homeContainer {
- align-items: center;
- margin-top: 200rpx;
-}
-
-.homeTitle {
- font-size: 45rpx;
- font-weight: bold;
- margin: 20rpx 0;
-}
-
-.homeInfo {
- font-size: 36rpx;
- margin: 8rpx 0;
- color: #555;
-}
diff --git a/examples/with-pha/src/pages/layout.tsx b/examples/with-pha/src/pages/layout.tsx
deleted file mode 100644
index 2460e127c7..0000000000
--- a/examples/with-pha/src/pages/layout.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { Outlet, defineDataLoader } from 'ice';
-
-export default () => {
- return (
-
-
ICE 3.0 Layout
-
-
- );
-};
-
-export function pageConfig() {
- return {
- title: 'Layout',
- meta: [
- {
- name: 'layout-color',
- content: '#f00',
- },
- ],
- };
-}
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- layout: true,
- });
- }, 1 * 100);
- });
-});
diff --git a/examples/with-pha/src/typings.d.ts b/examples/with-pha/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-pha/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-pha/tsconfig.json b/examples/with-pha/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-pha/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-request/.browserslistrc b/examples/with-request/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-request/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-request/ice.config.mts b/examples/with-request/ice.config.mts
deleted file mode 100644
index 750da564c1..0000000000
--- a/examples/with-request/ice.config.mts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { defineConfig } from '@ice/app';
-import request from '@ice/plugin-request';
-
-export default defineConfig(() => ({
- plugins: [
- request(),
- ],
-}));
diff --git a/examples/with-request/package.json b/examples/with-request/package.json
deleted file mode 100644
index fe27060741..0000000000
--- a/examples/with-request/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "@examples/with-request",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "ICE example with plugin-request",
- "author": "ICE Team",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/plugin-request": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "tslib": "^2.4.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.6"
- }
-}
diff --git a/examples/with-request/src/app.tsx b/examples/with-request/src/app.tsx
deleted file mode 100644
index a8c0f7a935..0000000000
--- a/examples/with-request/src/app.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { request as requestAPI, defineDataLoader } from 'ice';
-import { defineRequestConfig } from '@ice/plugin-request/types';
-
-export const dataLoader = defineDataLoader(async () => {
- try {
- return await requestAPI('/user');
- } catch (err) {
- console.log('request error', err);
- }
-});
-
-export default {
- app: {
- rootId: 'app',
- },
-};
-
-export const requestConfig = defineRequestConfig(() => ({
- // 可选的,全局设置 request 是否返回 response 对象,默认为 false
- withFullResponse: false,
- baseURL: '/api',
- headers: {},
- // 其它 RequestConfig 参数
-
- // 拦截器
- interceptors: {
- request: {
- onConfig: (config) => {
- // 发送请求前:可以对 RequestConfig 做一些统一处理
- config.headers = { a: 1 };
- return config;
- },
- onError: (error) => {
- return Promise.reject(error);
- },
- },
- response: {
- onConfig: (response) => {
- console.log(response);
- // 请求成功:可以做全局的 toast 展示,或者对 response 做一些格式化
- if (response.data.status === 1) {
- alert('请求失败');
- }
- return response;
- },
- onError: (error) => {
- // MOCK DATA for `/api/user`
- if (error.config.url === '/api/user') {
- return new Promise((resolve) => {
- setTimeout(() => {
- error.response.data = {
- name: 'ICE',
- age: 26,
- };
- resolve(error.response);
- }, 1000);
- });
- }
- // 请求出错:服务端返回错误状态码
- console.log(error.response.data);
- console.log(error.response.status);
- console.log(error.response.headers);
- return Promise.reject(error);
- },
- },
- },
-}));
diff --git a/examples/with-request/src/document.tsx b/examples/with-request/src/document.tsx
deleted file mode 100644
index 61e35a7ec2..0000000000
--- a/examples/with-request/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-request/src/pages/home.tsx b/examples/with-request/src/pages/home.tsx
deleted file mode 100644
index e7d5e3360c..0000000000
--- a/examples/with-request/src/pages/home.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { useEffect } from 'react';
-import { useRequest } from 'ice';
-import service from '../service';
-import styles from './index.module.css';
-
-export default function Home() {
- const { data, error, loading, request } = useRequest(service.getUser);
-
- useEffect(() => {
- request();
- // eslint-disable-next-line
- }, []);
-
- if (error) {
- return failed to load
;
- }
- if (!data || loading) {
- return loading...
;
- }
- return (
- <>
- Name: {data.name} Age: {data.age}
- >
- );
-}
-
-export function pageConfig() {
- return {
- title: 'Home',
- };
-}
diff --git a/examples/with-request/src/pages/index.module.css b/examples/with-request/src/pages/index.module.css
deleted file mode 100644
index 836f971af7..0000000000
--- a/examples/with-request/src/pages/index.module.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.title {
- color: red;
- margin-left: 10rpx;
-}
diff --git a/examples/with-request/src/pages/layout.tsx b/examples/with-request/src/pages/layout.tsx
deleted file mode 100644
index e8466f2f00..0000000000
--- a/examples/with-request/src/pages/layout.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Outlet, defineDataLoader, useData, request } from 'ice';
-
-export default () => {
- const data = useData();
- console.log(data);
-
- return (
-
-
ICE 3.0 Layout
-
-
- );
-};
-
-export function pageConfig() {
- return {
- title: 'Layout',
- meta: [
- {
- name: 'layout-color',
- content: '#f00',
- },
- ],
- };
-}
-
-export const dataLoader = defineDataLoader(async () => {
- try {
- const data = await request('/data');
- return data;
- } catch (e) {
- console.error(e);
- return {};
- }
-});
diff --git a/examples/with-request/src/service.ts b/examples/with-request/src/service.ts
deleted file mode 100644
index 98f22460db..0000000000
--- a/examples/with-request/src/service.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { request } from 'ice';
-
-const service = {
- async getUser() {
- return await request('/api/user');
- },
-
- async getRepo(id) {
- return await request(`/api/repo/${id}`);
- },
-
- async getDetail(params) {
- const data = await request({
- url: '/api/detail',
- params,
- });
-
- return data.map(item => {
- return {
- ...item,
- price: item.oldPrice,
- text: item.status === '1' ? '确定' : '取消',
- };
- });
- },
-};
-export default service;
diff --git a/examples/with-request/src/typings.d.ts b/examples/with-request/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-request/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-request/tsconfig.json b/examples/with-request/tsconfig.json
deleted file mode 100644
index 26fd9ec799..0000000000
--- a/examples/with-request/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-ssg/.browserslistrc b/examples/with-ssg/.browserslistrc
deleted file mode 100644
index 7637baddc3..0000000000
--- a/examples/with-ssg/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-chrome 55
\ No newline at end of file
diff --git a/examples/with-ssg/ice.config.mts b/examples/with-ssg/ice.config.mts
deleted file mode 100644
index cbfe8999c4..0000000000
--- a/examples/with-ssg/ice.config.mts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig({
- ssr: false,
-});
diff --git a/examples/with-ssg/package.json b/examples/with-ssg/package.json
deleted file mode 100644
index 7ff04db320..0000000000
--- a/examples/with-ssg/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "@examples/with-ssg",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "ICE example with ssg",
- "author": "ICE Team",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.6"
- }
-}
diff --git a/examples/with-ssg/src/app.tsx b/examples/with-ssg/src/app.tsx
deleted file mode 100644
index 8ae11aed57..0000000000
--- a/examples/with-ssg/src/app.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineDataLoader } from 'ice';
-
-export default {
- app: {
- rootId: 'app',
- },
-};
-
-export const dataLoader = defineDataLoader(async () => {
- return {
- id: 123,
- };
-});
diff --git a/examples/with-ssg/src/document.tsx b/examples/with-ssg/src/document.tsx
deleted file mode 100644
index 4f850e15c5..0000000000
--- a/examples/with-ssg/src/document.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-ssg/src/pages/index.tsx b/examples/with-ssg/src/pages/index.tsx
deleted file mode 100644
index fd6781a8ca..0000000000
--- a/examples/with-ssg/src/pages/index.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { useData, defineDataLoader, defineStaticDataLoader, useAppData } from 'ice';
-import { useState } from 'react';
-
-export default function Home() {
- const data = useData();
- const appData = useAppData();
-
- return (
- <>
- With SSG
-
- id: {appData.id}
- price: {data.price}
- >
- );
-}
-
-function Counter() {
- const [count, setCount] = useState(0);
-
- function updateCount() {
- setCount(count + 1);
- }
-
- return (
-
- 👍🏻 {count}
-
- );
-}
-
-export const dataLoader = defineDataLoader(() => {
- return {
- price: 99.99,
- };
-});
-
-export const staticDataLoader = defineStaticDataLoader(() => {
- return {
- price: '0.00',
- };
-});
diff --git a/examples/with-ssg/src/pages/layout.tsx b/examples/with-ssg/src/pages/layout.tsx
deleted file mode 100644
index 04113ad6ed..0000000000
--- a/examples/with-ssg/src/pages/layout.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Outlet } from 'ice';
-
-export default function Layout() {
- console.log('render layout');
-
- return (
- <>
- With SSG
-
- >
- );
-}
\ No newline at end of file
diff --git a/examples/with-ssg/src/typings.d.ts b/examples/with-ssg/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-ssg/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-ssg/tsconfig.json b/examples/with-ssg/tsconfig.json
deleted file mode 100644
index e41a1f451f..0000000000
--- a/examples/with-ssg/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "esnext",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-store/ice.config.mts b/examples/with-store/ice.config.mts
deleted file mode 100644
index d9944d8bb5..0000000000
--- a/examples/with-store/ice.config.mts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { defineConfig } from '@ice/app';
-import store from '@ice/plugin-store';
-
-export default defineConfig(() => ({
- ssg: false,
- plugins: [
- store({
- resetPageState: true,
- }),
- ],
-}));
diff --git a/examples/with-store/package.json b/examples/with-store/package.json
deleted file mode 100644
index 1027af687f..0000000000
--- a/examples/with-store/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "@examples/with-store",
- "private": true,
- "version": "1.0.0",
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*"
- },
- "devDependencies": {
- "@ice/plugin-store": "workspace:*",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "tslib": "^2.4.0"
- }
-}
\ No newline at end of file
diff --git a/examples/with-store/public/favicon.ico b/examples/with-store/public/favicon.ico
deleted file mode 100644
index a2605c57e9..0000000000
Binary files a/examples/with-store/public/favicon.ico and /dev/null differ
diff --git a/examples/with-store/src/app.tsx b/examples/with-store/src/app.tsx
deleted file mode 100644
index a41605439a..0000000000
--- a/examples/with-store/src/app.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { defineAppConfig, defineDataLoader } from 'ice';
-import { defineStoreConfig } from '@ice/plugin-store/types';
-
-export const storeConfig = defineStoreConfig(async (appData) => {
- return {
- initialStates: {
- ...appData,
- },
- };
-});
-
-export const dataLoader = defineDataLoader(() => {
- return new Promise((resolve) => {
- resolve({
- user: {
- name: 'icejs',
- },
- });
- });
-});
-
-export default defineAppConfig(() => ({
- router: {
- type: 'hash',
- },
-}));
diff --git a/examples/with-store/src/document.tsx b/examples/with-store/src/document.tsx
deleted file mode 100644
index a61df501ef..0000000000
--- a/examples/with-store/src/document.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Document;
diff --git a/examples/with-store/src/models/user.ts b/examples/with-store/src/models/user.ts
deleted file mode 100644
index 90fef0c898..0000000000
--- a/examples/with-store/src/models/user.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { createModel } from 'ice';
-
-export default createModel({
- state: {
- name: '',
- },
-});
diff --git a/examples/with-store/src/pages/blog/first-post.tsx b/examples/with-store/src/pages/blog/first-post.tsx
deleted file mode 100644
index 35aedd9c26..0000000000
--- a/examples/with-store/src/pages/blog/first-post.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Link } from 'ice';
-import pageStore from './store';
-
-function FirstPost() {
- const [infoState] = pageStore.useModel('info');
-
- return (
- <>
-
- {infoState.posts[0].title}
-
- Back
- >
- );
-}
-
-export default FirstPost;
diff --git a/examples/with-store/src/pages/blog/index.tsx b/examples/with-store/src/pages/blog/index.tsx
deleted file mode 100644
index 0213470ef1..0000000000
--- a/examples/with-store/src/pages/blog/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Link } from 'ice';
-import pageStore from './store';
-
-function Blog() {
- const [infoState] = pageStore.useModel('info');
-
- return (
-
- Blog Count: {infoState.posts.length}
-
- {infoState.posts.map(({ title, id }) => {
- return {title} ;
- })}
-
-
Home
-
- );
-}
-
-export default Blog;
diff --git a/examples/with-store/src/pages/blog/layout.tsx b/examples/with-store/src/pages/blog/layout.tsx
deleted file mode 100644
index 9a5d94f9ce..0000000000
--- a/examples/with-store/src/pages/blog/layout.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Outlet } from 'ice';
-import store from './store';
-
-function layout() {
- const [infoState] = store.useModel('info');
- return (
- <>
- {infoState.title}
-
- >
- );
-}
-
-export default layout;
\ No newline at end of file
diff --git a/examples/with-store/src/pages/blog/models/info.ts b/examples/with-store/src/pages/blog/models/info.ts
deleted file mode 100644
index 60924a2444..0000000000
--- a/examples/with-store/src/pages/blog/models/info.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { createModel } from 'ice';
-
-export default createModel({
- state: {
- title: 'ICE Blog',
- posts: [
- { title: 'First Post', id: 'first-post' },
- ],
- },
-});
diff --git a/examples/with-store/src/pages/blog/store.ts b/examples/with-store/src/pages/blog/store.ts
deleted file mode 100644
index 4a1f21686d..0000000000
--- a/examples/with-store/src/pages/blog/store.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { createStore } from 'ice';
-import info from './models/info';
-
-export default createStore({ info });
diff --git a/examples/with-store/src/pages/ice.png b/examples/with-store/src/pages/ice.png
deleted file mode 100644
index e5e98fac1e..0000000000
Binary files a/examples/with-store/src/pages/ice.png and /dev/null differ
diff --git a/examples/with-store/src/pages/index.tsx b/examples/with-store/src/pages/index.tsx
deleted file mode 100644
index 36ed640458..0000000000
--- a/examples/with-store/src/pages/index.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Link, definePageConfig } from 'ice';
-import pageStore from './store';
-import logo from './ice.png';
-import appStore from '@/store';
-
-function Home() {
- const [userState] = appStore.useModel('user');
- const [countState, countDispatcher] = pageStore.useModel('counter');
- return (
- <>
-
- name: {userState.name}
-
-
-
- countDispatcher.inc()}>+
- {countState.count}
- countDispatcher.dec()}>-
-
- <>
- Blog
-
- Login
- >
- >
- );
-}
-
-export const pageConfig = definePageConfig(() => ({
- title: 'Home Page',
-}));
-
-export default Home;
diff --git a/examples/with-store/src/pages/login.tsx b/examples/with-store/src/pages/login.tsx
deleted file mode 100644
index e7a616cd8f..0000000000
--- a/examples/with-store/src/pages/login.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { history } from 'ice';
-import store from '@/store';
-
-export default function Login() {
- const [, userDispatcher] = store.useModel('user');
-
- function login() {
- userDispatcher.setState({ name: 'Hello' });
- history?.push('/');
- }
-
- return (
- login()} id="login-click">Click Me to Login
- );
-}
diff --git a/examples/with-store/src/pages/models/counter.ts b/examples/with-store/src/pages/models/counter.ts
deleted file mode 100644
index d47da9565b..0000000000
--- a/examples/with-store/src/pages/models/counter.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { createModel } from 'ice';
-
-export default createModel({
- state: {
- count: 0,
- },
- reducers: {
- inc(prevState, count = 1) {
- prevState.count += count;
- },
- dec(prevState, count = 1) {
- prevState.count -= count;
- },
- },
-});
diff --git a/examples/with-store/src/pages/store.ts b/examples/with-store/src/pages/store.ts
deleted file mode 100644
index fd399d4f11..0000000000
--- a/examples/with-store/src/pages/store.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { createStore } from 'ice';
-import counter from './models/counter';
-
-const store = createStore({ counter });
-
-export default store;
diff --git a/examples/with-store/src/store.ts b/examples/with-store/src/store.ts
deleted file mode 100644
index 4ece95481c..0000000000
--- a/examples/with-store/src/store.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { createStore } from 'ice';
-import user from './models/user';
-console.log('app store depend on window', window);
-export default createStore({ user });
diff --git a/examples/with-store/src/typings.d.ts b/examples/with-store/src/typings.d.ts
deleted file mode 100644
index 1f6ba4ffa6..0000000000
--- a/examples/with-store/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/examples/with-store/tsconfig.json b/examples/with-store/tsconfig.json
deleted file mode 100644
index 7f2f2ffce9..0000000000
--- a/examples/with-store/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compileOnSave": false,
- "buildOnSave": false,
- "compilerOptions": {
- "baseUrl": ".",
- "outDir": "build",
- "module": "esnext",
- "target": "es6",
- "jsx": "react-jsx",
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true,
- "lib": ["es6", "dom"],
- "sourceMap": true,
- "allowJs": true,
- "rootDir": "./",
- "forceConsistentCasingInFileNames": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": false,
- "importHelpers": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "paths": {
- "@/*": ["./src/*"],
- "ice": [".ice"]
- }
- },
- "include": ["src", ".ice", "ice.config.*"],
- "exclude": ["node_modules", "build", "public"]
-}
\ No newline at end of file
diff --git a/examples/with-suspense-ssr/ice.config.mts b/examples/with-suspense-ssr/ice.config.mts
deleted file mode 100644
index 02208a54f6..0000000000
--- a/examples/with-suspense-ssr/ice.config.mts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineConfig } from '@ice/app';
-
-export default defineConfig({
- ssr: true,
-});
diff --git a/examples/with-suspense-ssr/package.json b/examples/with-suspense-ssr/package.json
deleted file mode 100644
index b6c25658de..0000000000
--- a/examples/with-suspense-ssr/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "@examples/with-suspense-ssr",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "start": "ice start",
- "build": "ice build"
- },
- "description": "ICE example with suspense ssr",
- "author": "ICE Team",
- "license": "MIT",
- "dependencies": {
- "@ice/app": "workspace:*",
- "@ice/runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
- },
- "devDependencies": {
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.6"
- }
-}
diff --git a/examples/with-suspense-ssr/src/app.tsx b/examples/with-suspense-ssr/src/app.tsx
deleted file mode 100644
index 1ceb78f306..0000000000
--- a/examples/with-suspense-ssr/src/app.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineAppConfig } from 'ice';
-
-export default defineAppConfig({
- app: {
- rootId: 'app',
- },
-});
diff --git a/examples/with-suspense-ssr/src/components/Comments.tsx b/examples/with-suspense-ssr/src/components/Comments.tsx
deleted file mode 100644
index 252ee4bc02..0000000000
--- a/examples/with-suspense-ssr/src/components/Comments.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { useSuspenseData, withSuspense } from 'ice';
-
-function Comments() {
- const comments = useSuspenseData(getData);
-
- console.log('Render: Comments');
-
- return (
-
- {comments.map((comment, i) => (
-
- {comment}
-
- ))}
-
- );
-}
-
-export default withSuspense(Comments);
-
-const fakeData = [
- "Wait, it doesn't wait for React to load?",
- 'How does this even work?',
- 'I like marshmallows',
-];
-
-async function getData(ctx) {
- console.log(ctx);
- console.log('load comments');
-
- await new Promise((resolve) => {
- setTimeout(() => resolve(null), 3000);
- });
-
- return fakeData;
-}
diff --git a/examples/with-suspense-ssr/src/components/Footer.tsx b/examples/with-suspense-ssr/src/components/Footer.tsx
deleted file mode 100644
index 27ceace7ba..0000000000
--- a/examples/with-suspense-ssr/src/components/Footer.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { useSuspenseData, withSuspense } from 'ice';
-
-function Footer() {
- const data = useSuspenseData(getData);
-
- console.log('Render: Footer');
-
- return (
-
-
{data.title}
-
- );
-}
-
-export default withSuspense(Footer);
-
-const fakeData = {
- title: 'Thanks for reading!',
-};
-
-async function getData() {
- console.log('load footer');
-
- await new Promise((resolve) => {
- setTimeout(() => resolve(null), 2000);
- });
-
- return fakeData;
-}
\ No newline at end of file
diff --git a/examples/with-suspense-ssr/src/document.tsx b/examples/with-suspense-ssr/src/document.tsx
deleted file mode 100644
index 5830d41615..0000000000
--- a/examples/with-suspense-ssr/src/document.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Meta, Title, Links, Main, Scripts } from 'ice';
-
-function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
';
- const tokens = new Scaner(s).scan();
- expect(tokens[1].content).toBe('script');
- });
- test('html should be rendered successfully', () => {
- const s = 'hello world
';
- const res = parser(s, document);
- expect(res[0].props.class).toBe('h5-script');
- expect(res[1].childNodes[0]._value).toBe('hello world');
- });
-});
-
-describe('sort style', () => {
- test('cssText should be sort', () => {
- const html = `
-
-
- `;
- const res = parser(html, document);
- const node = res[0];
-
- expect(node.style.cssText).toBe('color: blue; font-size: 12px;');
- });
-
- describe('html with transformText', () => {
- test('transformText function works', () => {
- options.html.transformText = text => {
- text._value = 'c';
- return text;
- };
- const html = 'a ';
- const res = parser(html, document);
- const node = res[0];
- expect(node.childNodes[0]._value).toBe('c');
- });
- });
-});
diff --git a/packages/miniapp-runtime/src/tests/react.spec.js b/packages/miniapp-runtime/src/tests/react.spec.js
deleted file mode 100644
index 05eed447cc..0000000000
--- a/packages/miniapp-runtime/src/tests/react.spec.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { expect, describe, test, vi } from 'vitest';
-import { document, createEvent } from '../index';
-describe('react', () => {
- test('event should work', () => {
- const div = document.createElement('div');
- const spy = vi.fn();
- div.addEventListener('tap', spy);
- const event = createEvent({ type: 'tap' }, div);
- div.dispatchEvent(event);
- expect(spy).toBeCalledTimes(1);
- });
-});
diff --git a/packages/miniapp-runtime/src/tests/style.spec.js b/packages/miniapp-runtime/src/tests/style.spec.js
deleted file mode 100644
index 5242b7df36..0000000000
--- a/packages/miniapp-runtime/src/tests/style.spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { expect, describe, test } from 'vitest';
-import { Style, document } from '../index';
-
-describe('style', () => {
- test('works', () => {
- const root = document.createElement('root');
- const style = new Style(root);
- style.color = 'red';
- expect(style._usedStyleProp.size).toBe(1);
- expect(style.getPropertyValue('color')).toBe('red');
- style.fontSize = '16';
- expect(style._usedStyleProp.size).toBe(2);
- expect(style.getPropertyValue('font-size')).toBe('16');
- style.removeProperty('font-size');
- expect(style._usedStyleProp.size).toBe(1);
- expect(style.fontSize).toBe('');
- style.setProperty('font-weight', 'bold');
- expect(style._usedStyleProp.size).toBe(2);
- expect(style.fontWeight).toBe('bold');
- expect(style.cssText).toBe('color: red; font-weight: bold;');
- style.cssText = '';
- expect(style.cssText).toBe('');
- expect(style._usedStyleProp.size).toBe(0);
- expect(style.color).toBe('');
- expect(style.fontWeight).toBe('');
- style.textAlign = 'center';
- expect(style.cssText).toBe('text-align: center;');
- style.cssText = 'color: red; font-weight: bold;';
- expect(style._usedStyleProp.size).toBe(2);
- expect(style.fontWeight).toBe('bold');
- expect(style.color).toBe('red');
- });
-});
diff --git a/packages/miniapp-runtime/src/tests/utils.js b/packages/miniapp-runtime/src/tests/utils.js
deleted file mode 100644
index 4296ccb504..0000000000
--- a/packages/miniapp-runtime/src/tests/utils.js
+++ /dev/null
@@ -1,8 +0,0 @@
-
-export const delay = (ms = 2) => {
- return new Promise(resolve => {
- setTimeout(() => {
- resolve();
- }, ms);
- });
-};
diff --git a/packages/miniapp-runtime/src/types.ts b/packages/miniapp-runtime/src/types.ts
deleted file mode 100644
index dd0b786b3d..0000000000
--- a/packages/miniapp-runtime/src/types.ts
+++ /dev/null
@@ -1,561 +0,0 @@
-/**
- * 微信小程序全局 Window 配置和页面配置的公共项目
- */
-interface CommonConfig {
- /** 导航栏背景颜色,HexColor
- * @default: "#000000"
- */
- navigationBarBackgroundColor?: string;
- /** 导航栏标题颜色,仅支持 black/white
- * @default: "white"
- */
- navigationBarTextStyle?: 'white' | 'black';
- /** 导航栏标题文字内容 */
- navigationBarTitleText?: string;
- /** 导航栏样式,仅支持以下值:
- * - default 默认样式
- * - custom 自定义导航栏
- */
- navigationStyle?: 'default' | 'custom';
- /** 窗口的背景色, HexColor
- * @default: "#ffffff"
- */
- backgroundColor?: string;
- /** 下拉背景字体、loading 图的样式,仅支持 dark/light
- * @default: "dark"
- */
- backgroundTextStyle?: 'dark' | 'light';
- /** 顶部窗口的背景色,仅 iOS 支持
- * @default: "#ffffff"
- */
- backgroundColorTop?: string;
- /** 底部窗口的背景色,仅 iOS 支持
- * @default: "#ffffff"
- */
- backgroundColorBottom?: string;
- /** 是否开启下拉刷新
- * @default: false
- */
- enablePullDownRefresh?: boolean;
- /** 页面上拉触底事件触发时距页面底部距离,单位为 px
- * @default: 50
- */
- onReachBottomDistance?: number;
- /** 屏幕旋转设置
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/view/resizable.html
- */
- pageOrientation?: 'auto' | 'portrait' | 'landscape';
- /** 页面初始渲染缓存配置,支持 static / dynamic */
- initialRenderingCache?: 'static' | 'dynamic';
- /** 重新启动策略配置
- * - homePage: 如果从这个页面退出小程序,下次将从首页冷启动
- * - homePageAndLatestPage: 如果从这个页面退出小程序,下次冷启动后立刻加载这个页面,页面的参数保持不变(不可用于 tab 页)
- * @default "homePage"
- */
- restartStrategy?: 'homePage' | 'homePageAndLatestPage';
-}
-
-export interface MiniappPageConfig extends CommonConfig {
- /** 设置为 true 则页面整体不能上下滚动;
- * 只在页面配置中有效,无法在 app.json 中设置该项
- * @default: false
- */
- disableScroll?: boolean;
- /** 是否使用页面全局滚动,MPA下默认为全局滚动,SPA默认为局部滚动
- * 只在H5生效
- * @default: MPA:true SPA:false
- */
- usingWindowScroll?: boolean;
- /** 禁止页面右滑手势返回
- *
- * **注意** 自微信客户端 7.0.5 开始,页面配置中的 disableSwipeBack 属性将不再生效,
- * 详情见[右滑手势返回能力调整](https://developers.weixin.qq.com/community/develop/doc/000868190489286620a8b27f156c01)公告
- * @default: false
- * @since 微信客户端 7.0.0
- */
- disableSwipeBack?: boolean;
- /** 是否启用分享给好友。
- * @default false
- */
- enableShareAppMessage?: boolean;
- /** 是否启用分享到朋友圈。
- * @default false
- */
- enableShareTimeline?: boolean;
- /**
- * 页面是否需要使用 \ 和 \ 组件
- * @default false
- * @support weapp, alipay
- */
- enablePageMeta?: boolean;
- /** 页面自定义组件配置
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/
- */
- usingComponents?: Record;
- /** 指定使用升级后的 weui 样式
- * - v2: 可表明启用新版的组件样式
- * @default default
- */
- style?: string;
- /** 单页模式相关配置 */
- singlePage?: SinglePage;
- /**
- * 事件监听是否为 passive
- * @default false
- * @see https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#enablePassiveEvent
- */
- enablePassiveEvent?:
- | boolean
- | {
- /**
- * 是否设置 touchstart 事件为 passive
- * @default false
- */
- touchstart?: boolean;
- /**
- * 是否设置 touchmove 事件为 passive
- * @default false
- */
- touchmove?: boolean;
- /**
- * 是否设置 wheel 事件为 passive
- * @default false
- */
- wheel?: boolean;
- };
- /**
- * 渲染后端
- * @default "webview"
- */
- renderer?: 'webview' | 'skyline';
- /**
- * 组件框架
- * @default "exparser"
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/glass-easel/migration.html
- */
- componentFramework?: 'exparser' | 'glass-easel';
- /**
- * 指定特殊的样式隔离选项
- *
- * isolated 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响(一般情况下的默认值)
- *
- * apply-shared 表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面
- *
- * shared 表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了 apply-shared 或 shared 的自定义组件。(这个选项在插件中不可用。)
- */
- styleIsolation?: 'isolated' | 'apply-shared' | 'shared';
- /**
- * 设置导航栏额外图标,目前支持设置属性 icon,值为图标 url(以 https/http 开头)或 base64 字符串,大小建议 30*30 px
- *
- * 点击后触发 onOptionMenuClick(**注意**:该配置即将废弃。)。
- * @supported alipay
- */
- optionMenu?: Record;
- /**
- * 设置导航栏图标主题,仅支持真机预览。"default" 为蓝色图标,"light" 为白色图标。
- * @supported alipay
- */
- barButtonTheme?: string;
-}
-
-interface WindowConfig extends CommonConfig {
- /** 切入系统后台时,隐藏页面内容,保护用户隐私。支持 hidden / none
- * @default none
- */
- visualEffectInBackground?: 'hidden' | 'none';
- /** 是否允许下拉刷新
- * 备注:下拉刷新生效的前提是 allowsBounceVertical 值为 YES
- * @default: "NO"
- */
- pullRefresh?: 'YES' | 'NO' | boolean;
- /** 是否允许向下拉拽
- * @default: "YES"
- */
- allowsBounceVertical?: 'YES' | 'NO';
-}
-
-interface TabBarItem {
- /** 页面路径,必须在 pages 中先定义 */
- pagePath: string;
- /** tab 上按钮文字 */
- text: string;
- /** 图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片 */
- iconPath?: string;
- /** 选中时的图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效 */
- selectedIconPath?: string;
-}
-
-interface TabBar {
- /** tab 上的文字默认颜色 */
- color?: string;
- /** tab 上的文字选中时的颜色 */
- selectedColor?: string;
- /** tab 的背景色 */
- backgroundColor?: string;
- /** tabbar上边框的颜色, 仅支持 black/white
- * @default: black
- */
- borderStyle?: 'black' | 'white';
- /** tab 的列表,详见 list 属性说明,最少 2 个、最多 5 个 tab */
- list: TabBarItem[];
- /** tabbar 的位置,可选值 bottom、top
- * @default: 'bottom'
- */
- position?: 'bottom' | 'top';
- /** 自定义 tabBar,见[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html)
- * @default false
- * @since 2.1.0
- */
- custom?: boolean;
-}
-
-interface NetworkTimeout {
- /**
- * @default 60000
- */
- request?: number;
- /**
- * @default 60000
- */
- connectSocket?: number;
- /**
- * @default 60000
- */
- uploadFile?: number;
- /**
- * @default 60000
- */
- downloadFile?: number;
-}
-
-interface SubPackage {
- /** 分包根路径
- * - 注意:不能放在主包pages目录下
- */
- root: string;
- /** 分包路径下的所有页面配置 */
- pages: string[];
- /** 分包别名,分包预下载时可以使用 */
- name?: string;
- /** 分包是否是独立分包 */
- independent?: boolean;
- /** 分包支持引用独立的插件 */
- plugins?: Plugins;
-}
-
-interface Plugins {
- [key: string]: {
- version: string;
- provider: string;
- };
-}
-
-interface PreloadRule {
- [key: string]: {
- /** 进入页面后预下载分包的 root 或 name。__APP__ 表示主包。 */
- packages: string[];
- /** 在指定网络下预下载,可选值为:
- * - all: 不限网络
- * - wifi: 仅wifi下预下载
- * @default "wifi"
- */
- network?: 'all' | 'wifi';
- };
-}
-
-interface Permission {
- [key: string]: {
- /** 小程序获取权限时展示的接口用途说明。最长30个字符 */
- desc: string;
- };
-}
-
-interface SinglePage {
- /** 导航栏与页面的相交状态,值为 float 时表示导航栏浮在页面上,与页面相交;值为 squeezed 时表示页面被导航栏挤压,与页面不相交
- * @default "默认自动调整,若原页面是自定义导航栏,则为 float,否则为 squeezed"
- */
- navigationBarFit?: string;
-}
-
-interface RouterAnimate {
- /** 动画切换时间,单位毫秒
- * @default 300
- */
- duration?: number;
- /** 动画切换时间,单位毫秒
- * @default 50
- */
- delay?: number;
-}
-
-export interface MiniappAppConfig {
- /** 小程序默认启动首页,未指定 entryPagePath 时,数组的第一项代表小程序的初始页面(首页)。 */
- entryPagePath?: string;
- /** 接受一个数组,每一项都是字符串,来指定小程序由哪些页面组成,数组的第一项代表小程序的初始页面 */
- pages?: string[];
- /** 全局的默认窗口表现 */
- window?: WindowConfig;
- /** 底部 tab 栏的表现 */
- tabBar?: TabBar;
- /** 各类网络请求的超时时间,单位均为毫秒。 */
- networkTimeout?: NetworkTimeout;
- /** 是否开启 debug 模式,默认关闭
- * @default false
- */
- debug?: boolean;
- /** 启用插件功能页时,插件所有者小程序需要设置其 functionalPages 为 true。
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/functional-pages.html
- * @default false
- * @since 2.1.0
- */
- functionalPages?:
- | boolean
- | {
- independent?: boolean;
- };
- /** 分包结构配置
- * @example
- * ```json
- * [
- * {
- * root: 'packages/module',
- * pages: [
- * 'pages/page/index'
- * ]
- * }
- * ]
- * ```
- * @since 1.7.3
- */
- subPackages?: SubPackage[];
- subpackages?: SubPackage[];
- /** Worker 代码放置的目录
- * 使用 Worker 处理多线程任务时,设置 Worker 代码放置的目录
- * @since 1.9.90
- */
- workers?: string | string[];
- /** 申明需要后台运行的能力,类型为数组。目前支持以下项目:
- * - audio: 后台音乐播放
- * - location: 后台定位
- * @since 微信客户端 6.7.2 及以上版本支持
- */
- requiredBackgroundModes?: ('audio' | 'location')[];
- /** 申明需要使用的地理位置相关接口,类型为数组。目前支持以下项目:
- * 自 2022 年 7 月 14 日后发布的小程序,使用以下8个地理位置相关接口时,需要声明该字段,否则将无法正常使用。2022 年 7 月 14 日前发布的小程序不受影响。
- * - getFuzzyLocation: 获取模糊地理位置
- * - getLocation: 获取精确地理位置
- * - onLocationChange: 监听试试地理位置变化事件
- * - startLocationUpdate: 接收位置消息(前台)
- * - startLocationUpdateBackground: 接收位置消息(前后台)
- * - chooseLocation: 打开地图选择位置
- * - choosePoi: 打开 POI 列表选择位置
- * - chooseAddress: 获取用户地址信息
- * @see https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#requiredPrivateInfos
- */
- requiredPrivateInfos?: (
- | 'getFuzzyLocation'
- | 'getLocation'
- | 'onLocationChange'
- | 'startLocationUpdate'
- | 'startLocationUpdateBackground'
- | 'chooseLocation'
- | 'choosePoi'
- | 'chooseAddress'
- )[];
- /** 使用到的插件
- * @since 1.9.6
- */
- plugins?: Plugins;
- /** 声明分包预下载的规则。
- * preloadRule 中,key 是页面路径,value 是进入此页面的预下载配置
- * 注意: 分包预下载目前只支持通过配置方式使用,暂不支持通过调用API完成。
- * vConsole 里有 preloadSubpackages 开头的日志信息,可以用来验证预下载的情况。
- * @since 2.3.0
- */
- preloadRule?: PreloadRule;
- /** PC 小程序是否支持用户任意改变窗口大小(包括最大化窗口);iPad 小程序是否支持屏幕旋转
- * @default false
- * @since 2.3.0
- */
- resizable?: boolean;
- /** 需要跳转的小程序列表
- * @since 2.4.0
- */
- navigateToMiniProgramAppIdList?: string[];
- /** 全局自定义组件配置
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/
- */
- usingComponents?: Record;
- /** 小程序接口权限相关设置
- * @since 微信客户端 7.0.0
- */
- permission?: Permission;
- /** 指明 sitemap.json 的位置 */
- sitemapLocation?: string;
- /** 指定使用升级后的 weui 样式
- * - v2: 可表明启用新版的组件样式
- * @default default
- */
- style?: string;
- /** 指定需要引用的扩展库
- * 指定需要引用的扩展库。目前支持以下项目:
- * - kbone: 多端开发框架
- * - weui: WeUI 组件库
- */
- useExtendedLib?: Record;
- /** 微信消息用小程序打开
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/location-message.html
- */
- entranceDeclare?: {
- /** 声明“位置消息”场景进入小程序的启动页面 */
- locationMessage?: {
- /** 启动页路径,必须是在pages中已经定义 */
- path?: string;
- /** 启动页参数 */
- query?: string;
- };
- };
- /**
- * 配置 darkMode 为 true,即表示当前小程序已适配 DarkMode
- * @since 2.11.0
- */
- darkmode?: boolean;
- /** 指明 theme.json 的位置,darkmode为true为必填
- * @since 2.11.0
- */
- themeLocation?: string;
- /** 配置自定义组件代码按需注入 */
- lazyCodeLoading?: 'requiredComponents' | string;
- /** 单页模式相关配置 */
- singlePage?: SinglePage;
- /** 聊天素材小程序打开相关配置
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/material/support_material.html
- */
- supportedMaterials?: {
- /** 支持文件类型的MimeType,音频,视频支持二级配置的通配模式,例如: video/*。通配模式配置和精确类型配置同时存在时,则优先使用精确类型的配置(例如video/*和video/mp4同时存在,会优先使用video/mp4的配置)。 */
- materialType: string;
- /** 开发者配置的标题,在素材页面会展示该标题,配置中必须包含${nickname}, 代码包编译后会自动替换为小程序名称,如果声明了简称则会优先使用简称。除去${nickname}其余字数不得超过6个。 */
- name: string;
- /** 用途描述,会在推荐列表展示该描述,限定字数不超过22个。 */
- desc: string;
- /** 在该场景下打开小程序时跳转页面 */
- path: string;
- };
- /** 定制化型服务商票据 */
- serviceProviderTicket?: string;
- /** 半屏小程序 appId */
- embeddedAppIdList?: string[];
- /** 视频号直播半屏场景设置 */
- halfPage?: {
- /** 视频号直播打开的第一个页面的全屏状态使用自定义顶部,支持 */
- firstPageNavigationStyle?: 'default' | 'custom';
- };
- /** 小程序调试相关配置项 */
- debugOptions?: {
- /** 是否开启 FPS 面板,默认false */
- enableFPSPanel?: boolean;
- };
- /**
- * touch 相关事件默认的 passive 为 false。如果小程序不使用 catchtouch 事件时,可以通过这个选项将 passive 置为 true,以提高滚动性能。
- * 具体原理可参考[MDN](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners)
- *
- * 可以直接设置这个选项为 true,也可以分别控制某个事件。
- * @default false
- */
- enablePassiveEvent?:
- | boolean
- | {
- /**
- * 是否设置 touchstart 事件为 passive
- * @default false
- */
- touchstart?: boolean;
- /**
- * 是否设置 touchmove 事件为 passive
- * @default false
- */
- touchmove?: boolean;
- /**
- * 是否设置 wheel 事件为 passive
- * @default false
- */
- wheel?: boolean;
- };
- /** 自定义模块映射规则 */
- resolveAlias?: Record;
- /** 接受一个数组,每一项都是字符串,来指定编译为原生小程序组件的组件入口 */
- components?: string[];
- /** 渲染页面的容器 id
- * @default "app"
- * @since 3.3.18
- */
- appId?: string;
- /** 是否开启 h5 端路由动画功能,默认开启
- * @supported h5
- * @since 3.3.18
- */
- animation?: RouterAnimate | boolean;
- /**
- * 指定小程序全局的默认渲染后端。
- * @default "webview"
- */
- renderer?: 'webview' | 'skyline';
- /**
- * 渲染后端选项
- * @see https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#rendererOptions
- */
- // rendererOptions?: RenderOptions;
- /**
- * 指定小程序使用的组件框架
- * @default "exparser"
- * @see https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/glass-easel/migration.html
- */
- componentFramework?: 'exparser' | 'glass-easel';
- /**
- * 多端模式场景接入身份管理服务时开启小程序授权页相关配置
- * @see https://dev.weixin.qq.com/docs/framework/getting_started/auth.html#%E6%96%B0%E6%89%8B%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
- */
- miniApp?: {
- /**
- * 用于 wx.weixinMinProgramLogin 在小程序中插入「小程序授权 Page」
- */
- useAuthorizePage: boolean;
- };
- /**
- * 在 2023年9月15号之前,在 app.json 中配置 __usePrivacyCheck__: true 后,会启用隐私相关功能,如果不配置或者配置为 false 则不会启用。
- * 在 2023年9月15号之后,不论 app.json 中是否有配置 __usePrivacyCheck__,隐私相关功能都会启用
- * @supported weapp
- */
- __usePrivacyCheck__?: boolean;
- /**
- * 正常情况下默认所有资源文件都被打包发布到所有平台,可以通过 static 字段配置特定每个目录/文件只能发布到特定的平台(多端场景)
- * @see https://dev.weixin.qq.com/docs/framework/guideline/devtools/condition-compile.html#%E8%B5%84%E6%BA%90
- */
- static?: { pattern: string; platforms: string[] }[];
- /**
- * 动态插件配置规则,声明小程序需要使用动态插件
- * @supported alipay
- */
- useDynamicPlugins?: boolean;
- /**
- * 用于改变小程序若干运行行为
- * @supported alipay
- */
- // behavior?: Behavior;
-}
-
-export interface MiniappConfig extends MiniappPageConfig, MiniappAppConfig {
- cloud?: boolean;
-}
-
-export interface MiniappLifecycles {
- onLaunch?: (options: any) => void;
- onShow?: (options: any) => void;
- onHide?: () => void;
- onError?: (...rest) => void;
- onPageNotFound?: (options: any) => void;
- onUnhandledRejection?: (options: any) => void;
- onShareAppMessage?: (options: any) => Record;
-
- [key: string]: any;
-}
diff --git a/packages/miniapp-runtime/src/utils/index.ts b/packages/miniapp-runtime/src/utils/index.ts
deleted file mode 100644
index 4f1bb7f264..0000000000
--- a/packages/miniapp-runtime/src/utils/index.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import {
- getComponentsAlias as _getComponentsAlias,
- internalComponents,
- isFunction,
- Shortcuts,
-} from '@ice/shared';
-
-import {
- CLASS,
- COMMENT,
- ID,
- ROOT_STR,
- STYLE,
- UID,
-} from '../constants/index.js';
-import type { Element } from '../dom/element.js';
-import type { Node } from '../dom/node.js';
-import { NodeType } from '../dom/node_types.js';
-import type { Text } from '../dom/text.js';
-import type { Func } from '../interface/index.js';
-
-export const incrementId = () => {
- const chatCodes: number[] = [];
- // A-Z
- for (let i = 65; i <= 90; i++) {
- chatCodes.push(i);
- }
- // a-z
- for (let i = 97; i <= 122; i++) {
- chatCodes.push(i);
- }
- const chatCodesLen = chatCodes.length - 1;
- const list = [0, 0];
- return () => {
- const target = list.map(item => chatCodes[item]);
- const res = String.fromCharCode(...target);
-
- let tailIdx = list.length - 1;
-
- list[tailIdx]++;
-
- while (list[tailIdx] > chatCodesLen) {
- list[tailIdx] = 0;
- tailIdx = tailIdx - 1;
- if (tailIdx < 0) {
- list.push(0);
- break;
- }
- list[tailIdx]++;
- }
-
- return res;
- };
-};
-
-export function isElement(node: Node): node is Element {
- return node.nodeType === NodeType.ELEMENT_NODE;
-}
-
-export function isText(node: Node): node is Text {
- return node.nodeType === NodeType.TEXT_NODE;
-}
-
-export function isComment(node: Node): boolean {
- return node.nodeName === COMMENT;
-}
-
-export function isHasExtractProp(el: Element): boolean {
- const res = Object.keys(el.props).find(prop => {
- return !(/^(class|style|id)$/.test(prop) || prop.startsWith('data-'));
- });
- return Boolean(res);
-}
-
-/**
- * 往上寻找组件树直到 root,寻找是否有祖先组件绑定了同类型的事件
- * @param node 当前组件
- * @param type 事件类型
- */
-export function isParentBinded(node: Element | null, type: string): boolean {
- let res = false;
- while (node?.parentElement && node.parentElement._path !== ROOT_STR) {
- if (node.parentElement.__handlers[type]?.length) {
- res = true;
- break;
- }
- node = node.parentElement;
- }
- return res;
-}
-
-export function shortcutAttr(key: string): string {
- switch (key) {
- case STYLE:
- return Shortcuts.Style;
- case ID:
- return UID;
- case CLASS:
- return Shortcuts.Class;
- default:
- return key;
- }
-}
-
-export const customWrapperCache = new Map>();
-
-interface Ctor {
- new (...args: any[]): any;
-}
-
-export function extend(ctor: Ctor, methodName: string, options: Func | Record) {
- if (isFunction(options)) {
- options = {
- value: options,
- };
- }
- Object.defineProperty(ctor.prototype, methodName, {
- configurable: true,
- enumerable: true,
- ...options,
- });
-}
-
-let componentsAlias;
-export function getComponentsAlias() {
- if (!componentsAlias) {
- componentsAlias = _getComponentsAlias(internalComponents);
- }
- return componentsAlias;
-}
diff --git a/packages/miniapp-runtime/tsconfig.json b/packages/miniapp-runtime/tsconfig.json
deleted file mode 100644
index ea83b793fe..0000000000
--- a/packages/miniapp-runtime/tsconfig.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "module": "ES2020",
- "moduleResolution": "NodeNext",
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-antd/CHANGELOG.md b/packages/plugin-antd/CHANGELOG.md
deleted file mode 100644
index ec82c08f2d..0000000000
--- a/packages/plugin-antd/CHANGELOG.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Changelog
-
-## 1.0.2
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-- Updated dependencies [b8b1d5e4]
- - @ice/style-import@1.0.1
-
-## 1.0.1
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.0.0
-
-- [feat] `plugin-antd` to support `themeConfig`
diff --git a/packages/plugin-antd/README.md b/packages/plugin-antd/README.md
deleted file mode 100644
index 81859102a1..0000000000
--- a/packages/plugin-antd/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# `@ice/plugin-antd`
-
-An ice.js plugin to use `antd` components.
-
-## Usage
-
-```js
-import { defineConfig } from '@ice/app';
-import antd from '@ice/plugin-antd';
-
-export default defineConfig(() => ({
- plugins: [antd({
- dark: true,
- compact: true,
- theme: {
- 'primary-color': '#fd8',
- },
- })],
-}));
-```
diff --git a/packages/plugin-antd/package.json b/packages/plugin-antd/package.json
deleted file mode 100644
index 907892f542..0000000000
--- a/packages/plugin-antd/package.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "@ice/plugin-antd",
- "version": "1.0.2",
- "description": "ice.js plugin for use antd",
- "type": "module",
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "author": "",
- "license": "MIT",
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-antd"
- },
- "devDependencies": {
- "@ice/app": "^3.3.2"
- },
- "dependencies": {
- "@ice/style-import": "^1.0.1"
- },
- "publishConfig": {
- "access": "public"
- },
- "files": [
- "esm",
- "!esm/**/*.map"
- ]
-}
diff --git a/packages/plugin-antd/src/index.ts b/packages/plugin-antd/src/index.ts
deleted file mode 100644
index b9a5ddf48a..0000000000
--- a/packages/plugin-antd/src/index.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { createRequire } from 'module';
-import type { Plugin } from '@ice/app/types';
-import styleImportPlugin from '@ice/style-import';
-
-interface PluginOptions {
- theme?: Record;
- dark?: Boolean;
- compact?: Boolean;
- importStyle?: Boolean;
-}
-
-const require = createRequire(import.meta.url);
-
-const plugin: Plugin = ({ theme, dark, compact, importStyle }) => ({
- name: '@ice/plugin-antd',
- setup: ({ onGetConfig }) => {
- if (importStyle) {
- onGetConfig((config) => {
- config.transformPlugins = [...(config.transformPlugins || []), styleImportPlugin({
- libraryName: 'antd',
- style: (name) => `antd/es/${name.toLocaleLowerCase()}/style`,
- })];
- });
- }
- if (theme || dark || compact) {
- onGetConfig((config) => {
- // Modify webpack config of less rule for antd theme.
- config.configureWebpack ??= [];
- config.configureWebpack.push((webpackConfig) => {
- const { rules } = webpackConfig.module;
- let lessLoader = null;
- rules.some((rule) => {
- if (typeof rule === 'object' &&
- rule.test instanceof RegExp &&
- rule?.test?.source?.match(/less/)) {
- lessLoader = Array.isArray(rule?.use) &&
- rule.use.find((use) => typeof use === 'object' && use.loader.includes('less-loader'));
- return true;
- }
- return false;
- });
- if (lessLoader) {
- let themeConfig = theme || {};
- if (dark || compact) {
- // Try to get theme config for antd.
- const { getThemeVariables } = require('antd/dist/theme');
- themeConfig = {
- ...(getThemeVariables({
- dark,
- compact,
- })),
- ...themeConfig,
- };
- }
-
- const loaderOptions = lessLoader.options || {};
- lessLoader.options = {
- ...loaderOptions,
- lessOptions: {
- ...(loaderOptions?.lessOptions || {}),
- modifyVars: {
- ...(loaderOptions?.lessOptions?.modifyVars || {}),
- ...themeConfig,
- },
- },
- };
- }
- return webpackConfig;
- });
- });
- }
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-antd/tsconfig.json b/packages/plugin-antd/tsconfig.json
deleted file mode 100644
index 5647eb03bd..0000000000
--- a/packages/plugin-antd/tsconfig.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-auth/CHANGELOG.md b/packages/plugin-auth/CHANGELOG.md
deleted file mode 100644
index 3751bb3729..0000000000
--- a/packages/plugin-auth/CHANGELOG.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Changelog
-
-## 1.0.2
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 1.0.1
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.0.0-rc.3
-
-- [feat] support initialize auth by app data.
diff --git a/packages/plugin-auth/README.md b/packages/plugin-auth/README.md
deleted file mode 100644
index 4293a0b6a0..0000000000
--- a/packages/plugin-auth/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# `@ice/plugin-auth`
-
-An ice.js plugin to enable auth ability.
-
-## Usage
-
-```js
-import { defineConfig } from '@ice/app';
-import auth from '@ice/plugin-auth';
-
-export default defineConfig(() => ({
- plugins: [
- auth(),
- ],
-}));
-```
-
-More details to see https://v3.ice.work/docs/guide/advanced/auth
diff --git a/packages/plugin-auth/package.json b/packages/plugin-auth/package.json
deleted file mode 100644
index 81941dd708..0000000000
--- a/packages/plugin-auth/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "name": "@ice/plugin-auth",
- "version": "1.0.2",
- "description": "",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./runtime": {
- "types": "./esm/runtime/index.d.ts",
- "import": "./esm/runtime/index.js",
- "default": "./esm/runtime/index.js"
- },
- "./esm/runtime": {
- "types": "./esm/runtime/index.d.ts",
- "import": "./esm/runtime/index.js",
- "default": "./esm/runtime/index.js"
- },
- "./types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- },
- "./esm/types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- }
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map",
- "*.d.ts"
- ],
- "devDependencies": {
- "@ice/app": "^3.3.2",
- "@ice/runtime": "^1.2.9",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "regenerator-runtime": "^0.13.9"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-auth"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-auth/runtime.d.ts b/packages/plugin-auth/runtime.d.ts
deleted file mode 100644
index 72417e24df..0000000000
--- a/packages/plugin-auth/runtime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime';
diff --git a/packages/plugin-auth/src/index.ts b/packages/plugin-auth/src/index.ts
deleted file mode 100644
index 33b48609ab..0000000000
--- a/packages/plugin-auth/src/index.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-
-const PLUGIN_NAME = '@ice/plugin-auth';
-
-const plugin: Plugin = () => ({
- name: PLUGIN_NAME,
- setup: ({ generator }) => {
- // Register API: `import { useAuth, withAuth } from 'ice';`
- generator.addExport({
- specifier: ['withAuth', 'useAuth'],
- source: '@ice/plugin-auth/runtime',
- });
-
- generator.addRouteTypes({
- specifier: ['ConfigAuth'],
- type: true,
- source: '@ice/plugin-auth/types',
- });
- },
- runtime: `${PLUGIN_NAME}/runtime`,
-});
-
-export default plugin;
diff --git a/packages/plugin-auth/src/runtime/Auth.tsx b/packages/plugin-auth/src/runtime/Auth.tsx
deleted file mode 100644
index 2eeb1ef3d7..0000000000
--- a/packages/plugin-auth/src/runtime/Auth.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import * as React from 'react';
-import { createContext, useContext } from 'react';
-import type { ContextType } from '../types.js';
-
-const Context = createContext(null);
-
-Context.displayName = 'AuthContext';
-
-const AuthProvider = Context.Provider;
-
-interface InjectProps {
- auth: ContextType[0];
- setAuth: ContextType[1];
-}
-
-const useAuth = (): ContextType => {
- const value = useContext(Context);
- return value;
-};
-
-// class 组件支持 Hoc 用法
-function withAuth(Component: React.ComponentType) {
- const AuthWrapped = (props: Props) => {
- const [auth, setAuth] = useAuth();
- return ;
- };
- return AuthWrapped;
-}
-
-export {
- useAuth,
- withAuth,
- AuthProvider,
- InjectProps,
-};
\ No newline at end of file
diff --git a/packages/plugin-auth/src/runtime/index.tsx b/packages/plugin-auth/src/runtime/index.tsx
deleted file mode 100644
index cf0fda848d..0000000000
--- a/packages/plugin-auth/src/runtime/index.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import * as React from 'react';
-import type { RuntimePlugin, AppProvider, RouteWrapper } from '@ice/runtime/types';
-import type { AuthConfig, AuthType, Auth } from '../types.js';
-import { AuthProvider, useAuth, withAuth } from './Auth.js';
-import type { InjectProps } from './Auth.js';
-
-export { withAuth, useAuth };
-
-const EXPORT_NAME = 'authConfig';
-
-const runtime: RuntimePlugin = async ({ appContext, useConfig, addProvider, addWrapper }) => {
- const { appExport, appData } = appContext;
- const exported = appExport[EXPORT_NAME];
- const authConfig: AuthConfig = (typeof exported === 'function' ? await exported(appData) : exported) || {};
- const initialAuth = authConfig.initialAuth || {};
-
- const AuthProviderWrapper: AppProvider = ({ children }) => {
- const [state, setState] = React.useState(initialAuth);
-
- const updateState: InjectProps['setAuth'] = (newState = {}) => {
- setState({
- ...state,
- ...newState,
- });
- };
- return {children} ;
- };
- addProvider(AuthProviderWrapper);
-
- const AuthRouteWrapper: RouteWrapper = ({ children }) => {
- const [auth] = useAuth();
- const routeConfig = useConfig();
- const routeConfigAuth = routeConfig?.auth;
-
- if (routeConfigAuth && !Array.isArray(routeConfigAuth)) {
- throw new Error('config.auth must be an array');
- }
-
- const hasAuth =
- Array.isArray(routeConfigAuth) && routeConfigAuth.length
- ? Object.keys(auth).filter((item) =>
- (routeConfigAuth.includes(item) ? auth[item] : false),
- ).length
- : true;
-
- if (!hasAuth) {
- if (authConfig.NoAuthFallback) {
- return ;
- }
-
- return <>No Auth>;
- }
-
- return <>{children}>;
- };
- addWrapper(AuthRouteWrapper);
-};
-
-export type {
- Auth,
-};
-export default runtime;
diff --git a/packages/plugin-auth/src/types.ts b/packages/plugin-auth/src/types.ts
deleted file mode 100644
index 318a0a670d..0000000000
--- a/packages/plugin-auth/src/types.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import type * as React from 'react';
-import type { RouteConfig } from '@ice/runtime/types';
-
-export interface AuthConfig {
- initialAuth: {
- [auth: string]: boolean;
- };
- NoAuthFallback?: React.ComponentType<{routeConfig: RouteConfig}>;
-}
-
-export type AuthType = Record;
-export type ContextType = [AuthType, React.Dispatch>];
-export type Auth = (data?: any) => Promise | AuthConfig;
-
-export function defineAuthConfig(fn: Auth) {
- return fn;
-}
-
-export interface ConfigAuth {
- auth?: string[];
-}
diff --git a/packages/plugin-auth/tsconfig.json b/packages/plugin-auth/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-auth/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-auth/types.d.ts b/packages/plugin-auth/types.d.ts
deleted file mode 100644
index 8554e6cd41..0000000000
--- a/packages/plugin-auth/types.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/types';
diff --git a/packages/plugin-cavans/CHANGELOG.md b/packages/plugin-cavans/CHANGELOG.md
deleted file mode 100644
index eed0221be8..0000000000
--- a/packages/plugin-cavans/CHANGELOG.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# @ice/plugin-canvas
-
-## 0.0.5
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-- Updated dependencies [1e4b20af]
-- Updated dependencies [b8b1d5e4]
-- Updated dependencies [a04cc002]
- - @ice/cache-canvas@0.0.13
-
-## 0.0.4
-
-### Patch Changes
-
-- f923c586: chore: remove runtime
-- Updated dependencies [b588f0a4]
-- Updated dependencies [4d5112bf]
- - @ice/cache-canvas@0.0.12
-
-## 0.0.3
-
-### Patch Changes
-
-- 018238f9: feat: support cache of 2d cavans
-- Updated dependencies [018238f9]
-- Updated dependencies [b691b9e9]
- - @ice/cache-canvas@0.0.9
- - @ice/runtime@1.2.6
diff --git a/packages/plugin-cavans/README.md b/packages/plugin-cavans/README.md
deleted file mode 100644
index 677c5c2b49..0000000000
--- a/packages/plugin-cavans/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# @ice/plugin-canvas
-
-An ice.js plugin for canvas projects.
-
-## Usage
-
-Add plugin in `ice.config.mts`:
-
-```js
-import { defineConfig } from 'ice';
-import canvasPlugin from '@ice/plugin-canvas';
-
-export default defineConfig(() => ({
- plugins: [canvasPlugin({ /* options */ })],
-}));
-```
diff --git a/packages/plugin-cavans/package.json b/packages/plugin-cavans/package.json
deleted file mode 100644
index 84756c3f6a..0000000000
--- a/packages/plugin-cavans/package.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "name": "@ice/plugin-canvas",
- "version": "0.0.5",
- "description": "Provide canvas render support for ice.js",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./CacheCanvas": {
- "types": "./esm/CacheCanvas.d.ts",
- "import": "./esm/CacheCanvas.js",
- "default": "./esm/CacheCanvas.js"
- },
- "./runtime": {
- "types": "./esm/runtime.d.ts",
- "import": "./esm/runtime.js",
- "default": "./esm/runtime.js"
- },
- "./*": "./*"
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map"
- ],
- "dependencies": {
- "@ice/cache-canvas": "workspace:*"
- },
- "devDependencies": {
- "@ice/app": "^3.3.2",
- "webpack": "^5.88.0",
- "@ice/runtime": "^1.2.9"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-canvas"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-cavans/src/index.ts b/packages/plugin-cavans/src/index.ts
deleted file mode 100644
index e76c74f47c..0000000000
--- a/packages/plugin-cavans/src/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-
-const PLUGIN_NAME = '@ice/plugin-canvas';
-
-const plugin: Plugin = () => ({
- name: PLUGIN_NAME,
- setup: async ({ generator }) => {
- generator.addExport({
- source: '@ice/cache-canvas',
- specifier: ['CacheCanvas'],
- });
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-cavans/tsconfig.json b/packages/plugin-cavans/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-cavans/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-css-assets-local/CHANGELOG.md b/packages/plugin-css-assets-local/CHANGELOG.md
deleted file mode 100644
index 3d32bc2693..0000000000
--- a/packages/plugin-css-assets-local/CHANGELOG.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Changelog
-
-## 1.0.2
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 1.0.1
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.0.0
-
-- feat: init plugin
diff --git a/packages/plugin-css-assets-local/README.md b/packages/plugin-css-assets-local/README.md
deleted file mode 100644
index 9ccda9bfa7..0000000000
--- a/packages/plugin-css-assets-local/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# @ice/plugin-css-assets-local
-
-An ice.js plugin for localize css assets resource.
-
-## Install
-
-```bash
-npm i -D @ice/plugin-css-assets-local
-```
-
-## Usage
-
-Add plugin to your `ice.config.mts`:
-
-```ts title="ice.config.mts"
-import { defineConfig } from '@ice/app';
-import cssAssetsLocal from '@ice/plugin-css-assets-local';
-
-export default defineConfig(() => ({
- plugins: [
- cssAssetsLocal(),
- ],
-}));
-```
-
-After running `npm run build`, you can see asset resources will be downloaded to your local disk.
-
-## Options
-
-### `outputPath`
-
-The assets resource output path.
-
-- Type: `string`
-- Default: `"assets"`
-
-### `relativeCssPath`
-
-The asset paths relative to the css file path.
-
-- Type: `string`
-- Default: `"../"`
-
-### `enableInDev`
-
-Whether enable the plugin in dev or not.
-
-- Type: `boolean`
-- Default: `false`
diff --git a/packages/plugin-css-assets-local/package.json b/packages/plugin-css-assets-local/package.json
deleted file mode 100644
index 82cb1ea21f..0000000000
--- a/packages/plugin-css-assets-local/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "@ice/plugin-css-assets-local",
- "version": "1.0.2",
- "license": "MIT",
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-css-assets-local"
- },
- "type": "module",
- "files": [
- "esm",
- "!esm/**/*.map"
- ],
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- }
- },
- "dependencies": {
- "extract-css-assets-webpack-plugin": "^0.2.10",
- "consola": "^2.15.3"
- },
- "devDependencies": {
- "@ice/app": "^3.3.2"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-css-assets-local/src/index.ts b/packages/plugin-css-assets-local/src/index.ts
deleted file mode 100644
index a072472695..0000000000
--- a/packages/plugin-css-assets-local/src/index.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-// @ts-expect-error cjs module error
-import ExtractCssAssetsWebpackPlugin from 'extract-css-assets-webpack-plugin';
-import consola from 'consola';
-
-interface PluginOptions {
- /**
- * The assets path.
- *
- * Default value: `assets`
- */
- outputPath?: string;
- /**
- * The asset paths relative to the css file path.
- *
- * Default value: `../`
- */
- relativeCssPath?: string;
- /**
- *
- * Whether enable the plugin in dev or not.
- *
- * Default value: `false`
- */
- enableInDev?: boolean;
-}
-
-const plugin: Plugin = (options = {}) => ({
- name: '@ice/plugin-css-assets-local',
- setup: ({ onGetConfig, context: { command } }) => {
- const {
- outputPath = 'assets',
- relativeCssPath = '../',
- enableInDev = false,
- } = options;
- // it is increase dev build time by set default activeCommands ['build']
- const activeCommands = enableInDev ? ['start', 'build'] : ['build'];
- if (activeCommands.indexOf(command) > -1) {
- consola.info('\n[plugin-css-assets-local] Automatically download network resources, please wait patiently.');
- onGetConfig((config) => {
- config.plugins ??= [];
- config.plugins.push(new ExtractCssAssetsWebpackPlugin({
- outputPath,
- relativeCssPath,
- forceLocal: true,
- }));
- });
- }
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-css-assets-local/tsconfig.json b/packages/plugin-css-assets-local/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-css-assets-local/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-externals/CHANGELOG.md b/packages/plugin-externals/CHANGELOG.md
deleted file mode 100644
index 75aa8d343b..0000000000
--- a/packages/plugin-externals/CHANGELOG.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# @ice/plugin-externals
-
-## 1.0.1
-
-### Patch Changes
-
-- 4569200ca: fix: support externals field in assets-manifest
-
-## 1.0.0
-
-- Initial release
diff --git a/packages/plugin-externals/README.md b/packages/plugin-externals/README.md
deleted file mode 100644
index 7f2e170c85..0000000000
--- a/packages/plugin-externals/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# @ice/plugin-externals
-
-`@ice/plugin-externals` is a ice.js plugin. It provides a simple way to add externals support to your application.
-
-## Install
-
-```bash
-$ npm i @ice/plugin-externals --save-dev
-```
-
-## Usage
-
-Set preset `react` to external react in a easy way.
-
-```js
-import { defineConfig } from '@ice/app';
-import externals from '@ice/plugin-externals';
-
-export default defineConfig(() => ({
- plugins: [externals({ preset: 'react' })]
-}));
-```
-
-Framework will auto add externals of `react` and `react-dom` to your application, and the cdn url will be inject to the document by default.
-
-Also, you can custom externals and cdn url by yourself:
-
-```js
-import { defineConfig } from '@ice/app';
-import externals from '@ice/plugin-externals';
-
-export default defineConfig(() => ({
- plugins: [externals({
- externals: {
- antd: 'Antd',
- },
- cdnMap: {
- antd: {
- development: 'https://unpkg.com/antd/dist/antd.js',
- production: 'https://unpkg.com/antd/dist/antd.min.js',
- }
- }
- })]
-}));
-```
diff --git a/packages/plugin-externals/package.json b/packages/plugin-externals/package.json
deleted file mode 100644
index e419f782c4..0000000000
--- a/packages/plugin-externals/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "@ice/plugin-externals",
- "version": "1.0.1",
- "description": "plugin to make externals much easier in ice.js",
- "files": [
- "esm",
- "!esm/**/*.map",
- "*.d.ts"
- ],
- "type": "module",
- "main": "esm/index.js",
- "module": "esm/index.js",
- "types": "esm/index.d.ts",
- "exports": {
- ".": "./esm/index.js"
- },
- "sideEffects": false,
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "devDependencies": {
- "@ice/app": "^3.3.2",
- "@ice/runtime": "^1.2.9",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "webpack": "^5.88.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-externals"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-externals/src/index.ts b/packages/plugin-externals/src/index.ts
deleted file mode 100644
index 97c6a65b4d..0000000000
--- a/packages/plugin-externals/src/index.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-import InjectExternalScriptsWebpackPlugin from './webpack-plugin.js';
-
-const PLUGIN_NAME = '@ice/plugin-externals';
-
-type Preset = 'react';
-interface PluginOptions {
- preset?: Preset | Preset[];
- externals?: Record;
- cdnMap?: Record;
-}
-
-const plugin: Plugin = (options: PluginOptions) => ({
- name: PLUGIN_NAME,
- setup: ({ onGetConfig, context }) => {
- const { command } = context;
- const reactExternals = {
- react: 'React',
- 'react-dom': 'ReactDOM',
- };
- const reactCDN = {
- react: {
- development: 'https://g.alicdn.com/code/lib/react/18.3.1/umd/react.development.js',
- production: 'https://g.alicdn.com/code/lib/react/18.3.1/umd/react.production.min.js',
- },
- 'react-dom': {
- development: 'https://g.alicdn.com/code/lib/react-dom/18.3.1/umd/react-dom.development.js',
- production: 'https://g.alicdn.com/code/lib/react-dom/18.3.1/umd/react-dom.production.min.js',
- },
- };
- onGetConfig((config) => {
- config.configureWebpack ??= [];
- config.configureWebpack.push((webpackConfig) => {
- let externals = options.externals || {};
- let cdnMap = options.cdnMap || {};
- if (options.preset && options.preset === 'react') {
- switch (options.preset) {
- case 'react':
- externals = {
- ...reactExternals,
- ...externals,
- };
- cdnMap = {
- ...reactCDN,
- ...cdnMap,
- };
- break;
- }
- }
-
- if (!webpackConfig.externals) {
- webpackConfig.externals = externals;
- } else if (typeof webpackConfig.externals === 'object') {
- webpackConfig.externals = {
- ...webpackConfig.externals,
- ...externals,
- };
- }
- const cdnList = [];
- Object.keys(cdnMap).forEach((key) => {
- const url = command === 'start' ? cdnMap[key].development : cdnMap[key].production;
- const urls = Array.isArray(url) ? url : [url];
- cdnList.push(...urls);
- });
- if (cdnList.length > 0) {
- // @ts-ignore missmatch type becasue of webpack prebundled.
- webpackConfig.plugins.push(new InjectExternalScriptsWebpackPlugin({
- externals: cdnList,
- }));
- }
- return webpackConfig;
- });
- });
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-externals/src/webpack-plugin.ts b/packages/plugin-externals/src/webpack-plugin.ts
deleted file mode 100644
index 1ab0e256a7..0000000000
--- a/packages/plugin-externals/src/webpack-plugin.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import webpack from 'webpack';
-import type { Compiler } from 'webpack';
-
-const ASSET_MANIFEST_JSON_NAME = 'assets-manifest.json';
-
-interface PluginOptions {
- externals: string[];
-}
-
-export default class InjectExternalScriptsWebpackPlugin {
- private options: PluginOptions;
-
- constructor(options: PluginOptions) {
- this.options = options;
- }
-
- apply(compiler: Compiler) {
- compiler.hooks.make.tap('InjectExternalScriptsWebpackPlugin', (compilation) => {
- compilation.hooks.processAssets.tap(
- {
- name: 'InjectExternalScriptsWebpackPlugin',
- stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS,
- },
- () => {
- const assetsManifest = compilation.assets[ASSET_MANIFEST_JSON_NAME];
- if (assetsManifest) {
- const json = JSON.parse(assetsManifest.source().toString());
- delete compilation.assets[ASSET_MANIFEST_JSON_NAME];
- // Ensure externals array exists and add new externals at the beginning.
- json.externals ||= [];
- json.externals.unshift(...this.options.externals);
- compilation.emitAsset(
- ASSET_MANIFEST_JSON_NAME,
- new webpack.sources.RawSource(JSON.stringify(json)),
- );
- }
- },
- );
- });
- }
-}
diff --git a/packages/plugin-externals/tsconfig.json b/packages/plugin-externals/tsconfig.json
deleted file mode 100644
index d48d48a70c..0000000000
--- a/packages/plugin-externals/tsconfig.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "module": "NodeNext",
- "moduleResolution": "NodeNext"
- },
- "include": ["src"]
-}
diff --git a/packages/plugin-fusion/CHANGELOG.md b/packages/plugin-fusion/CHANGELOG.md
deleted file mode 100644
index 9952f11313..0000000000
--- a/packages/plugin-fusion/CHANGELOG.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Changelog
-
-## 1.1.0
-
-### Minor Changes
-
-- 79c32a77: feat: optimize function theme injection
-
-### Patch Changes
-
-- Updated dependencies [79c32a77]
- - @ice/style-import@1.1.0
-
-## 1.0.5
-
-### Patch Changes
-
-- 9f455628: fix: compatible with win32 when custom icon file
-- 9f455628: chore: add warning when options of plugin is not correct
-
-## 1.0.4
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-- Updated dependencies [b8b1d5e4]
- - @ice/style-import@1.0.1
-
-## 1.0.3
-
-### Patch Changes
-
-- 1e6a015d: fix: add icon style when config themePackage
-
-## 1.0.2
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-- c7cfed91: fix: compile non-js file when use plugin fusion
-
-## 1.0.1
-
-- [fix] error occur when use plugin without config `theme`
-
-## 1.0.0
-
-- [feat] support use fusion component in ice.js framework.
diff --git a/packages/plugin-fusion/README.md b/packages/plugin-fusion/README.md
deleted file mode 100644
index 43b7190a49..0000000000
--- a/packages/plugin-fusion/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# @ice/plugin-fusion
-
-ice.js plugin for using fusion components.
-
-## Usage
-
-```js
-import { defineConfig } from '@ice/app';
-import fusion from '@ice/plugin-fusion';
-
-export default defineConfig(() => ({
- plugins: [fusion({
- importStyle: true,
- themePackage: '@alifd/theme-design-pro',
- theme: {
- 'primary-color': '#fff',
- },
- })],
-}));
-```
-
-## Options
-
-- importStyle: Fusion component styles will be automatically imported after enabling.
-- themePackage: Fusion component theme package configuration, if set to an array, multi-theme capability is enabled.
-- theme: theme configuration, overwrite existing themes by setting sass variables.
diff --git a/packages/plugin-fusion/package.json b/packages/plugin-fusion/package.json
deleted file mode 100644
index 27a4905680..0000000000
--- a/packages/plugin-fusion/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "@ice/plugin-fusion",
- "version": "1.1.0",
- "description": "plugin for ICE while use fusion component",
- "license": "MIT",
- "type": "module",
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map"
- ],
- "dependencies": {
- "@ice/style-import": "^1.1.0"
- },
- "devDependencies": {
- "@ice/app": "^3.4.5"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-fusion"
- },
- "publishConfig": {
- "access": "public"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- }
-}
diff --git a/packages/plugin-fusion/src/index.ts b/packages/plugin-fusion/src/index.ts
deleted file mode 100644
index 7fa04b7d8b..0000000000
--- a/packages/plugin-fusion/src/index.ts
+++ /dev/null
@@ -1,115 +0,0 @@
-import { createRequire } from 'module';
-import * as path from 'path';
-import type { Plugin } from '@ice/app/types';
-import styleImportPlugin from '@ice/style-import';
-
-interface PluginOptions {
- theme?: Record;
- themePackage?: string;
- importStyle?: Boolean | string;
-}
-
-const require = createRequire(import.meta.url);
-
-function formatPath(pathStr: string): string {
- return process.platform === 'win32' ? pathStr.split(path.sep).join('/') : pathStr;
-}
-
-function getVariablesPath({
- packageName,
- filename = 'variables.scss',
- silent = false,
-}) {
- let filePath = '';
- const variables = `${packageName}/${filename}`;
- try {
- filePath = require.resolve(variables);
- } catch (err) {
- if (!silent) {
- console.log('[ERROR]', `fail to resolve ${variables}`);
- }
- }
- return formatPath(filePath);
-}
-
-const plugin: Plugin = (options = {}) => ({
- name: '@ice/plugin-fusion',
- setup: ({ onGetConfig, createLogger, generator }) => {
- const { theme, themePackage, importStyle } = options;
- if (importStyle) {
- onGetConfig((config) => {
- config.transformPlugins = [...(config.transformPlugins || []), styleImportPlugin({
- libraryName: '@alifd/next',
- style: (name) => `@alifd/next/es/${name.toLocaleLowerCase()}/${importStyle === 'sass' ? 'style' : 'style2'}`,
- })];
- });
- }
- if (theme || themePackage) {
- // Try to get icon.scss if exists.
- const iconFile = getVariablesPath({
- packageName: themePackage,
- filename: 'icons.scss',
- silent: true,
- });
- if (iconFile) {
- generator.addEntryImportAhead({
- source: iconFile,
- });
- }
- onGetConfig((config) => {
- // Modify webpack config of scss rule for fusion theme.
- config.configureWebpack ??= [];
- config.configureWebpack.push((webpackConfig) => {
- const { rules } = webpackConfig.module;
- let sassLoader = null;
- rules.some((rule) => {
- if (typeof rule === 'object' &&
- rule.test instanceof RegExp &&
- rule?.test?.source?.match(/scss/)) {
- sassLoader = Array.isArray(rule?.use) &&
- rule.use.find((use) => typeof use === 'object' && use.loader.includes('sass-loader'));
- return true;
- }
- return false;
- });
- if (sassLoader) {
- const additionalContent = [
- `$css-prefix: '${theme?.['css-prefix'] || 'next-'}' !default;`,
- ];
- if (themePackage) {
- const themeFile = getVariablesPath({
- packageName: themePackage,
- });
- if (themeFile) {
- additionalContent.push(`@import 'http://github.com/$%7BthemePackage%7D/variables.scss';`);
- if (importStyle === true) {
- createLogger('Plugin Fusion').warn('themePackage is configured, please configurate importStyle as "sass", ' +
- 'ohterwise, themes defined by sass variables will not take effect.');
- }
- }
- }
- let themeConfig = [];
- Object.keys(theme || {}).forEach((key) => {
- themeConfig.push(`$${key}: ${theme[key]};`);
- });
- additionalContent.push(themeConfig.join('\n'));
-
- const loaderOptions = sassLoader.options || {};
- sassLoader.options = {
- ...loaderOptions,
- additionalData: (content, loaderContext) => {
- const originalContent = typeof loaderOptions.additionalData === 'function'
- ? loaderOptions.additionalData(content, loaderContext)
- : `${loaderOptions.additionalData || ''}${content}`;
- return `${additionalContent.join('\n')}\n${originalContent}`;
- },
- };
- }
- return webpackConfig;
- });
- });
- }
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-fusion/tsconfig.json b/packages/plugin-fusion/tsconfig.json
deleted file mode 100644
index 5647eb03bd..0000000000
--- a/packages/plugin-fusion/tsconfig.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-i18n/CHANGELOG.md b/packages/plugin-i18n/CHANGELOG.md
deleted file mode 100644
index 4ead04fdab..0000000000
--- a/packages/plugin-i18n/CHANGELOG.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# @ice/plugin-i18n
-
-## 5.0.2
-
-### Patch Changes
-
-- 41951673: chore: update @swc/helpers to 0.5.17
-- Updated dependencies [41951673]
-- Updated dependencies [795c1986]
-- Updated dependencies [59414ba4]
- - @ice/jsx-runtime@0.3.2
- - @ice/app@3.6.2
-
-## 5.0.1
-
-### Patch Changes
-
-- Updated dependencies [bccc7db1]
-- Updated dependencies [4c9456fc]
-- Updated dependencies [b808156b]
- - @ice/jsx-runtime@0.3.0
- - @ice/runtime@1.4.8
- - @ice/app@3.4.9
-
-## 5.0.0
-
-### Patch Changes
-
-- Updated dependencies [8d57a24a]
-- Updated dependencies [b85feaae]
-- Updated dependencies [c1aab10a]
-- Updated dependencies [b3c53b87]
-- Updated dependencies [2a998626]
-- Updated dependencies [fd447841]
- - @ice/runtime@1.4.0
- - @ice/app@3.4.3
-
-## 4.0.0
-
-### Patch Changes
-
-- Updated dependencies [7d193fe9]
-- Updated dependencies [a68ff48d]
- - @ice/app@3.4.0
-
-## 3.0.0
-
-### Patch Changes
-
-- Updated dependencies [ca14f6d3]
-- Updated dependencies [df854102]
-- Updated dependencies [244bb17f]
-- Updated dependencies [50efd1ee]
-- Updated dependencies [6f18c3db]
-- Updated dependencies [1de19371]
-- Updated dependencies [7924f2d1]
-- Updated dependencies [4d256e30]
-- Updated dependencies [93e868d3]
-- Updated dependencies [aa29b37b]
-- Updated dependencies [50efd1ee]
- - @ice/app@3.3.4
- - @ice/runtime@1.3.0
-
-## 2.0.1
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-- Updated dependencies [b8b1d5e4]
-- Updated dependencies [06829a4e]
-- Updated dependencies [7194c75c]
-- Updated dependencies [68f19eae]
-- Updated dependencies [cec448c3]
-- Updated dependencies [64442269]
- - @ice/jsx-runtime@0.2.2
- - @ice/runtime@1.2.9
- - @ice/app@3.3.2
-
-## 2.0.0
-
-### Patch Changes
-
-- Updated dependencies [f5d155b5]
- - @ice/app@3.3.0
-
-## 1.0.0
-
-### Major Changes
-
-- 1c3d3fec: feat: init plugin
-
-### Patch Changes
-
-- Updated dependencies
- - @ice/runtime@1.2.0
- - @ice/app@3.2.0
diff --git a/packages/plugin-i18n/README.md b/packages/plugin-i18n/README.md
deleted file mode 100644
index 08dc3542f6..0000000000
--- a/packages/plugin-i18n/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# @ice/plugin-i18n
-
-组件功能描述
-
-## Install
-
-```bash
-$ npm i @ice/plugin-i18n --save-dev
-```
-
-## Usage
-
-```ts
-import { defineConfig } from '@ice/app';
-import i18n from '@ice/plugin-i18n';
-
-export default defineConfig({
- plugins: [
- i18n({
- locales: ['zh-CN', 'en-US'],
- defaultLocale: 'zh-CN',
- }),
- ],
-});
-```
-
-## Options
-
-### `locales`
-
-- **type:** `string[]`
-
-The locales you want to support in your app. This option is required.
-
-### defaultLocale
-
-- **type:** `string`
-
-The default locale you want to be used when visiting a non-locale prefixed path. This option is required.
-
-### autoRedirect
-
-- **type:** `boolean`
-- **default:** `true`
-
-Redirect to the preferred locale automatically. This option should be used with the middleware. If you deploy your application in production, you should read the [example]() for more detail.
diff --git a/packages/plugin-i18n/build.config.mts b/packages/plugin-i18n/build.config.mts
deleted file mode 100644
index bb61d11703..0000000000
--- a/packages/plugin-i18n/build.config.mts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineConfig } from '@ice/pkg';
-
-// https://pkg.ice.work/reference/config-list/
-export default defineConfig({
- transform: {
- formats: ['es2017'],
- },
- sourceMaps: process.env.NODE_ENV === 'development',
-});
diff --git a/packages/plugin-i18n/package.json b/packages/plugin-i18n/package.json
deleted file mode 100644
index 49e8bdf0ca..0000000000
--- a/packages/plugin-i18n/package.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "name": "@ice/plugin-i18n",
- "version": "5.0.2",
- "description": "I18n plugin for ice.js 3.",
- "files": [
- "es2017",
- "!es2017/**/*.map"
- ],
- "type": "module",
- "main": "es2017/index.js",
- "module": "es2017/index.js",
- "types": "es2017/index.d.ts",
- "exports": {
- ".": {
- "types": "./es2017/index.d.ts",
- "import": "./es2017/index.js",
- "default": "./es2017/index.js"
- },
- "./runtime": {
- "types": "./es2017/runtime/index.d.ts",
- "import": "./es2017/runtime/index.js",
- "default": "./es2017/runtime/index.js"
- },
- "./types": {
- "types": "./es2017/types.d.ts",
- "import": "./es2017/types.js",
- "default": "./es2017/types.js"
- },
- "./*": "./*"
- },
- "sideEffects": false,
- "scripts": {
- "watch": "cross-env NODE_ENV=development ice-pkg start",
- "build": "cross-env NODE_ENV=production ice-pkg build"
- },
- "keywords": [
- "ice.js",
- "i18n",
- "plugin"
- ],
- "dependencies": {
- "@ice/jsx-runtime": "^0.3.2",
- "@swc/helpers": "^0.5.17",
- "accept-language-parser": "^1.5.0",
- "universal-cookie": "^4.0.4",
- "url-join": "^5.0.0"
- },
- "devDependencies": {
- "@ice/pkg": "^1.5.0",
- "@ice/app": "workspace:^",
- "@ice/runtime": "workspace:^",
- "@remix-run/router": "^1.14.2",
- "@types/accept-language-parser": "^1.5.3",
- "@types/react": "^18.0.33",
- "cross-env": "^7.0.3",
- "webpack-dev-server": "4.15.0"
- },
- "peerDependencies": {
- "@ice/app": "^3.6.4",
- "@ice/runtime": "^1.5.7"
- },
- "publishConfig": {
- "access": "public"
- },
- "license": "MIT"
-}
diff --git a/packages/plugin-i18n/runtime.d.ts b/packages/plugin-i18n/runtime.d.ts
deleted file mode 100644
index c26ea1b145..0000000000
--- a/packages/plugin-i18n/runtime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './es2017/runtime/index';
\ No newline at end of file
diff --git a/packages/plugin-i18n/src/constants.ts b/packages/plugin-i18n/src/constants.ts
deleted file mode 100644
index 00ad99dd39..0000000000
--- a/packages/plugin-i18n/src/constants.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const LOCALE_COOKIE_NAME = 'ice_locale';
diff --git a/packages/plugin-i18n/src/index.ts b/packages/plugin-i18n/src/index.ts
deleted file mode 100644
index 3a39633b0f..0000000000
--- a/packages/plugin-i18n/src/index.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import * as path from 'path';
-import { createRequire } from 'module';
-import { fileURLToPath } from 'url';
-import type { Plugin } from '@ice/app/types';
-import type { CreateLoggerReturnType } from '@ice/app';
-import type { I18nConfig } from './types.js';
-
-const _require = createRequire(import.meta.url);
-const _dirname = path.dirname(fileURLToPath(import.meta.url));
-const packageJSON = _require('../package.json');
-const { name: packageName } = packageJSON;
-
-const plugin: Plugin = (i18nConfig) => ({
- name: packageName,
- setup: ({ addRoutesDefinition, generator, createLogger }) => {
- const logger = createLogger('plugin-i18n');
- checkPluginOptions(i18nConfig, logger);
-
- const { locales, defaultLocale } = i18nConfig;
- const prefixedLocales = locales.filter(locale => locale !== defaultLocale);
-
- const defineRoutes: Parameters[0] = (defineRoute, options) => {
- function defineChildrenRoutes(children: any[], prefixedLocale: string) {
- children.forEach(child => {
- defineRoute(
- child.path,
- child.file,
- { index: child.index },
- () => {
- if (child.children) {
- defineChildrenRoutes(child.children, prefixedLocale);
- }
- });
- });
- }
- prefixedLocales.forEach(prefixedLocale => {
- options.nestedRouteManifest.forEach(route => {
- const newRoutePath = `${prefixedLocale}${route.path ? `/${route.path}` : ''}`;
- defineRoute(newRoutePath, route.file, { index: route.index }, () => {
- route.children && defineChildrenRoutes(route.children, prefixedLocale);
- });
- });
- });
- };
- addRoutesDefinition(defineRoutes);
-
- generator.addRenderFile(
- path.join(_dirname, 'templates/plugin-i18n.ts.ejs'),
- 'plugin-i18n.ts',
- {
- defaultLocale: defaultLocale,
- locales: JSON.stringify(locales),
- },
- );
- generator.addExport({
- specifier: ['getDefaultLocale', 'getAllLocales'],
- source: './plugin-i18n',
- });
- generator.addExport({
- specifier: ['withLocale', 'useLocale'],
- source: `${packageName}/runtime`,
- });
-
- generator.modifyRenderData((renderData) => {
- renderData.customRuntimeOptions ||= {};
- (renderData.customRuntimeOptions as Record).i18nConfig = i18nConfig;
- return renderData;
- });
- },
- runtime: `${packageName}/runtime`,
-});
-
-function checkPluginOptions(options: I18nConfig, logger: CreateLoggerReturnType) {
- const { locales, defaultLocale } = options;
- if (!Array.isArray(locales)) {
- logger.error(`The plugin option \`locales\` type should be array but received ${typeof locales}`);
- process.exit(1);
- }
- if (typeof defaultLocale !== 'string') {
- logger.error(`The plugin option \`defaultLocale\` type should be string but received ${typeof defaultLocale}`);
- process.exit(1);
- }
-}
-
-export default plugin;
diff --git a/packages/plugin-i18n/src/runtime/I18nContext.tsx b/packages/plugin-i18n/src/runtime/I18nContext.tsx
deleted file mode 100644
index 0470680b83..0000000000
--- a/packages/plugin-i18n/src/runtime/I18nContext.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import type { ReactElement, SetStateAction, Dispatch } from 'react';
-import React, { createContext, useState, useContext } from 'react';
-import normalizeLocalePath from '../utils/normalizeLocalePath.js';
-import setLocaleToCookie from '../utils/setLocaleToCookie.js';
-import type { I18nConfig } from '../types.js';
-
-type ContextValue = [string, Dispatch>];
-
-interface I18nProvider {
- children: ReactElement;
- locales: I18nConfig['locales'];
- defaultLocale: I18nConfig['defaultLocale'];
- pathname: string;
- disableCookie: boolean;
- basename?: string;
- headers?: {
- [key: string]: string | string[];
- };
-}
-
-export const I18nContext = createContext(null);
-
-I18nContext.displayName = 'I18nContext';
-
-export function I18nProvider({
- children,
- locales,
- defaultLocale,
- disableCookie,
- pathname,
- basename,
-}: I18nProvider) {
- const [locale, updateLocale] = useState(
- normalizeLocalePath({ pathname, basename, locales: locales }).pathLocale || defaultLocale,
- );
-
- function setLocale(locale: string) {
- !disableCookie && setLocaleToCookie(locale);
- updateLocale(locale);
- }
-
- return (
-
- {children}
-
- );
-}
-
-export function useLocale() {
- return useContext(I18nContext);
-}
-
-export function withLocale(Component: React.ComponentType) {
- return (props: Props) => {
- const [locale, setLocale] = useLocale();
- return ;
- };
-}
diff --git a/packages/plugin-i18n/src/runtime/hijackHistory.tsx b/packages/plugin-i18n/src/runtime/hijackHistory.tsx
deleted file mode 100644
index 984284c79a..0000000000
--- a/packages/plugin-i18n/src/runtime/hijackHistory.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import type { History, To } from '@remix-run/router';
-import urlJoin from 'url-join';
-import detectLocale from '../utils/detectLocale.js';
-import normalizeLocalePath from '../utils/normalizeLocalePath.js';
-import type { I18nConfig } from '../types.js';
-
-/**
- * Hijack history in order to add locale prefix to the new route path.
- */
-export default function hijackHistory(
- history: History,
- i18nConfig: I18nConfig,
- disableCookie: boolean,
- basename?: string,
-) {
- const originHistory = { ...history };
- const { defaultLocale, locales } = i18nConfig;
-
- function createNewNavigate(type: 'push' | 'replace') {
- return function (toPath: To, state?: Record) {
- const locale = state?.locale;
- const localePrefixPathname = getLocalePrefixPathname({
- toPath,
- basename,
- locales,
- currentLocale: locale,
- defaultLocale,
- disableCookie,
- });
- originHistory[type](localePrefixPathname, state);
- };
- }
-
- history.push = createNewNavigate('push');
-
- history.replace = createNewNavigate('replace');
-}
-
-function getLocalePrefixPathname({
- toPath,
- locales,
- defaultLocale,
- basename,
- disableCookie,
- currentLocale = '',
-}: {
- toPath: To;
- locales: string[];
- defaultLocale: string;
- disableCookie: boolean;
- currentLocale: string;
- basename?: string;
-}) {
- const pathname = getPathname(toPath);
- const locale = disableCookie ? currentLocale : detectLocale({
- locales,
- defaultLocale,
- pathname,
- disableCookie,
- });
- const { pathname: newPathname } = normalizeLocalePath({ pathname, locales, basename });
- return urlJoin(
- basename,
- locale === defaultLocale ? '' : locale,
- newPathname,
- typeof toPath === 'string' ? '' : toPath.search,
- );
-}
-
-function getPathname(toPath: To): string {
- if (isPathnameString(toPath)) {
- return toPath;
- }
- return toPath.pathname;
-}
-
-function isPathnameString(pathname: To): pathname is string {
- return typeof pathname === 'string';
-}
diff --git a/packages/plugin-i18n/src/runtime/index.tsx b/packages/plugin-i18n/src/runtime/index.tsx
deleted file mode 100644
index dee5e6a12c..0000000000
--- a/packages/plugin-i18n/src/runtime/index.tsx
+++ /dev/null
@@ -1,89 +0,0 @@
-import * as React from 'react';
-import type { RuntimePlugin } from '@ice/runtime/types';
-import detectLocale from '../utils/detectLocale.js';
-import type { I18nAppConfig, I18nConfig } from '../types.js';
-import getLocaleRedirectPath from '../utils/getLocaleRedirectPath.js';
-import { I18nProvider, useLocale, withLocale } from './I18nContext.js';
-import hijackHistory from './hijackHistory.js';
-
-const EXPORT_NAME = 'i18nConfig';
-// Mock it to avoid ssg error and use new URL to parse url instead of url.parse.
-const baseUrl = 'http://127.0.0.1/';
-
-const runtime: RuntimePlugin<{ i18nConfig: I18nConfig }> = async (
- {
- appContext,
- addProvider,
- history,
- addResponseHandler,
- },
- runtimeOptions,
-) => {
- const { basename, requestContext, appExport } = appContext;
- const exported = appExport[EXPORT_NAME];
- const i18nAppConfig: I18nAppConfig = Object.assign(
- { disableCookie: false },
- (typeof exported === 'function' ? await exported() : exported),
- );
- const disableCookie = typeof i18nAppConfig.disableCookie === 'function'
- ? i18nAppConfig.disableCookie()
- : i18nAppConfig.disableCookie;
-
- const { i18nConfig } = runtimeOptions;
- const { locales, defaultLocale, autoRedirect } = i18nConfig;
-
- addProvider(({ children }) => {
- return (
-
- {children}
-
- );
- });
-
- if (history) {
- hijackHistory(history, i18nConfig, disableCookie, basename);
- }
-
- if (autoRedirect) {
- addResponseHandler((req) => {
- const url = new URL(`${baseUrl}${req.url}`);
- const detectedLocale = detectLocale({
- locales,
- defaultLocale,
- basename,
- pathname: url.pathname,
- headers: req.headers,
- disableCookie: false,
- });
-
- const localeRedirectPath = getLocaleRedirectPath({
- pathname: url.pathname,
- defaultLocale,
- detectedLocale,
- basename,
- });
- if (localeRedirectPath) {
- url.pathname = localeRedirectPath;
-
- return {
- statusCode: 302,
- statusText: 'Found',
- headers: {
- location: String(Object.assign(new URL(baseUrl), url)).replace(RegExp(`^${baseUrl}`), ''),
- },
- };
- }
- });
- }
-};
-
-export default runtime;
-
-export { useLocale, withLocale };
\ No newline at end of file
diff --git a/packages/plugin-i18n/src/templates/plugin-i18n.ts.ejs b/packages/plugin-i18n/src/templates/plugin-i18n.ts.ejs
deleted file mode 100644
index 6d87f99556..0000000000
--- a/packages/plugin-i18n/src/templates/plugin-i18n.ts.ejs
+++ /dev/null
@@ -1,7 +0,0 @@
-export function getDefaultLocale() {
- return '<%= defaultLocale %>';
-}
-
-export function getAllLocales() {
- return <%- locales %>;
-}
diff --git a/packages/plugin-i18n/src/types.ts b/packages/plugin-i18n/src/types.ts
deleted file mode 100644
index 185f58b493..0000000000
--- a/packages/plugin-i18n/src/types.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-export interface I18nConfig {
- /**
- * The locales which you want to support in your app.
- */
- locales: string[];
- /**
- * The default locale which is used when visiting a non-locale prefixed path. e.g `/home`.
- */
- defaultLocale: string;
- /**
- * Automatically redirect to the correct path which is based on user's preferred locale.
- */
- autoRedirect?: boolean;
-}
-
-export interface I18nAppConfig {
- /**
- * Weather or not current application cookie is blocked(authorized).
- * If it is, we will not get the locale value(ice_locale) from cookie.
- * @default {false}
- */
- disableCookie?: boolean | (() => boolean);
-}
-
-export function defineI18nConfig(
- configOrDefineConfig: I18nAppConfig | (() => I18nAppConfig),
-): I18nAppConfig {
- if (typeof configOrDefineConfig === 'function') {
- return configOrDefineConfig();
- }
- return configOrDefineConfig;
-}
diff --git a/packages/plugin-i18n/src/typings.d.ts b/packages/plugin-i18n/src/typings.d.ts
deleted file mode 100644
index 922f320605..0000000000
--- a/packages/plugin-i18n/src/typings.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/packages/plugin-i18n/src/utils/detectLocale.ts b/packages/plugin-i18n/src/utils/detectLocale.ts
deleted file mode 100644
index 53aaa88171..0000000000
--- a/packages/plugin-i18n/src/utils/detectLocale.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import type { I18nConfig } from '../types.js';
-import getLocaleFromCookie from './getLocaleFromCookie.js';
-import normalizeLocalePath from './normalizeLocalePath.js';
-import getPreferredLocale from './getPreferredLocale.js';
-
-interface DetectLocaleParams {
- locales: I18nConfig['locales'];
- defaultLocale: I18nConfig['defaultLocale'];
- pathname: string;
- disableCookie: boolean;
- basename?: string;
- headers?: {
- [key: string]: string | string[];
- };
-}
-
-export default function detectLocale({
- locales,
- defaultLocale,
- pathname,
- basename,
- disableCookie,
- headers = {},
-}: DetectLocaleParams): string {
- const detectedLocale = (
- normalizeLocalePath({ pathname, locales, basename }).pathLocale ||
- (!disableCookie && getLocaleFromCookie(locales, headers)) ||
- getPreferredLocale(locales, headers) ||
- defaultLocale
- );
-
- return detectedLocale;
-}
diff --git a/packages/plugin-i18n/src/utils/getLocaleFromCookie.ts b/packages/plugin-i18n/src/utils/getLocaleFromCookie.ts
deleted file mode 100644
index fbf661e756..0000000000
--- a/packages/plugin-i18n/src/utils/getLocaleFromCookie.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import type { I18nConfig } from 'src/types.js';
-import Cookies from 'universal-cookie';
-import { LOCALE_COOKIE_NAME } from '../constants.js';
-
-export default function getLocaleFromCookie(
- locales: I18nConfig['locales'],
- headers: { [key: string]: string | string[] | undefined } = {},
-) {
- const cookies: Cookies = new Cookies(typeof window === 'undefined' ? headers.cookie : undefined);
- const iceLocale = cookies.get(LOCALE_COOKIE_NAME);
- const locale = locales.find(locale => iceLocale === locale) || undefined;
-
- return locale;
-}
\ No newline at end of file
diff --git a/packages/plugin-i18n/src/utils/getLocaleRedirectPath.ts b/packages/plugin-i18n/src/utils/getLocaleRedirectPath.ts
deleted file mode 100644
index 68c8c55dfe..0000000000
--- a/packages/plugin-i18n/src/utils/getLocaleRedirectPath.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import urlJoin from 'url-join';
-import type { I18nConfig } from '../types.js';
-import removeBasenameFromPath from './removeBasenameFromPath.js';
-
-interface GetRedirectPathOptions {
- pathname: string;
- defaultLocale: I18nConfig['defaultLocale'];
- detectedLocale: string;
- basename?: string;
-}
-
-export default function getLocaleRedirectPath({
- pathname,
- defaultLocale,
- detectedLocale,
- basename,
-}: GetRedirectPathOptions) {
- const normalizedPathname = removeBasenameFromPath(pathname, basename);
- const isRootPath = normalizedPathname === '/';
-
- if (isRootPath && defaultLocale !== detectedLocale) {
- return urlJoin(basename, detectedLocale);
- }
-}
diff --git a/packages/plugin-i18n/src/utils/getPreferredLocale.ts b/packages/plugin-i18n/src/utils/getPreferredLocale.ts
deleted file mode 100644
index 50ff12b112..0000000000
--- a/packages/plugin-i18n/src/utils/getPreferredLocale.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { pick as acceptLanguagePick } from 'accept-language-parser';
-
-/**
- * Get the preferred locale by Accept-Language in request headers(Server) or window.navigator.languages(Client)
- */
-export default function getPreferredLocale(locales: string[], headers: { [key: string]: string | string[] } = {}) {
- if (typeof window === 'undefined') {
- const acceptLanguageValue = headers?.['accept-language'] as string;
- return acceptLanguagePick(locales, acceptLanguageValue);
- } else {
- const acceptLanguages = window.navigator.languages || [];
- return acceptLanguages.find(acceptLanguage => locales.includes(acceptLanguage));
- }
-}
diff --git a/packages/plugin-i18n/src/utils/normalizeLocalePath.ts b/packages/plugin-i18n/src/utils/normalizeLocalePath.ts
deleted file mode 100644
index 08c0c06328..0000000000
--- a/packages/plugin-i18n/src/utils/normalizeLocalePath.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import type { I18nConfig } from '../types.js';
-import removeBasenameFromPath from './removeBasenameFromPath.js';
-
-interface NormalizeLocalePathOptions {
- pathname: string;
- locales: I18nConfig['locales'];
- basename?: string;
-}
-
-export default function normalizeLocalePath({ pathname, locales, basename }: NormalizeLocalePathOptions) {
- const originPathname = removeBasenameFromPath(pathname, basename);
- const subPaths = originPathname.split('/');
- let newPathname = originPathname;
- let pathLocale: string | undefined;
-
- for (const locale of locales) {
- if (subPaths[1] && subPaths[1] === locale) {
- pathLocale = locale;
- subPaths.splice(1, 1);
- newPathname = subPaths.join('/') || '/';
- break;
- }
- }
-
- return {
- pathname: newPathname,
- pathLocale,
- };
-}
\ No newline at end of file
diff --git a/packages/plugin-i18n/src/utils/removeBasenameFromPath.ts b/packages/plugin-i18n/src/utils/removeBasenameFromPath.ts
deleted file mode 100644
index acb994b86f..0000000000
--- a/packages/plugin-i18n/src/utils/removeBasenameFromPath.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-export default function removeBasenameFromPath(pathname: string, basename?: string) {
- if (typeof basename !== 'string') {
- return pathname;
- }
- if (basename[0] !== '/') {
- // compatible with no slash. For example: ice -> /ice
- basename = `/${basename}`;
- }
-
- if (pathname.startsWith(basename)) {
- pathname = pathname.substring(basename.length);
- if (!pathname.startsWith('/')) {
- pathname = `/${pathname || ''}`;
- }
- }
-
- return pathname;
-}
diff --git a/packages/plugin-i18n/src/utils/setLocaleToCookie.ts b/packages/plugin-i18n/src/utils/setLocaleToCookie.ts
deleted file mode 100644
index 308a3afb0f..0000000000
--- a/packages/plugin-i18n/src/utils/setLocaleToCookie.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import Cookies from 'universal-cookie';
-import { LOCALE_COOKIE_NAME } from '../constants.js';
-
-/**
- * NOTE: Call this function in browser.
- */
-export default function setLocaleToCookie(locale: string) {
- const cookies = new Cookies();
- cookies.set(LOCALE_COOKIE_NAME, locale, { path: '/' });
-}
diff --git a/packages/plugin-i18n/tsconfig.json b/packages/plugin-i18n/tsconfig.json
deleted file mode 100644
index 67afd8c5e4..0000000000
--- a/packages/plugin-i18n/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- },
- "include": ["src"]
-}
diff --git a/packages/plugin-i18n/types.d.ts b/packages/plugin-i18n/types.d.ts
deleted file mode 100644
index d285a37f53..0000000000
--- a/packages/plugin-i18n/types.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './es2017/types';
diff --git a/packages/plugin-icestark/CHANGELOG.md b/packages/plugin-icestark/CHANGELOG.md
deleted file mode 100644
index 10751c68f4..0000000000
--- a/packages/plugin-icestark/CHANGELOG.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Changelog
-
-## 1.2.1
-
-- fix: plugin type definition of `library`
-
-## 1.2.0
-
-### Minor Changes
-
-- 2f73084d: feat: support framework provider
-- 2f73084d: feat: support custom AppRoute
-
-## 1.1.1
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 1.1.0
-
-### Minor Changes
-
-- 1ed81fee: feat: refactor runtime api
-
-## 1.0.5
-
-### Patch Changes
-
-- 42d18539: fix: ignore props pass by other micro app framework
-
-## 1.0.4
-
-### Patch Changes
-
-- dec56a33: fix: avoid remount when app mount in other micro app framework
-
-## 1.0.3
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.0.2
-
-- [feat] support lifecycle of `bootstrap` for qiankun micro app.
-
-## 1.0.1
-
-- [fix] modify basename when render as a child app.
-
-## 1.0.0
-
-- [feat] plugin for micro-fontends, support both `Framework app` and `Sub app`.
diff --git a/packages/plugin-icestark/Context.d.ts b/packages/plugin-icestark/Context.d.ts
deleted file mode 100644
index 6a2482c984..0000000000
--- a/packages/plugin-icestark/Context.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime/Context';
\ No newline at end of file
diff --git a/packages/plugin-icestark/README.md b/packages/plugin-icestark/README.md
deleted file mode 100644
index c433588706..0000000000
--- a/packages/plugin-icestark/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# plugin-icestark
-
-> Easy use [`icestark`](https://github.com/ice-lab/icestark) in [icejs](https://github.com/alibaba/ice).
-
-## Usage
-
-### Install
-
-```bash
-npm i -D @ice/plugin-icestark
-```
-
-### Framework Application
-
-Configurate plugin to your `ice.config.mts`:
-
-```ts title="ice.config.mts"
-import { defineConfig } from '@ice/app';
-import icestark from '@ice/plugin-icestark';
-
-export default defineConfig(() => ({
- plugins: [
- icestark({ type: 'framework' }),
- ],
-}));
-```
-
-Through export `icestark` configuration of your framework application.
-
-```ts title="src/app.ts"
-import { defineFrameworkConfig } from '@ice/plugin-icestark/esm/types';
-
-export const icestark = defineFrameworkConfig(() => ({
- getApps: () => ([]),
-}));
-```
-
-**Options:**
- - `getApps`: get sub-application information, support async function
- - `appRouter`
- - `ErrorComponent`: error component
- - `LoadingComponent`: loading component
- - `NotFoundComponent`: 404 not found component
- - `shouldAssetsRemove`: check assets if it should be removed
- - `layout`: specify Framework application Layout
-
-### Sub-application
-
-Configurate plugin to your `ice.config.mts`:
-
-```ts title="ice.config.mts"
-import { defineConfig } from '@ice/app';
-import icestark from '@ice/plugin-icestark';
-
-export default defineConfig(() => ({
- plugins: [
- icestark({ type: 'child' }),
- ],
-}));
-```
-
-modify `icestark` exports in `src/app.ts`:
-
-```ts title="src/app.ts"
-// app.ts
-import { defineChildConfig } from '@ice/plugin-icestark/esm/types';
-
-export const icestark = defineChildConfig(() => ({
- mount: () => {},
- unmount: () => {},
-}));
-```
-
-**Options:**
- - `mount`: excute before Sub-application mounted
- - `unmount`: excute after Sub-application unmounted
\ No newline at end of file
diff --git a/packages/plugin-icestark/package.json b/packages/plugin-icestark/package.json
deleted file mode 100644
index 456d074186..0000000000
--- a/packages/plugin-icestark/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "name": "@ice/plugin-icestark",
- "version": "1.2.1",
- "description": "Easy use `icestark` in icejs.",
- "author": "ice-admin@alibaba-inc.com",
- "homepage": "",
- "license": "MIT",
- "main": "esm/index.js",
- "type": "module",
- "files": [
- "esm",
- "!esm/**/*.map",
- "*.d.ts"
- ],
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./Context": {
- "types": "./esm/runtime/Context.d.ts",
- "import": "./esm/runtime/Context.js",
- "default": "./esm/runtime/Context.js"
- },
- "./esm/runtime/child": {
- "types": "./esm/runtime/child.d.ts",
- "import": "./esm/runtime/child.js",
- "default": "./esm/runtime/child.js"
- },
- "./esm/runtime/framework": {
- "types": "./esm/runtime/framework.d.ts",
- "import": "./esm/runtime/framework.js",
- "default": "./esm/runtime/framework.js"
- },
- "./types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- },
- "./esm/types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- }
- },
- "dependencies": {
- "@ice/stark": "^2.7.4",
- "@ice/stark-app": "^1.2.0"
- },
- "devDependencies": {
- "@ice/app": "^3.6.1",
- "@ice/runtime": "^1.2.9",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-icestark"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-icestark/runtime.d.ts b/packages/plugin-icestark/runtime.d.ts
deleted file mode 100644
index c490c5c819..0000000000
--- a/packages/plugin-icestark/runtime.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './esm/runtime/child';
-export * from './esm/runtime/framework';
diff --git a/packages/plugin-icestark/src/index.ts b/packages/plugin-icestark/src/index.ts
deleted file mode 100644
index 4532b15a56..0000000000
--- a/packages/plugin-icestark/src/index.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-
-interface PluginOptions {
- type: 'child' | 'framework';
- library?: string | string[];
-}
-
-const PLUGIN_NAME = '@ice/plugin-icestark';
-const plugin: Plugin = ({ type, library }) => ({
- name: PLUGIN_NAME,
- setup: ({ onGetConfig, context, generator, modifyUserConfig }) => {
- const libraryName = library || context.pkg?.name as string || 'microApp';
- onGetConfig((config) => {
- config.configureWebpack ??= [];
- config.configureWebpack.push((webpackConfig) => {
- if (type === 'child') {
- webpackConfig.output.library = libraryName;
- webpackConfig.output.libraryTarget = 'umd';
- }
- return webpackConfig;
- });
- return config;
- });
- if (type === 'child') {
- // Modify basename when render as a child app.
- generator.modifyRenderData((data) => {
- return {
- ...data,
- basename: `(typeof window !== 'undefined' && window.ICESTARK?.basename || ${data.basename})`,
- };
- });
- generator.addEntryCode(() => {
- return `let root;
-if (!window.ICESTARK?.root && !window.__POWERED_BY_QIANKUN__) {
- root = render();
-}
-// Set library name
-if (typeof window !== 'undefined' && window.ICESTARK) {
- window.ICESTARK.library = ${JSON.stringify(libraryName)};
-}
-
-// For qiankun lifecycle validation.
-export async function bootstrap(props) {
- await app?.icestark?.bootstrap?.(props);
-}
-
-export async function mount(props) {
- await app?.icestark?.mount?.(props);
- // Avoid remount when app mount in other micro app framework.
- if (!root) {
- // When app mount in qiankun, do not use props passed by.
- // Props of container if conflict with render node in ice, it may cause node overwritten.
- let runtimeOptions = props;
- if (props.singleSpa) {
- const iceContainer = props.container?.querySelector('#ice-container');
- if (iceContainer) {
- runtimeOptions = {...props, container: iceContainer };
- } else {
- const ele = document.createElement('div');
- ele.id = 'ice-container';
- props.container.appendChild(ele);
- runtimeOptions = {...props, container: ele };
- }
- }
- root = render({ runtimeOptions });
- }
- await root;
-}
-export async function unmount(props) {
- root?.then((res) => res.unmount());
- await app?.icestark?.unmount?.(props);
- // Reset root to null when app unmount.
- root = null;
-}`;
-});
- } else {
- // Plugin icestark do not support ssr yet.
- modifyUserConfig('ssr', false);
- modifyUserConfig('ssg', false);
- }
- },
- runtime: `${PLUGIN_NAME}/esm/runtime/${type === 'framework' ? 'framework' : 'child'}`,
-});
-
-export default plugin;
diff --git a/packages/plugin-icestark/src/runtime/Context.tsx b/packages/plugin-icestark/src/runtime/Context.tsx
deleted file mode 100644
index 7545be0df5..0000000000
--- a/packages/plugin-icestark/src/runtime/Context.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { createContext, useContext } from 'react';
-
-export const FrameworkContext = createContext({});
-
-export const useFrameworkContext = (): T => {
- return useContext(FrameworkContext) as T;
-};
diff --git a/packages/plugin-icestark/src/runtime/child.tsx b/packages/plugin-icestark/src/runtime/child.tsx
deleted file mode 100644
index f1062b3d55..0000000000
--- a/packages/plugin-icestark/src/runtime/child.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import * as React from 'react';
-import * as ReactDOM from 'react-dom/client';
-import type { RuntimePlugin } from '@ice/runtime/types';
-import type { LifecycleOptions } from '../types';
-import { FrameworkContext } from './Context.js';
-
-const runtime: RuntimePlugin = ({ setRender }, runtimeOptions) => {
- if (runtimeOptions?.container) {
- setRender((_, element) => {
- // Replace render root when app rendered as a child app.
- const root = ReactDOM.createRoot(runtimeOptions.container);
- root.render(
-
- {element}
- ,
- );
- return root;
- });
- }
-};
-
-export default runtime;
diff --git a/packages/plugin-icestark/src/runtime/framework.tsx b/packages/plugin-icestark/src/runtime/framework.tsx
deleted file mode 100644
index fffc2484f3..0000000000
--- a/packages/plugin-icestark/src/runtime/framework.tsx
+++ /dev/null
@@ -1,98 +0,0 @@
-import * as React from 'react';
-import { AppRouter, AppRoute } from '@ice/stark';
-import type { RuntimePlugin, ClientAppRouterProps } from '@ice/runtime/types';
-import type { AppRouterProps } from '@ice/stark/lib/AppRouter';
-import type { RouteInfo, AppConfig, FrameworkConfig } from '../types';
-
-const { useState, useEffect } = React;
-
-const runtime: RuntimePlugin = ({ getAppRouter, setAppRouter, appContext }) => {
- const { appExport, appData } = appContext;
- const OriginalRouter = getAppRouter();
- const { layout, getApps, appRouter, AppRoute: CustomizeAppRoute } = (appExport?.icestark || {}) as FrameworkConfig;
-
- if (!getApps) {
- console.warn(`
- [plugin-icestark]: appConfig.icestark.getApps should be not empty if this is an framework app.
- see https://ice.work/docs/guide/advanced/icestark/
- `);
- return;
- }
-
- const FrameworkRouter = (props: ClientAppRouterProps) => {
- const [routeInfo, setRouteInfo] = useState({});
- const [appEnter, setAppEnter] = useState({});
- const [appLeave, setAppLeave] = useState({});
- const [apps, setApps] = useState(null);
- const FrameworkLayout = layout || React.Fragment;
- const appInfo = {
- pathname: routeInfo.pathname || (typeof window !== 'undefined' ? window.location.pathname : ''),
- routeInfo,
- appEnter,
- appLeave,
- updateApps: setApps,
- };
-
- useEffect(() => {
- const fetchApps = async () => {
- try {
- const appList = await getApps(appData);
- setApps(appList);
- } catch (error) {
- console.error('[plugin-icestark]: Failed to fetch apps', error);
- }
- };
-
- fetchApps();
- }, []);
-
- const handleRouteChange: AppRouterProps['onRouteChange'] = (pathname, query, hash, routeType) => {
- setRouteInfo({ pathname, query, hash, routeType });
- };
-
- const handleAppLeave: AppRouterProps['onAppLeave'] = (config) => setAppLeave(config);
- const handleAppEnter: AppRouterProps['onAppEnter'] = (config) => setAppEnter(config);
- const AppRouteComponent = CustomizeAppRoute || AppRoute;
-
- const appRouterProps: AppRouterProps = {
- ...appRouter,
- onRouteChange: handleRouteChange,
- onAppEnter: handleAppEnter,
- onAppLeave: handleAppLeave,
- };
- return (
-
- {apps && (
-
- {apps?.map((item: AppConfig, idx: number) => (
-
- ))}
- {
- const { routerContext } = props;
- routerContext.routes = [
- ...routerContext.routes,
- {
- path: '*',
- Component: () => (
- process.env.NODE_ENV === 'development'
- ? Add $.tsx to folder pages as a 404 component
- : null
- ),
- },
- ];
- return ;
- }}
- />
-
- )}
-
- );
- };
-
- setAppRouter(FrameworkRouter);
-};
-
-export default runtime;
diff --git a/packages/plugin-icestark/src/types.ts b/packages/plugin-icestark/src/types.ts
deleted file mode 100644
index 92acc6e6be..0000000000
--- a/packages/plugin-icestark/src/types.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import type { ComponentType } from 'react';
-import type { CompatibleAppConfig } from '@ice/stark/lib/AppRoute';
-import type { AppRouterProps } from '@ice/stark/lib/AppRouter';
-import type { AppRoute } from '@ice/stark';
-
-export interface RouteInfo {
- pathname?: string;
- query?: object;
- hash?: string;
- routeType?: string;
-}
-
-export type FrameworkComponent = ComponentType;
-
-export type AppConfig = CompatibleAppConfig;
-
-export interface FrameworkConfig {
- getApps?: (data?: any) => (AppConfig[] | Promise);
- appRouter?: Omit;
- layout?: ComponentType;
- AppRoute?: typeof AppRoute;
-}
-
-export interface LifecycleOptions {
- container: Element;
- customProps?: Record;
-}
-
-export interface ChildConfig {
- mount?: (options?: LifecycleOptions) => Promise | void;
- unmount?: (options?: LifecycleOptions) => Promise | void;
- // Just for qiankun lifecycle, not used in icestark.
- bootstrap?: (options?: any) => Promise | void;
-}
-
-export function defineFrameworkConfig(config: FrameworkConfig | (() => FrameworkConfig)) {
- return typeof config === 'function' ? config() : config;
-}
-
-export function defineChildConfig(config: ChildConfig | (() => ChildConfig)) {
- return typeof config === 'function' ? config() : config;
-}
\ No newline at end of file
diff --git a/packages/plugin-icestark/tsconfig.json b/packages/plugin-icestark/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-icestark/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-icestark/types.d.ts b/packages/plugin-icestark/types.d.ts
deleted file mode 100644
index 8554e6cd41..0000000000
--- a/packages/plugin-icestark/types.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/types';
diff --git a/packages/plugin-intl/CHANGELOG.md b/packages/plugin-intl/CHANGELOG.md
deleted file mode 100644
index 00334f00c8..0000000000
--- a/packages/plugin-intl/CHANGELOG.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# @ice/plugin-intl
-
-## 1.1.0
-
-### Minor Changes
-
-- 2626dcdc: feat: support the simple mode of intl solution
-
-## 1.0.2
-
-fix: compat with the navigator language return with underslash.
-
-## 1.0.1
-
-### Patch Changes
-
-- d06826ef: feat: support get locale messages for global
-
-## 1.0.0
-
-- Initial release
diff --git a/packages/plugin-intl/README.md b/packages/plugin-intl/README.md
deleted file mode 100644
index c72097f403..0000000000
--- a/packages/plugin-intl/README.md
+++ /dev/null
@@ -1,119 +0,0 @@
-# @ice/plugin-intl
-
-`@ice/plugin-intl` is a ice.js plugin. It provides a simple way to add internationalization support to your application.
-
-> `@ice/plugin-intl` is based on `react-intl`.
-
-## Install
-
-```bash
-$ npm i @ice/plugin-intl --save-dev
-```
-
-## Usage
-
-Define the plugin in `ice.config.mts`:
-
-```ts
-import { defineConfig } from '@ice/app';
-import intl from '@ice/plugin-intl';
-
-export default defineConfig({
- plugins: [
- intl(),
- ],
-});
-```
-
-Define locale config in `src/app.ts`:
-
-```ts
-import { defineAppConfig } from 'ice';
-import type { LocaleConfig } from '@ice/plugin-intl/types';
-
-export default defineAppConfig(() => ({}));
-
-export const locale: LocaleConfig = {
- // Cutomize getLocale method and other options supported by react-intl.
- getLocale: () => 'en-US',
-};
-```
-
-## Locales
-
-Locales are defined in the `src/locales` directory. Each locale is defined in a separate file, with the locale name as the file name. For example, `en-US.ts`:
-
-```ts
-export default {
- 'app.title': 'My Application',
- 'app.welcome': 'Welcome to my application!',
-};
-```
-
-Use the `useIntl` hook to access the current locale:
-
-```tsx
-import { useIntl } from 'ice';
-
-export default function Home() {
- const intl = useIntl();
- console.log(intl.formatMessage({ id: 'new' }));
- return home ;
-}
-```
-
-Use the `intl` function to access the current locale:
-
-```tsx
-import { intl } from 'ice';
-
-function alertMessage() {
- alert(intl.formatMessage({ id: 'app.welcome' }));
-}
-```
-
-## Simple mode
-
-Simple mode for remove the dependency of `react-intl`:
-
-Define the plugin in `ice.config.mts`:
-
-```ts
-import { defineConfig } from '@ice/app';
-import intl from '@ice/plugin-intl';
-
-export default defineConfig({
- plugins: [
- // Add intlSolution to remove the dependency of react-intl
- intl({ intlSolution: 'simple' }),
- ],
-});
-```
-
-When you use the `simple` mode, you can only use the `intl.formateMessage` function to get the locale message:
-
-```tsx
-import { ice } from 'ice';
-
-export default function Home() {
- console.log(intl.formatMessage({ id: 'new' }));
- return home ;
-}
-```
-
-Function `intl.formatMessage` is limited, you can only use the syntax below to get the locale message:
-
-Simple Usage:
-
-```tsx
-intl.formatMessage({ id: 'app.welcome', defaultMessage: 'Welcome to my application!' });
-intl.formatMessage('app.welcome');
-```
-
-With Variables:
-
-```tsx
-intl.formatMessage({ id: 'app.welcome' }, { name: 'icejs' });
-```
-
-> Caution: the message Syntax only support the pattern like `{name}`.
diff --git a/packages/plugin-intl/package.json b/packages/plugin-intl/package.json
deleted file mode 100644
index 44d8bd2e05..0000000000
--- a/packages/plugin-intl/package.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "name": "@ice/plugin-intl",
- "version": "1.1.0",
- "description": "react intl plugin for ice.js 3.",
- "files": [
- "esm",
- "!esm/**/*.map",
- "*.d.ts",
- "templates"
- ],
- "type": "module",
- "main": "esm/index.js",
- "module": "esm/index.js",
- "types": "esm/index.d.ts",
- "exports": {
- ".": "./esm/index.js",
- "./runtime": "./esm/runtime.js",
- "./runtime-simple": "./esm/runtime-simple.js",
- "./types": "./esm/types.js"
- },
- "sideEffects": false,
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "dependencies": {
- "react-intl": "^6.0.0",
- "fast-glob": "^3.3.2"
- },
- "devDependencies": {
- "@ice/app": "^3.4.9",
- "@ice/runtime": "^1.4.11",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-intl"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-intl/runtime-simple.d.ts b/packages/plugin-intl/runtime-simple.d.ts
deleted file mode 100644
index a51144f125..0000000000
--- a/packages/plugin-intl/runtime-simple.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime-simple';
diff --git a/packages/plugin-intl/runtime.d.ts b/packages/plugin-intl/runtime.d.ts
deleted file mode 100644
index 72417e24df..0000000000
--- a/packages/plugin-intl/runtime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime';
diff --git a/packages/plugin-intl/src/index.ts b/packages/plugin-intl/src/index.ts
deleted file mode 100644
index 294b21ce6a..0000000000
--- a/packages/plugin-intl/src/index.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import * as path from 'path';
-import { fileURLToPath } from 'url';
-import fg from 'fast-glob';
-import type { Plugin } from '@ice/app/types';
-
-const _dirname = path.dirname(fileURLToPath(import.meta.url));
-
-interface PluginOptions {
- // The key of locale content read from the window object.
- localeMessagesKey?: string;
- defaultLocaleKey?: string;
- useCDN?: boolean;
- intlSolution?: 'react-intl' | 'simple';
-}
-
-const plugin: Plugin = ({
- localeMessagesKey = '__LOCALE_MESSAGES__',
- defaultLocaleKey = '__DEFAULT_LOCALE__',
- useCDN = false,
- intlSolution = 'react-intl',
-} = {}) => ({
- name: 'plugin-intl',
- setup: ({ generator, context, createLogger, watch }) => {
- const { rootDir } = context;
- const logger = createLogger('plugin-intl');
-
- const renderLocaleEntry = (localeFiles: string[]) => {
- const locales = [];
- let localeExport = [];
- localeFiles.forEach((file) => {
- const filename = path.basename(file, path.extname(file));
- // `-` is not allowed in import specifier.
- const specifier = filename.replace('-', '_');
- locales.push(`import ${specifier} from '@/locales/${filename}';`);
- localeExport.push(`'${filename}': ${specifier},`);
- });
-
- generator.addRenderFile(
- path.join(_dirname, '../templates/locales.ts.ejs'),
- 'locales.ts',
- {
- localeMessagesKey,
- defaultLocaleKey,
- localeImport: locales.join('\n'),
- localeExport: localeExport.join('\n '),
- },
- );
- };
- const globRule = 'src/locales/*.{ts,js,json}';
- // Glob all locale files, and generate runtime options.
- const localeFiles = fg.sync(globRule, { cwd: rootDir });
- if (localeFiles.length > 0 && !useCDN) {
- // Filter the entry of locale files.
- const mainEntry = localeFiles.find((file) => file.match(/index\.(ts|js|json)$/));
- let runtimeSource = '';
- if (mainEntry) {
- runtimeSource = `@/locales/${path.basename(mainEntry)}`;
- } else {
- // Create a locale entry file to export all locale files.
- renderLocaleEntry(localeFiles);
-
- // Add watch event for locale files added or removed.
- watch.addEvent([/src\/locales/, (event) => {
- if (event === 'unlink' || event === 'add') {
- const files = fg.sync(globRule, { cwd: rootDir });
- renderLocaleEntry(files);
- }
- }]);
- runtimeSource = './locales';
-
- generator.addEntryImportAhead({
- source: runtimeSource,
- // @ts-ignore
- }, 'both');
- }
- } else {
- renderLocaleEntry([]);
- generator.addEntryImportAhead({
- source: './locales',
- // @ts-ignore
- }, 'both');
- if (!useCDN) {
- logger.warn('No locale files found, please check the `src/locales` folder.');
- }
- }
-
- // Add intl export from ice.
- if (intlSolution === 'simple') {
- generator.addExport({
- specifier: ['intl'],
- source: '@ice/plugin-intl/runtime-simple',
- });
- } else {
- generator.addExport({
- specifier: ['useIntl', 'intl'],
- source: '@ice/plugin-intl/runtime',
- });
- }
- },
- runtime: intlSolution === 'simple' ? '@ice/plugin-intl/runtime-simple' : '@ice/plugin-intl/runtime',
-});
-
-export default plugin;
diff --git a/packages/plugin-intl/src/intl-until.ts b/packages/plugin-intl/src/intl-until.ts
deleted file mode 100644
index e21c37474c..0000000000
--- a/packages/plugin-intl/src/intl-until.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-export const EXPORT_NAME = 'locale';
-
-export const getDefaultLocale = () => {
- // @ts-ignore
- const defaultLocale = (typeof window !== 'undefined' && window.__ICE_DEFAULT_LOCALE__) ||
- (typeof navigator !== 'undefined' && navigator.language) ||
- 'zh-CN';
- return defaultLocale.replace('_', '-');
-};
-
-export const getLocaleMessages = () => {
- // @ts-ignore
- const localeMessages = typeof window === 'undefined' ? global.__ICE_LOCALE_MESSAGES__ : window.__ICE_LOCALE_MESSAGES__;
- return localeMessages || {};
-};
diff --git a/packages/plugin-intl/src/runtime-simple.ts b/packages/plugin-intl/src/runtime-simple.ts
deleted file mode 100644
index 504e18cf09..0000000000
--- a/packages/plugin-intl/src/runtime-simple.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import type { RuntimePlugin } from '@ice/runtime/types';
-import { getDefaultLocale, getLocaleMessages, EXPORT_NAME } from './intl-until.js';
-
-let currentLocale = getDefaultLocale();
-let localeMessages = getLocaleMessages();
-
-const runtime: RuntimePlugin = async ({
- appContext,
-}) => {
- const { appExport } = appContext;
- const { getLocale, ...l } = appExport?.[EXPORT_NAME] || {};
- if (Object.keys(l)?.length > 0) {
- console.error('The locale config is not supported in the simple mode.');
- }
- const locale = getLocale ? getLocale() : getDefaultLocale();
- currentLocale = locale;
- // Refresh locale messages for server side because of import hoisting.
- localeMessages = getLocaleMessages();
-};
-
-interface MessageDescriptor {
- id: string;
- defaultMessage?: string;
-}
-
-const intl = {
- formatMessage: (message: MessageDescriptor | string, values?: Record) => {
- let messageId = typeof message === 'string' ? message : message.id;
- const defaultMessage = typeof message === 'string' ? message : message.defaultMessage;
- let content = localeMessages?.[currentLocale]?.[messageId];
- if (!content) {
- console.error(`Message with id "${messageId}" not found in locale "${currentLocale}"`);
- return defaultMessage || messageId;
- }
- if (values) {
- Object.keys(values).forEach((key) => {
- content = content.replace(new RegExp(`{${key}}`, 'g'), values[key]);
- });
- }
- return content;
- },
-};
-
-export { intl };
-
-export default runtime;
diff --git a/packages/plugin-intl/src/runtime.tsx b/packages/plugin-intl/src/runtime.tsx
deleted file mode 100644
index d8c47f5f39..0000000000
--- a/packages/plugin-intl/src/runtime.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import * as React from 'react';
-import { createIntl, createIntlCache, RawIntlProvider, useIntl } from 'react-intl';
-import type { IntlShape } from 'react-intl';
-import type { RuntimePlugin } from '@ice/runtime/types';
-import { getDefaultLocale, getLocaleMessages, EXPORT_NAME } from './intl-until.js';
-import type { LocaleConfig } from './types.js';
-
-const cache = createIntlCache();
-
-const defaultLocale = getDefaultLocale();
-let intl: IntlShape = createIntl({
- locale: defaultLocale,
- messages: getLocaleMessages()?.[defaultLocale] || {},
-});
-
-const runtime: RuntimePlugin = async ({
- addProvider,
- appContext,
-}) => {
- const { appExport } = appContext;
- const exported = appExport[EXPORT_NAME];
- const localeConfig: LocaleConfig = (typeof exported === 'function' ? await exported() : exported) || {};
- const { getLocale, ...l } = localeConfig;
- const locale = getLocale ? getLocale() : getDefaultLocale();
-
- intl = createIntl({
- ...l,
- messages: getLocaleMessages()?.[locale] || {},
- locale: getLocale ? getLocale() : getDefaultLocale(),
- }, cache);
- addProvider(({ children }) => {
- return {children} ;
- });
-};
-
-export {
- intl,
- useIntl,
-};
-
-export default runtime;
diff --git a/packages/plugin-intl/src/types.ts b/packages/plugin-intl/src/types.ts
deleted file mode 100644
index 57f058e32c..0000000000
--- a/packages/plugin-intl/src/types.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { IntlConfig } from 'react-intl';
-
-interface AdditionalConfig {
- getLocale: () => string;
-}
-
-export type LocaleConfig = Partial & AdditionalConfig;
diff --git a/packages/plugin-intl/templates/locales.ts.ejs b/packages/plugin-intl/templates/locales.ts.ejs
deleted file mode 100644
index 501187ba37..0000000000
--- a/packages/plugin-intl/templates/locales.ts.ejs
+++ /dev/null
@@ -1,15 +0,0 @@
-<%- localeImport %>
-
-const localeMessages = {
- <%- localeExport %>
-};
-const LOCALE_MESSAGES_KEY = '__ICE_LOCALE_MESSAGES__';
-const DEFAULT_LOCALE_KEY = '__ICE_DEFAULT_LOCALE__';
-if (typeof window !== 'undefined') {
- window[LOCALE_MESSAGES_KEY] = window['<%- localeMessagesKey %>'] || localeMessages;
- window[DEFAULT_LOCALE_KEY] = window['<%- defaultLocaleKey %>'];
-} else {
- global[LOCALE_MESSAGES_KEY]= localeMessages;
-}
-
-export default localeMessages;
diff --git a/packages/plugin-intl/tsconfig.json b/packages/plugin-intl/tsconfig.json
deleted file mode 100644
index ea83b793fe..0000000000
--- a/packages/plugin-intl/tsconfig.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "module": "ES2020",
- "moduleResolution": "NodeNext",
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-intl/types.d.ts b/packages/plugin-intl/types.d.ts
deleted file mode 100644
index 8554e6cd41..0000000000
--- a/packages/plugin-intl/types.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/types';
diff --git a/packages/plugin-jsx-plus/CHANGELOG.md b/packages/plugin-jsx-plus/CHANGELOG.md
deleted file mode 100644
index d4c76963ea..0000000000
--- a/packages/plugin-jsx-plus/CHANGELOG.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Changelog
-
-## 1.0.4
-
-### Patch Changes
-
-- aaea501d: fix: allow decorators-legacy syntax in js file
-
-## 1.0.3
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 1.0.2
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.0.1
-
-### Patch Changes
-
-- 5cc9ce45: Enable ignoreModuleCheck to support compat rax.
-
-## 1.0.0
-
-Initial implementation.
diff --git a/packages/plugin-jsx-plus/README.md b/packages/plugin-jsx-plus/README.md
deleted file mode 100644
index a0fde64511..0000000000
--- a/packages/plugin-jsx-plus/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# @ice/plugin-jsx-plus
-
-This plugin adds support for JSX+ syntax to the ice.js.
-
-## Definition of JSX Plus
-
-https://github.com/jsx-plus/jsx-plus
-
-## Usage
-
-```js
-import { defineConfig } from '@ice/app';
-import jsxplus from '@ice/plugin-jsx-plus';
-
-export default defineConfig(() => ({
- plugins: [
- jsxplus({
- // options
- }),
- ],
-}));
-```
-
-## Options
-
-- `include`: `(string | RegExp)[]`
- - Files to be included.
- - Default: the project `src` directory.
-- `exclude`: `(string | RegExp)[]`
- - Files to be excluded.
- - Default: `[]`
-- `extensions`: `string[]`
- - File extensions to be processed.
- - Default: `['.jsx', '.tsx']`
-
-> If `include` and `exclude` are both set, `exclude` will be priority executed.
diff --git a/packages/plugin-jsx-plus/package.json b/packages/plugin-jsx-plus/package.json
deleted file mode 100644
index 121e984b26..0000000000
--- a/packages/plugin-jsx-plus/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "name": "@ice/plugin-jsx-plus",
- "version": "1.0.4",
- "description": "JSX Plus support for ice.js",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- },
- "./esm/types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- }
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map"
- ],
- "devDependencies": {
- "@ice/app": "^3.3.2",
- "@types/react": "^18.0.20",
- "@types/react-dom": "^18.0.6"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-jsx-plus"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "dependencies": {
- "@babel/core": "^7.19.1",
- "babel-plugin-transform-jsx-class": "^0.1.3",
- "babel-plugin-transform-jsx-condition": "^0.1.3",
- "babel-plugin-transform-jsx-fragment": "^0.1.4",
- "babel-plugin-transform-jsx-list": "^0.1.2",
- "babel-plugin-transform-jsx-memo": "^0.1.4",
- "babel-plugin-transform-jsx-slot": "^0.1.2",
- "babel-runtime-jsx-plus": "^0.1.5"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-jsx-plus/src/index.ts b/packages/plugin-jsx-plus/src/index.ts
deleted file mode 100644
index 93ffe389fc..0000000000
--- a/packages/plugin-jsx-plus/src/index.ts
+++ /dev/null
@@ -1,139 +0,0 @@
-import path from 'path';
-import { createRequire } from 'module';
-import type { Plugin } from '@ice/app/types';
-import { transformSync } from '@babel/core';
-
-const require = createRequire(import.meta.url);
-const runtimePackage = 'babel-runtime-jsx-plus';
-const runtimePackagePath = require.resolve(runtimePackage);
-
-const babelPlugins = [
- 'babel-plugin-transform-jsx-list',
- 'babel-plugin-transform-jsx-condition',
- 'babel-plugin-transform-jsx-memo',
- 'babel-plugin-transform-jsx-slot',
- ['babel-plugin-transform-jsx-fragment', { moduleName: 'react', ignoreModuleCheck: true }],
- 'babel-plugin-transform-jsx-class',
-];
-
-const babelTransformOptions = {
- babelrc: false,
- configFile: false,
- parserOpts: {
- sourceType: 'module',
- allowAwaitOutsideFunction: true,
- // ts syntax had already been transformed by swc plugin.
- plugins: [
- 'jsx',
- 'importMeta',
- 'topLevelAwait',
- 'classProperties',
- 'classPrivateMethods',
- 'decorators-legacy', // allowing decorators by default
- ],
- generatorOpts: {
- decoratorsBeforeExport: true,
- },
- },
- plugins: [],
-};
-
-babelPlugins.forEach((plugin) => {
- if (typeof plugin === 'string') {
- babelTransformOptions.plugins.push(require.resolve(plugin));
- } else if (Array.isArray(plugin)) {
- const pluginName = plugin[0] as string;
- const pluginOption = plugin[1];
- babelTransformOptions.plugins.push([require.resolve(pluginName), pluginOption]);
- }
-});
-
-export function idFilter(options: JSXPlusOptions, id: string): boolean {
- const extFilter = (id) => options.extensions.some((ext) => id.endsWith(ext));
-
- if (options.exclude) {
- for (const pattern of options.exclude) {
- if (typeof pattern === 'string') {
- if (id.indexOf(pattern) > -1) {
- return false;
- }
- } else if (pattern instanceof RegExp && pattern.test(id)) {
- return false;
- }
- }
- }
-
- if (options.include) {
- for (const pattern of options.include) {
- if (typeof pattern === 'string') {
- if (id.indexOf(pattern) > -1) {
- return extFilter(id);
- }
- } else if (pattern instanceof RegExp && pattern.test(id)) {
- return extFilter(id);
- }
- }
- }
-
- return false;
-}
-
-export interface JSXPlusOptions {
- include?: (string | RegExp)[];
- exclude?: (string | RegExp)[];
- extensions?: string[];
-}
-
-const plugin: Plugin = (options: JSXPlusOptions = {}) => ({
- name: '@ice/plugin-jsx-plus',
- setup: ({ onGetConfig, context }) => {
- // Default include all files in `src`.
- if (!options.include) {
- const sourceDir = path.join(context.rootDir, 'src');
- options.include = [sourceDir];
- }
-
- // Default include all files with `.tsx` and `.jsx` extensions.
- if (!options.extensions) {
- options.extensions = ['.tsx', '.jsx'];
- }
-
- function jsxPlusTransformer(source, id) {
- if (idFilter(options, id)) {
- try {
- const options = Object.assign({
- filename: id,
- sourceFileName: id,
- }, babelTransformOptions);
- if (/\.tsx?$/.test(id)) {
- // When routes file is a typescript file, add ts parser plugins.
- options.parserOpts.plugins.push('typescript');
- }
-
- const { code, map } = transformSync(source, options);
- return { code, map };
- } catch (compileError) {
- console.error(compileError);
- return { code: source, map: null };
- }
- }
- return { code: source, map: null };
- }
-
- onGetConfig((config) => {
- // Add runtime alias.
- if (!config.alias) {
- config.alias = {};
- }
- config.alias[runtimePackage] = runtimePackagePath;
-
- // Apply babel jsx plus transformer.
- if (!config.transforms) {
- config.transforms = [];
- }
- config.transforms.push(jsxPlusTransformer);
- });
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-jsx-plus/tests/jsxplus.test.ts b/packages/plugin-jsx-plus/tests/jsxplus.test.ts
deleted file mode 100644
index 22bda62974..0000000000
--- a/packages/plugin-jsx-plus/tests/jsxplus.test.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { expect, it, describe } from 'vitest';
-import { default as jsxPlus, idFilter } from '../src';
-
-describe('JSX Plus Plugin', () => {
- describe('Id filter', () => {
- it('default', () => {
- expect(idFilter({}, '/bar/a.tsx')).toBeFalsy();
- });
-
- it('include', () => {
- const options = {
- include: [/bar/, 'foo'],
- extensions: ['.jsx', '.tsx'],
- };
-
- expect(idFilter(options, '/bar/a.tsx')).toBeTruthy();
- expect(idFilter(options, '/foo/a.tsx')).toBeTruthy();
- });
-
- it('exclude', () => {
- expect(idFilter({
- exclude: ['foo'],
- include: [/bar/],
- extensions: ['.jsx', '.tsx'],
- }, '/foo/bar/a.tsx')).toBeFalsy();
-
- expect(idFilter({
- exclude: [/foo/],
- include: [/bar/],
- extensions: ['.jsx', '.tsx'],
- }, '/foo/bar/a.tsx')).toBeFalsy();
- });
-
- it('extensions', () => {
- const options = {
- include: [/bar/],
- extensions: ['.jsx', '.tsx', '.custom.ext'],
- };
- expect(idFilter(options, '/foo/bar/a.tsx.custom.ext')).toBeTruthy();
- });
- });
-
- describe('Plugin', () => {
- it('default', () => {
- const plugin = jsxPlus({
- include: ['foo'],
- });
- // @ts-ignore
- expect(plugin.name).toBe('@ice/plugin-jsx-plus');
- const fakeConfig = {};
- function onGetConfig(fn) {
- fn(fakeConfig);
- }
- const context = {
- rootDir: '/foo/bar',
- };
- // @ts-ignore
- plugin.setup({ onGetConfig, context });
- expect(fakeConfig['alias']['babel-runtime-jsx-plus']).toBeDefined();
- expect(Array.isArray(fakeConfig['transforms'])).toBeTruthy();
- expect(fakeConfig['transforms'].length).toBe(1);
- });
-
- it('transformer', () => {
- const plugin = jsxPlus({
- include: ['foo'],
- });
- const fakeConfig = {};
- function onGetConfig(fn) {
- fn(fakeConfig);
- }
- const context = {
- rootDir: '/foo/bar',
- };
- // @ts-ignore
- plugin.setup({ onGetConfig, context });
-
- const transformer = fakeConfig['transforms'][0];
- const ret = transformer('
', '/foo/bar/a.tsx');
- expect(ret.code).toBe(`import { createCondition as __create_condition__ } from "babel-runtime-jsx-plus";
-__create_condition__([[() => false, () =>
]]);`);
- });
-
- it('transformer w/ parent element is a <>>', () => {
- const plugin = jsxPlus({
- include: ['foo'],
- });
- const fakeConfig = {};
- function onGetConfig(fn) {
- fn(fakeConfig);
- }
- const context = {
- rootDir: '/foo/bar',
- };
- // @ts-ignore
- plugin.setup({ onGetConfig, context });
-
- const transformer = fakeConfig['transforms'][0];
- const ret = transformer('<>
>', '/foo/bar/a.tsx');
- expect(ret.code).toBe(`import { createCondition as __create_condition__ } from "babel-runtime-jsx-plus";
-import { Fragment } from "react";
-<>{__create_condition__([[() => true, () =>
]])}>;`);
- });
- });
-});
\ No newline at end of file
diff --git a/packages/plugin-jsx-plus/tsconfig.json b/packages/plugin-jsx-plus/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-jsx-plus/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-miniapp/CHANGELOG.md b/packages/plugin-miniapp/CHANGELOG.md
deleted file mode 100644
index 2f7ad0a952..0000000000
--- a/packages/plugin-miniapp/CHANGELOG.md
+++ /dev/null
@@ -1,164 +0,0 @@
-# Changelog
-
-## 1.2.7
-
-### Patch Changes
-
-- @ice/miniapp-runtime@1.2.6
-- @ice/miniapp-react-dom@1.1.6
-
-## 1.2.6
-
-### Patch Changes
-
-- @ice/miniapp-runtime@1.2.5
-- @ice/miniapp-react-dom@1.1.5
-
-## 1.2.5
-
-### Patch Changes
-
-- @ice/miniapp-runtime@1.2.4
-- @ice/miniapp-react-dom@1.1.4
-
-## 1.2.4
-
-### Patch Changes
-
-- 3670eadc: fix: miniapp using absolute path to match route manifest
-- Updated dependencies [d27ad76c]
- - @ice/miniapp-runtime@1.2.3
- - @ice/miniapp-react-dom@1.1.3
-
-## 1.2.3
-
-### Patch Changes
-
-- Updated dependencies [2f73084d]
- - @ice/bundles@0.2.9
- - @ice/miniapp-loader@1.2.2
-
-## 1.2.2
-
-### Patch Changes
-
-- Updated dependencies [97cb2046]
-- Updated dependencies [97cb2046]
-- Updated dependencies [a0099df5]
- - @ice/bundles@0.2.8
- - @ice/miniapp-loader@1.2.1
- - @ice/miniapp-runtime@1.2.2
- - @ice/miniapp-react-dom@1.1.2
-
-## 1.2.1
-
-### Patch Changes
-
-- cce46e9b: fix: should check skeleton file existed before read
- - @ice/miniapp-runtime@1.2.1
- - @ice/miniapp-react-dom@1.1.1
-
-## 1.2.0
-
-### Minor Changes
-
-- 710b2e48: feat: improve miniapp runtime
-
-### Patch Changes
-
-- Updated dependencies [710b2e48]
- - @ice/miniapp-loader@1.2.0
- - @ice/miniapp-react-dom@1.1.0
- - @ice/miniapp-runtime@1.2.0
- - @ice/shared@1.1.0
- - @ice/route-manifest@1.3.0
-
-## 1.1.3
-
-### Patch Changes
-
-- Updated dependencies [a68ff48d]
- - @ice/bundles@0.2.0
- - @ice/miniapp-loader@1.1.2
-
-## 1.1.2
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-- Updated dependencies [b8b1d5e4]
- - @ice/miniapp-react-dom@1.0.2
- - @ice/miniapp-runtime@1.1.2
- - @ice/miniapp-loader@1.1.1
- - @ice/bundles@0.1.16
- - @ice/shared@1.0.2
-
-## 1.1.1
-
-### Patch Changes
-
-- 098cb37c: fix: add export of streaming api
-- Updated dependencies [f95bbc2e]
-- Updated dependencies [098cb37c]
-- Updated dependencies [c70c7737]
- - @ice/bundles@0.1.12
- - @ice/miniapp-runtime@1.1.1
-
-## 1.1.0
-
-### Minor Changes
-
-- cc448339: set default value for miniappLifecycles
-- ddee1c3e: support miniapp native events
-- 57219848: support miniapp native lifecycle events
-
-### Patch Changes
-
-- 4655a76d: update remove expressions for data loader
-- Updated dependencies
- - @ice/bundles@0.1.10
- - @ice/miniapp-runtime@1.1.0
- - @ice/miniapp-loader@1.1.0
- - @ice/shared@1.0.1
-
-## 1.1.0-beta.1
-
-### Minor Changes
-
-- set default value for miniappLifecycles
-
-### Patch Changes
-
-- Updated dependencies
- - @ice/miniapp-runtime@1.1.0-beta.2
-
-## 1.0.4-beta.0
-
-### Patch Changes
-
-- 4655a76d: update remove expressions for data loader
-- Updated dependencies [4655a76d]
- - @ice/miniapp-runtime@1.1.0-beta.1
-
-## 1.0.3
-
-### Patch Changes
-
-- 4e1d9065: refactor: reuse route paths
-- Updated dependencies [ee4141d5]
- - @ice/bundles@0.1.7
-
-## 1.0.2
-
-### Patch Changes
-
-- @ice/miniapp-react-dom@1.0.1
-- @ice/miniapp-runtime@1.0.2
-
-## 1.0.1
-
-- [fix] rename platform to target
-
-## 1.0.0
-
-- [feat] support miniapp development
diff --git a/packages/plugin-miniapp/README.md b/packages/plugin-miniapp/README.md
deleted file mode 100644
index 1f342d17e2..0000000000
--- a/packages/plugin-miniapp/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# @ice/plugin-miniapp
-
-> Forked from [taro](https://github.com/NervJS/taro) with respect ❤️
-> Licensed under the MIT License
-> https://github.com/NervJS/taro/blob/main/LICENSE
-
-ice.js plugin to enable miniapp development.
-
-See [documentation](https://v3.ice.work) for more details.
diff --git a/packages/plugin-miniapp/package.json b/packages/plugin-miniapp/package.json
deleted file mode 100644
index a3fad8086e..0000000000
--- a/packages/plugin-miniapp/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "name": "@ice/plugin-miniapp",
- "version": "1.2.7",
- "description": "ice.js plugin for miniapp.",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./runtime": {
- "types": "./esm/runtime/index.d.ts",
- "import": "./esm/runtime/index.js",
- "default": "./esm/runtime/index.js"
- },
- "./esm/runtime": {
- "types": "./esm/runtime/index.d.ts",
- "import": "./esm/runtime/index.js",
- "default": "./esm/runtime/index.js"
- },
- "./targets/*": "./esm/targets/*"
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map",
- "template"
- ],
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "dependencies": {
- "@ice/bundles": "workspace:*",
- "@ice/miniapp-loader": "workspace:*",
- "@ice/miniapp-react-dom": "workspace:*",
- "@ice/miniapp-runtime": "workspace:*",
- "@ice/route-manifest": "workspace:*",
- "@ice/shared": "workspace:*",
- "acorn-walk": "^8.2.0",
- "chalk": "^4.0.0",
- "consola": "^2.15.3",
- "fast-glob": "^3.2.11",
- "fs-extra": "^10.0.0",
- "html-minifier": "^4.0.0",
- "regenerator-runtime": "^0.11.0",
- "sax": "^1.2.4"
- },
- "devDependencies": {
- "@ice/app": "^3.6.4",
- "@ice/runtime": "^1.5.7",
- "webpack": "^5.88.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-miniapp"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-miniapp/runtime.d.ts b/packages/plugin-miniapp/runtime.d.ts
deleted file mode 100644
index 5a40ee37b2..0000000000
--- a/packages/plugin-miniapp/runtime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime/index';
diff --git a/packages/plugin-miniapp/src/constant.ts b/packages/plugin-miniapp/src/constant.ts
deleted file mode 100644
index 98e6b766fe..0000000000
--- a/packages/plugin-miniapp/src/constant.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export const WEB = 'web';
-export const ALI_MINIAPP = 'ali-miniapp';
-export const WECHAT_MINIPROGRAM = 'wechat-miniprogram';
-export const BYTEDANCE_MICROAPP = 'bytedance-microapp';
-export const BAIDU_SMARTPROGRAM = 'baidu-smartprogram';
-export const KUAISHOU_MINIPROGRAM = 'kuaishou-miniprogram';
-
-export const MINIAPP_TARGETS = [
- ALI_MINIAPP,
- WECHAT_MINIPROGRAM,
- BYTEDANCE_MICROAPP,
- BAIDU_SMARTPROGRAM,
- KUAISHOU_MINIPROGRAM,
-];
-export const ALL_TARGETS = [WEB, ...MINIAPP_TARGETS];
-
-export const MINIAPP_TARGET_FOLDER_NAMES = {
- [ALI_MINIAPP]: 'ali',
- [WECHAT_MINIPROGRAM]: 'wechat',
- [BYTEDANCE_MICROAPP]: 'bytedance',
- [BAIDU_SMARTPROGRAM]: 'baidu',
- // TODO: add kuaishou
-};
diff --git a/packages/plugin-miniapp/src/helper/constants.ts b/packages/plugin-miniapp/src/helper/constants.ts
deleted file mode 100644
index 214ab19180..0000000000
--- a/packages/plugin-miniapp/src/helper/constants.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-import * as os from 'node:os';
-
-import { chalk } from './terminal.js';
-
-// eslint-disable-next-line dot-notation
-export const PLATFORMS = (global['PLATFORMS'] = global['PLATFORMS'] || {});
-
-export const enum processTypeEnum {
- START = 'start',
- CREATE = 'create',
- COMPILE = 'compile',
- CONVERT = 'convert',
- COPY = 'copy',
- GENERATE = 'generate',
- MODIFY = 'modify',
- ERROR = 'error',
- WARNING = 'warning',
- UNLINK = 'unlink',
- REFERENCE = 'reference',
- REMIND = 'remind',
-}
-
-export interface IProcessTypeMap {
- [key: string]: {
- name: string;
- color: string | chalk.Chalk;
- };
-}
-
-export const processTypeMap: IProcessTypeMap = {
- [processTypeEnum.CREATE]: {
- name: '创建',
- color: 'cyan',
- },
- [processTypeEnum.COMPILE]: {
- name: '编译',
- color: 'green',
- },
- [processTypeEnum.CONVERT]: {
- name: '转换',
- color: chalk.rgb(255, 136, 0),
- },
- [processTypeEnum.COPY]: {
- name: '拷贝',
- color: 'magenta',
- },
- [processTypeEnum.GENERATE]: {
- name: '生成',
- color: 'blue',
- },
- [processTypeEnum.MODIFY]: {
- name: '修改',
- color: 'yellow',
- },
- [processTypeEnum.ERROR]: {
- name: '错误',
- color: 'red',
- },
- [processTypeEnum.WARNING]: {
- name: '警告',
- color: 'yellowBright',
- },
- [processTypeEnum.UNLINK]: {
- name: '删除',
- color: 'magenta',
- },
- [processTypeEnum.START]: {
- name: '启动',
- color: 'green',
- },
- [processTypeEnum.REFERENCE]: {
- name: '引用',
- color: 'blue',
- },
- [processTypeEnum.REMIND]: {
- name: '提示',
- color: 'green',
- },
-};
-
-export const CSS_EXT: string[] = ['.css', '.scss', '.sass', '.less', '.styl', '.stylus', '.wxss', '.acss'];
-export const SCSS_EXT: string[] = ['.scss'];
-export const JS_EXT: string[] = ['.js', '.jsx'];
-export const TS_EXT: string[] = ['.ts', '.tsx'];
-export const UX_EXT: string[] = ['.ux'];
-export const SCRIPT_EXT: string[] = JS_EXT.concat(TS_EXT);
-export const VUE_EXT: string[] = ['.vue'];
-
-export const REG_JS = /\.m?js(\?.*)?$/;
-export const REG_SCRIPT = /\.m?(js|jsx)(\?.*)?$/;
-export const REG_TYPESCRIPT = /\.(tsx|ts)(\?.*)?$/;
-export const REG_SCRIPTS = /\.m?[tj]sx?$/i;
-export const REG_VUE = /\.vue$/i;
-export const REG_SASS = /\.(s[ac]ss)$/;
-export const REG_SASS_SASS = /\.sass$/;
-export const REG_SASS_SCSS = /\.scss$/;
-export const REG_LESS = /\.less$/;
-export const REG_STYLUS = /\.styl(us)?$/;
-export const REG_STYLE = /\.(css|scss|sass|less|styl|stylus|wxss|acss|ttss|jxss|qss)(\?.*)?$/;
-export const REG_CSS = /\.(css|qss|jxss|wxss|acss|ttss)(\?.*)?$/;
-export const REG_MEDIA = /\.(mp4|webm|ogg|mp3|m4a|wav|flac|aac)(\?.*)?$/;
-export const REG_IMAGE = /\.(png|jpe?g|gif|bpm|svg|webp)(\?.*)?$/;
-export const REG_FONT = /\.(woff2?|eot|ttf|otf)(\?.*)?$/;
-export const REG_JSON = /\.json(\?.*)?$/;
-export const REG_UX = /\.ux(\?.*)?$/;
-export const REG_TEMPLATE = /\.(wxml|axml|ttml|qml|swan|jxml)(\?.*)?$/;
-export const REG_WXML_IMPORT = / REG_NODE_MODULES.test(filename);
-
-export function isNpmPkg(name: string): boolean {
- if (/^(\.|\/)/.test(name)) {
- return false;
- }
- return true;
-}
-
-export function isQuickAppPkg(name: string): boolean {
- return /^@(system|service)\.[a-zA-Z]{1,}/.test(name);
-}
-
-export function isAliasPath(name: string, pathAlias: Record = {}): boolean {
- const prefixes = Object.keys(pathAlias);
- if (prefixes.length === 0) {
- return false;
- }
- return prefixes.includes(name) || new RegExp(`^(${prefixes.join('|')})/`).test(name);
-}
-
-export function replaceAliasPath(filePath: string, name: string, pathAlias: Record = {}) {
- // 后续的 path.join 在遇到符号链接时将会解析为真实路径,如果
- // 这里的 filePath 没有做同样的处理,可能会导致 import 指向
- // 源代码文件,导致文件被意外修改
- filePath = fs.realpathSync(filePath);
-
- const prefixes = Object.keys(pathAlias);
- if (prefixes.includes(name)) {
- return promoteRelativePath(path.relative(filePath, fs.realpathSync(resolveScriptPath(pathAlias[name]))));
- }
- const reg = new RegExp(`^(${prefixes.join('|')})/(.*)`);
- name = name.replace(reg, (_m, $1, $2) => {
- return promoteRelativePath(path.relative(filePath, path.join(pathAlias[$1], $2)));
- });
- return name;
-}
-
-export function promoteRelativePath(fPath: string): string {
- const fPathArr = fPath.split(path.sep);
- let dotCount = 0;
- fPathArr.forEach((item) => {
- if (item.indexOf('..') >= 0) {
- dotCount++;
- }
- });
- if (dotCount === 1) {
- fPathArr.splice(0, 1, '.');
- return fPathArr.join('/');
- }
- if (dotCount > 1) {
- fPathArr.splice(0, 1);
- return fPathArr.join('/');
- }
- return normalizePath(fPath);
-}
-
-export function resolveStylePath(p: string): string {
- const realPath = p;
- const removeExtPath = p.replace(path.extname(p), '');
- const taroEnv = process.env.TARO_ENV;
- for (let i = 0; i < CSS_EXT.length; i++) {
- const item = CSS_EXT[i];
- if (taroEnv) {
- if (fs.existsSync(`${removeExtPath}.${taroEnv}${item}`)) {
- return `${removeExtPath}.${taroEnv}${item}`;
- }
- }
- if (fs.existsSync(`${p}${item}`)) {
- return `${p}${item}`;
- }
- }
- return realPath;
-}
-
-export function printLog(type: processTypeEnum, tag: string, filePath?: string) {
- const typeShow = processTypeMap[type];
- const tagLen = tag.replace(/[\u0391-\uFFE5]/g, 'aa').length;
- const tagFormatLen = 8;
- if (tagLen < tagFormatLen) {
- const rightPadding = new Array(tagFormatLen - tagLen + 1).join(' ');
- tag += rightPadding;
- }
- const padding = '';
- filePath = filePath || '';
- if (typeof typeShow.color === 'string') {
- console.log(chalk[typeShow.color](typeShow.name), padding, tag, padding, filePath);
- } else {
- console.log(typeShow.color(typeShow.name), padding, tag, padding, filePath);
- }
-}
-
-export function recursiveFindNodeModules(filePath: string, lastFindPath?: string): string {
- const findWorkspaceRoot = require('find-yarn-workspace-root');
- if (lastFindPath && normalizePath(filePath) === normalizePath(lastFindPath)) {
- return filePath;
- }
- const dirname = path.dirname(filePath);
- const workspaceRoot = findWorkspaceRoot(dirname);
- const nodeModules = path.join(workspaceRoot || dirname, 'node_modules');
- if (fs.existsSync(nodeModules)) {
- return nodeModules;
- }
- if (dirname.split(path.sep).length <= 1) {
- printLog(processTypeEnum.ERROR, `在${dirname}目录下`, '未找到node_modules文件夹,请先安装相关依赖库!');
- return nodeModules;
- }
- return recursiveFindNodeModules(dirname, filePath);
-}
-
-export function getUserHomeDir(): string {
- function homedir(): string {
- const { env } = process;
- const home = env.HOME;
- const user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME;
-
- if (process.platform === 'win32') {
- return env.USERPROFILE || `${env.HOMEDRIVE}${env.HOMEPATH}` || home || '';
- }
-
- if (process.platform === 'darwin') {
- return home || (user ? `/Users/${user}` : '');
- }
-
- if (process.platform === 'linux') {
- return home || (process.getuid?.() === 0 ? '/root' : user ? `/home/${user}` : '');
- }
-
- return home || '';
- }
- return typeof (os.homedir as (() => string) | undefined) === 'function' ? os.homedir() : homedir();
-}
-
-export function getHash(text: Buffer | string): string {
- return createHash('sha256').update(text).digest('hex').substring(0, 8);
-}
-
-export function getSystemUsername(): string {
- const userHome = getUserHomeDir();
- const systemUsername = process.env.USER || path.basename(userHome);
- return systemUsername;
-}
-
-export function shouldUseYarn(): boolean {
- try {
- execSync('yarn --version', { stdio: 'ignore' });
- return true;
- } catch (e) {
- return false;
- }
-}
-
-export function shouldUseCnpm(): boolean {
- try {
- execSync('cnpm --version', { stdio: 'ignore' });
- return true;
- } catch (e) {
- return false;
- }
-}
-
-export function isEmptyObject(obj: any): boolean {
- if (obj == null) {
- return true;
- }
- for (const key in obj) {
- if (obj.hasOwnProperty(key)) {
- return false;
- }
- }
- return true;
-}
-
-// export function resolveSync(id: string, opts: TResolve.SyncOpts & { mainFields?: string[] } = {}): string | null {
-// try {
-// const resolve = require('resolve').sync as (typeof TResolve)['sync'];
-// return resolve(id, {
-// ...opts,
-// packageFilter(pkg, pkgfile, dir) {
-// if (opts.packageFilter) {
-// pkg = opts.packageFilter(pkg, pkgfile, dir);
-// } else if (opts.mainFields?.length) {
-// pkg.main = pkg[opts.mainFields.find((field) => pkg[field] && typeof pkg[field] === 'string') || 'main'];
-// }
-// return pkg;
-// },
-// });
-// } catch (error) {
-// return null;
-// }
-// }
-
-export function resolveMainFilePath(p: string, extArrs = SCRIPT_EXT): string {
- if (p.startsWith('pages/') || p === 'app.config') {
- return p;
- }
- const realPath = p;
- const taroEnv = process.env.TARO_ENV;
- for (let i = 0; i < extArrs.length; i++) {
- const item = extArrs[i];
- if (taroEnv) {
- if (fs.existsSync(`${p}.${taroEnv}${item}`)) {
- return `${p}.${taroEnv}${item}`;
- }
- if (fs.existsSync(`${p}${path.sep}index.${taroEnv}${item}`)) {
- return `${p}${path.sep}index.${taroEnv}${item}`;
- }
- if (fs.existsSync(`${p.replace(/\/index$/, `.${taroEnv}/index`)}${item}`)) {
- return `${p.replace(/\/index$/, `.${taroEnv}/index`)}${item}`;
- }
- }
- if (fs.existsSync(`${p}${item}`)) {
- return `${p}${item}`;
- }
- if (fs.existsSync(`${p}${path.sep}index${item}`)) {
- return `${p}${path.sep}index${item}`;
- }
- }
- // 存在多端页面但是对应的多端页面配置不存在时,使用该页面默认配置
- if (taroEnv && path.parse(p).base.endsWith(`.${taroEnv}.config`)) {
- const idx = p.lastIndexOf(`.${taroEnv}.config`);
- return resolveMainFilePath(`${p.slice(0, idx)}.config`);
- }
- return realPath;
-}
-
-export function resolveScriptPath(p: string): string {
- return resolveMainFilePath(p);
-}
-
-export function generateEnvList(env: Record): Record {
- const res = {};
- if (env && !isEmptyObject(env)) {
- for (const key in env) {
- try {
- res[`process.env.${key}`] = JSON.parse(env[key]);
- } catch (err) {
- res[`process.env.${key}`] = env[key];
- }
- }
- }
- return res;
-}
-
-/**
- * 获取 npm 文件或者依赖的绝对路径
- *
- * @param {string} 参数1 - 组件路径
- * @param {string} 参数2 - 文件扩展名
- * @returns {string} npm 文件绝对路径
- */
-export function getNpmPackageAbsolutePath(npmPath: string, defaultFile = 'index'): string | null {
- try {
- let packageName = '';
- let componentRelativePath = '';
- const packageParts = npmPath.split(path.sep);
-
- // 获取 npm 包名和指定的包文件路径
- // taro-loader/path/index => packageName = taro-loader, componentRelativePath = path/index
- // @tarojs/runtime/path/index => packageName = @tarojs/runtime, componentRelativePath = path/index
- if (npmPath.startsWith('@')) {
- packageName = packageParts.slice(0, 2).join(path.sep);
- componentRelativePath = packageParts.slice(2).join(path.sep);
- } else {
- packageName = packageParts[0];
- componentRelativePath = packageParts.slice(1).join(path.sep);
- }
-
- // 没有指定的包文件路径统一使用 defaultFile
- componentRelativePath ||= defaultFile;
- // require.resolve 解析的路径会包含入口文件路径,通过正则过滤一下
- const packageJsonPath = require.resolve(path.join(packageName, 'package.json'));
- const packageDir = path.dirname(packageJsonPath);
- const packageJson = require(packageJsonPath);
-
- if (packageJson.miniprogram) {
- return path.join(packageDir, packageJson.miniprogram, componentRelativePath);
- }
-
- return path.join(packageDir, `./${componentRelativePath}`);
- } catch (error) {
- return null;
- }
-}
-
-export function generateConstantsList(constants: Record): Record {
- const res = {};
- if (constants && !isEmptyObject(constants)) {
- for (const key in constants) {
- if (isPlainObject(constants[key])) {
- res[key] = generateConstantsList(constants[key]);
- } else {
- try {
- res[key] = JSON.parse(constants[key]);
- } catch (err) {
- res[key] = constants[key];
- }
- }
- }
- }
- return res;
-}
-
-export function cssImports(content: string): string[] {
- const results: string[] = [];
- const cssImportRegx = new RegExp(REG_CSS_IMPORT);
- let match: RegExpExecArray | null;
-
- content = String(content).replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, '');
-
- while ((match = cssImportRegx.exec(content))) {
- results.push(match[2]);
- }
-
- return results;
-}
-
-/*eslint-disable*/
-const retries = process.platform === 'win32' ? 100 : 1;
-export function emptyDirectory(
- dirPath: string,
- opts: { excludes: Array | string | RegExp } = { excludes: [] },
-) {
- if (fs.existsSync(dirPath)) {
- fs.readdirSync(dirPath).forEach((file) => {
- const curPath = path.join(dirPath, file);
- if (fs.lstatSync(curPath).isDirectory()) {
- let removed = false;
- let i = 0; // retry counter
- do {
- try {
- const excludes = Array.isArray(opts.excludes) ? opts.excludes : [opts.excludes];
- const canRemove =
- !excludes.length ||
- !excludes.some((item) => (typeof item === 'string' ? curPath.indexOf(item) >= 0 : item.test(curPath)));
- if (canRemove) {
- emptyDirectory(curPath);
- fs.rmdirSync(curPath);
- }
- removed = true;
- } catch (e) {
- } finally {
- if (++i < retries) {
- continue;
- }
- }
- } while (!removed);
- } else {
- fs.unlinkSync(curPath);
- }
- });
- }
-}
-/* eslint-enable */
-
-export const pascalCase: (str: string) => string = (str: string): string =>
- str.charAt(0).toUpperCase() + camelCase(str.substr(1));
-
-// export function getInstalledNpmPkgPath(pkgName: string, basedir: string): string | null {
-// try {
-// const resolve = require('resolve').sync as (typeof TResolve)['sync'];
-// return resolve(`${pkgName}/package.json`, { basedir });
-// } catch (err) {
-// return null;
-// }
-// }
-
-// export function getInstalledNpmPkgVersion(pkgName: string, basedir: string): string | null {
-// const pkgPath = getInstalledNpmPkgPath(pkgName, basedir);
-// if (!pkgPath) {
-// return null;
-// }
-// return fs.readJSONSync(pkgPath).version;
-// }
-
-export const recursiveMerge = (src: Partial, ...args: (Partial | undefined)[]) => {
- return mergeWith(src, ...args, (value, srcValue) => {
- const typeValue = typeof value;
- const typeSrcValue = typeof srcValue;
- if (typeValue !== typeSrcValue) return;
- if (Array.isArray(value) && Array.isArray(srcValue)) {
- return value.concat(srcValue);
- }
- if (typeValue === 'object') {
- return recursiveMerge(value, srcValue);
- }
- });
-};
-
-export const mergeVisitors = (src, ...args) => {
- const validFuncs = ['exit', 'enter'];
- return mergeWith(src, ...args, (value, srcValue, key, object, srcObject) => {
- if (!object.hasOwnProperty(key) || !srcObject.hasOwnProperty(key)) {
- return undefined;
- }
-
- const shouldMergeToArray = validFuncs.indexOf(key) > -1;
- if (shouldMergeToArray) {
- return flatMap([value, srcValue]);
- }
- const [newValue, newSrcValue] = [value, srcValue].map((v) => {
- if (typeof v === 'function') {
- return {
- enter: v,
- };
- } else {
- return v;
- }
- });
- return mergeVisitors(newValue, newSrcValue);
- });
-};
-
-export const applyArrayedVisitors = (obj) => {
- let key;
- for (key in obj) {
- const funcs = obj[key];
- if (Array.isArray(funcs)) {
- obj[key] = (astPath, ...args) => {
- funcs.forEach((func) => {
- func(astPath, ...args);
- });
- };
- } else if (typeof funcs === 'object') {
- applyArrayedVisitors(funcs);
- }
- }
- return obj;
-};
-
-export const getAllFilesInFolder = async (folder: string, filter: string[] = []): Promise => {
- let files: string[] = [];
- const list = readDirWithFileTypes(folder);
-
- await Promise.all(
- list.map(async (item) => {
- const itemPath = path.join(folder, item.name);
- if (item.isDirectory) {
- const _files = await getAllFilesInFolder(itemPath, filter);
- files = [...files, ..._files];
- } else if (item.isFile) {
- if (!filter.find((rule) => rule === item.name)) files.push(itemPath);
- }
- }),
- );
-
- return files;
-};
-
-export interface FileStat {
- name: string;
- isDirectory: boolean;
- isFile: boolean;
-}
-
-export function readDirWithFileTypes(folder: string): FileStat[] {
- const list = fs.readdirSync(folder);
- const res = list.map((name) => {
- const stat = fs.statSync(path.join(folder, name));
- return {
- name,
- isDirectory: stat.isDirectory(),
- isFile: stat.isFile(),
- };
- });
- return res;
-}
-
-export function extnameExpRegOf(filePath: string): RegExp {
- return new RegExp(`${path.extname(filePath)}$`);
-}
-
-export function addPlatforms(platform: string) {
- const upperPlatform = platform.toLocaleUpperCase();
- if (PLATFORMS[upperPlatform]) return;
- PLATFORMS[upperPlatform] = platform;
-}
-
-export const getModuleDefaultExport = (exports) => (exports.__esModule ? exports.default : exports);
-
-export function removeHeadSlash(str: string) {
- return str.replace(/^(\/|\\)/, '');
-}
-
-// converts ast nodes to js object
-function exprToObject(node: any) {
- const types = ['BooleanLiteral', 'StringLiteral', 'NumericLiteral'];
-
- if (types.includes(node.type)) {
- return node.value;
- }
-
- if (node.name === 'undefined' && !node.value) {
- return undefined;
- }
-
- if (node.type === 'NullLiteral') {
- return null;
- }
-
- if (node.type === 'ObjectExpression') {
- return genProps(node.properties);
- }
-
- if (node.type === 'ArrayExpression') {
- return node.elements.reduce(
- (acc: any, el: any) => [
- ...acc,
- ...(el!.type === 'SpreadElement' ? exprToObject(el.argument) : [exprToObject(el)]),
- ],
- [],
- );
- }
-}
-
-// converts ObjectExpressions to js object
-function genProps(props: any[]) {
- return props.reduce((acc, prop) => {
- if (prop.type === 'SpreadElement') {
- return {
- ...acc,
- ...exprToObject(prop.argument),
- };
- } else if (prop.type !== 'ObjectMethod') {
- const v = exprToObject(prop.value);
- if (v !== undefined) {
- return {
- ...acc,
- [prop.key.name || prop.key.value]: v,
- };
- }
- }
- return acc;
- }, {});
-}
-
-// read page config from a sfc file instead of the regular config file
-// function readSFCPageConfig(configPath: string) {
-// if (!fs.existsSync(configPath)) return {};
-//
-// const sfcSource = fs.readFileSync(configPath, 'utf8');
-// const dpcReg = /definePageConfig\(\{[\w\W]+?\}\)/g;
-// const matches = sfcSource.match(dpcReg);
-//
-// let result: any = {};
-//
-// if (matches && matches.length === 1) {
-// const callExprHandler = (p: any) => {
-// const { callee } = p.node;
-// if (!callee.name) return;
-// if (callee.name && callee.name !== 'definePageConfig') return;
-//
-// const configNode = p.node.arguments[0];
-// result = exprToObject(configNode);
-// p.stop();
-// };
-// const configSource = matches[0];
-// const ast = babel.parse(configSource, { filename: '' }) as babel.ParseResult;
-//
-// babel.traverse(ast.program, { CallExpression: callExprHandler });
-// }
-//
-// return result;
-// }
-
-// export function readPageConfig(configPath: string) {
-// let result: any = {};
-// const extNames = ['.js', '.jsx', '.ts', '.tsx', '.vue'];
-//
-// // check source file extension
-// extNames.some((ext) => {
-// const tempPath = configPath.replace('.config', ext);
-// if (fs.existsSync(tempPath)) {
-// try {
-// result = readSFCPageConfig(tempPath);
-// } catch (error) {
-// result = {};
-// }
-// return true;
-// }
-// });
-// return result;
-// }
-
-// interface IReadConfigOptions {
-// defineConstants?: Record;
-// alias?: Record;
-// }
-// NOTE: 请使用 combination.readConfig 代替
-// export function readConfig(configPath: string, options: T = {} as T) {
-// let result: any = {};
-// if (fs.existsSync(configPath)) {
-// if (REG_JSON.test(configPath)) {
-// result = fs.readJSONSync(configPath);
-// } else {
-// result = requireWithEsbuild(configPath, {
-// customConfig: {
-// alias: options.alias || {},
-// define: defaults({}, options.defineConstants || {}, {
-// define: 'define', // Note: 该场景下不支持 AMD 导出,这会导致 esbuild 替换 babel 的 define 方法
-// }),
-// },
-// customSwcConfig: {
-// jsc: {
-// parser: {
-// syntax: 'typescript',
-// decorators: true,
-// },
-// transform: {
-// legacyDecorator: true,
-// },
-// experimental: {
-// plugins: [[path.resolve(__dirname, '../swc/swc_plugin_define_config.wasm'), {}]],
-// },
-// },
-// module: {
-// type: 'commonjs',
-// },
-// },
-// });
-// }
-//
-// result = getModuleDefaultExport(result);
-// } else {
-// result = readPageConfig(configPath);
-// }
-// return result;
-// }
-
-// 去除路径前缀,比如 /, ./
-export function removePathPrefix(filePath = '') {
- const normalizedPath = path.normalize(filePath);
- const parsedPath = path.parse(normalizedPath);
- const { root, dir, base } = parsedPath;
-
- let result = path.join(dir, base);
-
- if (result.startsWith(root)) {
- result = result.slice(root.length);
- }
-
- return result;
-}
-
-export { fs };
-
-// 集中引入 babel 工具箱,供编译时使用
-// export const babelKit = {
-// types: t,
-// parse: babelParser.parse,
-// generate: babelGenerator,
-// traverse: babelTraverse,
-// };
diff --git a/packages/plugin-miniapp/src/index.ts b/packages/plugin-miniapp/src/index.ts
deleted file mode 100644
index e4fa119e81..0000000000
--- a/packages/plugin-miniapp/src/index.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import path from 'path';
-import { createRequire } from 'module';
-import consola from 'consola';
-import chalk from 'chalk';
-import type { Plugin } from '@ice/app/esm/types';
-import getMiniappTask from './miniapp/index.js';
-import { MINIAPP_TARGET_FOLDER_NAMES, MINIAPP_TARGETS } from './constant.js';
-
-interface MiniappOptions {
- // TODO: specify the config type of native.
- nativeConfig?: Record;
-}
-
-const _require = createRequire(import.meta.url);
-const packageJSON = _require('../package.json');
-const { name: PLUGIN_NAME } = packageJSON;
-
-const plugin: Plugin = (miniappOptions = {}) => ({
- name: PLUGIN_NAME,
- setup: ({ registerTask, onHook, context, generator, modifyUserConfig }) => {
- const { nativeConfig = {} } = miniappOptions;
- const { commandArgs, rootDir, command } = context;
- const { target } = commandArgs;
- if (MINIAPP_TARGETS.includes(target)) {
- const configAPI = {
- getAppConfig: async () => ({}),
- getRoutesConfig: async () => ({}),
- };
- // Recommand add @ice/miniapp-runtime in dependencies when use pnpm.
- // Use `@ice/miniapp-runtime/esm/app` for vscode type hint.
- const miniappRuntime = '@ice/miniapp-runtime/esm/app';
- const importSpecifiers = [
- 'defineAppConfig',
- 'useAppData',
- 'useData',
- 'useConfig',
- 'Link',
- 'useSearchParams',
- 'history',
- 'defineDataLoader',
- 'usePageLifecycle',
- 'withSuspense',
- 'useSuspenseData',
- ];
- generator.addRenderFile('core/entry.client.tsx.ejs', 'entry.miniapp.tsx', {
- iceRuntimePath: miniappRuntime,
- enableRoutes: false,
- });
-
- generator.addRenderFile('core/index.ts.ejs', 'index.miniapp.ts', {
- framework: {
- imports: `import { ${importSpecifiers.join(',\n')} } from '${miniappRuntime}';`,
- exports: importSpecifiers.join(',\n'),
- },
- });
- generator.addRuntimeOptions({
- source: `${PLUGIN_NAME}/targets/${MINIAPP_TARGET_FOLDER_NAMES[target]}/runtime.js`,
- });
- modifyUserConfig('optimization', {
- router: false,
- disableRouter: true,
- });
- // Get server compiler by hooks
- onHook(`before.${command as 'start' | 'build'}.run`, async ({ getAppConfig, getRoutesConfig }) => {
- configAPI.getAppConfig = getAppConfig;
- configAPI.getRoutesConfig = getRoutesConfig;
- });
- registerTask(
- 'miniapp',
- getMiniappTask({
- rootDir,
- command,
- target,
- configAPI,
- runtimeDir: '.ice',
- nativeConfig,
- }),
- );
- onHook(`after.${command as 'start' | 'build'}.compile`, async ({ isSuccessful, isFirstCompile }) => {
- const shouldShowLog = isSuccessful && ((command === 'start' && isFirstCompile) || command === 'build');
- if (shouldShowLog) {
- let logoutMessage = '\n';
- logoutMessage += chalk.green(`Use ${target} developer tools to open the this project or build folder`);
- consola.log(`${logoutMessage}\n`);
- }
- });
- }
- },
- runtime: `${PLUGIN_NAME}/runtime`,
-});
-
-export default plugin;
diff --git a/packages/plugin-miniapp/src/miniapp/html/index.ts b/packages/plugin-miniapp/src/miniapp/html/index.ts
deleted file mode 100644
index 6402a6df7b..0000000000
--- a/packages/plugin-miniapp/src/miniapp/html/index.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-interface ComponentConfig {
- includes: Set;
-}
-
-interface OnParseCreateElementArgs {
- nodeName: string;
- componentConfig: ComponentConfig;
-}
-
-const inlineElements = [
- 'i',
- 'abbr',
- 'select',
- 'acronym',
- 'small',
- 'bdi',
- 'kbd',
- 'strong',
- 'big',
- 'sub',
- 'sup',
- 'br',
- 'mark',
- 'meter',
- 'template',
- 'cite',
- 'object',
- 'time',
- 'code',
- 'output',
- 'u',
- 'data',
- 'picture',
- 'tt',
- 'datalist',
- 'var',
- 'dfn',
- 'del',
- 'q',
- 'em',
- 's',
- 'embed',
- 'samp',
- 'b',
-];
-const blockElements = [
- 'body',
- 'svg',
- 'address',
- 'fieldset',
- 'li',
- 'span',
- 'article',
- 'figcaption',
- 'main',
- 'aside',
- 'figure',
- 'nav',
- 'blockquote',
- 'footer',
- 'ol',
- 'details',
- 'p',
- 'dialog',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'pre',
- 'dd',
- 'header',
- 'section',
- 'div',
- 'hgroup',
- 'table',
- 'dl',
- 'hr',
- 'ul',
- 'dt',
- 'view',
- 'view-block',
-];
-const specialElements = [
- 'slot',
- 'form',
- 'iframe',
- 'img',
- 'audio',
- 'video',
- 'canvas',
- 'a',
- 'input',
- 'label',
- 'textarea',
- 'progress',
- 'button',
-];
-
-// 收集使用到的小程序组件
-export default function onParseCreateElement({ nodeName, componentConfig }: OnParseCreateElementArgs) {
- if (!(inlineElements.includes(nodeName) || blockElements.includes(nodeName) || specialElements.includes(nodeName))) return;
-
- const simple = ['audio', 'button', 'canvas', 'form', 'label', 'progress', 'textarea', 'video'];
- const special = {
- a: ['navigator'],
- iframe: ['web-view'],
- img: ['image'],
- input: ['input', 'checkbox', 'radio'],
- };
- const { includes } = componentConfig;
-
- if (simple.includes(nodeName) && !includes.has(nodeName)) {
- includes.add(nodeName);
- } else if (nodeName in special) {
- const maps = special[nodeName];
- maps.forEach((item) => {
- !includes.has(item) && includes.add(item);
- });
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/index.ts b/packages/plugin-miniapp/src/miniapp/index.ts
deleted file mode 100644
index 711b83c1db..0000000000
--- a/packages/plugin-miniapp/src/miniapp/index.ts
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- * Based on [@tarojs/webpack5-runner](https://github.com/NervJS/taro/tree/next/packages/taro-webpack5-runner) with respect ❤️
- * Licensed under the MIT License
- * https://github.com/NervJS/taro/blob/next/LICENSE
- * */
-import * as path from 'path';
-import { createRequire } from 'node:module';
-import fs from 'fs-extra';
-import fg from 'fast-glob';
-import type { Config } from '@ice/app/esm/types';
-import { mergeInternalComponents } from '@ice/shared';
-import getMiniappTargetConfig from '../targets/index.js';
-import getMiniappWebpackConfig from './webpack/index.js';
-
-const require = createRequire(import.meta.url);
-
-// The same as @ice/webpack-config
-function getEntry(rootDir: string, runtimeDir: string) {
- // check entry.client.tsx
- let entryFile = fg.sync('entry.client.{tsx,ts,jsx.js}', {
- cwd: path.join(rootDir, 'src'),
- absolute: true,
- })[0];
- if (!entryFile) {
- // use generated file in template directory
- entryFile = path.join(rootDir, runtimeDir, 'entry.miniapp.tsx');
- }
- return {
- main: entryFile,
- };
-}
-
-const getMiniappTask = ({ rootDir, command, target, configAPI, runtimeDir, nativeConfig }): Config => {
- const entry = getEntry(rootDir, runtimeDir);
- const mode = command === 'start' ? 'development' : 'production';
- const { template, globalObject, fileType, projectConfigJson, modifyBuildAssets, components } = getMiniappTargetConfig(target);
- const { plugins, module } = getMiniappWebpackConfig({
- rootDir,
- template,
- fileType,
- configAPI,
- projectConfigJson,
- nativeConfig,
- modifyBuildAssets,
- });
- const isPublicDirExist = fs.existsSync(path.join(rootDir, 'public'));
- const defaultLogging = command === 'start' ? 'summary' : 'summary assets';
-
- mergeInternalComponents(components);
-
- return {
- mode,
- entry,
- outputDir: 'build',
- output: {
- chunkLoadingGlobal: 'webpackJsonp',
- publicPath: '/',
- filename: '[name].js',
- chunkFilename: '[name].js',
- globalObject,
- enabledLibraryTypes: [],
- },
- cacheDir: path.join(rootDir, 'node_modules', '.cache'),
- sourceMap: command === 'start' ? 'cheap-module-source-map' : false,
- alias: {
- ice: path.join(rootDir, runtimeDir, 'index.miniapp.ts'),
- '@': path.join(rootDir, 'src'),
- // 小程序使用 regenerator-runtime@0.11
- 'regenerator-runtime': require.resolve('regenerator-runtime'),
- '@swc/helpers': path.dirname(require.resolve('@swc/helpers/package.json')),
- '@ice/miniapp-runtime/esm/app': require.resolve('@ice/miniapp-runtime/app'),
- // 开发组件库时 link 到本地调试,runtime 包需要指向本地 node_modules 顶层的 runtime,保证闭包值 Current 一致,shared 也一样
- '@ice/miniapp-runtime': require.resolve('@ice/miniapp-runtime'),
- '@ice/shared': require.resolve('@ice/shared'),
- 'react-dom$': require.resolve('@ice/miniapp-react-dom'),
- },
- // FIXME: enable cache will cause error, disable it temporarily
- enableCache: false,
- enableEnv: false,
- plugins,
- loaders: module?.rules,
- assetsManifest: false,
- fastRefresh: false,
- optimization: {
- sideEffects: true,
- usedExports: true,
- runtimeChunk: {
- name: 'runtime',
- },
- splitChunks: {
- chunks: 'all',
- maxInitialRequests: Infinity,
- minSize: 0,
- cacheGroups: {
- default: false,
- defaultVendors: false,
- common: {
- name: 'common',
- minChunks: 2,
- priority: 1,
- },
- vendors: {
- name: 'vendors',
- minChunks: 2,
- test: (module: any) => /[\\/]node_modules[\\/]/.test(module.resource),
- priority: 10,
- },
- ice: {
- name: 'ice',
- test: (module: any) => /@ice[\\/][a-z]+/.test(module.context),
- priority: 101,
- },
- },
- },
- },
- performance: {
- maxEntrypointSize: 2 * 1000 * 1000,
- },
- devServer: {}, // No need to use devServer in miniapp
- useDevServer: false,
- enableCopyPlugin: isPublicDirExist, // Only when public dir exists should copy-webpack-plugin be enabled
- swcOptions: {
- removeExportExprs: ['serverDataLoader', 'staticDataLoader'],
- compilationConfig: {
- jsc: {
- // 小程序强制编译到 es5
- target: 'es5',
- },
- },
- },
- cssFilename: `[name]${fileType.style}`,
- cssChunkFilename: `[name]${fileType.style}`,
- cssExtensionAlias: ['.qss', '.jxss', '.wxss', '.acss', '.ttss'],
- enableRpx2Vw: false, // No need to transform rpx to vw in miniapp
- logging: process.env.WEBPACK_LOGGING || defaultLogging,
- };
-};
-
-export default getMiniappTask;
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/combination.ts b/packages/plugin-miniapp/src/miniapp/webpack/combination.ts
deleted file mode 100644
index 7aba6f7feb..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/combination.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import path from 'node:path';
-import fs from 'fs-extra';
-import { createRouteIdByFile } from '@ice/route-manifest';
-import type { MiniappWebpackOptions } from '../../types.js';
-import type { IMiniBuildConfig } from './utils/types.js';
-import { MiniWebpackPlugin } from './plugin.js';
-import { MiniWebpackModule } from './module.js';
-
-export class MiniCombination {
- config: IMiniBuildConfig;
- sourceRoot: string;
- sourceDir: string;
-
- constructor(public appPath: string, public rawConfig: MiniappWebpackOptions) {
- this.sourceRoot = 'src';
- this.sourceDir = path.resolve(appPath, this.sourceRoot);
- // for mock
- this.config = {
- sourceRoot: this.sourceRoot,
- fileType: rawConfig.fileType,
- env: rawConfig.env,
- template: rawConfig.template,
- modifyBuildAssets: rawConfig.modifyBuildAssets,
- // the follow value is writing for type check, do not make any sense.
- isBuildPlugin: false,
- isBuildNativeComp: false,
- isSupportRecursive: false, // TODO
- platform: 'wechat',
- nodeModulesPath: '',
- isSupportXS: true,
- globalObject: '',
- taroComponentsPath: '',
- mode: 'development',
- buildAdapter: '',
- platformType: 'mini',
- onParseCreateElement: async (nodeName, componentConfig) => {},
- modifyComponentConfig: async () => {},
- };
- }
-
- process() {
- const webpackPlugin = new MiniWebpackPlugin(this);
- const webpackModule = new MiniWebpackModule(this);
-
- return {
- plugins: webpackPlugin.getPlugins(),
- module: webpackModule.getModules(),
- };
- }
-
- async readConfig(configPath: string, appPath: string): Promise {
- const relativePath = path.relative(appPath, configPath);
- const relativePathSegments = relativePath.split(path.sep);
- if (relativePathSegments[0] === '.ice' && relativePathSegments[1] === 'entry.miniapp.config') {
- const { miniappManifest } = await this.rawConfig.configAPI.getAppConfig(['miniappManifest']);
- if (!miniappManifest) {
- throw new Error('缺少 miniappManifest,请检查!');
- }
- const appConfig = {
- ...miniappManifest,
- pages: miniappManifest.routes.map((route) => `pages/${route}`),
- subPackages: miniappManifest.subPackages?.map((subPackage) => ({
- ...subPackage,
- root: `pages/${subPackage.root}`,
- })) ?? [],
- };
- delete appConfig.routes;
-
- return appConfig;
- } else if (configPath.endsWith('.json')) {
- return await fs.readJSON(configPath);
- } else if (relativePathSegments[0] === 'src' && relativePathSegments[1] === 'pages' && relativePathSegments[relativePathSegments.length - 1].endsWith('.config')) {
- // starts with src/pages and ends with .config
- // for example: src/pages/home/a.config => home/a
- const route = [...relativePathSegments.slice(2, -1), relativePathSegments[relativePathSegments.length - 1].slice(0, -'.config'.length)].join('/');
- const routeId = createRouteIdByFile(`${route}.tsx`);
- const configFn = await this.rawConfig.configAPI.getRoutesConfig(routeId);
- return configFn?.() ?? {};
- }
-
- throw new Error(`Unknown config file of ${configPath}`);
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/dependencies/SingleEntryDependency.ts b/packages/plugin-miniapp/src/miniapp/webpack/dependencies/SingleEntryDependency.ts
deleted file mode 100644
index 2c547253f3..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/dependencies/SingleEntryDependency.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import webpack from '@ice/bundles/compiled/webpack/index.js';
-
-export default class SingleEntryDependency extends webpack.dependencies.ModuleDependency {
- name: string;
- miniType: any;
- loc: any;
- options: Record;
-
- constructor(request, name, loc, miniType, options = {}) {
- super(request);
- this.name = name;
- this.loc = loc;
- this.miniType = miniType;
- this.options = options;
- }
-
- // @ts-ignore
- get type() {
- return 'single entry';
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/index.ts b/packages/plugin-miniapp/src/miniapp/webpack/index.ts
deleted file mode 100644
index 3af9c3548f..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type { MiniappWebpackOptions, MiniappWebpackConfig } from '../../types.js';
-import { MiniCombination } from './combination.js';
-
-export default function getMiniappWebpackConfig(rawConfig: MiniappWebpackOptions): MiniappWebpackConfig {
- const combination = new MiniCombination(rawConfig.rootDir, rawConfig);
-
- return combination.process();
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/loaders/miniTemplateLoader.ts b/packages/plugin-miniapp/src/miniapp/webpack/loaders/miniTemplateLoader.ts
deleted file mode 100644
index 93f92887f4..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/loaders/miniTemplateLoader.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import loaderUtils from '@ice/bundles/compiled/loader-utils/index.js';
-import sax from 'sax';
-
-const { isUrlRequest, urlToRequest } = loaderUtils;
-export default function miniTemplateLoader(source: string) {
- this.cacheable && this.cacheable();
- /**
- * 两种fix方案:
- * 1. 用任意xml标签包裹source,使之变成较标准的xml格式(含有一个根节点)
- * 2. 修改 sax.parser 的第一个参数为 true,启用严格模式
- * 2.1 该模式下小程序模板中的标签或属性不会处理(例如写入 不会处理成 ,而是保持原样
- * 2.2 该模式将认为传入的xml为非标准的,无需标准化,且不按照以根节点模式处理,因此可以正常解析小程序模板
- *
- * 推荐方案1,这样在构建时会正常打入需要的包,但是若用户有 SrC 类似的写法导致引用失败,则可直接修正,不会认为是打包出现了问题
- * */
- const sourceWithRoot = `${source} `;
- const parser = sax.parser(false, { lowercase: true });
- const requests = new Map();
- const callback = this.async();
- const loadModule = (request) => this.importModule(request);
-
- parser.onattribute = (attr) => {
- const { name, value } = attr;
- if (value && (name === 'src' || name === 'from') && isUrlRequest(value) && !requests.has(value)) {
- const request = urlToRequest(value);
- requests.set(value, {
- url: request,
- name: name,
- });
- }
- };
- parser.onend = async () => {
- try {
- const requestsArray = Array.from(requests.values()).map(req => req.url);
- if (requestsArray.length) {
- for (let i = 0; i < requestsArray.length; i++) {
- await loadModule(requestsArray[i]);
- }
- }
- for (let url of requests.keys()) {
- if (url.indexOf('node_modules/') !== -1) {
- const changedUrl = url.replace(/^.*node_modules\//, '/npm/');
- source = source.replace(url, changedUrl);
- }
- }
- callback(null, source);
- } catch (error) {
- callback(error, source);
- }
- };
- parser.write(sourceWithRoot).close();
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/loaders/miniXScriptLoader.ts b/packages/plugin-miniapp/src/miniapp/webpack/loaders/miniXScriptLoader.ts
deleted file mode 100644
index 4c17147b02..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/loaders/miniXScriptLoader.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import loaderUtils from '@ice/bundles/compiled/loader-utils/index.js';
-
-const { isUrlRequest, urlToRequest } = loaderUtils;
-export default async function (source) {
- const REG_REQUIRE = /require\(['"](.+\.wxs)['"]\)/g;
- const callback = this.async();
- const importings: any[] = [];
- let res;
-
- try {
- while ((res = REG_REQUIRE.exec(source)) !== null) {
- const dep = res[1];
- if (isUrlRequest(dep)) {
- const request = urlToRequest(dep);
- importings.push(this.importModule(request));
- }
- }
- await Promise.all(importings);
- callback(null, source);
- } catch (error) {
- callback(error, source);
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/module.ts b/packages/plugin-miniapp/src/miniapp/webpack/module.ts
deleted file mode 100644
index 2f7fd0da41..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/module.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import path from 'path';
-import { fileURLToPath } from 'url';
-import { createRequire } from 'node:module';
-import { REG_NODE_MODULES, REG_TEMPLATE } from '../../helper/index.js';
-import type { MiniCombination } from './combination.js';
-
-export interface IRule {
- test?: any;
- exclude?: any[];
- include?: any[];
- use?: any;
- enforce?: 'pre' | 'post';
- issuer?: any;
- loader?: any;
- loaders?: any;
- oneOf?: any;
- options?: any;
- query?: any;
- parser?: any;
- generator?: any;
- resource?: any;
- resourceQuery?: any;
- rules?: any;
- sideEffects?: boolean;
- type?: string;
- resolve?: any;
-}
-
-const require = createRequire(import.meta.url);
-const __dirname = path.dirname(fileURLToPath(import.meta.url));
-
-const nodeModulesRegx = new RegExp(REG_NODE_MODULES, 'gi');
-
-export class MiniWebpackModule {
- constructor(public combination: MiniCombination) {}
-
- getLoader(loaderName: string, options?: Record) {
- return {
- loader: require.resolve(loaderName),
- options: options || {},
- };
- }
-
- getModules() {
- const { fileType, sourceRoot, buildAdapter } = this.combination.config;
-
- const rules: Array = [
- {
- // template
- test: REG_TEMPLATE,
- type: 'asset/resource',
- generator: {
- filename: ({ filename }) => {
- const extname = path.extname(filename);
- if (filename.startsWith(`${sourceRoot}/`)) filename = filename.slice(sourceRoot.length + 1);
- return filename.replace(extname, fileType.templ).replace(nodeModulesRegx, 'npm');
- },
- },
- use: [this.getLoader(path.resolve(__dirname, './loaders/miniTemplateLoader'), {
- buildAdapter,
- })],
- },
- {
- test: new RegExp(`\\${fileType.xs || 'wxs'}$`),
- type: 'asset/resource',
- generator: {
- filename({ filename }) {
- return filename
- .replace(`${sourceRoot}/`, '')
- .replace(nodeModulesRegx, 'npm');
- },
- },
- use: [this.getLoader(path.resolve(__dirname, './loaders/miniXScriptLoader'))],
- },
- ];
- return { rules };
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/plugin.ts b/packages/plugin-miniapp/src/miniapp/webpack/plugin.ts
deleted file mode 100644
index ac22f8799b..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/plugin.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import webpack from '@ice/bundles/compiled/webpack/index.js';
-import MiniPlugin from './plugins/MiniPlugin.js';
-import type { MiniCombination } from './combination.js';
-
-export class MiniWebpackPlugin {
- constructor(public combination: MiniCombination) {}
-
- getPlugins() {
- const providerPlugin = this.getProviderPlugin();
- const definePlugin = this.getDefinePlugin();
- const miniPlugin = this.getMainPlugin();
- // TODO: any type
- const plugins: Array = [providerPlugin, definePlugin, miniPlugin];
- return plugins;
- }
-
- getProviderPlugin() {
- return new webpack.ProvidePlugin({
- window: ['@ice/miniapp-runtime', 'window'],
- document: ['@ice/miniapp-runtime', 'document'],
- navigator: ['@ice/miniapp-runtime', 'navigator'],
- requestAnimationFrame: ['@ice/miniapp-runtime', 'requestAnimationFrame'],
- cancelAnimationFrame: ['@ice/miniapp-runtime', 'cancelAnimationFrame'],
- Element: ['@ice/miniapp-runtime', 'Element'],
- SVGElement: ['@ice/miniapp-runtime', 'SVGElement'],
- MutationObserver: ['@ice/miniapp-runtime', 'MutationObserver'],
- });
- }
-
- getDefinePlugin() {
- const { env = {} } = this.combination.config;
-
- const envConstants = Object.keys(env).reduce((target, key) => {
- target[`process.env.${key}`] = env[key];
- return target;
- }, {});
-
- const definitionsList = [envConstants];
- const definitions = Object.assign({}, ...definitionsList);
- return new webpack.DefinePlugin(definitions);
- }
-
- getMainPlugin() {
- return new MiniPlugin({
- commonChunks: ['runtime', 'vendors', 'common', 'ice'],
- constantsReplaceList: {},
- pxTransformConfig: {},
- hot: false,
- combination: this.combination,
- });
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/plugins/LoadChunksPlugin.ts b/packages/plugin-miniapp/src/miniapp/webpack/plugins/LoadChunksPlugin.ts
deleted file mode 100644
index edbaf43384..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/plugins/LoadChunksPlugin.ts
+++ /dev/null
@@ -1,195 +0,0 @@
-import webpack, { type Compiler, type Compilation, type Chunk } from '@ice/bundles/compiled/webpack/index.js';
-import { toDashed } from '@ice/shared';
-import { getChunkEntryModule, addRequireToSource, getChunkIdOrName } from '../utils/webpack.js';
-import type { AddPageChunks, IComponent } from '../utils/types.js';
-import { META_TYPE, taroJsComponents } from '../../../helper/index.js';
-import { componentConfig } from '../utils/component.js';
-import type NormalModule from './NormalModule.js';
-
-const { ConcatSource } = webpack.sources;
-const PLUGIN_NAME = 'LoadChunksPlugin';
-
-interface IOptions {
- commonChunks: string[];
- isBuildPlugin: boolean;
- framework: string;
- addChunkPages?: AddPageChunks;
- pages: Set;
- needAddCommon?: string[];
- isIndependentPackages?: boolean;
-}
-
-export default class LoadChunksPlugin {
- commonChunks: string[];
- isBuildPlugin: boolean;
- framework: string;
- addChunkPages?: AddPageChunks;
- pages: Set;
- isCompDepsFound: boolean;
- needAddCommon: string[];
- isIndependentPackages: boolean;
-
- constructor(options: IOptions) {
- this.commonChunks = options.commonChunks;
- this.isBuildPlugin = options.isBuildPlugin;
- this.framework = options.framework;
- this.addChunkPages = options.addChunkPages;
- this.pages = options.pages;
- this.needAddCommon = options.needAddCommon || [];
- this.isIndependentPackages = options.isIndependentPackages || false;
- }
-
- apply(compiler: Compiler) {
- const pagesList = this.pages;
- const addChunkPagesList = new Map();
- compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation: Compilation) => {
- let commonChunks;
- const fileChunks = new Map();
-
- compilation.hooks.afterOptimizeChunks.tap(PLUGIN_NAME, (chunks: Chunk[]) => {
- const chunksArray = Array.from(chunks);
- /**
- * 收集 common chunks 中使用到 @tarojs/components 中的组件
- */
- commonChunks = chunksArray
- .filter((chunk) => this.commonChunks.includes(chunk.name!) && chunkHasJs(chunk, compilation.chunkGraph))
- .reverse();
-
- this.isCompDepsFound = false;
- for (const chunk of commonChunks) {
- this.collectComponents(compiler, compilation, chunk);
- }
- if (!this.isCompDepsFound) {
- // common chunks 找不到再去别的 chunk 中找
- chunksArray
- .filter((chunk) => !this.commonChunks.includes(chunk.name!))
- .some((chunk) => {
- this.collectComponents(compiler, compilation, chunk);
- return this.isCompDepsFound;
- });
- }
-
- /**
- * 收集开发者在 addChunkPages 中配置的页面及其需要引用的公共文件
- */
- if (typeof this.addChunkPages === 'function') {
- this.addChunkPages(
- addChunkPagesList,
- Array.from(pagesList).map((item) => item.name),
- );
- chunksArray.forEach((chunk) => {
- const id = getChunkIdOrName(chunk);
- addChunkPagesList.forEach((deps, pageName) => {
- if (pageName === id) {
- const depChunks = deps.map((dep) => ({ name: dep }));
- fileChunks.set(id, depChunks);
- }
- });
- });
- }
- });
-
- compiler.webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation).render.tap(
- PLUGIN_NAME,
- (modules: webpack.sources.ConcatSource, { chunk }) => {
- const chunkEntryModule = getChunkEntryModule(compilation, chunk) as any;
- if (chunkEntryModule) {
- const entryModule: NormalModule = chunkEntryModule.rootModule ?? chunkEntryModule;
- if (entryModule.miniType === META_TYPE.EXPORTS) {
- const source = new ConcatSource();
- source.add('module.exports=');
- source.add(modules);
- return source;
- } else {
- return modules;
- }
- } else {
- return modules;
- }
- },
- );
-
- /**
- * 在每个 chunk 文本刚生成后,按判断条件在文本头部插入 require 语句
- */
- compiler.webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation).render.tap(
- PLUGIN_NAME,
- (modules: webpack.sources.ConcatSource, { chunk }) => {
- const chunkEntryModule = getChunkEntryModule(compilation, chunk) as any;
- if (chunkEntryModule) {
- if (this.isBuildPlugin) {
- return addRequireToSource(getChunkIdOrName(chunk), modules, commonChunks);
- }
-
- const entryModule: NormalModule = chunkEntryModule.rootModule ?? chunkEntryModule;
- const { miniType, isNativePage } = entryModule;
-
- if (this.needAddCommon.length) {
- for (const item of this.needAddCommon) {
- if (getChunkIdOrName(chunk) === item) {
- return addRequireToSource(item, modules, commonChunks);
- }
- }
- }
-
- if (miniType === META_TYPE.ENTRY) {
- return addRequireToSource(getChunkIdOrName(chunk), modules, commonChunks);
- }
-
- if (
- this.isIndependentPackages &&
- (miniType === META_TYPE.PAGE || miniType === META_TYPE.COMPONENT || isNativePage)
- ) {
- return addRequireToSource(getChunkIdOrName(chunk), modules, commonChunks);
- }
-
- // addChunkPages
- if (fileChunks.size && (miniType === META_TYPE.PAGE || miniType === META_TYPE.COMPONENT)) {
- let source;
- const id = getChunkIdOrName(chunk);
- fileChunks.forEach((v, k) => {
- if (k === id) {
- source = addRequireToSource(id, modules, v);
- }
- });
- return source;
- }
- } else {
- return modules;
- }
- },
- );
- });
- }
-
- collectComponents(compiler: Compiler, compilation: Compilation, chunk: Chunk) {
- const { chunkGraph } = compilation;
- const { moduleGraph } = compilation;
- const modulesIterable: Iterable = chunkGraph.getOrderedChunkModulesIterable(
- chunk,
- compiler.webpack.util.comparators.compareModulesByIdentifier,
- ) as any;
- for (const module of modulesIterable) {
- // if (module.rawRequest === taroJsComponents) {
- // this.isCompDepsFound = true;
- // const { includes } = componentConfig;
- // const moduleUsedExports = moduleGraph.getUsedExports(module, chunk.runtime);
- // if (moduleUsedExports === null || typeof moduleUsedExports === 'boolean') {
- // componentConfig.includeAll = true;
- // } else {
- // for (const item of moduleUsedExports) {
- // includes.add(toDashed(item));
- // }
- // }
- // break;
- // }
- }
- }
-}
-
-function chunkHasJs(chunk: webpack.Chunk, chunkGraph: webpack.ChunkGraph) {
- if (chunk.name === chunk.runtime) return true;
- if (chunkGraph.getNumberOfEntryModules(chunk) > 0) return true;
-
- return Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, 'javascript'));
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/plugins/MiniPlugin.ts b/packages/plugin-miniapp/src/miniapp/webpack/plugins/MiniPlugin.ts
deleted file mode 100644
index d7f0ebe8a8..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/plugins/MiniPlugin.ts
+++ /dev/null
@@ -1,1629 +0,0 @@
-// eslint-disable prefer-destructuring
-import { fileURLToPath } from 'url';
-import path from 'path';
-import { createRequire } from 'module';
-
-import type { RecursiveTemplate, UnRecursiveTemplate } from '@ice/shared';
-import type { MiniappAppConfig, MiniappConfig } from '@ice/miniapp-runtime/esm/types';
-import fs from 'fs-extra';
-import loaderUtils from '@ice/bundles/compiled/loader-utils/index.js';
-import type { Compilation, Compiler } from '@ice/bundles/compiled/webpack/index.js';
-import EntryDependency from '@ice/bundles/compiled/webpack/EntryDependency.js';
-
-import type { NestedRouteManifest } from '@ice/route-manifest';
-import SingleEntryDependency from '../dependencies/SingleEntryDependency.js';
-import { componentConfig } from '../utils/component.js';
-
-import {
- getNpmPackageAbsolutePath,
- isAliasPath,
- isEmptyObject,
- META_TYPE,
- NODE_MODULES,
- printLog,
- processTypeEnum,
- promoteRelativePath,
- REG_NODE_MODULES,
- REG_NODE_MODULES_DIR,
- REG_STYLE,
- replaceAliasPath,
- resolveMainFilePath,
- SCRIPT_EXT,
-} from '../../../helper/index.js';
-import { addRequireToSource, getChunkEntryModule, getChunkIdOrName } from '../utils/webpack.js';
-import type { IComponent, IComponentExtraPath, IFileType, IMiniFilesConfig } from '../utils/types.js';
-import type { MiniCombination } from '../combination.js';
-import SingleEntryPlugin from './SingleEntryPlugin.js';
-import NormalModulesPlugin from './NormalModulesPlugin.js';
-import LoadChunksPlugin from './LoadChunksPlugin.js';
-import type NormalModule from './NormalModule.js';
-
-const { urlToRequest } = loaderUtils;
-const __dirname = path.dirname(fileURLToPath(import.meta.url));
-const require = createRequire(import.meta.url);
-const PLUGIN_NAME = 'MiniPlugin';
-
-function isLoaderExist(loaders, loaderName: string) {
- return loaders.some((item) => item.loader === loaderName);
-}
-
-const baseCompName = 'comp';
-const customWrapperName = 'custom-wrapper';
-const CHILD_COMPILER_TAG = 'child';
-
-interface IIceMiniPluginOptions {
- commonChunks: string[];
- constantsReplaceList: Record;
- pxTransformConfig: {
- baseFontSize?: number;
- deviceRatio?: any;
- designWidth?: number;
- unitPrecision?: number;
- targetUnit?: string;
- };
- hot: boolean;
- combination: MiniCombination;
- loaderMeta?: Record;
-}
-
-interface IOptions extends IIceMiniPluginOptions {
- sourceDir: string;
- framework: string;
- frameworkExts: string[];
- template: RecursiveTemplate | UnRecursiveTemplate;
- runtimePath: string | string[];
- isBuildPlugin: boolean;
- blended: boolean;
- newBlended: boolean;
- fileType: IFileType;
- skipProcessUsingComponents: boolean;
- logger?: {
- quiet?: boolean;
- };
-}
-
-type IndependentPackage = { pages: string[]; components: string[] };
-
-export default class MiniPlugin {
- /** 插件配置选项 */
- options: IOptions;
- context: string;
- /** app 入口文件路径 */
- appEntry: string;
- /** app config 配置内容 */
- appConfig: MiniappAppConfig;
- /** app、页面、组件的配置集合 */
- filesConfig: IMiniFilesConfig = {};
- routeManifest: NestedRouteManifest[] = [];
- isWatch = false;
- /** 页面列表 */
- pages = new Set();
- components = new Set();
- /** 新的混合原生编译模式 newBlended 模式下,需要单独编译成原生代码的 component 的Map */
- nativeComponents = new Map();
- /** tabbar icon 图片路径列表 */
- tabBarIcons = new Set();
- prerenderPages = new Set();
- dependencies = new Map();
- loadChunksPlugin: LoadChunksPlugin;
- themeLocation: string;
- pageLoaderName = '@ice/miniapp-loader/lib/page.js';
- independentPackages = new Map();
- projectConfig: any = {};
-
- constructor(options: IIceMiniPluginOptions) {
- const { combination } = options;
- const miniBuildConfig = combination.config;
- const { template, baseLevel = 16 } = miniBuildConfig;
-
- this.options = {
- sourceDir: combination.sourceDir,
- framework: miniBuildConfig.framework || 'react',
- frameworkExts: miniBuildConfig.frameworkExts || [],
- template,
- runtimePath: miniBuildConfig.runtimePath || '',
- isBuildPlugin: miniBuildConfig.isBuildPlugin || false,
- blended: miniBuildConfig.blended || false,
- newBlended: miniBuildConfig.newBlended || false,
- logger: miniBuildConfig.logger,
- skipProcessUsingComponents: miniBuildConfig.skipProcessUsingComponents || false,
- fileType: miniBuildConfig.fileType,
- combination,
- commonChunks: options.commonChunks || ['runtime', 'vendors'],
- constantsReplaceList: options.constantsReplaceList,
- pxTransformConfig: options.pxTransformConfig,
- hot: options.hot,
- loaderMeta: options.loaderMeta || {},
- };
-
- if (template.isSupportRecursive === false && baseLevel > 0) {
- (template as UnRecursiveTemplate).baseLevel = baseLevel;
- }
- }
-
- /**
- * 自动驱动 tapAsync
- */
- tryAsync(fn: (target: T) => Promise) {
- return async (arg: T, callback: any) => {
- try {
- await fn(arg);
- callback();
- } catch (err) {
- console.error(err);
- callback(err);
- }
- };
- }
-
- /**
- * 插件入口
- */
- apply(compiler: Compiler) {
- this.context = compiler.context;
- this.appEntry = this.getAppEntry(compiler);
-
- const { commonChunks, combination, framework, isBuildPlugin, newBlended, sourceDir } = this.options;
-
- const { addChunkPages, onCompilerMake, modifyBuildAssets, onParseCreateElement } = combination.config;
-
- const routeManifestPath = path.join(combination.appPath, '.ice', 'route-manifest.json');
- this.routeManifest = fs.readJSONSync(routeManifestPath);
-
- /** build mode */
- compiler.hooks.run.tapAsync(
- PLUGIN_NAME,
- this.tryAsync(async (compiler) => {
- await this.run(compiler);
- new LoadChunksPlugin({
- commonChunks: commonChunks,
- isBuildPlugin,
- addChunkPages,
- pages: this.pages,
- framework: framework,
- }).apply(compiler);
- }),
- );
-
- /** watch mode */
- compiler.hooks.watchRun.tapAsync(
- PLUGIN_NAME,
- this.tryAsync(async (compiler) => {
- const changedFiles = this.getChangedFiles(compiler);
- if (changedFiles && changedFiles?.size > 0) {
- this.isWatch = true;
- }
- await this.run(compiler);
- if (!this.loadChunksPlugin) {
- this.loadChunksPlugin = new LoadChunksPlugin({
- commonChunks: commonChunks,
- isBuildPlugin,
- addChunkPages,
- pages: this.pages,
- framework: framework,
- });
- this.loadChunksPlugin.apply(compiler);
- }
- }),
- );
-
- /** compilation.addEntry */
- compiler.hooks.make.tapAsync(
- PLUGIN_NAME,
- this.tryAsync(async (compilation) => {
- const { dependencies } = this;
- const promises: Promise[] = [];
- this.compileIndependentPages(compiler, compilation, dependencies, promises);
- dependencies.forEach((dep) => {
- promises.push(
- new Promise((resolve, reject) => {
- compilation.addEntry(
- this.options.sourceDir,
- dep,
- {
- name: dep.name,
- ...dep.options,
- },
- (err) => (err ? reject(err) : resolve(null)),
- );
- }),
- );
- });
- await Promise.all(promises);
- await onCompilerMake?.(compilation, compiler, this);
- }),
- );
-
- compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation, { normalModuleFactory }) => {
- /** For Webpack compilation get factory from compilation.dependencyFactories by denpendence's constructor */
- compilation.dependencyFactories.set(EntryDependency, normalModuleFactory);
- compilation.dependencyFactories.set(SingleEntryDependency as any, normalModuleFactory);
-
- /**
- * webpack NormalModule 在 runLoaders 真正解析资源的前一刻,
- * 往 NormalModule.loaders 中插入对应的 mini Loader
- */
- compiler.webpack.NormalModule.getCompilationHooks(compilation).loader.tap(
- PLUGIN_NAME,
- (_loaderContext, module: /** NormalModule */ any) => {
- const { framework, loaderMeta, pxTransformConfig } = this.options;
-
- if (module.miniType === META_TYPE.ENTRY) {
- // TODO
- // const loaderName = '@ice/miniapp-loader';
- // if (!isLoaderExist(module.loaders, loaderName)) {
- // module.loaders.unshift({
- // loader: loaderName,
- // options: {
- // framework,
- // loaderMeta,
- // prerender: this.prerenderPages.size > 0,
- // config: this.appConfig,
- // runtimePath: this.options.runtimePath,
- // blended: this.options.blended,
- // newBlended: this.options.newBlended,
- // pxTransformConfig,
- // },
- // });
- // }
- } else if (module.miniType === META_TYPE.PAGE) {
- let isIndependent = false;
- this.independentPackages.forEach(({ pages }) => {
- if (pages.includes(module.resource)) {
- isIndependent = true;
- }
- });
- const isNewBlended = this.nativeComponents.has(module.name);
- const loaderName =
- isNewBlended || isBuildPlugin
- ? '@ice/miniapp-loader/lib/native-component.js'
- : isIndependent
- ? '@ice/miniapp-loader/lib/independentPage.js'
- : this.pageLoaderName;
-
- if (!isLoaderExist(module.loaders, loaderName)) {
- const routeInfo = this.routeManifest.find(route => path.join(sourceDir, 'pages', route.file) === module.resource);
- const hasExportData = routeInfo?.exports?.includes('dataLoader');
- const hasExportConfig = routeInfo?.exports?.includes('pageConfig');
- module.loaders.unshift({
- loader: require.resolve(loaderName),
- options: {
- framework,
- loaderMeta: {
- ...loaderMeta,
- hasExportData,
- hasExportConfig,
- },
- isNewBlended,
- name: module.name,
- prerender: this.prerenderPages.has(module.name),
- config: this.filesConfig,
- appConfig: this.appConfig,
- runtimePath: this.options.runtimePath,
- hot: this.options.hot,
- },
- });
- }
- } else if (module.miniType === META_TYPE.COMPONENT) {
- const loaderName = isBuildPlugin
- ? '@ice/miniapp-loader/lib/native-component.js'
- : '@ice/miniapp-loader/lib/component.js';
- if (!isLoaderExist(module.loaders, loaderName)) {
- module.loaders.unshift({
- loader: require.resolve(loaderName),
- options: {
- framework,
- loaderMeta,
- name: module.name,
- prerender: this.prerenderPages.has(module.name),
- runtimePath: this.options.runtimePath,
- },
- });
- }
- }
- },
- );
-
- const { PROCESS_ASSETS_STAGE_ADDITIONAL, PROCESS_ASSETS_STAGE_OPTIMIZE, PROCESS_ASSETS_STAGE_REPORT } =
- compiler.webpack.Compilation;
- compilation.hooks.processAssets.tapAsync(
- {
- name: PLUGIN_NAME,
- stage: PROCESS_ASSETS_STAGE_ADDITIONAL,
- },
- this.tryAsync(async () => {
- // 如果是子编译器,证明是编译独立分包,进行单独的处理
- if ((compilation as any).__tag === CHILD_COMPILER_TAG) {
- await this.generateIndependentMiniFiles(compilation, compiler);
- } else {
- await this.generateMiniFiles(compilation, compiler);
- }
- }),
- );
- compilation.hooks.processAssets.tapAsync(
- {
- name: PLUGIN_NAME,
- // 删除 assets 的相关操作放在触发时机较后的 Stage,避免过早删除出现的一些问题,#13988
- // Stage 触发顺序:https://webpack.js.org/api/compilation-hooks/#list-of-asset-processing-stages
- stage: PROCESS_ASSETS_STAGE_OPTIMIZE,
- },
- this.tryAsync(async () => {
- await this.optimizeMiniFiles(compilation, compiler);
- }),
- );
-
- compilation.hooks.processAssets.tapAsync(
- {
- name: PLUGIN_NAME,
- // 该 stage 是最后执行的,确保 taro 暴露给用户的钩子 modifyBuildAssets 在内部处理完 assets 之后再调用
- stage: PROCESS_ASSETS_STAGE_REPORT,
- },
- this.tryAsync(async () => {
- if (typeof modifyBuildAssets === 'function') {
- await modifyBuildAssets(compilation.assets, this);
- }
- }),
- );
- });
-
- compiler.hooks.afterEmit.tapAsync(
- PLUGIN_NAME,
- this.tryAsync(async (compilation) => {
- await this.addTarBarFilesToDependencies(compilation);
- }),
- );
-
- new NormalModulesPlugin(onParseCreateElement).apply(compiler);
-
- newBlended && this.addLoadChunksPlugin(compiler);
- }
-
- addLoadChunksPlugin(compiler: Compiler) {
- const fileChunks = new Map();
-
- compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
- compilation.hooks.afterOptimizeChunks.tap(PLUGIN_NAME, (chunks) => {
- for (const chunk of chunks) {
- const id = getChunkIdOrName(chunk);
- if (this.options.commonChunks.includes(id)) return;
-
- const deps: { name: string }[] = [];
-
- for (const group of chunk.groupsIterable) {
- group.chunks.forEach((chunk) => {
- const currentChunkId = getChunkIdOrName(chunk);
- if (id === currentChunkId) return;
- deps.push({
- name: currentChunkId,
- });
- });
- }
-
- fileChunks.set(id, deps);
- }
- });
- compiler.webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation).render.tap(
- PLUGIN_NAME,
- (modules, { chunk }) => {
- const chunkEntryModule = getChunkEntryModule(compilation, chunk) as any;
- if (!chunkEntryModule) return;
- const entryModule: NormalModule = chunkEntryModule.rootModule ?? chunkEntryModule;
- // addChunkPages
- if (fileChunks.size) {
- let source;
- const id = getChunkIdOrName(chunk);
- const { miniType } = entryModule as any;
- const entryChunk = [{ name: 'app' }];
- if (this.nativeComponents.has(id) || miniType === META_TYPE.STATIC) {
- fileChunks.forEach((v, k) => {
- if (k === id) {
- source = addRequireToSource(id, modules, v);
- }
- });
- return source;
- } else if (miniType === META_TYPE.PAGE) {
- return addRequireToSource(id, modules, entryChunk);
- }
- }
- },
- );
- });
- }
-
- /**
- * 根据 webpack entry 配置获取入口文件路径
- * @returns app 入口文件路径
- */
- getAppEntry(compiler: Compiler) {
- // const originalEntry = compiler.options.entry as webpack.EntryObject
- // compiler.options.entry = {}
- // return path.resolve(this.context, originalEntry.app[0])
-
- const { entry } = compiler.options;
- if (this.options.isBuildPlugin) {
- const entryCopy = Object.assign({}, entry);
- compiler.options.entry = {};
- return entryCopy;
- }
-
- function getEntryPath(entry) {
- const { main: app } = entry;
- if (Array.isArray(app)) {
- return app[0];
- } else if (Array.isArray(app.import)) {
- return app.import[0];
- }
- return app;
- }
-
- const appEntryPath = getEntryPath(entry);
- compiler.options.entry = {};
- return appEntryPath;
- }
-
- getIndependentPackage(pagePath: string): IndependentPackage | undefined {
- return Array.from(this.independentPackages.values()).find((independentPackage) => {
- const { pages } = independentPackage;
- if (pages.includes(pagePath)) {
- return independentPackage;
- }
- });
- }
-
- getChangedFiles(compiler: Compiler) {
- return compiler.modifiedFiles;
- }
-
- /**
- * 分析 app 入口文件,搜集页面、组件信息,
- * 往 this.dependencies 中添加资源模块
- */
- async run(compiler: Compiler) {
- if (this.options.isBuildPlugin) {
- this.getPluginFiles();
- this.getConfigFiles(compiler);
- } else {
- this.getProjectConfig();
- this.appConfig = await this.getAppConfig();
- await this.getPages();
- await this.getPagesConfig();
- this.getDarkMode();
- this.getConfigFiles(compiler);
- this.addEntries();
- }
- }
-
- getPluginFiles() {
- throw new Error('Unsupported plugin build');
- }
-
- modifyPluginJSON(pluginJSON) {
- const { main, publicComponents } = pluginJSON;
- const isUsingCustomWrapper = componentConfig.thirdPartyComponents.has('custom-wrapper');
- if (main) {
- pluginJSON.main = this.getTargetFilePath(main, '.js');
- }
-
- if (!this.options.template.isSupportRecursive) {
- pluginJSON.publicComponents = Object.assign({}, publicComponents, {
- [baseCompName]: baseCompName,
- });
- }
-
- if (isUsingCustomWrapper) {
- pluginJSON.publicComponents = Object.assign({}, publicComponents, {
- [customWrapperName]: customWrapperName,
- });
- }
- }
-
- getProjectConfig(): void {
- const projectConfigJsonPath = path.join(this.options.combination.appPath, this.options.combination.rawConfig.projectConfigJson);
- if (!fs.existsSync(projectConfigJsonPath)) {
- this.projectConfig = this.options.combination.rawConfig.nativeConfig;
- return;
- }
- const localProjectConfig = JSON.parse(fs.readFileSync(projectConfigJsonPath, 'utf-8'));
- this.projectConfig = {
- ...localProjectConfig,
- ...this.options.combination.rawConfig.nativeConfig,
- };
- }
-
- /**
- * 获取 app config 配置内容
- * @returns app config 配置内容
- */
- async getAppConfig(): Promise {
- const appName = path.basename(this.appEntry).replace(path.extname(this.appEntry), '');
-
- await this.compileFile({
- name: appName,
- path: this.appEntry,
- isNative: false,
- });
-
- const fileConfig = this.filesConfig[this.getConfigFilePath(appName)];
- const appConfig = fileConfig ? fileConfig.content || {} : {};
-
- if (isEmptyObject(appConfig)) {
- throw new Error('缺少 app 全局配置文件,请检查!');
- }
- const { modifyAppConfig } = this.options.combination.config;
- if (typeof modifyAppConfig === 'function') {
- await modifyAppConfig(appConfig);
- }
- return appConfig as MiniappAppConfig;
- }
-
- /**
- * 根据 app config 的 pages 配置项,收集所有页面信息,
- * 包括处理分包和 tabbar
- */
- async getPages() {
- if (isEmptyObject(this.appConfig)) {
- throw new Error('缺少 app 全局配置文件,请检查!');
- }
-
- const appPages = this.appConfig.pages;
- if (!appPages || !appPages.length) {
- throw new Error('全局配置缺少 pages 字段,请检查!');
- }
-
- if (!this.isWatch && this.options.logger?.quiet === false) {
- printLog(processTypeEnum.COMPILE, '发现入口', this.getShowPath(this.appEntry));
- }
-
- const { newBlended, frameworkExts, combination } = this.options;
- // const { prerender } = combination.config;
-
- // this.prerenderPages = new Set(validatePrerenderPages(appPages, prerender).map((p) => p.path));
- await this.getTabBarFiles(this.appConfig);
- this.pages = new Set([
- ...appPages.map((item) => {
- const pagePath = resolveMainFilePath(path.join(this.options.sourceDir, item), frameworkExts);
- const pageTemplatePath = this.getTemplatePath(pagePath);
- const isNative = this.isNativePageORComponent(pageTemplatePath);
- return {
- name: item,
- path: pagePath,
- isNative,
- stylePath: isNative ? this.getStylePath(pagePath) : undefined,
- templatePath: isNative ? this.getTemplatePath(pagePath) : undefined,
- skeletonPath: isNative ? this.getSkeletonExtraPath(pagePath) : undefined,
- };
- }),
- ]);
- this.getSubPackages(this.appConfig);
- // 新的混合原生编译模式 newBlended 下,需要收集独立编译为原生自定义组件
- newBlended && this.getNativeComponent();
- }
-
- /**
- * 收集需要转换为本地化组件的内容
- */
- getNativeComponent() {
- const { frameworkExts } = this.options;
- const components = this.appConfig.components || [];
- components.forEach((item) => {
- const pagePath = resolveMainFilePath(path.join(this.options.sourceDir, item), frameworkExts);
- const componentObj = {
- name: item,
- path: pagePath,
- isNative: false,
- };
- if (!this.isWatch && this.options.logger?.quiet === false) {
- printLog(processTypeEnum.COMPILE, `发现[${item}]Native组件`);
- }
- this.pages.add(componentObj);
- // 登记需要编译成原生版本的组件
- this.nativeComponents.set(item, componentObj);
- });
- }
-
- /**
- * 读取页面及其依赖的组件的配置
- */
- async getPagesConfig() {
- for (const page of this.pages) {
- if (!this.isWatch && this.options.logger?.quiet === false) {
- printLog(processTypeEnum.COMPILE, '发现页面', this.getShowPath(page.path));
- }
-
- const pagePath = page.path;
- const independentPackage = this.getIndependentPackage(pagePath);
-
- await this.compileFile(page, independentPackage);
- }
- }
-
- /**
- * 往 this.dependencies 中新增或修改所有 config 配置模块
- */
- getConfigFiles(compiler: Compiler) {
- const { filesConfig } = this;
- Object.keys(filesConfig).forEach((item) => {
- if (fs.existsSync(filesConfig[item].path)) {
- this.addEntry(filesConfig[item].path, item, META_TYPE.CONFIG);
- }
- });
-
- // webpack createChunkAssets 前一刻,去除所有 config chunks
- compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
- compilation.hooks.beforeChunkAssets.tap(PLUGIN_NAME, () => {
- const { chunks } = compilation;
- const configNames = Object.keys(filesConfig);
-
- for (const chunk of chunks) {
- if (configNames.find((configName) => configName === chunk.name)) chunks.delete(chunk);
- }
- });
- });
- }
-
- /**
- * 在 this.dependencies 中新增或修改模块
- */
- addEntry(entryPath: string, entryName: string, entryType: META_TYPE, options = {}) {
- let dep: SingleEntryDependency;
- if (this.dependencies.has(entryPath)) {
- dep = this.dependencies.get(entryPath)!;
- dep.name = entryName;
- dep.loc = { name: entryName };
- dep.request = entryPath;
- dep.userRequest = entryPath;
- dep.miniType = entryType;
- dep.options = options;
- } else {
- dep = new SingleEntryDependency(entryPath, entryName, { name: entryName }, entryType, options);
- }
- this.dependencies.set(entryPath, dep);
- }
-
- /**
- * 在 this.dependencies 中新增或修改 app、模板组件、页面、组件等资源模块
- */
- addEntries() {
- const { template } = this.options;
-
- this.addEntry(this.appEntry, 'app', META_TYPE.ENTRY);
- if (!template.isSupportRecursive) {
- this.addEntry(path.resolve(__dirname, '..', 'template/comp'), 'comp', META_TYPE.STATIC);
- }
- this.addEntry(path.resolve(__dirname, '..', 'template/custom-wrapper'), 'custom-wrapper', META_TYPE.STATIC);
-
- const resolveComponentStyleEntry = (name: string, stylePaths: string[], ext = this.options.fileType.style) => {
- for (const stylePath of stylePaths) {
- if (fs.existsSync(stylePath)) {
- this.addEntry(stylePath, this.getTargetFilePath(name, ext), META_TYPE.NORMAL);
- break;
- }
- }
- };
-
- const resolveComponentEntry = (nonNativeType: META_TYPE) => (item: IComponent) => {
- if (item.isNative) {
- this.addEntry(item.path, item.name, META_TYPE.NORMAL, { isNativePage: true });
- if (item.stylePath) {
- resolveComponentStyleEntry(item.name, item.stylePath);
- }
- if (item.templatePath && fs.existsSync(item.templatePath)) {
- this.addEntry(item.templatePath, this.getTemplatePath(item.name), META_TYPE.NORMAL);
- }
-
- if (item.skeletonPath && item.skeletonPath.template && fs.existsSync(item.skeletonPath.template)) {
- this.addEntry(item.skeletonPath.template, this.getTargetFilePath(item.name, `${this.options.fileType.skeletonMidExt}${this.options.fileType.templ}`), META_TYPE.NORMAL);
- if (item.skeletonPath.style) {
- resolveComponentStyleEntry(item.name, item.skeletonPath.style, `${this.options.fileType.skeletonMidExt}${this.options.fileType.style}`);
- }
- }
- } else {
- this.addEntry(item.path, item.name, nonNativeType);
- }
- };
-
- this.pages.forEach(resolveComponentEntry(META_TYPE.PAGE));
-
- this.components.forEach(resolveComponentEntry(META_TYPE.COMPONENT));
- }
-
- replaceExt(file: string, ext: string) {
- return path.join(path.dirname(file), `${path.basename(file, path.extname(file))}${ext}`);
- }
-
- /**
- * 读取页面、组件的配置,并递归读取依赖的组件的配置
- */
- async compileFile(file: IComponent, independentPackage?: IndependentPackage) {
- const filePath = file.path;
- const fileConfigPath = file.isNative ? this.replaceExt(filePath, '.json') : this.getConfigFilePath(filePath);
- // const fileConfig = readConfig(fileConfigPath, this.options.combination.config);
- const fileConfig = await this.options.combination.readConfig(fileConfigPath, this.options.combination.appPath);
- const { componentGenerics, usingComponents } = fileConfig;
-
- if (this.options.isBuildPlugin && componentGenerics) {
- Object.keys(componentGenerics).forEach((component) => {
- if (componentGenerics[component]) {
- if (!componentConfig.thirdPartyComponents.has(component)) {
- componentConfig.thirdPartyComponents.set(component, new Set());
- }
- }
- });
- }
-
- // 递归收集依赖的第三方组件
- if (usingComponents) {
- const componentNames = Object.keys(usingComponents);
- const depComponents: Array<{ name: string; path: string }> = [];
- // alias 的值需要从最终的 chain 中拿,避免用户在 webpackChain 中设置的 alias 无法被读取到
- // const alias = this.options.combination.chain.toConfig().resolve?.alias;
- const alias = {};
-
- for (const compName of componentNames) {
- let compPath: string = usingComponents[compName];
-
- if (isAliasPath(compPath, alias)) {
- compPath = replaceAliasPath(filePath, compPath, alias);
- fileConfig.usingComponents[compName] = compPath;
- }
-
- // 判断是否为第三方依赖的正则,如果 test 为 false 则为第三方依赖
- const notNpmPkgReg = /^[.\\/]/;
- if (
- !this.options.skipProcessUsingComponents &&
- !compPath.startsWith('plugin://') &&
- !notNpmPkgReg.test(compPath)
- ) {
- const tempCompPath = getNpmPackageAbsolutePath(compPath);
-
- if (tempCompPath) {
- compPath = tempCompPath;
- fileConfig.usingComponents[compName] = compPath;
- }
- }
-
- depComponents.push({
- name: compName,
- path: compPath,
- });
-
- if (!componentConfig.thirdPartyComponents.has(compName) && !file.isNative) {
- componentConfig.thirdPartyComponents.set(compName, new Set());
- }
- }
-
- await Promise.all(depComponents.map(async (item) => {
- const componentPath = resolveMainFilePath(path.resolve(path.dirname(file.path), item.path));
- if (fs.existsSync(componentPath) && !Array.from(this.components).some((item) => item.path === componentPath)) {
- const componentName = this.getComponentName(componentPath);
- // newBlended 模式下,本地化组件使用Page进行处理,此处直接跳过
- if (this.nativeComponents.has(componentName)) return;
- const componentTempPath = this.getTemplatePath(componentPath);
- const isNative = this.isNativePageORComponent(componentTempPath);
- const componentObj = {
- name: componentName,
- path: componentPath,
- isNative,
- stylePath: isNative ? this.getStylePath(componentPath) : undefined,
- templatePath: isNative ? this.getTemplatePath(componentPath) : undefined,
- };
-
- // 收集独立分包的组件,用于后续单独编译
- independentPackage?.components?.push(componentPath);
-
- this.components.add(componentObj);
- await this.compileFile(componentObj, independentPackage);
- }
- }));
- }
-
- this.filesConfig[this.getConfigFilePath(file.name)] = {
- content: fileConfig,
- path: fileConfigPath,
- };
- }
-
- /**
- * 收集分包配置中的页面
- */
- getSubPackages(appConfig: MiniappAppConfig) {
- const { subPackages } = appConfig; // || appConfig.subpackages;
- const { frameworkExts } = this.options;
- if (subPackages && subPackages.length) {
- subPackages.forEach((item) => {
- if (item.pages && item.pages.length) {
- const { root } = item;
- const isIndependent = !!item.independent;
- if (isIndependent) {
- this.independentPackages.set(root, { pages: [], components: [] });
- }
- item.pages.forEach((page) => {
- let pageItem = `${root}/${page}`;
- pageItem = pageItem.replace(/\/{2,}/g, '/');
- let hasPageIn = false;
- this.pages.forEach(({ name }) => {
- if (name === pageItem) {
- hasPageIn = true;
- }
- });
- if (!hasPageIn) {
- const pagePath = resolveMainFilePath(path.join(this.options.sourceDir, pageItem), frameworkExts);
- const templatePath = this.getTemplatePath(pagePath);
- const isNative = this.isNativePageORComponent(templatePath);
- if (isIndependent) {
- const independentPages = this.independentPackages.get(root)?.pages;
- independentPages?.push(pagePath);
- }
- this.pages.add({
- name: pageItem,
- path: pagePath,
- isNative,
- stylePath: isNative ? this.getStylePath(pagePath) : undefined,
- templatePath: isNative ? this.getTemplatePath(pagePath) : undefined,
- });
- }
- });
- }
- });
- }
- }
-
- /**
- * 收集 dark mode 配置中的文件
- */
- getDarkMode() {
- const { themeLocation } = this.appConfig;
- const darkMode = this.appConfig.darkmode;
- if (darkMode && themeLocation && typeof themeLocation === 'string') {
- this.themeLocation = themeLocation;
- }
- }
-
- compileIndependentPages(compiler, compilation, dependencies, promises) {
- const { independentPackages } = this;
- if (independentPackages.size) {
- const JsonpTemplatePlugin = require('webpack/lib/web/JsonpTemplatePlugin');
- const NaturalChunkIdsPlugin = require('webpack/lib/ids/NaturalChunkIdsPlugin');
- const SplitChunksPlugin = require('webpack/lib/optimize/SplitChunksPlugin');
- const RuntimeChunkPlugin = require('webpack/lib/optimize/RuntimeChunkPlugin');
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
-
- independentPackages.forEach(({ pages, components }, name) => {
- const childCompiler = compilation.createChildCompiler(PLUGIN_NAME, {
- path: `${compiler.options.output.path}/${name}`,
- chunkLoadingGlobal: `subpackage_${name}`,
- });
- const compPath = path.resolve(__dirname, '..', 'template/comp');
- childCompiler.inputFileSystem = compiler.inputFileSystem;
- childCompiler.outputFileSystem = compiler.outputFileSystem;
- childCompiler.context = compiler.context;
- new JsonpTemplatePlugin().apply(childCompiler);
- new NaturalChunkIdsPlugin().apply(childCompiler);
- new MiniCssExtractPlugin({
- filename: `[name]${this.options.fileType.style}`,
- chunkFilename: `[name]${this.options.fileType.style}`,
- }).apply(childCompiler);
- new compiler.webpack.DefinePlugin(this.options.constantsReplaceList).apply(childCompiler);
- if (compiler.options.optimization) {
- new SplitChunksPlugin({
- chunks: 'all',
- maxInitialRequests: Infinity,
- minSize: 0,
- cacheGroups: {
- common: {
- name: `${name}/common`,
- minChunks: 2,
- priority: 1,
- },
- vendors: {
- name: `${name}/vendors`,
- minChunks: 1,
- test: (module) => {
- const nodeModulesDirRegx = new RegExp(REG_NODE_MODULES_DIR);
- return nodeModulesDirRegx.test(module.resource) && module.resource.indexOf(compPath) < 0;
- },
- priority: 10,
- },
- },
- }).apply(childCompiler);
- new RuntimeChunkPlugin({
- name: `${name}/runtime`,
- }).apply(childCompiler);
- }
- const childPages = new Set();
- pages.forEach((pagePath) => {
- if (dependencies.has(pagePath)) {
- const dep = dependencies.get(pagePath);
- new SingleEntryPlugin(compiler.context, dep?.request, dep?.name, dep?.miniType, dep?.options).apply(
- childCompiler,
- );
- }
- this.pages.forEach((item) => {
- if (item.path === pagePath) {
- childPages.add(item);
- }
- });
- dependencies.delete(pagePath);
- });
- components.forEach((componentPath) => {
- if (dependencies.has(componentPath)) {
- const dep = dependencies.get(componentPath);
- new SingleEntryPlugin(compiler.context, dep?.request, dep?.name, dep?.miniType, dep?.options).apply(
- childCompiler,
- );
- }
-
- dependencies.delete(componentPath);
- });
- new LoadChunksPlugin({
- commonChunks: [`${name}/runtime`, `${name}/vendors`, `${name}/common`],
- isBuildPlugin: false,
- addChunkPages: this.options.combination.config.addChunkPages,
- pages: childPages,
- framework: this.options.framework,
- isIndependentPackages: true,
- needAddCommon: [`${name}/comp`, `${name}/custom-wrapper`],
- }).apply(childCompiler);
- // 添加 comp 和 custom-wrapper 组件
- new SingleEntryPlugin(
- compiler.context,
- path.resolve(__dirname, '..', 'template/comp'),
- `${name}/comp`,
- META_TYPE.STATIC,
- ).apply(childCompiler);
- new SingleEntryPlugin(
- compiler.context,
- path.resolve(__dirname, '..', 'template/custom-wrapper'),
- `${name}/custom-wrapper`,
- META_TYPE.STATIC,
- ).apply(childCompiler);
-
- // 给每个子编译器标记上名称和 tag
- // tag 用于生成模板和 config 时区别于主编译器走不同的方法
- // 名称用于在生成资源时判断是否为当前子编译器的资源
- childCompiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
- compilation.__name = name;
- compilation.__tag = CHILD_COMPILER_TAG;
- });
-
- promises.push(
- new Promise((resolve, reject) => {
- childCompiler.runAsChild((err) => {
- if (err) {
- return reject(err);
- }
- resolve(null);
- });
- }).catch((err) => console.log(err)),
- );
- });
- }
- }
-
- /**
- * 搜集 tabbar icon 图标路径
- * 收集自定义 tabbar 组件
- */
- async getTabBarFiles(appConfig: MiniappAppConfig) {
- const { tabBar } = appConfig;
- const { sourceDir, frameworkExts } = this.options;
- if (tabBar && typeof tabBar === 'object' && !isEmptyObject(tabBar)) {
- // eslint-disable-next-line dot-notation
- const list = tabBar['list'] || [];
- list.forEach((item) => {
- // eslint-disable-next-line dot-notation
- item['iconPath'] && this.tabBarIcons.add(item['iconPath']);
- // eslint-disable-next-line dot-notation
- item['selectedIconPath'] && this.tabBarIcons.add(item['selectedIconPath']);
- });
- if (tabBar.custom) {
- const isAlipay = process.env.TARO_ENV === 'alipay';
- const customTabBarPath = path.join(sourceDir, isAlipay ? 'customize-tab-bar' : 'custom-tab-bar');
- const customTabBarComponentPath = resolveMainFilePath(customTabBarPath, [...frameworkExts, ...SCRIPT_EXT]);
- if (fs.existsSync(customTabBarComponentPath)) {
- const customTabBarComponentTemplPath = this.getTemplatePath(customTabBarComponentPath);
- const isNative = this.isNativePageORComponent(customTabBarComponentTemplPath);
- if (!this.isWatch && this.options.logger?.quiet === false) {
- printLog(processTypeEnum.COMPILE, '自定义 tabBar', this.getShowPath(customTabBarComponentPath));
- }
- const componentObj: IComponent = {
- name: isAlipay ? 'customize-tab-bar/index' : 'custom-tab-bar/index',
- path: customTabBarComponentPath,
- isNative,
- stylePath: isNative ? this.getStylePath(customTabBarComponentPath) : undefined,
- templatePath: isNative ? this.getTemplatePath(customTabBarComponentPath) : undefined,
- };
- await this.compileFile(componentObj);
- this.components.add(componentObj);
- }
- }
- }
- }
-
- /** 是否为小程序原生页面或组件 */
- isNativePageORComponent(templatePath: string): boolean {
- return fs.existsSync(templatePath);
- }
-
- getShowPath(filePath: string) {
- return filePath.replace(this.context, '').replace(/\\/g, '/').replace(/^\//, '');
- }
-
- // 调整 config 文件中 usingComponents 的路径
- // 1. 将 node_modules 调整为 npm
- // 2. 将 ../../../node_modules/xxx 调整为 /npm/xxx
- adjustConfigContent(config: MiniappConfig) {
- const { usingComponents } = config;
-
- if (!usingComponents || this.options.skipProcessUsingComponents) return;
-
- for (const [key, value] of Object.entries(usingComponents)) {
- if (!value.includes(NODE_MODULES)) return;
-
- const match = value.replace(NODE_MODULES, 'npm').match(/npm.*/);
- usingComponents[key] = match ? `${path.sep}${match[0]}` : value;
- }
- }
-
- /** 生成小程序独立分包的相关文件 */
- async generateIndependentMiniFiles(compilation: Compilation, compiler: Compiler) {
- const { template, sourceDir } = this.options;
- const baseTemplateName = 'base';
- const isUsingCustomWrapper = componentConfig.thirdPartyComponents.has('custom-wrapper');
- // @ts-ignore
- const childName = compilation.__name;
- // 为独立分包生成 base/comp/custom-wrapper
- this.independentPackages.forEach((_pages, name) => {
- // independentPackages 是包含了所有 ChildCompiler 的资源,如果不是当前 ChildCompiler 的资源不做处理
- if (name !== childName) return;
-
- this.generateTemplateFile(
- compilation,
- compiler,
- `${name}/${baseTemplateName}`,
- template.buildTemplate,
- componentConfig,
- );
- if (!template.isSupportRecursive) {
- // 如微信、QQ 不支持递归模版的小程序,需要使用自定义组件协助递归
- this.generateConfigFile(compilation, compiler, `${name}/${baseCompName}`, {
- component: true,
- usingComponents: {
- [baseCompName]: `./${baseCompName}`,
- [customWrapperName]: `./${customWrapperName}`,
- },
- });
- this.generateTemplateFile(
- compilation,
- compiler,
- `${name}/${baseCompName}`,
- template.buildBaseComponentTemplate,
- this.options.fileType.templ,
- );
- }
- this.generateConfigFile(compilation, compiler, `${name}/${customWrapperName}`, {
- component: true,
- usingComponents: {
- [customWrapperName]: `./${customWrapperName}`,
- },
- });
- this.generateTemplateFile(
- compilation,
- compiler,
- `${name}/${customWrapperName}`,
- template.buildCustomComponentTemplate,
- this.options.fileType.templ,
- );
- this.generateXSFile(compilation, compiler, `${name}/utils`);
- });
-
- this.pages.forEach((page) => {
- let importBaseTemplatePath = promoteRelativePath(
- path.relative(page.path, path.join(sourceDir, this.getTemplatePath(baseTemplateName))),
- );
- const config = this.filesConfig[this.getConfigFilePath(page.name)];
- let isIndependent = false;
- let independentName = '';
- this.independentPackages.forEach(({ pages }, name) => {
- // independentPackages 是包含了所有 ChildCompiler 的资源,如果不是当前 ChildCompiler 的资源不做处理
- if (pages.includes(page.path) && name === childName) {
- isIndependent = true;
- independentName = name;
- importBaseTemplatePath = promoteRelativePath(
- path.relative(page.path, path.join(sourceDir, name, this.getTemplatePath(baseTemplateName))),
- );
- }
- });
-
- if (!isIndependent) return;
-
- // 生成页面模板需要在生成页面配置之前,因为会依赖到页面配置的部分内容
- if (!page.isNative) {
- this.generateTemplateFile(
- compilation,
- compiler,
- page.path,
- template.buildPageTemplate,
- importBaseTemplatePath,
- config,
- );
- }
-
- if (config) {
- const importBaseCompPath = promoteRelativePath(
- path.relative(page.path, path.join(sourceDir, independentName, this.getTargetFilePath(baseCompName, ''))),
- );
- const importCustomWrapperPath = promoteRelativePath(
- path.relative(
- page.path,
- path.join(sourceDir, independentName, this.getTargetFilePath(customWrapperName, '')),
- ),
- );
- config.content.usingComponents = {
- ...config.content.usingComponents,
- };
-
- if (isUsingCustomWrapper) {
- config.content.usingComponents[customWrapperName] = importCustomWrapperPath;
- }
- if (!template.isSupportRecursive && !page.isNative) {
- config.content.usingComponents[baseCompName] = importBaseCompPath;
- }
- this.generateConfigFile(compilation, compiler, page.path, config.content);
- }
- });
- }
-
- /** 生成小程序相关文件 */
- async generateMiniFiles(compilation: Compilation, compiler: Compiler) {
- const { RawSource } = compiler.webpack.sources;
- const { template, combination, isBuildPlugin, sourceDir } = this.options;
- const { modifyMiniConfigs } = combination.config;
- const baseTemplateName = 'base';
- const isUsingCustomWrapper = componentConfig.thirdPartyComponents.has('custom-wrapper');
-
- /**
- * 与原生小程序混写时解析模板与样式
- */
- compilation.getAssets().forEach(({ name: assetPath }) => {
- const styleExt = this.options.fileType.style;
- if (new RegExp(`${styleExt}${styleExt}$`).test(assetPath)) {
- const assetObj = compilation.assets[assetPath];
- const newAssetPath = assetPath.replace(styleExt, '');
- compilation.assets[newAssetPath] = assetObj;
- }
- });
-
- if (typeof modifyMiniConfigs === 'function') {
- await modifyMiniConfigs(this.filesConfig);
- }
-
- compilation.assets[combination.rawConfig.projectConfigJson] = new RawSource(JSON.stringify(this.projectConfig, null, 2));
-
- if ((!this.options.blended || !this.options.newBlended) && !isBuildPlugin) {
- const appConfigName = path.basename(this.appEntry).replace(path.extname(this.appEntry), '');
- const appConfigPath = this.getConfigFilePath(appConfigName);
- this.generateConfigFile(compilation, compiler, 'app.js', this.filesConfig[appConfigPath].content);
- }
-
- if (!template.isSupportRecursive) {
- // 如微信、QQ 不支持递归模版的小程序,需要使用自定义组件协助递归
- this.generateTemplateFile(
- compilation,
- compiler,
- baseCompName,
- template.buildBaseComponentTemplate,
- this.options.fileType.templ,
- );
-
- const baseCompConfig = {
- component: true,
- usingComponents: {
- [baseCompName]: `./${baseCompName}`,
- },
- };
-
- if (isUsingCustomWrapper) {
- baseCompConfig.usingComponents[customWrapperName] = `./${customWrapperName}`;
- this.generateConfigFile(compilation, compiler, customWrapperName, {
- component: true,
- styleIsolation: 'apply-shared',
- usingComponents: {
- [baseCompName]: `./${baseCompName}`,
- [customWrapperName]: `./${customWrapperName}`,
- },
- });
- }
-
- this.generateConfigFile(compilation, compiler, baseCompName, baseCompConfig);
- } else {
- if (isUsingCustomWrapper) {
- this.generateConfigFile(compilation, compiler, customWrapperName, {
- component: true,
- usingComponents: {
- [customWrapperName]: `./${customWrapperName}`,
- },
- });
- }
- }
-
- this.generateTemplateFile(compilation, compiler, baseTemplateName, template.buildTemplate, componentConfig);
- isUsingCustomWrapper &&
- this.generateTemplateFile(
- compilation,
- compiler,
- customWrapperName,
- template.buildCustomComponentTemplate,
- this.options.fileType.templ,
- );
- this.generateXSFile(compilation, compiler, 'utils');
-
- this.components.forEach((component) => {
- const importBaseTemplatePath = promoteRelativePath(
- path.relative(
- component.path,
- path.join(sourceDir, isBuildPlugin ? 'plugin' : '', this.getTemplatePath(baseTemplateName)),
- ),
- );
- const config = this.filesConfig[this.getConfigFilePath(component.name)];
- if (config) {
- this.generateConfigFile(compilation, compiler, component.path, config.content);
- }
- if (!component.isNative) {
- this.generateTemplateFile(
- compilation,
- compiler,
- component.path,
- template.buildPageTemplate,
- importBaseTemplatePath,
- );
- }
- });
-
- this.pages.forEach((page) => {
- const importBaseTemplatePath = promoteRelativePath(
- path.relative(
- page.path,
- path.join(sourceDir, isBuildPlugin ? 'plugin' : '', this.getTemplatePath(baseTemplateName)),
- ),
- );
- const config = this.filesConfig[this.getConfigFilePath(page.name)];
- // pages 里面会混合独立分包的,在这里需要过滤一下,避免重复生成 assets
- const isIndependent = !!this.getIndependentPackage(page.path);
-
- if (isIndependent) return;
-
- // 生成页面模板需要在生成页面配置之前,因为会依赖到页面配置的部分内容
- if (!page.isNative) {
- this.generateTemplateFile(
- compilation,
- compiler,
- page.path,
- template.buildPageTemplate,
- importBaseTemplatePath,
- config,
- );
- }
-
- if (config) {
- const importBaseCompPath = promoteRelativePath(
- path.relative(page.path, path.join(sourceDir, this.getTargetFilePath(baseCompName, ''))),
- );
- const importCustomWrapperPath = promoteRelativePath(
- path.relative(page.path, path.join(sourceDir, this.getTargetFilePath(customWrapperName, ''))),
- );
- config.content.usingComponents = {
- ...config.content.usingComponents,
- };
-
- if (isUsingCustomWrapper) {
- config.content.usingComponents[customWrapperName] = importCustomWrapperPath;
- }
- if (!template.isSupportRecursive && !page.isNative) {
- config.content.usingComponents[baseCompName] = importBaseCompPath;
- }
- this.generateConfigFile(compilation, compiler, page.path, config.content);
- }
- });
-
- this.generateTabBarFiles(compilation, compiler);
- this.injectCommonStyles(compilation, compiler);
- if (this.themeLocation) {
- this.generateDarkModeFile(compilation, compiler);
- }
-
- if (isBuildPlugin) {
- const pluginJSONPath = path.join(sourceDir, 'plugin', 'plugin.json');
- if (fs.existsSync(pluginJSONPath)) {
- const pluginJSON = fs.readJSONSync(pluginJSONPath);
- this.modifyPluginJSON(pluginJSON);
- compilation.assets['plugin.json'] = new RawSource(JSON.stringify(pluginJSON));
- }
- }
-
- // 将三方的自定义组件信息输出到目录中,方便后续处理
- compilation.assets['third-party-components.json'] = new RawSource(JSON.stringify(
- Array.from(componentConfig.thirdPartyComponents.entries()),
- ));
- }
-
- async optimizeMiniFiles(compilation: Compilation, _compiler: Compiler) {
- const isUsingCustomWrapper = componentConfig.thirdPartyComponents.has('custom-wrapper');
-
- /**
- * 与原生小程序混写时解析模板与样式
- */
- compilation.getAssets().forEach(({ name: assetPath }) => {
- const styleExt = this.options.fileType.style;
- const templExt = this.options.fileType.templ;
- if (new RegExp(`(\\${styleExt}|\\${templExt})\\.js(\\.map){0,1}$`).test(assetPath)) {
- delete compilation.assets[assetPath];
- } else if (new RegExp(`${styleExt}${styleExt}$`).test(assetPath)) {
- delete compilation.assets[assetPath];
- }
- if (!isUsingCustomWrapper && assetPath === 'custom-wrapper.js') {
- delete compilation.assets[assetPath];
- }
- });
- }
-
- generateConfigFile(
- compilation: Compilation,
- compiler: Compiler,
- filePath: string,
- config: MiniappConfig & {
- component?: boolean;
- },
- ) {
- const { RawSource } = compiler.webpack.sources;
- const fileConfigName = this.getConfigPath(this.getComponentName(filePath));
-
- const unofficialConfigs = ['enableShareAppMessage', 'enableShareTimeline', 'enablePageMeta', 'components'];
- unofficialConfigs.forEach((item) => {
- delete config[item];
- });
-
- this.adjustConfigContent(config);
-
- const fileConfigStr = JSON.stringify(config);
- compilation.assets[fileConfigName] = new RawSource(fileConfigStr);
- }
-
- generateTemplateFile(
- compilation: Compilation,
- compiler: Compiler,
- filePath: string,
- templateFn: (...args) => string,
- ...options
- ) {
- const { RawSource } = compiler.webpack.sources;
- let templStr = templateFn(...options);
- const fileTemplName = this.getTemplatePath(this.getComponentName(filePath));
-
- if (this.options.combination.config.minifyXML?.collapseWhitespace) {
- const { minify } = require('html-minifier');
- templStr = minify(templStr, {
- collapseWhitespace: true,
- keepClosingSlash: true,
- });
- }
-
- compilation.assets[fileTemplName] = new RawSource(templStr);
- }
-
- generateXSFile(compilation: Compilation, compiler: Compiler, xsPath) {
- const { RawSource } = compiler.webpack.sources;
- const ext = this.options.fileType.xs;
- const isSupportXS = this.options.template.supportXS;
-
- if (ext == null || !isSupportXS) {
- return;
- }
-
- const xs = this.options.template.buildXScript();
- const fileXsName = this.getTargetFilePath(xsPath, ext);
- const filePath = fileXsName;
- compilation.assets[filePath] = new RawSource(xs);
- }
-
- getComponentName(componentPath: string) {
- let componentName: string;
- if (componentPath.startsWith(this.options.sourceDir)) {
- // 如果在源码文件夹下,直接处理即可,无需考虑其他情况
- componentName = componentPath.slice(this.options.sourceDir.length)
- .replace(/\\/g, '/')
- .replace(path.extname(componentPath), '');
- if (this.options.isBuildPlugin) {
- componentName = componentName.replace(/plugin\//, '');
- }
- } else if (REG_NODE_MODULES.test(componentPath)) {
- // 如果是在 npm 下的路径中
- const nodeModulesRegx = new RegExp(REG_NODE_MODULES, 'gi');
-
- componentName = componentPath
- .replace(this.context, '')
- .replace(/\\/g, '/')
- .replace(path.extname(componentPath), '');
- componentName = componentName.replace(nodeModulesRegx, 'npm');
- } else {
- // 兜底情况,理论上应该不会走到这里来了
- componentName = componentPath
- .replace(this.options.sourceDir, '')
- .replace(/\\/g, '/')
- .replace(path.extname(componentPath), '');
- if (this.options.isBuildPlugin) {
- componentName = componentName.replace(/plugin\//, '');
- }
- }
-
- return componentName.replace(/^(\/|\\)/, '');
- }
-
- /**
- * 根据 app、页面、组件的路径获取对应的 config 配置文件的路径
- * @returns config 的路径
- */
- getConfigFilePath(filePath: string) {
- return resolveMainFilePath(`${filePath.replace(path.extname(filePath), '')}.config`);
- }
-
- /** 处理 xml 文件后缀 */
- getTemplatePath(filePath: string) {
- return this.getTargetFilePath(filePath, this.options.fileType.templ);
- }
-
- getSkeletonExtraPath(filePath: string): IComponentExtraPath | null {
- const { fileType } = this.options;
- if (!fileType.skeletonMidExt) return null;
- return {
- template: this.getTargetFilePath(filePath, `${fileType.skeletonMidExt}${fileType.templ}`),
- style: [
- this.getTargetFilePath(filePath, `${fileType.skeletonMidExt}${fileType.style}`),
- this.getTargetFilePath(filePath, `${fileType.skeletonMidExt}.less`),
- this.getTargetFilePath(filePath, `${fileType.skeletonMidExt}.sass`),
- ],
- };
- }
-
- /** 处理样式文件后缀 */
- getStylePath(filePath: string) {
- return [
- this.getTargetFilePath(filePath, this.options.fileType.style),
- this.getTargetFilePath(filePath, '.less'),
- this.getTargetFilePath(filePath, '.sass'),
- ];
- }
-
- /** 处理 config 文件后缀 */
- getConfigPath(filePath: string) {
- return this.getTargetFilePath(filePath, this.options.fileType.config);
- }
-
- /** 处理 extname */
- getTargetFilePath(filePath: string, targetExtname: string) {
- const extname = path.extname(filePath);
- if (extname) {
- return filePath.replace(extname, targetExtname);
- }
- return filePath + targetExtname;
- }
-
- /**
- * 输出 themeLocation 文件
- * @param compilation
- */
- generateDarkModeFile(compilation: Compilation, { webpack }: Compiler) {
- const { RawSource } = webpack.sources;
- const themeLocationPath = path.resolve(this.options.sourceDir, this.themeLocation);
- if (fs.existsSync(themeLocationPath)) {
- const themeLocationSource = fs.readFileSync(themeLocationPath);
- compilation.assets[this.themeLocation] = new RawSource(themeLocationSource);
- }
- }
-
- /**
- * 输出 tabbar icons 文件
- */
- generateTabBarFiles(compilation: Compilation, { webpack }: Compiler) {
- const { RawSource } = webpack.sources;
- this.tabBarIcons.forEach((icon) => {
- const iconPath = path.resolve(this.options.sourceDir, icon);
- if (fs.existsSync(iconPath)) {
- const iconSource = fs.readFileSync(iconPath);
- compilation.assets[icon] = new RawSource(iconSource);
- }
- });
- }
-
- /**
- * 小程序全局样式文件中引入 common chunks 中的公共样式文件
- */
- injectCommonStyles({ assets }: Compilation, { webpack }: Compiler) {
- const { newBlended } = this.options;
- const { ConcatSource, RawSource } = webpack.sources;
- const styleExt = this.options.fileType.style;
- const appStyle = `app${styleExt}`;
- const REG_STYLE_EXT = new RegExp(`\\.(${styleExt.replace('.', '')})(\\?.*)?$`);
-
- const originSource = assets[appStyle] || new RawSource('');
- const commons = new ConcatSource('');
- const componentCommons: string[] = [];
- const independentPackageNames: string[] = [];
-
- this.independentPackages.forEach((_, name) => {
- independentPackageNames.push(name);
- });
-
- Object.keys(assets).forEach((assetName) => {
- const fileName = path.basename(assetName, path.extname(assetName));
- if (
- (REG_STYLE.test(assetName) || REG_STYLE_EXT.test(assetName)) &&
- this.options.commonChunks.includes(fileName) &&
- // app.wxss 不能引入独立分包中的 common 样式文件
- independentPackageNames.every((name) => !assetName.includes(name))
- ) {
- commons.add('\n');
- commons.add(`@import ${JSON.stringify(urlToRequest(assetName))};`);
- componentCommons.push(assetName);
- }
- });
-
- if (commons.size() > 0) {
- const APP_STYLE_NAME = `app-origin${styleExt}`;
- assets[APP_STYLE_NAME] = new ConcatSource(originSource);
- const source = new ConcatSource('');
- source.add(`@import ${JSON.stringify(urlToRequest(APP_STYLE_NAME))};`);
- source.add(commons);
- source.add('\n');
- assets[appStyle] = source;
- if (newBlended) {
- // 本地化组件引入common公共样式文件
- this.pages.forEach((page) => {
- if (page.isNative) return;
- const pageStyle = `${page.name}${styleExt}`;
- if (this.nativeComponents.has(page.name)) {
- // 本地化组件如果没有wxss则直接写入一个空的
- if (!(pageStyle in assets)) {
- assets[pageStyle] = new ConcatSource('');
- }
- const source = new ConcatSource('');
- const originSource = assets[pageStyle];
- componentCommons.forEach((item) => {
- source.add(
- `@import ${JSON.stringify(urlToRequest(path.posix.relative(path.dirname(pageStyle), item)))};\n`,
- );
- });
- source.add(originSource);
- assets[pageStyle] = source;
- } else {
- if (pageStyle in assets) {
- const source = new ConcatSource('');
- const originSource = assets[pageStyle];
- source.add(
- `@import ${JSON.stringify(
- urlToRequest(path.posix.relative(path.dirname(pageStyle), `app${styleExt}`)),
- )};\n`,
- );
- source.add(originSource);
- assets[pageStyle] = source;
- }
- }
- });
- }
- }
- }
-
- addTarBarFilesToDependencies(compilation: Compilation) {
- const { fileDependencies, missingDependencies } = compilation;
- this.tabBarIcons.forEach((icon) => {
- if (!fileDependencies.has(icon)) {
- fileDependencies.add(icon);
- }
- // 避免触发 watchpack 里 WatchpackFileWatcher 类的 "initial-missing" 事件中 _onRemove 逻辑,
- // 它会把 tabbar icon 当做已 remove 多次触发构建
- if (!missingDependencies.has(icon)) {
- missingDependencies.add(icon);
- }
- });
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/plugins/NormalModule.ts b/packages/plugin-miniapp/src/miniapp/webpack/plugins/NormalModule.ts
deleted file mode 100644
index a9f6590a15..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/plugins/NormalModule.ts
+++ /dev/null
@@ -1,162 +0,0 @@
-import webpack from '@ice/bundles/compiled/webpack/index.js';
-import { isEmpty } from '@ice/shared';
-import type { META_TYPE } from '../../../helper/index.js';
-import { componentConfig, elementNameSet, componentNameSet } from '../utils/component.js';
-
-export class BaseNormalModule extends webpack.NormalModule {
- elementNameSet: Set;
-
- componentNameSet: Set;
-
- collectProps: { [name: string]: string };
-
- constructor(data) {
- super(data);
-
- this.collectProps = {};
- this.elementNameSet = new Set();
- this.componentNameSet = new Set();
- }
-
- clear() {
- this.collectProps = {};
- this.elementNameSet.clear();
- this.componentNameSet.clear();
- }
-
- serialize(context) {
- const { write } = context;
-
- write(this.collectProps);
- write(this.elementNameSet);
- write(this.componentNameSet);
-
- super.serialize(context);
- }
-
- deserialize(context) {
- const { read } = context;
-
- this.collectProps = read();
- this.elementNameSet = read();
- this.componentNameSet = read();
-
- if (!isEmpty(this.collectProps)) {
- for (const key in this.collectProps) {
- const attrs = componentConfig.thirdPartyComponents.get(key);
- const value = this.collectProps[key];
-
- if (!attrs) continue;
-
- value.split('|').forEach((item) => {
- attrs.add(item);
- });
- }
- }
-
- for (const elementName of this.elementNameSet) {
- elementNameSet.add(elementName);
- }
- for (const componentName of this.componentNameSet) {
- componentNameSet.add(componentName);
- }
-
- return super.deserialize(context);
- }
-}
-
-export default class NormalModule extends BaseNormalModule {
- name: string;
- miniType: META_TYPE;
- // 在 TaroLoadChunksPlugin 用于判断是否为独立分包,来添加 common、runtime 和 vendor 头部引用
- isNativePage?: boolean;
-
- constructor(data) {
- super(data);
- this.name = data.name;
- this.miniType = data.miniType;
- this.isNativePage = data.isNativePage || false;
- }
-
- serialize(context) {
- const { write } = context;
- write(this.name);
- write(this.miniType);
- write(this.isNativePage);
- super.serialize(context);
- }
-
- deserialize(context) {
- const { read } = context;
- this.name = read();
- this.miniType = read();
- this.isNativePage = read();
- super.deserialize(context);
- }
-}
-
-webpack.util.serialization.register(
- NormalModule,
- '@ice/app/esm/tasks/miniapp/webpack/plugins/NormalModule',
- 'NormalModule',
- {
- serialize(obj, context) {
- obj.serialize(context);
- },
- deserialize(context) {
- const obj = new NormalModule({
- // will be deserialized by Module
- layer: null,
- type: '',
- // will be filled by updateCacheModule
- resource: '',
- context: '',
- request: null,
- userRequest: null,
- rawRequest: null,
- loaders: null,
- matchResource: null,
- parser: null,
- parserOptions: null,
- generator: null,
- generatorOptions: null,
- resolveOptions: null,
- });
- obj.deserialize(context);
- return obj;
- },
- },
-);
-
-webpack.util.serialization.register(
- BaseNormalModule,
- '@ice/app/esm/tasks/miniapp/webpack/plugins/BaseNormalModule',
- 'BaseNormalModule',
- {
- serialize(obj, context) {
- obj.serialize(context);
- },
- deserialize(context) {
- const obj = new BaseNormalModule({
- // will be deserialized by Module
- layer: null,
- type: '',
- // will be filled by updateCacheModule
- resource: '',
- context: '',
- request: null,
- userRequest: null,
- rawRequest: null,
- loaders: null,
- matchResource: null,
- parser: null,
- parserOptions: null,
- generator: null,
- generatorOptions: null,
- resolveOptions: null,
- });
- obj.deserialize(context);
- return obj;
- },
- },
-);
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/plugins/NormalModulesPlugin.ts b/packages/plugin-miniapp/src/miniapp/webpack/plugins/NormalModulesPlugin.ts
deleted file mode 100644
index 4140a913ba..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/plugins/NormalModulesPlugin.ts
+++ /dev/null
@@ -1,143 +0,0 @@
-import type { Compiler } from '@ice/bundles/compiled/webpack/index.js';
-import * as walk from 'acorn-walk';
-import type { Func } from '@ice/miniapp-runtime';
-import SingleEntryDependency from '../dependencies/SingleEntryDependency.js';
-import { componentConfig, componentNameSet, elementNameSet } from '../utils/component.js';
-import NormalModule, { BaseNormalModule } from './NormalModule.js';
-
-const PLUGIN_NAME = 'NormalModulesPlugin';
-
-export default class NormalModulesPlugin {
- isCache = true;
-
- onParseCreateElement: Func | undefined;
-
- constructor(onParseCreateElement: Func | undefined) {
- this.onParseCreateElement = onParseCreateElement;
- }
-
- apply(compiler: Compiler) {
- compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation, { normalModuleFactory }) => {
- // cache 开启后,会跳过 JavaScript parser 环节,因此需要收集组件信息,在 finishModules 阶段处理
- compilation.hooks.finishModules.tap(PLUGIN_NAME, (_) => {
- if (!this.isCache) return;
-
- for (const name of elementNameSet) {
- this.onParseCreateElement?.(name, componentConfig);
- }
-
- for (const name of componentNameSet) {
- if (name === 'CustomWrapper' && !componentConfig.thirdPartyComponents.get('custom-wrapper')) {
- componentConfig.thirdPartyComponents.set('custom-wrapper', new Set());
-
- return;
- }
- }
- });
-
- normalModuleFactory.hooks.createModule.tapPromise(PLUGIN_NAME, (data, { dependencies }) => {
- const dependency = dependencies[0];
- if (dependency instanceof SingleEntryDependency) {
- return Promise.resolve(
- new NormalModule(
- Object.assign(data, {
- miniType: dependency.miniType,
- name: dependency.name,
- isNativePage: dependency.options.isNativePage,
- }),
- ),
- );
- }
- return Promise.resolve(new BaseNormalModule(data));
- });
-
- // react 的第三方组件支持
- normalModuleFactory.hooks.parser.for('javascript/auto').tap(PLUGIN_NAME, (parser) => {
- parser.hooks.program.tap(PLUGIN_NAME, (ast) => {
- this.isCache = false;
-
- const currentModule = parser.state.current as BaseNormalModule;
- currentModule.clear();
-
- walk.ancestor(ast, {
- CallExpression: (node, _ancestors) => {
- // @ts-ignore
- const { callee } = node;
-
- if (callee.type === 'MemberExpression') {
- if (callee.property.type !== 'Identifier') {
- return;
- }
- if (callee.property.name !== 'createElement') {
- return;
- }
- } else {
- const nameOfCallee = (callee as any).name;
- if (
- // 兼容 react17 new jsx transtrom 以及esbuild-loader的ast兼容问题
- !/^_?jsxs?$/.test(nameOfCallee) &&
- // 兼容 Vue 3.0 渲染函数及 JSX
- !(nameOfCallee && nameOfCallee.includes('createVNode')) &&
- !(nameOfCallee && nameOfCallee.includes('createBlock')) &&
- !(nameOfCallee && nameOfCallee.includes('createElementVNode')) &&
- !(nameOfCallee && nameOfCallee.includes('createElementBlock')) &&
- !(nameOfCallee && nameOfCallee.includes('resolveComponent')) && // 收集使用解析函数的组件名称
- !(nameOfCallee && nameOfCallee.includes('_$createElement')) // solidjs创建元素
- ) {
- return;
- }
- }
-
- // @ts-ignore
- const [type, prop] = node.arguments;
-
- if (!type) return;
-
- const componentName = type.name;
-
- if (type.value) {
- this.onParseCreateElement?.(type.value, componentConfig);
- // @ts-ignore
- currentModule.elementNameSet.add(type.value);
- }
-
- if (componentName) {
- currentModule.componentNameSet.add(componentName);
- if (componentName === 'CustomWrapper' && !componentConfig.thirdPartyComponents.get('custom-wrapper')) {
- componentConfig.thirdPartyComponents.set('custom-wrapper', new Set());
- }
- }
-
- if (componentConfig.thirdPartyComponents.size === 0) {
- return;
- }
- // @ts-ignore
- const attrs = componentConfig.thirdPartyComponents.get(type.value);
-
- if (attrs == null || !prop || prop.type !== 'ObjectExpression') {
- return;
- }
-
- function getPropName(key): string {
- return key.type === 'Identifier' ? key.name : key.type === 'Literal' ? key.value : null;
- }
-
- const props = prop.properties.filter((p) => {
- if (p.type !== 'Property') return false;
-
- const propName = getPropName(p.key);
- return propName && propName !== 'children' && propName !== 'id';
- });
- // @ts-ignore
- const res = props.map((p) => getPropName(p.key)).join('|');
- // @ts-ignore
- props.forEach((p) => attrs.add(getPropName(p.key)));
- // @ts-ignore
- currentModule.collectProps[type.value] = res;
- },
- });
- });
- });
- });
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/plugins/SingleEntryPlugin.ts b/packages/plugin-miniapp/src/miniapp/webpack/plugins/SingleEntryPlugin.ts
deleted file mode 100644
index 89f69efd74..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/plugins/SingleEntryPlugin.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import SingleEntryDependency from '../dependencies/SingleEntryDependency.js';
-
-export default class SingleEntryPlugin {
- context: any;
- entry: string;
- name: string;
- miniType: any;
-
- constructor(context, entry, name, miniType, public options = {}) {
- this.context = context;
- this.entry = entry;
- this.name = name;
- this.miniType = miniType;
- }
-
- apply(compiler) {
- compiler.hooks.compilation.tap('SingleEntryDependency', (compilation, { normalModuleFactory }) => {
- compilation.dependencyFactories.set(SingleEntryDependency, normalModuleFactory);
- });
-
- compiler.hooks.make.tapAsync('SingleEntryPlugin', (compilation, callback) => {
- const { entry, name, context, miniType } = this;
-
- const dep = SingleEntryPlugin.createDependency(entry, name, miniType);
- compilation.addEntry(context, dep, name, callback);
- });
- }
-
- static createDependency(entry, name, miniType) {
- return new SingleEntryDependency(entry, name, { name }, miniType);
- }
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/template/comp.ts b/packages/plugin-miniapp/src/miniapp/webpack/template/comp.ts
deleted file mode 100644
index 452d7c3241..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/template/comp.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-/* eslint-disable no-undef */
-import { createRecursiveComponentConfig } from '@ice/miniapp-runtime';
-// @ts-ignore
-Component(createRecursiveComponentConfig());
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/template/custom-wrapper.ts b/packages/plugin-miniapp/src/miniapp/webpack/template/custom-wrapper.ts
deleted file mode 100644
index 93862c095e..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/template/custom-wrapper.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-/* eslint-disable no-undef */
-import { createRecursiveComponentConfig } from '@ice/miniapp-runtime';
-// @ts-ignore
-Component(createRecursiveComponentConfig('custom-wrapper'));
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/utils/component.ts b/packages/plugin-miniapp/src/miniapp/webpack/utils/component.ts
deleted file mode 100644
index ca30e83470..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/utils/component.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-type Tagname = string;
-type Attrs = Set;
-
-export interface IComponentConfig {
- includes: Set;
- exclude: Set;
- thirdPartyComponents: Map;
- includeAll: boolean;
-}
-
-export const componentConfig: IComponentConfig = {
- includes: new Set([
- 'view',
- 'catch-view',
- 'static-view',
- 'pure-view',
- 'scroll-view',
- 'image',
- 'static-image',
- 'text',
- 'static-text',
- ]),
- exclude: new Set(),
- thirdPartyComponents: new Map(),
- // TODO: include all components temporarily
- includeAll: true,
-};
-
-// 用户 cache 功能开启时,记录 parser 过程中的组件信息
-export const elementNameSet = new Set();
-export const componentNameSet = new Set();
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/utils/index.ts b/packages/plugin-miniapp/src/miniapp/webpack/utils/index.ts
deleted file mode 100644
index 3e2ad298f9..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/utils/index.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { networkInterfaces } from 'node:os';
-import path from 'node:path';
-
-export const emptyTogglableObj = {
- enable: false,
- config: {},
-};
-
-export const getRootPath = function () {
- return path.resolve(__dirname, '../../');
-};
-
-export const addLeadingSlash = (url = '') => (url.charAt(0) === '/' ? url : `/${url}`);
-export const addTrailingSlash = (url = '') => (url.charAt(url.length - 1) === '/' ? url : `${url}/`);
-export const hasBasename = (path = '', prefix = '') =>
- new RegExp(`^${prefix}(\\/|\\?|#|$)`, 'i').test(path) || path === prefix;
-export const stripBasename = (path = '', prefix = '') =>
- (hasBasename(path, prefix) ? path.substr(prefix.length) : path);
-export const stripTrailingSlash = (path = '') =>
- (path.charAt(path.length - 1) === '/' ? path.substring(0, path.length - 1) : path);
-export const addHtmlSuffix = (path = '') => `${path}.html`;
-
-export const formatOpenHost = (host?: string) => {
- let result = host;
- // 配置host为0.0.0.0时,可以转换为ip打开, 其他以配置host默认打开
- if (!result || result === '0.0.0.0' || result.startsWith('local-ip')) {
- // 设置localhost为初值, 防止没正确获取到host时以0.0.0.0打开
- result = 'localhost';
- const interfaces = networkInterfaces();
- for (const devName in interfaces) {
- const isEnd = interfaces[devName]?.some((item) => {
- // 取IPv4, 不为127.0.0.1的内网ip
- if (['IPv4', 4, '4'].includes(item.family) && item.address !== '127.0.0.1' && !item.internal) {
- result = item.address;
- return true;
- }
- return false;
- });
- // 若获取到ip, 结束遍历
- if (isEnd) {
- break;
- }
- }
- }
- return result;
-};
-
-export function parsePublicPath(publicPath = '/') {
- return ['', 'auto'].includes(publicPath) ? publicPath : addTrailingSlash(publicPath);
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/utils/types.ts b/packages/plugin-miniapp/src/miniapp/webpack/utils/types.ts
deleted file mode 100644
index 9a833123b1..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/utils/types.ts
+++ /dev/null
@@ -1,341 +0,0 @@
-import type { MiniappAppConfig, MiniappConfig } from '@ice/miniapp-runtime/esm/types.js';
-import type { RecursiveTemplate, UnRecursiveTemplate } from '@ice/shared';
-import type { Compilation, Compiler } from '@ice/bundles/compiled/webpack';
-import type { IComponentConfig } from './component.js';
-
-export interface IOption {
- [key: string]: any;
-}
-
-export interface IComponent {
- name: string;
- path: string;
- isNative: boolean;
- stylePath?: string[];
- templatePath?: string;
- skeletonPath?: IComponentExtraPath;
-}
-
-export interface IComponentExtraPath {
- template?: string;
- style?: string[];
-}
-
-export interface IComponentObj {
- name?: string;
- path: string | null;
- type?: string;
-}
-
-export interface IChain {
- [key: string]: any;
-}
-
-export interface IFileType {
- style: string;
- script: string;
- templ: string;
- config: string;
- xs?: string;
- skeletonMidExt?: string;
-}
-
-interface IMiniAppConfig {
- isWatch?: boolean;
- port?: number;
- /** 项目名称 */
- projectName?: string;
-
- /** 项目创建日期 */
- date?: string;
-
- /** 设计稿尺寸 */
- // designWidth?: number | ((size?: string | number | Input) => number)
-
- /** 设计稿尺寸换算规则 */
- // deviceRatio?: TaroGeneral.TDeviceRatio
-
- watcher?: any[];
-
- /** 源码存放目录 (默认值:'src') */
- sourceRoot?: string;
-
- /** 代码编译后的生产目录 (默认值:'dist') */
- outputRoot?: string;
-
- /**
- * 用于配置`process.env.xxxx`相关的环境变量
- * @deprecated 建议使用根目录下的 .env 文件替代
- * @description 注意:这里的环境变量只能在业务代码中使用,编译时的 node 环境中无法使用
- * @example
- * ```ts
- * // config/index.ts
- * export default defineConfig({
- * env: {
- * xxxx: '"测试"'
- * }
- * })
- *
- * // src/app.ts
- * onShow() {
- * console.log(process.env.xxxx) // 打印 "测试"
- * }
- * ```
- */
- env?: IOption;
-
- /** 用于配置目录别名,从而方便书写代码引用路径 */
- alias?: IOption;
-
- /**
- * 用于配置一些常量供代码中进行全局替换使用
- * @description 注意:这里的环境变量只能在业务代码中使用,编译时的 node 环境中无法使用
- * @example
- * ```ts
- * // config/index.ts
- * export default defineConfig({
- * defineConstants: {
- * __TEST__: JSON.stringify('test')
- * }
- * })
- *
- * // src/app.ts
- * onShow() {
- * console.log(__TEST__) // 打印 "test"
- * }
- * ```
- */
- defineConstants?: IOption;
-
- /** 用于把文件从源码目录直接拷贝到编译后的生产目录 */
- // copy?: ICopyOptions
-
- /** 配置 JS 压缩工具 (默认 terser) */
- jsMinimizer?: 'terser' | 'esbuild';
-
- /** 配置 CSS 压缩工具 (默认 csso) */
- cssMinimizer?: 'csso' | 'esbuild' | 'lightningcss';
-
- /** 配置 csso 工具以压缩 CSS 代码 */
- // csso?: TogglableOptions
-
- /** 配置 terser 工具以压缩 JS 代码 */
- // terser?: TogglableOptions
-
- // esbuild?: Record<'minify', TogglableOptions>
-
- // uglify?: TogglableOptions
-
- /** 用于控制对 scss 代码的编译行为,默认使用 dart-sass,具体配置可以参考 https://www.npmjs.com/package/sass */
- // sass?: ISassOptions
-
- /** 配置 Taro 插件 */
- // plugins?: PluginItem[]
-
- /** 一个 preset 是一系列 Taro 插件的集合,配置语法同 plugins */
- // presets?: PluginItem[]
-
- /** 模板循环次数 */
- baseLevel?: number;
-
- /** 使用的开发框架。可选值:react、preact、vue3 */
- framework?: 'react' | 'preact' | 'solid' | 'vue3';
- frameworkExts?: string[];
-
- /** 使用的编译工具。可选值:webpack5 */
- // compiler?: Compiler
-
- /** Webpack5 持久化缓存配置。具体配置请参考 [WebpackConfig.cache](https://webpack.js.org/configuration/cache/#cache) */
- // cache?: ICache
-
- /** 控制 Taro 编译日志的输出方式 */
- // logger?: ILogger
- logger?: any;
-
- /** 用于控制是否生成 js、css 对应的 sourceMap */
- enableSourceMap?: boolean;
-
- /**
- * 编译开始
- */
- onBuildStart?: (...args: any[]) => Promise;
-
- /**
- * 编译完成(启动项目后首次编译结束后会触发一次)
- */
- onBuildComplete?: (...args: any[]) => Promise;
-
- /**
- * 编译结束(保存代码每次编译结束后都会触发)
- */
- onBuildFinish?: (res: { error; stats; isWatch }) => Promise;
-
- /**
- * 修改编译过程中的页面组件配置
- */
- onCompilerMake?: (compilation: Compilation, compiler: Compiler, plugin: any) => Promise;
-
- // onWebpackChainReady?: (webpackChain: Chain) => Promise
-
- modifyAppConfig?: (appConfig: MiniappAppConfig) => Promise;
-
- /**
- * 编译中修改 webpack 配置,在这个钩子中,你可以对 webpackChain 作出想要的调整,等同于配置 [`webpackChain`](./config-detail#miniwebpackchain)
- */
- // modifyWebpackChain?: (chain: Chain, webpack: typeof Webpack, data: IModifyChainData) => Promise
-
- /**
- * 编译中修改 vite 配置
- */
- // modifyViteConfig?: (viteConfig: any, data: IModifyChainData) => void
-
- /**
- * 修改编译后的结果
- */
- modifyBuildAssets?: (assets: any, miniPlugin?: any) => Promise;
-
- /**
- * 修改编译过程中的页面组件配置
- */
- modifyMiniConfigs?: (configMap: IMiniFilesConfig) => Promise;
-
- /**
- * 修改 Taro 编译配置
- */
- modifyRunnerOpts?: (opts: any) => Promise;
-}
-
-interface IProjectBaseConfig {
- /** 用于控制是否生成 js、css 对应的 sourceMap (默认值:watch 模式下为 true,否则为 false) */
- enableSourceMap?: boolean;
-
- /** 默认值:'cheap-module-source-map', 具体参考[Webpack devtool 配置](https://webpack.js.org/configuration/devtool/#devtool) */
- sourceMapType?: string;
-
- /** 指定 React 框架相关的代码是否使用开发环境(未压缩)代码,默认使用生产环境(压缩后)代码 */
- debugReact?: boolean;
-
- /** 是否跳过第三方依赖 usingComponent 的处理,默认为自动处理第三方依赖的自定义组件 */
- skipProcessUsingComponents?: boolean;
-
- /** 压缩小程序 xml 文件的相关配置 */
- minifyXML?: {
- /** 是否合并 xml 文件中的空格 (默认false) */
- collapseWhitespace?: boolean;
- };
-
- /**
- * 自定义 Webpack 配置
- * @param chain [webpackChain](https://github.com/neutrinojs/webpack-chain) 对象
- * @param webpack webpack 实例
- * @param PARSE_AST_TYPE 小程序编译时的文件类型集合
- * @returns
- */
- // webpackChain?: (chain: Chain, webpack: typeof Webpack, PARSE_AST_TYPE: any) => void
-
- /** webpack 编译模式下,可用于修改、拓展 Webpack 的 output 选项,配置项参考[官方文档](https://webpack.js.org/configuration/output/)
- * vite 编译模式下,用于修改、扩展 rollup 的 output,目前仅适配 chunkFileNames 和 assetFileNames 两个配置,修改其他配置请使用 vite 插件进行修改。配置想参考[官方文档](https://rollupjs.org/configuration-options/)
- */
- // output?: T extends 'vite'
- // ? Pick & OutputExt
- // : Webpack.Configuration['output'] & OutputExt
-
- /** 配置 postcss 相关插件 */
- // postcss?: IPostcssOption<'mini'>
-
- /** [css-loader](https://github.com/webpack-contrib/css-loader) 的附加配置 */
- cssLoaderOption?: IOption;
-
- /** [sass-loader](https://github.com/webpack-contrib/sass-loader) 的附加配置 */
- sassLoaderOption?: IOption;
-
- /** [less-loader](https://github.com/webpack-contrib/less-loader) 的附加配置 */
- lessLoaderOption?: IOption;
-
- /** [stylus-loader](https://github.com/shama/stylus-loader) 的附加配置 */
- stylusLoaderOption?: IOption;
-
- /** 针对 mp4 | webm | ogg | mp3 | wav | flac | aac 文件的 [url-loader](https://github.com/webpack-contrib/url-loader) 配置 */
- // mediaUrlLoaderOption?: IUrlLoaderOption
-
- /** 针对 woff | woff2 | eot | ttf | otf 文件的 [url-loader](https://github.com/webpack-contrib/url-loader) 配置 */
- // fontUrlLoaderOption?: IUrlLoaderOption
-
- /** 针对 png | jpg | jpeg | gif | bpm | svg 文件的 [url-loader](https://github.com/webpack-contrib/url-loader) 配置 */
- // imageUrlLoaderOption?: IUrlLoaderOption
-
- /** [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) 的附加配置 */
- miniCssExtractPluginOption?: IOption;
-
- /** 用于告诉 Taro 编译器需要抽取的公共文件 */
- commonChunks?: string[] | ((commonChunks: string[]) => string[]);
-
- /** 为某些页面单独指定需要引用的公共文件 */
- addChunkPages?: (pages: Map, pagesNames?: string[]) => void;
-
- /** 优化主包的体积大小 */
- optimizeMainPackage?: {
- enable?: boolean;
- exclude?: any[];
- };
-
- /** 小程序编译过程的相关配置 */
- compile?: {
- exclude?: (string | RegExp)[];
- include?: (string | RegExp)[];
- filter?: (filename: string) => boolean;
- };
-
- /** 插件内部使用 */
- // runtime?: Runtime
-
- /** 使用的编译工具。可选值:webpack5、vite */
- // compiler?: Compiler
-
- /** 体验式功能 */
- experimental?: {
- /** 是否开启编译模式 */
- compileMode?: boolean | string;
- };
-}
-
-export interface CommonBuildConfig extends IProjectBaseConfig {
- // entry?: webpack.EntryObject;
- mode: 'production' | 'development' | 'none';
- buildAdapter: string; // weapp | swan | alipay | tt | qq | jd | h5
- platformType: string; // mini | web
- /** special mode */
- isBuildNativeComp?: boolean;
- newBlended?: boolean;
- withoutBuild?: boolean;
- noInjectGlobalStyle?: boolean;
- /** hooks */
- onParseCreateElement: (nodeName, componentConfig) => Promise;
- modifyComponentConfig: (componentConfig: IComponentConfig, config: Partial) => Promise;
-}
-
-export interface IMiniBuildConfig extends CommonBuildConfig, IMiniAppConfig {
- isBuildPlugin: boolean;
- isSupportRecursive: boolean;
- isSupportXS: boolean;
- nodeModulesPath: string;
- fileType: IFileType;
- globalObject: string;
- platform: string;
- // prerender?: PrerenderConfig
- prerender?: never;
- template: RecursiveTemplate | UnRecursiveTemplate;
- runtimePath?: string | string[];
- taroComponentsPath: string;
- blended?: boolean;
- hot?: boolean;
-}
-
-export type AddPageChunks = (pages: Map, pagesNames?: string[]) => void;
-
-export interface IMiniFilesConfig {
- [configName: string]: {
- content: MiniappConfig;
- path: string;
- };
-}
diff --git a/packages/plugin-miniapp/src/miniapp/webpack/utils/webpack.ts b/packages/plugin-miniapp/src/miniapp/webpack/utils/webpack.ts
deleted file mode 100644
index 4ee061c6a9..0000000000
--- a/packages/plugin-miniapp/src/miniapp/webpack/utils/webpack.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import path from 'path';
-import webpack from '@ice/bundles/compiled/webpack/index.js';
-import { promoteRelativePath } from '../../../helper/index.js';
-
-const { ConcatSource } = webpack.sources;
-
-export function getChunkEntryModule(compilation: webpack.Compilation, chunk: webpack.Chunk) {
- const { chunkGraph } = compilation;
- const entryModules = Array.from(chunkGraph.getChunkEntryModulesIterable(chunk));
- if (entryModules.length) {
- return entryModules[0];
- }
-}
-
-/**
- * 在文本头部加入一些 require 语句
- */
-export function addRequireToSource(
- id: string,
- modules: any,
- commonChunks: (webpack.Chunk | { name: string })[],
-): webpack.sources.ConcatSource {
- const source = new ConcatSource();
- commonChunks.forEach((chunkItem) => {
- source.add(`require(${JSON.stringify(promoteRelativePath(path.relative(id, chunkItem.name)))});\n`);
- });
- source.add('\n');
- source.add(modules);
- source.add(';');
- return source;
-}
-
-export function getChunkIdOrName(chunk: webpack.Chunk) {
- if (typeof chunk.id === 'string') {
- return chunk.id;
- }
- return chunk.name;
-}
diff --git a/packages/plugin-miniapp/src/runtime/index.ts b/packages/plugin-miniapp/src/runtime/index.ts
deleted file mode 100644
index 90ec50aab2..0000000000
--- a/packages/plugin-miniapp/src/runtime/index.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import type { RuntimePlugin } from '@ice/runtime/types';
-import type { MiniappLifecycles } from '@ice/miniapp-runtime/esm/types';
-
-export function defineMiniappConfig(
- miniappConfigOrDefineMiniappConfig: MiniappLifecycles | (() => MiniappLifecycles),
-): MiniappLifecycles {
- let miniappLifecycles: MiniappLifecycles = {};
- if (typeof miniappConfigOrDefineMiniappConfig === 'function') {
- miniappLifecycles = miniappConfigOrDefineMiniappConfig();
- } else {
- miniappLifecycles = miniappConfigOrDefineMiniappConfig;
- }
-
- return miniappLifecycles;
-}
-
-const runtime: RuntimePlugin = ({}) => {};
-export default runtime;
diff --git a/packages/plugin-miniapp/src/targets/ali/components.ts b/packages/plugin-miniapp/src/targets/ali/components.ts
deleted file mode 100644
index 14d927688f..0000000000
--- a/packages/plugin-miniapp/src/targets/ali/components.ts
+++ /dev/null
@@ -1,205 +0,0 @@
-import { singleQuote } from '@ice/shared';
-
-export const components = {
- // ======== 调整属性 ========
- View: {
- 'disable-scroll': 'false',
- hidden: 'false',
- bindAppear: '',
- bindDisappear: '',
- bindFirstAppear: '',
- },
- Text: {
- 'number-of-lines': '',
- },
- Map: {
- skew: '0',
- rotate: '0',
- polygons: '[]',
- 'include-padding': '',
- 'ground-overlays': '[]',
- 'tile-overlay': '',
- 'custom-map-style': '',
- panels: '[]',
- setting: '{}',
- optimize: 'false',
- 'show-compass': 'false',
- 'show-scale': 'false',
- 'enable-overlooking': 'false',
- 'enable-zoom': 'true',
- 'enable-scroll': 'true',
- 'enable-rotate': 'false',
- 'enable-traffic': 'false',
- 'enable-poi': 'true',
- 'enable-building': 'true',
- 'enable-satellite': 'false',
- bindRegionChange: '',
- bindPanelTap: '',
- bindInitComplete: '',
- },
- Button: {
- scope: '',
- 'public-id': '',
- bindGetAuthorize: '',
- bindError: '',
- bindGetUserInfo: '',
- bindGetPhoneNumber: '',
- bindFollowLifestyle: '',
- },
- Checkbox: {
- bindChange: '',
- },
- Input: {
- 'always-system': 'false',
- 'random-number': 'false',
- controlled: 'false',
- enableNative: 'true',
- name: '',
- },
- Slider: {
- 'track-size': '4',
- 'handle-size': '22',
- 'handle-color': singleQuote('#ffffff'),
- },
- Switch: {
- controlled: 'false',
- },
- Textarea: {
- 'show-count': 'true',
- controlled: 'false',
- enableNative: 'false',
- },
- MovableView: {
- bindChangeEnd: '',
- },
- ScrollView: {
- 'scroll-animation-duration': '',
- 'trap-scroll': 'false',
- },
- Swiper: {
- 'active-class': '',
- 'changing-class': '',
- acceleration: 'false',
- 'disable-programmatic-animation': 'false',
- 'disable-touch': 'false',
- bindAnimationEnd: '',
- },
- Image: {
- 'default-source': '',
- },
- Camera: {
- mode: singleQuote('normal'),
- 'output-dimension': singleQuote('720P'),
- 'frame-size': singleQuote('medium'),
- bindScanCode: '',
- bindReady: '',
- },
- Canvas: {
- type: '',
- width: singleQuote('300px'),
- height: singleQuote('225px'),
- bindReady: '',
- },
- Video: {
- 'poster-size': singleQuote('contain'),
- 'show-thin-progress-bar': 'false',
- 'mobilenet-hint-type': '1',
- 'floating-mode': singleQuote('none'),
- enableNative: 'true',
- bindLoading: '',
- bindUserAction: '',
- bindStop: '',
- bindRenderStart: '',
- },
- // ======== 额外组件 ========
- Lottie: {
- autoplay: 'false',
- path: '',
- speed: '1.0',
- 'repeat-count': '0',
- 'auto-reverse': 'false',
- 'assets-path': '',
- placeholder: '',
- djangoId: '',
- md5: '',
- optimize: 'false',
- bindDataReady: '',
- bindDataFailed: '',
- bindAnimationStart: '',
- bindAnimationEnd: '',
- bindAnimationRepeat: '',
- bindAnimationCancel: '',
- bindDataLoadReady: '',
- },
- Lifestyle: {
- 'public-id': '',
- memo: '',
- bindFollow: '',
- },
- LifeFollow: {
- sceneId: '',
- checkFollow: '',
- bindCheckFollow: '',
- bindClose: '',
- },
- ContactButton: {
- 'tnt-inst-id': '',
- scene: '',
- size: '25',
- color: singleQuote('#00A3FF'),
- icon: '',
- 'alipay-card-no': '',
- 'ext-info': '',
- },
- ArCamera: {
- devicePosition: singleQuote('back'),
- marker: '',
- mode: singleQuote('imageTracking'),
- useCapturedImage: 'false',
- bindInit: '',
- bindStop: '',
- bindError: '',
- bindARFrame: '',
- },
- PageContainer: {
- show: 'false',
- duration: '300',
- 'z-index': '100',
- overlay: 'true',
- position: singleQuote('bottom'),
- round: 'false',
- 'close-on-slide-down': 'false',
- 'overlay-style': '',
- 'custom-style': '',
- bindBeforeEnter: '',
- bindEnter: '',
- bindEnterCancelled: '',
- bindAfterEnter: '',
- bindBeforeLeave: '',
- bindLeave: '',
- bindLeaveCancelled: '',
- bindAfterLeave: '',
- bindClickOverlay: '',
- },
- ShareElement: {
- name: '',
- transform: 'false',
- duration: '300',
- 'easing-function': singleQuote('ease-out'),
- },
- RootPortal: {
- enable: 'true',
- },
- PageMeta: {
- 'background-color': '',
- 'background-color-top': '',
- 'background-color-bottom': '',
- 'root-background-color': '',
- 'scroll-top': "''",
- 'scroll-duration': '300',
- 'page-style': "''",
- 'root-font-size': "''",
- 'page-font-size': "''",
- bindScroll: '',
- },
-};
diff --git a/packages/plugin-miniapp/src/targets/ali/index.ts b/packages/plugin-miniapp/src/targets/ali/index.ts
deleted file mode 100644
index e3c4ec1226..0000000000
--- a/packages/plugin-miniapp/src/targets/ali/index.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import Template from './template.js';
-import { components } from './components.js';
-
-export default {
- globalObject: 'my',
- projectConfigJson: 'mini.project.json',
- fileType: {
- templ: '.axml',
- style: '.acss',
- config: '.json',
- script: '.js',
- xs: '.sjs',
- skeletonMidExt: '.loading',
- },
- template: new Template(),
- modifyBuildAssets,
- components,
-};
-
-function getIsBuildPluginPath(filePath, isBuildPlugin) {
- return isBuildPlugin ? `plugin/${filePath}` : filePath;
-}
-
-async function modifyBuildAssets(assets: any, miniPlugin: any) {
- const pages: string[] = [];
-
- // 筛选出使用了自定义组件的页面
- miniPlugin.pages.forEach(page => {
- const config = miniPlugin.filesConfig[miniPlugin.getConfigFilePath(page.name)].content;
- if (!page.isNative && config?.hasOwnProperty('usingComponents') && Object.keys(config.usingComponents).length) {
- pages.push(page.name);
- }
- });
-
- if (!pages.length) return;
-
- const baseXml = assets[getIsBuildPluginPath('base.axml', miniPlugin.options.isBuildPlugin)].source();
-
- pages.forEach(page => {
- const templateName = `${page}.axml`;
- const assetsItem = assets[templateName];
- const src = assetsItem._value ? assetsItem._value.toString() : assetsItem.source();
- let relativePath;
- const templateCaller = src.replace(/ /, (_, $1) => {
- relativePath = $1;
- return '';
- });
- const main = baseXml.replace(/ /, () => {
- return src.includes(' `;
- });
-
- const res = `${templateCaller}
-${main}`;
- assets[templateName] = {
- size: () => res.length,
- source: () => res,
- };
- });
- if (miniPlugin.options.isBuildPlugin) {
- const miniProjectJSONStr = JSON.stringify({
- miniprogramRoot: 'miniprogram',
- pluginRoot: 'plugin',
- compileType: 'plugin',
- }, null, 2);
- assets['mini.project.json'] = {
- size: () => miniProjectJSONStr.length,
- source: () => miniProjectJSONStr,
- };
- const pluginJSON = JSON.parse(assets['/plugin/plugin.json'].source());
- pluginJSON.publicPages = pluginJSON.pages;
- pluginJSON.pages = Object.values(pluginJSON.publicPages);
- const pluginJSONStr = JSON.stringify(pluginJSON, null, 2);
- assets['/plugin/plugin.json'] = {
- size: () => pluginJSONStr.length,
- source: () => pluginJSONStr,
- };
- }
-}
diff --git a/packages/plugin-miniapp/src/targets/ali/runtime.ts b/packages/plugin-miniapp/src/targets/ali/runtime.ts
deleted file mode 100644
index bba94b9d88..0000000000
--- a/packages/plugin-miniapp/src/targets/ali/runtime.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { hooks, mergeInternalComponents } from '@ice/shared';
-import { createEventHandlerForThirdComponent, bindEventHandlersForThirdComponentNode } from '@ice/miniapp-runtime';
-import { components } from './components.js';
-
-mergeInternalComponents(components);
-
-hooks.tap('onAddEvent', (type, handler, options, node) => {
- const instance = node._root.ctx;
- if (!instance) {
- return;
- }
- instance[`eh_${node.sid}_${type}`] = createEventHandlerForThirdComponent(node.sid, type);
-});
-
-hooks.tap('hydrateNativeComponentNode', node => {
- bindEventHandlersForThirdComponentNode(node);
-});
diff --git a/packages/plugin-miniapp/src/targets/ali/template.ts b/packages/plugin-miniapp/src/targets/ali/template.ts
deleted file mode 100644
index a56a4c0a01..0000000000
--- a/packages/plugin-miniapp/src/targets/ali/template.ts
+++ /dev/null
@@ -1,163 +0,0 @@
-import { capitalize, RecursiveTemplate, Shortcuts, toCamelCase } from '@ice/shared';
-import { components } from './components.js';
-
-
-export default class Template extends RecursiveTemplate {
- exportExpr = 'export default';
- supportXS = true;
- isXMLSupportRecursiveReference = false;
- adapter = {
- if: 'a:if',
- else: 'a:else',
- elseif: 'a:elif',
- for: 'a:for',
- forItem: 'a:for-item',
- forIndex: 'a:for-index',
- key: 'a:key',
- xs: 'sjs',
- type: 'alipay',
- };
-
- transferComponents: Record> = {};
-
- constructor() {
- super();
- this.nestElements.set('root-portal', 3);
- }
-
- buildXsTemplate(filePath = './utils') {
- return ` `;
- }
-
- replacePropName(name, value, compName, componentAlias) {
- if (value === 'eh') return name.replace('bind', 'on');
-
- if (compName === 'map') {
- const polygonsAlias = componentAlias.polygons;
- if (value.includes(polygonsAlias)) {
- name = 'polygon';
- }
- }
-
- return name;
- }
-
- getEvents() {
- return {
- onTap: 'eh',
- onTouchMove: 'eh',
- onTouchEnd: 'eh',
- onTouchCancel: 'eh',
- onLongTap: 'eh',
- };
- }
-
- buildThirdPartyAttr(attrs: Set) {
- return [...attrs].reduce((str, attr) => {
- if (attr.startsWith('@')) {
- // TODO: vue 模式暂时不支持
- return `${str}on${capitalize(attr.slice(1))}="eh" `;
- } else if (attr.startsWith('bind') || attr.startsWith('on')) {
- return `${str}${attr}="eh_{{ i.sid }}_${attr.replace(/^(bind|on)/, '').toLowerCase()}" `;
- }
-
- return `${str} ${attr}="{{ i.${toCamelCase(attr)} }}" `;
- }, '');
- }
-
- createMiniComponents(components): any {
- const result = super.createMiniComponents(components);
-
- // 兼容支付宝 2.0 构建
- delete result.slot;
- delete result['slot-view'];
- delete result['native-slot'];
-
- // PageMeta & NavigationBar
- this.transferComponents['page-meta'] = result['page-meta'];
- delete result['page-meta'];
-
- return result;
- }
-
- modifyLoopBody = (child: string, nodeName: string) => {
- if (nodeName === 'picker-view') {
- return `
-
- ${child}
-
- `;
- }
- return child;
- };
-
- modifyLoopContainer = (children: string, nodeName: string) => {
- if (nodeName === 'picker') {
- return `
- ${children}
- `;
- }
- if (nodeName === 'swiper') {
- return `
-
-
-
-
-
-
-
- `;
- }
- return children;
- };
-
- modifyTemplateResult = (res: string, nodeName: string) => {
- if (nodeName === 'picker-view-column' || nodeName === 'swiper-item') return '';
- return res;
- };
-
- modifyThirdPartyLoopBody = () => {
- // 兼容支付宝 2.0 构建
- const { slot } = this.componentsAlias;
- const slotAlias = slot._num;
- const slotNamePropAlias = slot.name;
-
- return `
-
-
-
-
- `;
- };
-
- buildXSTmpExtra() {
- const swiperItemAlias = this.componentsAlias['swiper-item']._num;
- return `f: function (l) {
- return l.filter(function (i) {return i.nn === '${swiperItemAlias}'})
- }`;
- }
-
- buildPageTemplate = (baseTempPath: string, page?) => {
- let pageMetaTemplate = '';
- const pageConfig = page?.content;
-
- if (pageConfig?.enablePageMeta) {
- const getComponentAttrs = (componentName: string, dataPath: string) => {
- return Object.entries(this.transferComponents[componentName]).reduce((sum, [key, value]) => {
- sum += `${key}="${value === 'eh' ? value : `{{${value.replace('i.', dataPath)}}}`}" `;
- return sum;
- }, '');
- };
- const pageMetaAttrs = getComponentAttrs('page-meta', 'pageMeta.');
-
- pageMetaTemplate = `
-
- `;
- }
-
- const template = ` ${pageMetaTemplate}
- `;
-
- return template;
- };
-}
diff --git a/packages/plugin-miniapp/src/targets/baidu/components.ts b/packages/plugin-miniapp/src/targets/baidu/components.ts
deleted file mode 100644
index b4b52cb945..0000000000
--- a/packages/plugin-miniapp/src/targets/baidu/components.ts
+++ /dev/null
@@ -1,221 +0,0 @@
-import { singleQuote } from '@ice/shared';
-
-export const components = {
- // ======== 调整属性 ========
- Progress: {
- 'border-radius': '0',
- 'font-size': '16',
- duration: '30',
- },
- RichText: {
- selectable: 'false',
- name: '',
- attrs: '',
- children: '[]',
- text: '',
- 'image-menu-prevent': 'false',
- preview: '',
- },
- Map: {
- polygons: '[]',
- 'enable-3D': 'false',
- 'show-compass': 'false',
- 'enable-overlooking': 'false',
- 'enable-zoom': 'true',
- 'enable-scroll': 'true',
- 'enable-rotate': 'false',
- bindRegionChange: '',
- bindPoiTap: '',
- },
- Button: {
- 'template-id': '',
- 'subscribe-id': '',
- bindSubscribe: '',
- bindGetPhoneNumber: '',
- bindGetUserInfo: '',
- bindOpenSetting: '',
- bindContact: '',
- bindChooseAddress: '',
- bindChooseInvoiceTitle: '',
- bindLogin: '',
- },
- Form: {
- 'report-type': 'default',
- 'template-id': '',
- 'subscribe-id': '',
- 'skip-subscribe-authorize': 'false',
- },
- Input: {
- 'adjust-position': 'true',
- },
- Textarea: {
- 'confirm-type': singleQuote('default'),
- 'confirm-hold': 'false',
- 'show-confirm-bar': 'true',
- 'adjust-position': 'true',
- },
- Navigator: {
- target: singleQuote('self'),
- 'app-id': '',
- path: '',
- 'extra-data': '',
- version: singleQuote('version'),
- },
- Image: {
- webp: 'false',
- 'image-menu-prevent': 'false',
- preview: '',
- 'original-src': '',
- },
- Video: {
- title: '',
- 'show-no-wifi-tip': 'true',
- 'vslide-gesture': 'false',
- 'vslide-gesture-in-fullscreen': 'true',
- 'enable-play-gesture': 'false',
- 'show-rate-btn': 'false',
- 'show-vslide-btn-in-fullscreen': 'true',
- 'silent-play': 'false',
- bindLoadedMetadata: '',
- },
- Ad: {
- appid: '',
- apid: '',
- type: singleQuote('feed'),
- updatetime: '',
- bindStatus: '',
- },
- // ======== 额外组件 ========
- Tabs: {
- 'tabs-background-color': singleQuote('#fff'),
- 'tabs-active-text-color': singleQuote('#000'),
- 'tabs-inactive-text-color': singleQuote('#666'),
- 'tabs-underline-color': singleQuote('#333'),
- 'active-name': '',
- 'url-query-name': '',
- 'max-tab-item-amount': '5',
- bindTabChange: '',
- },
- TabItem: {
- label: '',
- name: '',
- 'badge-type': '',
- 'badge-text': '',
- },
- AnimationVideo: {
- 'resource-width': '800',
- 'resource-height': '400',
- 'canvas-style': singleQuote('width:400px;height:400px'),
- path: '',
- loop: 'false',
- autoplay: 'false',
- 'alpha-direction': singleQuote('left'),
- bindStarted: '',
- bindEnded: '',
- },
- AnimationView: {
- path: '',
- loop: 'false',
- autoplay: 'true',
- action: singleQuote('play'),
- hidden: 'true',
- bindEnded: '',
- },
- ArCamera: {
- key: '',
- type: '',
- flash: singleQuote('off'),
- bindError: '',
- bindLoad: '',
- bindMessage: '',
- bindScanCode: '',
- },
- RtcRoom: {
- id: '',
- 'enable-camera': 'true',
- 'enable-auto-focus': 'true',
- 'enable-zoom': 'false',
- 'device-position': singleQuote('front'),
- 'enable-mic': 'true',
- 'enable-agc': 'false',
- 'enable-ans': 'false',
- bitrate: '900',
- 'video-width': '360',
- 'video-height': '640',
- 'enable-remote-mirror': 'false',
- 'local-mirror': singleQuote('auto'),
- 'sound-mode': singleQuote('speaker'),
- bindStateChange: '',
- bindError: '',
- },
- RtcRoomItem: {
- id: '',
- type: '',
- 'user-id': '',
- },
- OpenData: {
- type: '',
- },
- Login: {
- 'button-class': '',
- 'checked-color': singleQuote('#3388FF'),
- 'theme-color': singleQuote('#3388FF'),
- bindGetPhoneNumber: '',
- bindLoadError: '',
- },
- Like: {
- 'is-liked': 'false',
- mode: singleQuote('icon'),
- 'icon-type': singleQuote('hand'),
- 'like-text': singleQuote('赞'),
- 'like-num': '0',
- 'like-type': '0',
- 'animation-type': '1',
- 'is-show-toast': 'false',
- 'toast-text': "['已点赞', '已取消']",
- 'like-param': '',
- bindError: '',
- bindSuccess: '',
- bindFail: '',
- },
- CommentList: {
- 'comment-param': '',
- 'toolbar-config': '',
- 'is-page-scroll': 'true',
- 'need-toolbar': 'true',
- 'add-comment': 'false',
- 'detail-path': '',
- 'is-folded': 'false',
- 'fold-num': '3',
- 'view-more-path': '',
- 'view-more-style': '',
- bindClickComment: '',
- bindViewMore: '',
- },
- CommentDetail: {
- 'comment-param': '',
- srid: '',
- 'is-page-scroll': 'true',
- 'need-toolbar': 'true',
- 'need-like-btn': 'true',
- 'back-list-after-delete': 'true',
- 'add-comment': 'false',
- bindDelete: '',
- },
- FollowSwan: {
- size: singleQuote('default'),
- type: singleQuote('primary'),
- bindFavorStatusChange: '',
- },
- InlinePaymentPanel: {
- 'total-amount': '',
- 'deal-id': '',
- 'app-key': '',
- 'promotion-tag': '',
- 'enable-page-back-modal': '',
- 'custom-style': '',
- 'style-type': singleQuote('default'),
- bindGetPaymentInfo: '',
- bindError: '',
- },
-};
diff --git a/packages/plugin-miniapp/src/targets/baidu/index.ts b/packages/plugin-miniapp/src/targets/baidu/index.ts
deleted file mode 100644
index c8064b7a06..0000000000
--- a/packages/plugin-miniapp/src/targets/baidu/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import Template from './template.js';
-import { components } from './components.js';
-
-export default {
- globalObject: 'swan',
- fileType: {
- templ: '.swan',
- style: '.css',
- config: '.json',
- script: '.js',
- xs: '.sjs',
- },
- template: new Template(),
- components,
-};
diff --git a/packages/plugin-miniapp/src/targets/baidu/runtime.ts b/packages/plugin-miniapp/src/targets/baidu/runtime.ts
deleted file mode 100644
index 08b5589c3f..0000000000
--- a/packages/plugin-miniapp/src/targets/baidu/runtime.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeInternalComponents } from '@ice/shared';
-import { components } from './components.js';
-
-mergeInternalComponents(components);
diff --git a/packages/plugin-miniapp/src/targets/baidu/template.ts b/packages/plugin-miniapp/src/targets/baidu/template.ts
deleted file mode 100644
index b81f73d86f..0000000000
--- a/packages/plugin-miniapp/src/targets/baidu/template.ts
+++ /dev/null
@@ -1,263 +0,0 @@
-import { indent, isArray, Shortcuts, RecursiveTemplate } from '@ice/shared';
-
-const swanSpecialAttrs = {
- 'scroll-view': ['scroll-top', 'scroll-left', 'scroll-into-view'],
- 'movable-view': ['x', 'y'],
- slider: ['value'],
- input: ['value'],
- textarea: ['value'],
-};
-
-interface TemplateOptions {
- flattenViewLevel?: number;
- flattenCoverLevel?: number;
- flattenTextLevel?: number;
-}
-
-export default class Template extends RecursiveTemplate {
- supportXS = true;
-
- adapter = {
- if: 's-if',
- else: 's-else',
- elseif: 's-elif',
- for: 's-for',
- forItem: 's-for-item',
- forIndex: 's-for-index',
- key: 's-key',
- xs: 'sjs',
- type: 'swan',
- };
-
- flattenViewLevel: number;
- flattenCoverLevel: number;
- flattenTextLevel: number;
-
- legacyMiniComponents: {
- [key: string]: Record;
- };
-
- constructor(options?: TemplateOptions) {
- super();
- this.flattenViewLevel = options?.flattenViewLevel ?? 8;
- this.flattenCoverLevel = options?.flattenCoverLevel ?? 3;
- this.flattenTextLevel = options?.flattenTextLevel ?? 3;
- }
-
- createMiniComponents(components): any {
- const result = super.createMiniComponents(components);
-
- this.legacyMiniComponents = { ...result };
-
- delete result['pure-view'];
- delete result['static-view'];
-
- return result;
- }
-
- buildXsTemplate() {
- return ' ';
- }
-
- dataKeymap(keymap: string) {
- return `{ ${keymap} }`;
- }
-
- getAttrValue(value: string, key: string, nodeName: string) {
- if (isArray(swanSpecialAttrs[nodeName]) && swanSpecialAttrs[nodeName].includes(key)) {
- return `= ${value} =`;
- }
-
- return `{${value}}`;
- }
-
- buildFlattenNodeAttributes(nodeName: string): string {
- const component = this.legacyMiniComponents[nodeName];
-
- return Object.keys(component)
- .map(
- (k) =>
- `${k}="${
- k.startsWith('bind') || k.startsWith('on') || k.startsWith('catch')
- ? component[k]
- : `{{${component[k].replace('i.', 'item.')}}}`
- }"`,
- )
- .join(' ');
- }
-
- buildFlattenView = (level = this.flattenViewLevel): string => {
- if (level === 0) {
- return ' ';
- }
-
- const child = this.buildFlattenView(level - 1);
-
- const { componentsAlias } = this;
- const viewAlias = componentsAlias.view._num;
- const textAlias = componentsAlias.text._num;
- const staticTextAlias = componentsAlias['static-text']._num;
- const buttonAlias = componentsAlias.button._num;
- const inputAlias = componentsAlias.input._num;
- const swiperAlias = componentsAlias.swiper._num;
-
- const template = `
-
- ${indent(child, 4)}
-
-
-
-
- {{item.v}}
-
-
-
-
- {{item.v}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `;
-
- return template;
- };
-
- buildFlattenCover = (level = this.flattenCoverLevel): string => {
- if (level === 0) {
- return ' ';
- }
-
- const child = this.buildFlattenCover(level - 1);
-
- const { componentsAlias } = this;
- const coverViewAlias = componentsAlias['cover-view']._num;
- const coverImageAlias = componentsAlias['cover-image']._num;
- const contentAlias = componentsAlias['#text']._num;
-
- const template = `
-
- ${indent(child, 4)}
-
-
-
-{{item.v}}
-
-
- `;
-
- return template;
- };
-
- buildFlattenText = (level = this.flattenTextLevel): string => {
- if (level === 0) {
- return `{{i.${Shortcuts.Childnodes}[index].${Shortcuts.Text}}} `;
- }
-
- const child = this.buildFlattenText(level - 1);
-
- const { componentsAlias } = this;
- const contentAlias = componentsAlias['#text']._num;
-
- const template = `{{item.v}}
-
-
- ${indent(child, 4)}
-
- `;
- return template;
- };
-
- modifyLoopBody = (child: string, nodeName: string): string => {
- const { componentsAlias } = this;
- const adAlias = componentsAlias.ad._num;
-
- switch (nodeName) {
- case 'view':
- // fix issue #6015
- return this.buildFlattenView();
-
- case 'cover-view':
- case 'canvas':
- case 'map':
- case 'animation-view':
- case 'camera':
- case 'live-player':
- return this.buildFlattenCover();
-
- case 'video': {
- const body = `
-
- ${indent(this.buildFlattenCover(), 2)}
- `;
- return body;
- }
-
- case 'text':
- case 'static-text':
- return this.buildFlattenText();
-
- case 'picker-view':
- return `
-
- ${child}
-
- `;
-
- default:
- return child;
- }
- };
-
- modifyLoopContainer = (children: string, nodeName: string) => {
- if (nodeName === 'swiper') {
- return children.replace(/s-for="{{i\.cn}}"/, 's-for="{{xs.f(i.cn)}}"');
- }
-
- return children;
- };
-
- modifyTemplateResult = (res: string, nodeName: string) => {
- if (nodeName === 'picker-view-column') return '';
- return res;
- };
-
- buildXSTmpExtra() {
- const { componentsAlias } = this;
- const swiperAlias = componentsAlias['swiper-item']._num;
- return `f: function (l) {
- return l.filter(function (i) {return i.nn === '${swiperAlias}'})
- }`;
- }
-}
diff --git a/packages/plugin-miniapp/src/targets/bytedance/components.ts b/packages/plugin-miniapp/src/targets/bytedance/components.ts
deleted file mode 100644
index 18b44d45ce..0000000000
--- a/packages/plugin-miniapp/src/targets/bytedance/components.ts
+++ /dev/null
@@ -1,172 +0,0 @@
-import { singleQuote } from '@ice/shared';
-
-const _true = '!0';
-const _false = '!1';
-const _empty = '';
-
-export const components = {
- // ======== 调整属性 ========
- Icon: {
- size: '24',
- },
- Input: {
- 'adjust-position': _true,
- 'hold-keyboard': _false,
- 'clue-type': '0',
- bindKeyboardHeightChange: _empty,
- },
- Button: {
- bindGetPhoneNumber: _empty,
- 'data-channel': _empty,
- 'data-aweme-id': _empty,
- 'group-id': _empty,
- 'data-is-half-page': _empty,
- bindOpenAwemeUserProfile: _empty,
- bindJoinGroup: _empty,
- },
- Form: {
- 'report-submit-timeout': '0',
- },
- Slider: {
- color: singleQuote('#e9e9e9'),
- 'selected-color': singleQuote('#1aad19'),
- },
- WebView: {
- 'progressbar-color': singleQuote('#51a0d8'),
- },
- Video: {
- 'play-btn-position': singleQuote('center'),
- 'pre-roll-unit-id': _empty,
- 'post-roll-unit-id': _empty,
- 'vslide-gesture': _false,
- 'vslide-gesture-in-fullscreen': _true,
- 'enable-play-gesture': _false,
- 'show-playback-rate-btn': _false,
- 'enable-play-in-background': _false,
- signature: _empty,
- bindProgress: _empty,
- bindSeekComplete: _empty,
- bindAdLoad: _empty,
- bindAdStart: _empty,
- bindAdEnded: _empty,
- bindAdError: _empty,
- bindAdClose: _empty,
- bindLoadedMetadata: _empty,
- bindPlaybackRateChange: _empty,
- bindMuteChange: _empty,
- bindControlTap: _empty,
- bindEnterBackground: _empty,
- bindCloseBackground: _empty,
- bindLeaveBackground: _empty,
- },
- Ad: {
- fixed: _empty,
- type: singleQuote('banner'),
- scale: '100',
- },
- Textarea: {
- 'disable-default-padding': _false,
- 'confirm-type': singleQuote('return'),
- 'confirm-hold': _false,
- 'show-confirm-bar': _true,
- 'adjust-position': _true,
- 'hold-keyboard': _false,
- },
- ScrollView: {
- enhanced: _false,
- bounces: _true,
- 'refresher-enabled': _false,
- 'refresher-threshold': '55',
- 'refresher-default-style': "'black'",
- 'refresher-background': "'#FFF'",
- 'refresher-triggered': _false,
- bindRefresherPulling: _empty,
- bindRefresherRefresh: _empty,
- bindRefresherRestore: _empty,
- bindRefresherAbort: _empty,
- },
- Canvas: {
- type: _empty,
- },
- Map: {
- polygons: '[]',
- rotate: '0',
- skew: '0',
- 'max-scale': '19',
- 'min-scale': '3',
- 'enable-3D': _false,
- 'show-compass': _false,
- 'show-scale': _false,
- 'enable-overlooking': _false,
- 'enable-zoom': _true,
- 'enable-scroll': _true,
- 'enable-rotate': _false,
- 'enable-satellite': _false,
- 'enable-traffic': _false,
- 'enable-poi': _true,
- 'enable-building': _true,
- bindLabelTap: _empty,
- bindRegionChange: _empty,
- bindAnchorPointTap: _empty,
- },
- // ======== 额外组件 ========
- RtcRoom: {
- 'user-id': _empty,
- mode: 'camera',
- 'device-position': 'front',
- bindError: _empty,
- },
- PayButton: {
- mode: '1',
- 'goods-id': _empty,
- 'goods-type': _empty,
- 'order-status': '0',
- 'order-id': _empty,
- 'refund-id': _empty,
- 'refund-total-amount': _empty,
- 'biz-line': '1',
- 'marketing-ready': _false,
- bindGetGoodsInfo: _empty,
- bindPlaceOrder: _empty,
- bindError: _empty,
- bindApplyRefund: _empty,
- bindRefund: _empty,
- bindPay: _empty,
- },
- ConsumeCard: {
- 'order-id': _empty,
- bindConsume: _empty,
- bindRefund: _empty,
- bindApplyRefund: _empty,
- bindError: _empty,
- },
- AwemeData: {
- 'aweme-id': _empty,
- type: singleQuote('avatar'),
- 'disable-default': _empty,
- 'default-avatar': _empty,
- 'default-text': _empty,
- bindError: _empty,
- },
- RateButton: {
- 'order-id': _empty,
- bindInit: _empty,
- bindSuccess: _empty,
- bindError: _empty,
- },
- OpenData: {
- type: _empty,
- 'default-text': _empty,
- 'default-avatar': _empty,
- 'use-empty-value': _false,
- bindError: _empty,
- },
- AwemeUserCard: {
- 'aweme-id': _empty,
- width: '504',
- height: '144',
- fixed: _false,
- 'left-right-padding': _empty,
- bindError: _empty,
- },
-};
diff --git a/packages/plugin-miniapp/src/targets/bytedance/index.ts b/packages/plugin-miniapp/src/targets/bytedance/index.ts
deleted file mode 100644
index d996a3170d..0000000000
--- a/packages/plugin-miniapp/src/targets/bytedance/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import Template from './template.js';
-import { components } from './components.js';
-
-export default {
- globalObject: 'tt',
- projectConfigJson: 'project.tt.json',
- fileType: {
- templ: '.ttml',
- style: '.ttss',
- config: '.json',
- script: '.js',
- },
- template: new Template(),
- components,
-};
diff --git a/packages/plugin-miniapp/src/targets/bytedance/runtime.ts b/packages/plugin-miniapp/src/targets/bytedance/runtime.ts
deleted file mode 100644
index 08b5589c3f..0000000000
--- a/packages/plugin-miniapp/src/targets/bytedance/runtime.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeInternalComponents } from '@ice/shared';
-import { components } from './components.js';
-
-mergeInternalComponents(components);
diff --git a/packages/plugin-miniapp/src/targets/bytedance/template.ts b/packages/plugin-miniapp/src/targets/bytedance/template.ts
deleted file mode 100644
index e60ef53e7b..0000000000
--- a/packages/plugin-miniapp/src/targets/bytedance/template.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { RecursiveTemplate } from '@ice/shared';
-
-export default class Template extends RecursiveTemplate {
- supportXS = false;
- adapter = {
- if: 'tt:if',
- else: 'tt:else',
- elseif: 'tt:elif',
- for: 'tt:for',
- forItem: 'tt:for-item',
- forIndex: 'tt:for-index',
- key: 'tt:key',
- type: 'tt',
- };
-
- replacePropName(name: string, value: string) {
- if (value === 'eh') {
- const nameLowerCase = name.toLowerCase();
- if (nameLowerCase === 'bindlongtap') return 'bindlongpress';
- return nameLowerCase;
- }
- return name;
- }
-}
diff --git a/packages/plugin-miniapp/src/targets/index.ts b/packages/plugin-miniapp/src/targets/index.ts
deleted file mode 100644
index f9fdeda50c..0000000000
--- a/packages/plugin-miniapp/src/targets/index.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { WECHAT_MINIPROGRAM, ALI_MINIAPP, BAIDU_SMARTPROGRAM, BYTEDANCE_MICROAPP } from '../constant.js';
-import type { TargetConfig } from '../types.js';
-import wechat from './wechat/index.js';
-import bytedance from './bytedance/index.js';
-import baidu from './baidu/index.js';
-import ali from './ali/index.js';
-
-// TODO: Add KUAISHOU_MINIPROGRAM.
-export default function getMiniappTargetConfig(target: string): TargetConfig {
- switch (target) {
- case WECHAT_MINIPROGRAM:
- return wechat;
- case ALI_MINIAPP:
- return ali;
- case BYTEDANCE_MICROAPP:
- return bytedance;
- case BAIDU_SMARTPROGRAM:
- return baidu;
- default:
- return wechat;
- }
-}
diff --git a/packages/plugin-miniapp/src/targets/wechat/components.ts b/packages/plugin-miniapp/src/targets/wechat/components.ts
deleted file mode 100644
index 43177c0d0c..0000000000
--- a/packages/plugin-miniapp/src/targets/wechat/components.ts
+++ /dev/null
@@ -1,478 +0,0 @@
-const _true = 'true';
-const _false = 'false';
-const _empty = '';
-const _zero = '0';
-
-export const components = {
- // ======== 调整属性 ========
- Progress: {
- 'border-radius': _zero,
- 'font-size': '16',
- duration: '30',
- bindActiveEnd: _empty,
- },
- RichText: {
- space: _empty,
- 'user-select': _false,
- },
- Text: {
- 'user-select': _false,
- overflow: 'visible',
- 'max-lines': '',
- },
- Map: {
- polygons: '[]',
- subkey: _empty,
- rotate: _zero,
- skew: _zero,
- 'max-scale': '20',
- 'min-scale': '3',
- 'enable-3D': _false,
- 'show-compass': _false,
- 'show-scale': _false,
- 'enable-overlooking': _false,
- 'enable-auto-max-overlooking': _false,
- 'enable-zoom': _true,
- 'enable-scroll': _true,
- 'enable-rotate': _false,
- 'enable-satellite': _false,
- 'enable-traffic': _false,
- 'enable-poi': _true,
- 'enable-building': _true,
- setting: '[]',
- bindLabelTap: _empty,
- bindRegionChange: _empty,
- bindPoiTap: _empty,
- bindPolylineTap: _empty,
- bindAbilitySuccess: _empty,
- bindAbilityFailed: _empty,
- bindAuthSuccess: _empty,
- bindInterpolatePoint: _empty,
- bindError: _empty,
- bindAnchorPointTap: _empty,
- },
- Button: {
- lang: 'en',
- 'session-from': _empty,
- 'send-message-title': _empty,
- 'send-message-path': _empty,
- 'send-message-img': _empty,
- 'app-parameter': _empty,
- 'show-message-card': _false,
- 'business-id': _empty,
- bindGetUserInfo: _empty,
- bindContact: _empty,
- bindGetPhoneNumber: _empty,
- bindGetRealTimePhoneNumber: _empty,
- bindChooseAvatar: _empty,
- bindError: _empty,
- bindOpenSetting: _empty,
- bindLaunchApp: _empty,
- bindAgreePrivacyAuthorization: _empty,
- },
- Form: {
- 'report-submit-timeout': _zero,
- },
- Input: {
- 'always-embed': _false,
- 'adjust-position': _true,
- 'hold-keyboard': _false,
- 'safe-password-cert-path': '',
- 'safe-password-length': '',
- 'safe-password-time-stamp': '',
- 'safe-password-nonce': '',
- 'safe-password-salt': '',
- 'safe-password-custom-hash': '',
- 'auto-fill': _empty,
- bindKeyboardHeightChange: _empty,
- bindNicknameReview: _empty,
- },
- Picker: {
- 'header-text': _empty,
- level: 'region',
- },
- PickerView: {
- 'immediate-change': _false,
- bindPickStart: _empty,
- bindPickEnd: _empty,
- },
- Slider: {
- color: "'#e9e9e9'",
- 'selected-color': "'#1aad19'",
- },
- Textarea: {
- 'show-confirm-bar': _true,
- 'adjust-position': _true,
- 'hold-keyboard': _false,
- 'disable-default-padding': _false,
- 'confirm-type': "'return'",
- 'confirm-hold': _false,
- bindKeyboardHeightChange: _empty,
- },
- ScrollView: {
- 'enable-flex': _false,
- 'scroll-anchoring': _false,
- enhanced: _false,
- 'using-sticky': _false,
- 'paging-enabled': _false,
- 'enable-passive': _false,
- 'refresher-enabled': _false,
- 'refresher-threshold': '45',
- 'refresher-default-style': "'black'",
- 'refresher-background': "'#FFF'",
- 'refresher-triggered': _false,
- bounces: _true,
- 'show-scrollbar': _true,
- 'fast-deceleration': _false,
- type: "'list'",
- reverse: _false,
- clip: _true,
- 'enable-back-to-top': _false,
- 'cache-extent': _empty,
- 'min-drag-distance': '18',
- 'scroll-into-view-within-extent': _false,
- 'scroll-into-view-alignment': "'start'",
- padding: '[0,0,0,0]',
- 'refresher-two-level-enabled': _false,
- 'refresher-two-level-triggered': _false,
- 'refresher-two-level-threshold': '150',
- 'refresher-two-level-close-threshold': '80',
- 'refresher-two-level-scroll-enabled': _false,
- 'refresher-ballistic-refresh-enabled': _false,
- 'refresher-two-level-pinned': _false,
- bindDragStart: _empty,
- bindDragging: _empty,
- bindDragEnd: _empty,
- bindRefresherPulling: _empty,
- bindRefresherRefresh: _empty,
- bindRefresherRestore: _empty,
- bindRefresherAbort: _empty,
- bindScrollStart: _empty,
- bindScrollEnd: _empty,
- bindRefresherWillRefresh: _empty,
- bindRefresherStatusChange: _empty,
- },
- StickySection: {
- 'push-pinned-header': _true,
- padding: '[0, 0, 0, 0]',
- },
- GridView: {
- type: "'aligned'",
- 'cross-axis-count': '2',
- 'max-cross-axis-extent': _zero,
- 'main-axis-gap': _zero,
- 'cross-axis-gap': _zero,
- padding: '[0, 0, 0, 0]',
- },
- GridBuilder: {
- type: "'aligned'",
- list: '[]',
- 'cross-axis-count': '2',
- 'max-cross-axis-extent': _zero,
- 'main-axis-gap': _zero,
- 'cross-axis-gap': _zero,
- padding: '[0, 0, 0, 0]',
- bindItemBuild: _empty,
- bindItemDispose: _empty,
- },
- ListView: {
- padding: '[0, 0, 0, 0]',
- },
- ListBuilder: {
- list: '[]',
- type: 'static',
- padding: '[0, 0, 0, 0]',
- 'child-count': _empty,
- 'child-height': _empty,
- bindItemBuild: _empty,
- bindItemDispose: _empty,
- },
- StickyHeader: {
- 'offset-top': '0',
- padding: '[0, 0, 0, 0]',
- },
- Swiper: {
- 'snap-to-edge': _false,
- 'easing-function': "'default'",
- },
- SwiperItem: {
- 'skip-hidden-item-layout': _false,
- },
- Navigator: {
- target: "'self'",
- 'app-id': _empty,
- path: _empty,
- 'extra-data': _empty,
- version: "'version'",
- },
- Camera: {
- mode: "'normal'",
- resolution: "'medium'",
- 'frame-size': "'medium'",
- bindInitDone: _empty,
- bindScanCode: _empty,
- },
- Image: {
- webp: _false,
- 'show-menu-by-longpress': _false,
- },
- LivePlayer: {
- mode: "'live'",
- 'sound-mode': "'speaker'",
- 'auto-pause-if-navigate': _true,
- 'auto-pause-if-open-native': _true,
- 'picture-in-picture-mode': '[]',
- 'enable-auto-rotation': _false,
- 'referrer-policy': "'no-referrer'",
- 'enable-casting': _false,
- bindstatechange: _empty,
- bindfullscreenchange: _empty,
- bindnetstatus: _empty,
- bindAudioVolumeNotify: _empty,
- bindEnterPictureInPicture: _empty,
- bindLeavePictureInPicture: _empty,
- bindCastingUserSelect: _empty,
- bindCastingStateChange: _empty,
- bindCastingInterrupt: _empty,
- },
- Video: {
- title: _empty,
- 'play-btn-position': "'bottom'",
- 'enable-play-gesture': _false,
- 'auto-pause-if-navigate': _true,
- 'auto-pause-if-open-native': _true,
- 'vslide-gesture': _false,
- 'vslide-gesture-in-fullscreen': _true,
- 'show-bottom-progress': _true,
- 'ad-unit-id': _empty,
- 'poster-for-crawler': _empty,
- 'show-casting-button': _false,
- 'picture-in-picture-mode': '[]',
- // picture-in-picture-show-progress 属性先注释掉的原因如下:
- // 该属性超过了 wxml 属性的长度限制,实际无法使用且导致编译报错。可等微信官方修复后再放开。
- // 参考1:https://developers.weixin.qq.com/community/develop/doc/000a429beb87f0eac07acc0fc5b400
- // 参考2: https://developers.weixin.qq.com/community/develop/doc/0006883619c48054286a4308258c00?_at=vyxqpllafi
- // 'picture-in-picture-show-progress': 'false',
- 'enable-auto-rotation': _false,
- 'show-screen-lock-button': _false,
- 'show-snapshot-button': _false,
- 'show-background-playback-button': _false,
- 'background-poster': _empty,
- 'referrer-policy': "'no-referrer'",
- 'is-drm': _false,
- 'is-live': _false,
- 'provision-url': _empty,
- 'certificate-url': _empty,
- 'license-url': _empty,
- 'preferred-peak-bit-rate': _empty,
- bindProgress: _empty,
- bindLoadedMetadata: _empty,
- bindControlsToggle: _empty,
- bindEnterPictureInPicture: _empty,
- bindLeavePictureInPicture: _empty,
- bindSeekComplete: _empty,
- bindCastingUserSelect: _empty,
- bindCastingStateChange: _empty,
- bindCastingInterrupt: _empty,
- bindAdLoad: _empty,
- bindAdError: _empty,
- bindAdClose: _empty,
- bindAdPlay: _empty,
- },
- Canvas: {
- type: _empty,
- },
- Ad: {
- 'ad-type': "'banner'",
- 'ad-theme': "'white'",
- },
- CoverView: {
- 'marker-id': _empty,
- slot: _empty,
- },
- // ======== 额外组件 ========
- Editor: {
- 'read-only': _false,
- placeholder: _empty,
- 'show-img-size': _false,
- 'show-img-toolbar': _false,
- 'show-img-resize': _false,
- focus: _false,
- bindReady: _empty,
- bindFocus: _empty,
- bindBlur: _empty,
- bindInput: _empty,
- bindStatusChange: _empty,
- name: _empty,
- },
- MatchMedia: {
- 'min-width': _empty,
- 'max-width': _empty,
- width: _empty,
- 'min-height': _empty,
- 'max-height': _empty,
- height: _empty,
- orientation: _empty,
- },
- FunctionalPageNavigator: {
- version: "'release'",
- name: _empty,
- args: _empty,
- bindSuccess: _empty,
- bindFail: _empty,
- bindCancel: _empty,
- },
- LivePusher: {
- url: _empty,
- mode: "'RTC'",
- autopush: _false,
- muted: _false,
- 'enable-camera': _true,
- 'auto-focus': _true,
- orientation: "'vertical'",
- beauty: _zero,
- whiteness: _zero,
- aspect: "'9:16'",
- 'min-bitrate': '200',
- 'max-bitrate': '1000',
- 'audio-quality': "'high'",
- 'waiting-image': _empty,
- 'waiting-image-hash': _empty,
- zoom: _false,
- 'device-position': "'front'",
- 'background-mute': _false,
- mirror: _false,
- 'remote-mirror': _false,
- 'local-mirror': _false,
- 'audio-reverb-type': _zero,
- 'enable-mic': _true,
- 'enable-agc': _false,
- 'enable-ans': _false,
- 'audio-volume-type': "'voicecall'",
- 'video-width': '360',
- 'video-height': '640',
- 'beauty-style': "'smooth'",
- filter: "'standard'",
- 'picture-in-picture-mode': '[]',
- animation: _empty,
- bindStateChange: _empty,
- bindNetStatus: _empty,
- bindBgmStart: _empty,
- bindBgmProgress: _empty,
- bindBgmComplete: _empty,
- bindAudioVolumeNotify: _empty,
- },
- OfficialAccount: {
- bindLoad: _empty,
- bindError: _empty,
- },
- OpenData: {
- type: _empty,
- 'open-gid': _empty,
- lang: "'en'",
- 'default-text': _empty,
- 'default-avatar': _empty,
- bindError: _empty,
- },
- NavigationBar: {
- title: _empty,
- loading: _false,
- 'front-color': "'#000000'",
- 'background-color': _empty,
- 'color-animation-duration': _zero,
- 'color-animation-timing-func': "'linear'",
- },
- PageMeta: {
- 'background-text-style': _empty,
- 'background-color': _empty,
- 'background-color-top': _empty,
- 'background-color-bottom': _empty,
- 'root-background-color': _empty,
- 'scroll-top': "''",
- 'scroll-duration': '300',
- 'page-style': "''",
- 'root-font-size': "''",
- 'page-orientation': "''",
- bindResize: _empty,
- bindScroll: _empty,
- bindScrollDone: _empty,
- },
- VoipRoom: {
- openid: _empty,
- mode: "'camera'",
- 'device-position': "'front'",
- bindError: _empty,
- },
- AdCustom: {
- 'unit-id': _empty,
- 'ad-intervals': _empty,
- bindLoad: _empty,
- bindError: _empty,
- },
- PageContainer: {
- show: _false,
- duration: '300',
- 'z-index': '100',
- overlay: _true,
- position: "'bottom'",
- round: _false,
- 'close-on-slide-down': _false,
- 'overlay-style': _empty,
- 'custom-style': _empty,
- bindBeforeEnter: _empty,
- bindEnter: _empty,
- bindAfterEnter: _empty,
- bindBeforeLeave: _empty,
- bindLeave: _empty,
- bindAfterLeave: _empty,
- bindClickOverlay: _empty,
- },
- ShareElement: {
- mapkey: _empty,
- transform: _false,
- duration: '300',
- 'easing-function': "'ease-out'",
- },
- KeyboardAccessory: {},
- RootPortal: {
- enable: _true,
- },
- ChannelLive: {
- 'feed-id': _empty,
- 'finder-user-name': _empty,
- },
- ChannelVideo: {
- 'feed-id': _empty,
- 'finder-user-name': _empty,
- 'feed-token': _empty,
- autoplay: _false,
- loop: _false,
- muted: _false,
- 'object-fit': "'contain'",
- bindError: _empty,
- },
- Snapshot: {
- mode: "'view'",
- },
- Span: {},
- OpenContainer: {
- transitionType: "'fade'",
- transitionDuration: '300',
- closedColor: "'white'",
- closedElevation: _zero,
- closeBorderRadius: _zero,
- middleColor: _empty,
- openColor: "'white'",
- openElevation: _zero,
- openBorderRadius: _zero,
- },
- DraggableSheet: {
- initialChildSize: '0.5',
- minChildSize: '0.25',
- maxChildSize: '1.0',
- snap: _false,
- snapSizes: '[]',
- },
- NestedScrollHeader: {},
- NestedScrollBody: {},
-};
diff --git a/packages/plugin-miniapp/src/targets/wechat/index.ts b/packages/plugin-miniapp/src/targets/wechat/index.ts
deleted file mode 100644
index 34d99059ed..0000000000
--- a/packages/plugin-miniapp/src/targets/wechat/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import Template from './template.js';
-import { components } from './components.js';
-
-export default {
- globalObject: 'wx',
- projectConfigJson: 'project.config.json',
- fileType: {
- templ: '.wxml',
- style: '.wxss',
- config: '.json',
- script: '.js',
- xs: '.wxs',
- },
- template: new Template(),
- components,
-};
diff --git a/packages/plugin-miniapp/src/targets/wechat/runtime.ts b/packages/plugin-miniapp/src/targets/wechat/runtime.ts
deleted file mode 100644
index 08b5589c3f..0000000000
--- a/packages/plugin-miniapp/src/targets/wechat/runtime.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { mergeInternalComponents } from '@ice/shared';
-import { components } from './components.js';
-
-mergeInternalComponents(components);
diff --git a/packages/plugin-miniapp/src/targets/wechat/template.ts b/packages/plugin-miniapp/src/targets/wechat/template.ts
deleted file mode 100644
index 6598259281..0000000000
--- a/packages/plugin-miniapp/src/targets/wechat/template.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { UnRecursiveTemplate } from '@ice/shared';
-
-interface IOptions {
- enablekeyboardAccessory?: boolean;
-}
-
-export default class Template extends UnRecursiveTemplate {
- pluginOptions: IOptions;
- supportXS = true;
- adapter = {
- if: 'wx:if',
- else: 'wx:else',
- elseif: 'wx:elif',
- for: 'wx:for',
- forItem: 'wx:for-item',
- forIndex: 'wx:for-index',
- key: 'wx:key',
- xs: 'wxs',
- type: 'weapp',
- };
-
- constructor(pluginOptions?: IOptions) {
- super();
- this.pluginOptions = pluginOptions || {};
- }
-
- buildXsTemplate() {
- return ' ';
- }
-
- replacePropName(name: string, value: string, componentName: string, componentAlias) {
- if (value === 'eh') {
- const nameLowerCase = name.toLowerCase();
- if (nameLowerCase === 'bindlongtap' && componentName !== 'canvas') return 'bindlongpress';
- return nameLowerCase;
- }
- if (componentName === 'share-element') {
- const mapKeyAlias = componentAlias.mapkey;
- if (value === `i.${mapKeyAlias}`) return 'key';
- }
- return name;
- }
-
- buildXSTepFocus(nn: string) {
- if (this.pluginOptions.enablekeyboardAccessory) {
- const textarea = this.componentsAlias.textarea._num;
- const input = this.componentsAlias.input._num;
- const ka = this.componentsAlias['keyboard-accessory']._num;
- return `function(i, prefix) {
- var s = i.focus !== undefined ? 'focus' : 'blur'
- var r = prefix + i.${nn} + '_' + s
- if ((i.nn === '${textarea}' || i.nn === '${input}') && i.cn[0] && i.cn[0].nn === '${ka}') {
- r = r + '_ka'
- }
- return r
- }`;
- } else {
- return super.buildXSTepFocus(nn);
- }
- }
-
- modifyTemplateResult = (res: string, nodeName: string, _level, children) => {
- if (nodeName === 'keyboard-accessory') return '';
-
- if ((nodeName === 'textarea' || nodeName === 'input') && this.pluginOptions.enablekeyboardAccessory) {
- const list = res.split('');
- const componentAlias = this.componentsAlias[nodeName];
- const nodeNameAlias = componentAlias._num;
-
- const target = `
-
-
-
-
-
- `;
-
- const templateFocus = list[1]
- .replace(children, target)
- .replace(`_${nodeNameAlias}_focus`, `_${nodeNameAlias}_focus_ka`);
-
- const templateBlur = list[2]
- .replace(children, target)
- .replace(`_${nodeNameAlias}_blur`, `_${nodeNameAlias}_blur_ka`);
-
- list.splice(3, 0, templateFocus, templateBlur);
- return list.join('');
- }
-
- return res;
- };
-}
diff --git a/packages/plugin-miniapp/src/types.ts b/packages/plugin-miniapp/src/types.ts
deleted file mode 100644
index 3df4d197df..0000000000
--- a/packages/plugin-miniapp/src/types.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import type { RecursiveTemplate, UnRecursiveTemplate } from '@ice/shared';
-import type { Config, webpack } from '@ice/app/esm/types';
-import type { IFileType, IMiniBuildConfig } from './miniapp/webpack/utils/types.js';
-
-export interface TargetConfig {
- globalObject: string;
- projectConfigJson?: string;
- fileType: IFileType;
- template: RecursiveTemplate | UnRecursiveTemplate;
- modifyBuildAssets?: IMiniBuildConfig['modifyBuildAssets'];
- components: Record>;
-}
-
-export interface MiniappWebpackOptions {
- rootDir: string;
- env?: Record;
- template: TargetConfig['template'];
- fileType: TargetConfig['fileType'];
- configAPI: {
- getAppConfig: Config['getAppConfig'];
- getRoutesConfig: Config['getRoutesConfig'];
- };
- projectConfigJson?: string;
- nativeConfig: Record;
- modifyBuildAssets?: IMiniBuildConfig['modifyBuildAssets'];
-}
-
-export interface MiniappWebpackConfig {
- plugins: Config['plugins'];
- module: webpack.Configuration['module'];
-}
diff --git a/packages/plugin-miniapp/tsconfig.json b/packages/plugin-miniapp/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-miniapp/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-moment-locales/CHANGELOG.md b/packages/plugin-moment-locales/CHANGELOG.md
deleted file mode 100644
index 79368f77f7..0000000000
--- a/packages/plugin-moment-locales/CHANGELOG.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Changelog
-
-## 1.0.2
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 1.0.1
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.0.0
-
-- [feat] support config locales of moment.
diff --git a/packages/plugin-moment-locales/README.md b/packages/plugin-moment-locales/README.md
deleted file mode 100644
index de02cc79ee..0000000000
--- a/packages/plugin-moment-locales/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# @ice/plugin-moment-locales
-
-ice.js Plugin for load moment locales and reduce size of moment.
-
-## Usage
-
-```js
-import { defineConfig } from '@ice/app';
-import moment from '@ice/plugin-moment-locales';
-
-export default defineConfig(() => ({
- plugins: [
- moment({
- locales: ['zh-CN'],
- }),
- ],
-}));
-```
diff --git a/packages/plugin-moment-locales/package.json b/packages/plugin-moment-locales/package.json
deleted file mode 100644
index c312f699bd..0000000000
--- a/packages/plugin-moment-locales/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "@ice/plugin-moment-locales",
- "version": "1.0.2",
- "description": "ice.js plugin for reduce moment locale size.",
- "type": "module",
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "author": "",
- "license": "MIT",
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-moment-locales"
- },
- "devDependencies": {
- "@ice/app": "^3.3.2"
- },
- "publishConfig": {
- "access": "public"
- },
- "files": [
- "esm",
- "!esm/**/*.map"
- ]
-}
diff --git a/packages/plugin-moment-locales/src/index.ts b/packages/plugin-moment-locales/src/index.ts
deleted file mode 100644
index e3cb1bdd16..0000000000
--- a/packages/plugin-moment-locales/src/index.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-
-interface PluginOptions {
- locales: string | string[];
-}
-
-const plugin: Plugin = (options) => ({
- name: '@ice/plugin-moment-locales',
- setup: ({ onGetConfig, context }) => {
- const { locales } = options || {};
- if (locales) {
- onGetConfig((config) => {
- config.plugins ??= [];
- const localeArray = typeof locales === 'string' ? [locales] : locales;
- config.plugins.push(new context.webpack.ContextReplacementPlugin(
- /moment[/\\]locale$/,
- new RegExp(localeArray.join('|')),
- ));
- });
- }
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-moment-locales/tsconfig.json b/packages/plugin-moment-locales/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-moment-locales/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-pha/CHANGELOG.md b/packages/plugin-pha/CHANGELOG.md
deleted file mode 100644
index 7f0ce70d5b..0000000000
--- a/packages/plugin-pha/CHANGELOG.md
+++ /dev/null
@@ -1,108 +0,0 @@
-# Changelog
-
-## 3.0.4
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 3.0.3
-
-### Patch Changes
-
-- e40a7cb2: fix: add `bounces` attr
-
-## 3.0.2
-
-### Patch Changes
-
-- 39c92e5b: fix: format of dataLoaderConfig loader changed.
-
-## 3.0.1
-
-### Patch Changes
-
-- 110b282b: fix: do not render document when template is set to false
-
-## 3.0.0
-
-### Major Changes
-
-- 583c29b3: feat: the target of PHA worker should be appWorker.
-
-## 2.0.3
-
-### Patch Changes
-
-- b1e89bc7: fix: PHA plugin can only run in web
-- d4f943fb: feat: support downgradeUrl
-- 922f0700: feat: support config of dataLoader for pha plugin
-- ce94e054: fix: fix frames build err in multiple
-- a878225f: fix: dataLoader is sent repeatedly in PHA
-
-## 2.0.2
-
-### Patch Changes
-
-- 4e1d9065: refactor: reuse route paths
-- 085498aa: fix: use latest plugin API of excuteServerEntry
-- 83af2887: feat: support pull refresh
-
-## 2.0.1
-
-### Patch Changes
-
-- 0c61f469: fix: prevent data loader to breack generate manifest
- fix: should replace env vars when build appWork
-
-## 2.0.0
-
-### Major Changes
-
-- 6824ad63: fix: fix data of prefetch decamelize (break change)
-- 73ae8bf4: fix: app-worker is not compiled when set a custom name
-- 1c09e79e: fix: support plugin-pha interface optional
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.1.3
-
-### Patch Changes
-
-- [fix] dev manifest should work when manifest has not tabBar
-- [fix] preload should be false default
-- [fix] print log once
-- [feat] support configure for resource_prefetch
-
-## 1.1.2
-
-- [fix] should't parse template in SSR/SSG
-- [feat] support dynamic data loader for pha worker
-
-## 1.1.1
-
-- [feat] support resource_prefetch to preload resource
-- [feat] support enableExpiredManifest
-- [feat] support configure `enableExpiredManifest`
-
-## 1.1.0
-
-- [feat] support static dataloader set to manifest
-
-## 1.0.3
-
-- [fix] fix lanUrlForTerminal when dev start
-- [feat] optimize log
-
-## 1.0.2
-
-- [fix] fix dev lanUrlForTerminal err
-- [fix] add title of manifest
-- [fix] add pha = true when dev
-
-## 1.0.1
-
-- [fix] failed to get route config when re-define route path
-
-## 1.0.0
-
-- [feat] plugin to enable PHA features
diff --git a/packages/plugin-pha/README.md b/packages/plugin-pha/README.md
deleted file mode 100644
index 4be22e8bc0..0000000000
--- a/packages/plugin-pha/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# @ice/plugin-pha
-
-An ice.js plugin to enable PHA features.
-
-## Usage
-
-```js
-import { defineConfig } from '@ice/app';
-import pha from '@ice/plugin-pha';
-
-export default defineConfig(() => ({
- plugins: [pha()],
-}));
-```
diff --git a/packages/plugin-pha/package.json b/packages/plugin-pha/package.json
deleted file mode 100644
index f3e2489c86..0000000000
--- a/packages/plugin-pha/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "@ice/plugin-pha",
- "version": "3.0.4",
- "description": "ice.js plugin for PHA.",
- "license": "MIT",
- "type": "module",
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map",
- "template",
- "*.d.ts"
- ],
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "dependencies": {
- "@remix-run/router": "^1.14.2",
- "chalk": "^4.0.0",
- "consola": "^2.15.3",
- "humps": "^2.0.1",
- "lodash.clonedeep": "^4.5.0",
- "htmlparser2": "^8.0.1"
- },
- "devDependencies": {
- "@ice/app": "^3.3.2",
- "build-scripts": "^2.1.2-0",
- "esbuild": "^0.17.16",
- "webpack": "^5.88.0",
- "webpack-dev-server": "4.15.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-pha"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-pha/runtime.d.ts b/packages/plugin-pha/runtime.d.ts
deleted file mode 100644
index 72417e24df..0000000000
--- a/packages/plugin-pha/runtime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime';
diff --git a/packages/plugin-pha/src/constants.ts b/packages/plugin-pha/src/constants.ts
deleted file mode 100644
index b26b23e181..0000000000
--- a/packages/plugin-pha/src/constants.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import type { Config, OverwritePluginAPI, PluginData } from '@ice/app/types';
-import type { Context } from 'build-scripts';
-
-// Keys of appConfig need transform to manifest.
-export const decamelizeKeys = [
- 'title',
- 'name',
- 'startUrl',
- 'shortName',
- 'lang',
- 'dir',
- 'description',
- 'backgroundColor',
- 'display',
- 'icons',
- 'appWorker',
- 'window',
- 'pageHeader',
- 'tabHeader',
- 'tabBar',
- 'pages',
- 'dataPrefetch',
- 'spm',
- 'metas',
- 'links',
- 'scripts',
- 'offlineResources',
- 'packageResources',
- 'manifestPrefetchExpires',
- 'manifestPrefetchMaxAge',
- 'maxAge',
- 'expires',
- 'queryParamsPassKeys',
- 'queryParamsPassIgnoreKeys',
- 'splashViewTimeout',
- 'splashViewAutoClose',
- 'splashViewHtml',
- 'splashViewUrl',
- 'swiperThreshold',
- 'requestHeaders',
- 'enablePoplayer',
- 'disableCapture',
- 'enablePullRefresh',
- 'pullRefreshBackgroundColor',
- 'pullRefreshColorScheme',
- 'pullRefresh',
- 'cacheQueryParams',
- 'customDataSource',
- 'enableExpiredManifest',
- 'bounces',
-];
-
-// Do not decamelize list.
-export const camelizeKeys = [
- 'appKey',
- 'dataType',
- 'valueType',
- 'isSec',
- 'LoginRequest',
- 'sessionOption',
- 'AntiCreep',
- 'AntiFlood',
- 'needLogin',
-];
-
-export const validPageConfigKeys = [
- 'pageHeader',
- 'defaultFrameIndex',
- 'title',
- 'priority',
- 'titleImage',
- 'titleBarColor',
- 'backgroundColor',
- 'enablePullRefresh',
- 'external',
- 'requestHeaders',
- 'frames',
- 'dataPrefetch',
- 'spm',
- 'queryParams',
- 'queryParamsPassKeys',
- 'pullRefresh',
- 'queryParamsPassIgnoreKeys',
- 'downgradeUrl',
- 'bounces',
-];
-
-// The manifest configuration is the default value for the page configuration
-export const pageDefaultValueKeys = [
- 'pullRefresh',
-];
-
-export const getCompilerConfig = (options: {
- getAllPlugin: Context['getAllPlugin'];
-}) => {
- const {
- getAllPlugin,
- } = options;
- const plugins = getAllPlugin(['keepExports']) as PluginData[];
-
- let keepExports = ['dataLoader'];
- plugins.forEach(plugin => {
- if (plugin.keepExports) {
- keepExports = keepExports.concat(plugin.keepExports);
- }
- });
- return {
- swc: {
- keepExports,
- },
- preBundle: false,
- externalDependencies: false,
- transformEnv: false,
- // Redirect import defineDataLoader from @ice/runtime to avoid build plugin side effect code.
- redirectImports: [{
- specifier: ['defineDataLoader'],
- source: '@ice/runtime',
- }],
- // Replace env vars.
- runtimeDefineVars: {
- 'import.meta.target': JSON.stringify('appWorker'),
- 'import.meta.renderer': JSON.stringify('client'),
- },
- };
-};
diff --git a/packages/plugin-pha/src/generateManifest.ts b/packages/plugin-pha/src/generateManifest.ts
deleted file mode 100644
index db66b3500c..0000000000
--- a/packages/plugin-pha/src/generateManifest.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import * as path from 'path';
-import * as fs from 'fs';
-import type { GetAppConfig, GetDataloaderConfig, GetRoutesConfig, CreateLoggerReturnType, Config, OverwritePluginAPI } from '@ice/app/types';
-import type { Context } from 'build-scripts';
-import { parseManifest, rewriteAppWorker, getAppWorkerUrl, getMultipleManifest, type ParseOptions } from './manifestHelpers.js';
-import { getCompilerConfig } from './constants.js';
-import type { Compiler } from './index.js';
-
-export interface Options {
- rootDir: string;
- outputDir: string;
- parseOptions: Partial;
- compiler: Compiler;
- getAppConfig: GetAppConfig;
- getRoutesConfig: GetRoutesConfig;
- getDataloaderConfig: GetDataloaderConfig;
- getAllPlugin: Context['getAllPlugin'];
- logger?: CreateLoggerReturnType;
-}
-
-export async function getAppWorkerContent(
- compiler: Compiler,
- buildOptions: {
- entry: string;
- outfile: string;
- minify?: boolean;
- }, options): Promise {
- const { entry, outfile, minify = false } = buildOptions;
- const appWorkerFile = await compiler({
- entry,
- outfile,
- minify,
- timestamp: false,
- }, options);
- return fs.readFileSync(appWorkerFile, 'utf-8');
-}
-
-export async function getAppWorkerPath({
- getAppConfig,
- rootDir,
-}) {
- const appConfig = await getAppConfig(['phaManifest']);
- let manifest = appConfig.phaManifest;
- return getAppWorkerUrl(manifest, path.join(rootDir, 'src'));
-}
-
-export default async function generateManifest({
- rootDir,
- outputDir,
- parseOptions,
- getAllPlugin,
- getAppConfig,
- getRoutesConfig,
- getDataloaderConfig,
- compiler,
- logger,
-}: Options) {
- const [appConfig, routesConfig] = await Promise.all([getAppConfig(['phaManifest']), getRoutesConfig()]);
-
- let dataloaderConfig;
- try {
- // dataLoader may have side effect code.
- dataloaderConfig = await getDataloaderConfig();
- } catch (err) {
- logger.briefError('GetDataloaderConfig failed.');
- logger.debug(err);
- }
-
- let manifest = appConfig.phaManifest;
- const appWorkerPath = getAppWorkerUrl(manifest, path.join(rootDir, 'src'));
- // TODO: PHA Worker should deal with url which load by script element.
- if (appWorkerPath) {
- manifest = rewriteAppWorker(manifest);
- const entry = path.join(rootDir, './.ice/appWorker.ts');
-
- await getAppWorkerContent(compiler, {
- entry: fs.existsSync(entry) ? entry : appWorkerPath,
- outfile: path.join(outputDir, 'app-worker.js'),
- minify: true,
- }, getCompilerConfig({ getAllPlugin }));
- }
-
- const phaManifest = await parseManifest(manifest, {
- dataloaderConfig,
- ...parseOptions,
- routesConfig,
- } as ParseOptions);
- if (phaManifest?.tab_bar) {
- fs.writeFileSync(path.join(outputDir, 'manifest.json'), JSON.stringify(phaManifest), 'utf-8');
- } else {
- const multipleManifest = getMultipleManifest(phaManifest);
- Object.keys(multipleManifest).forEach((key) => {
- fs.writeFileSync(path.join(outputDir, `${key}-manifest.json`), JSON.stringify(multipleManifest[key]), 'utf-8');
- });
- }
-}
diff --git a/packages/plugin-pha/src/index.ts b/packages/plugin-pha/src/index.ts
deleted file mode 100644
index 090a979114..0000000000
--- a/packages/plugin-pha/src/index.ts
+++ /dev/null
@@ -1,200 +0,0 @@
-import * as path from 'path';
-import { fileURLToPath } from 'url';
-import consola from 'consola';
-import chalk from 'chalk';
-import type { Plugin, GetAppConfig, GetRoutesConfig, GetDataloaderConfig, ServerCompiler } from '@ice/app/types';
-import generateManifest, { getAppWorkerPath } from './generateManifest.js';
-import createPHAMiddleware from './phaMiddleware.js';
-
-const __dirname = path.dirname(fileURLToPath(import.meta.url));
-
-export type Compiler = (options: {
- entry: string;
- outfile: string;
- minify?: boolean;
- timestamp?: boolean;
- removeCode?: boolean;
-}, buildOptions: Parameters[1]) => Promise;
-
-interface PluginOptions {
- template?: boolean;
- preload?: boolean;
- dataLoader?: {
- // Dynamic of dataLoader config will build the dataLoader into the app worker.
- useAppWorker: boolean;
- };
-}
-
-function getDevPath(url: string): string {
- return url.startsWith('http') ? `${new URL(url).origin}/` : url;
-}
-
-const plugin: Plugin = (options) => ({
- name: '@ice/plugin-pha',
- setup: ({ onGetConfig, onHook, context, excuteServerEntry, generator, getAllPlugin, createLogger }) => {
- if (!excuteServerEntry) {
- throw new Error('PHA plugin requires excuteServerEntry, Please upgrade @ice/app to latest version (>= 3.1.5).');
- }
- const {
- template = true,
- preload = false,
- dataLoader = {
- useAppWorker: true,
- },
- } = options || {};
-
- const { command, rootDir } = context;
-
- const logger = createLogger('plugin-pha');
-
- // Get variable blows from task config.
- let compiler: Compiler;
- let publicPath: string;
- let outputDir: string;
- let urlPrefix: string;
- let getAppConfig: GetAppConfig;
- let getRoutesConfig: GetRoutesConfig;
- let getDataloaderConfig: GetDataloaderConfig;
-
- generator.addRouteTypes({
- specifier: ['PageConfig'],
- alias: { PageConfig: 'PHAPageConfig' },
- type: true,
- source: '@ice/plugin-pha/types',
- });
-
- // TODO: get route manifest by API.
- const routeManifest = path.join(rootDir, '.ice', 'route-manifest.json');
- // Get server compiler by hooks
- onHook(`before.${command as 'start' | 'build'}.run`, async ({ serverCompiler, taskConfigs, urls = {}, ...restAPI }) => {
- const webTask = taskConfigs.find(({ name }) => name === 'web');
- if (!webTask) {
- throw new Error('PHA plugin can only run in web.');
- return;
- }
- const taskConfig = webTask.config;
- outputDir = path.isAbsolute(taskConfig.outputDir)
- ? taskConfig.outputDir : path.join(rootDir, taskConfig.outputDir);
-
- getAppConfig = restAPI.getAppConfig;
- getRoutesConfig = restAPI.getRoutesConfig;
- getDataloaderConfig = restAPI.getDataloaderConfig;
-
- const appWorkerPath = await getAppWorkerPath({
- rootDir,
- getAppConfig,
- });
-
- generator.addRenderFile(path.join(__dirname, '../template/appWorker.ejs'), 'appWorker.ts', {
- appWorkerPath,
- useAppWorker: dataLoader.useAppWorker,
- });
-
- // Need absolute path for pha dev.
- publicPath = command === 'start' ? getDevPath(urls.lanUrlForTerminal || urls.localUrlForTerminal) : (taskConfig.publicPath || '/');
-
- // process.env.DEPLOY_PATH is defined by cloud environment such as DEF plugin.
- urlPrefix = command === 'start' ? urls.lanUrlForTerminal : process.env.DEPLOY_PATH;
-
- compiler = async (options, buildOptions) => {
- const { entry, outfile, minify = false } = options;
- await serverCompiler({
- target: 'es2015',
- entryPoints: [entry],
- format: 'esm',
- outfile,
- minify,
- }, buildOptions);
- return `${outfile}`;
- };
- });
-
- onHook('after.build.compile', async () => {
- await generateManifest({
- rootDir,
- outputDir,
- compiler,
- getAllPlugin,
- getAppConfig,
- getRoutesConfig,
- getDataloaderConfig,
- parseOptions: {
- excuteServerEntry,
- publicPath,
- urlPrefix,
- template,
- preload,
- routeManifest,
- },
- logger,
- });
- });
-
- onHook('after.start.compile', async ({ isSuccessful, isFirstCompile, urls }) => {
- // Only print logout message once when build is successful.
- // See also @ice/app -> plugins/web.ts
- if (isSuccessful && isFirstCompile) {
- // Log out pha dev urls.
- const lanUrl = urls.lanUrlForTerminal;
- const appConfig = await getAppConfig(['phaManifest']);
- const { phaManifest } = appConfig || {};
- const phaDevUrls = [];
- if (phaManifest?.tabBar) {
- phaDevUrls.push(`${lanUrl}manifest.json?pha=true`);
- } else if (phaManifest?.routes?.length > 0) {
- phaManifest.routes.forEach((route) => {
- if (typeof route === 'string') {
- phaDevUrls.push(`${lanUrl}${route}-manifest.json?pha=true`);
- } else if (typeof route?.frames![0] === 'string') {
- phaDevUrls.push(`${lanUrl}${route.frames[0]}-manifest.json?pha=true`);
- }
- });
- }
- let logoutMessage = '\n';
- logoutMessage += chalk.green(' Serve PHA Manifest at:\n');
- phaDevUrls.forEach((url) => {
- logoutMessage += `\n ${chalk.underline.white(url)}`;
- });
- if (phaDevUrls.length > 0) {
- consola.log(`${logoutMessage}\n`);
- }
- }
- });
-
- onGetConfig('web', (config) => {
- const customMiddlewares = config.middlewares;
- config.middlewares = (middlewares, devServer) => {
- const currentMiddlewares = customMiddlewares ? customMiddlewares(middlewares, devServer) : middlewares;
- const insertIndex = currentMiddlewares.findIndex(({ name }) => name === 'server-compile');
- const phaMiddleware = createPHAMiddleware({
- compiler,
- rootDir,
- outputDir,
- getAppConfig,
- getRoutesConfig,
- getAllPlugin,
- getDataloaderConfig,
- parseOptions: {
- publicPath,
- urlPrefix,
- template,
- preload,
- routeManifest,
- excuteServerEntry,
- },
- logger,
- });
-
- // Add pha middleware after server-compile.
- middlewares.splice(insertIndex + 1, 0, {
- name: 'pha-manifest',
- middleware: phaMiddleware,
- });
- return currentMiddlewares;
- };
- return config;
- });
- },
-});
-
-export default plugin;
diff --git a/packages/plugin-pha/src/manifestHelpers.ts b/packages/plugin-pha/src/manifestHelpers.ts
deleted file mode 100644
index 190a8210ea..0000000000
--- a/packages/plugin-pha/src/manifestHelpers.ts
+++ /dev/null
@@ -1,459 +0,0 @@
-/* eslint-disable camelcase */
-import * as path from 'path';
-import * as fs from 'fs';
-import humps from 'humps';
-import consola from 'consola';
-import cloneDeep from 'lodash.clonedeep';
-import { matchRoutes } from '@remix-run/router';
-import * as htmlparser2 from 'htmlparser2';
-import { decamelizeKeys, camelizeKeys, validPageConfigKeys, pageDefaultValueKeys } from './constants.js';
-import type { Page, PageHeader, PageConfig, Manifest, PHAManifest, Frame } from './types';
-
-const { decamelize } = humps;
-
-interface TransformOptions {
- isRoot?: boolean;
- parentKey?: string;
-}
-
-export interface ParseOptions {
- urlPrefix: string;
- publicPath: string;
- routeManifest: string;
- excuteServerEntry: () => Promise;
- routesConfig?: Record;
- template?: boolean;
- preload?: boolean;
- urlSuffix?: string;
- ssr?: boolean;
- dataloaderConfig?: object | Function | Array;
-}
-
-interface TabConfig {
- name: string;
- url: string;
- html?: string;
-}
-
-type ResourcePrefetchConfig = Array<{
- src: string;
- mimeType?: string;
- headers?: string;
- queryParams?: string;
-}>;
-
-interface InternalPageConfig {
- path?: string;
- document?: string;
- resourcePrefetch?: ResourcePrefetchConfig;
-}
-
-type MixedPage = InternalPageConfig & PageConfig;
-
-export function transformManifestKeys(manifest: Manifest, options?: TransformOptions): PHAManifest {
- const { parentKey, isRoot } = options || {};
- const data = {};
-
- for (let key in manifest) {
- // Filter not need transform key.
- if (isRoot && !decamelizeKeys.includes(key)) {
- continue;
- }
- const value = manifest[key];
-
- // Compatible with pageHeader.
- if (key === 'pageHeader') {
- key = 'tabHeader';
- }
-
- let transformKey = key;
- if (!camelizeKeys.includes(key)) {
- transformKey = decamelize(key);
- }
- if (typeof value === 'string' || typeof value === 'number') {
- data[transformKey] = value;
- } else if (Array.isArray(value)) {
- data[transformKey] = value.map((item) => {
- if (parentKey === 'tabBar' && item.text) {
- item.name = item.text;
- delete item.text;
- }
- if (typeof item === 'object') {
- if (key === 'dataPrefetch') {
- // Hack: No header will crash in Android
- if (!item.header) {
- item.header = {};
- }
- // No prefetchKey will crash in Android TaoBao 9.26.0.
- if (!item.prefetchKey) {
- item.prefetchKey = 'mtop';
- }
- }
- return transformManifestKeys(item, { isRoot: false, parentKey: key });
- }
- return item;
- });
- } else if (key === 'pullRefresh') {
- if (value && value.reload) {
- // Need reload.
- data['pull_refresh'] = true;
- } else {
- data['enable_pull_refresh'] = true;
- }
- } else if (key === 'requestHeaders') {
- // Keys of requestHeaders should not be transformed.
- data[transformKey] = value;
- } else if (typeof value === 'object' && !(parentKey === 'dataPrefetch' && (key === 'header' || key === 'data'))) {
- data[transformKey] = transformManifestKeys(value, { isRoot: false, parentKey: key });
- } else {
- data[transformKey] = value;
- }
- }
- return data;
-}
-
-function getPageUrl(routeId: string, options: ParseOptions) {
- const { urlPrefix = '', urlSuffix = '' } = options;
- const splitCharacter = urlPrefix.endsWith('/') ? '' : '/';
- return `${urlPrefix}${splitCharacter}${routeId}${urlSuffix}`;
-}
-
-function getRouteManifest(routeManifest: string) {
- try {
- const routes = fs.readFileSync(routeManifest, 'utf-8');
- return JSON.parse(routes);
- } catch (e) {
- console.warn(`[plugin-pha warn] ${JSON.stringify(e)}`);
- return [];
- }
-}
-
-async function getPageConfig(
- routeId: string,
- routeManifest: string,
- routesConfig: Record,
-): Promise {
- const routes = getRouteManifest(routeManifest);
- const matches = matchRoutes(routes, routeId.startsWith('/') ? routeId : `/${routeId}`);
- let routeConfig: MixedPage = {};
- if (matches) {
- // Merge route config when return muitiple route.
- routeConfig = matches.reduce((prev, curr) => {
- const { id } = curr.route;
- return {
- ...prev,
- ...(routesConfig![id]?.() as MixedPage || {}),
- };
- }, {});
- }
- const filteredConfig = {};
- Object.keys(routeConfig).forEach((key) => {
- if (validPageConfigKeys.includes(key)) {
- filteredConfig[key] = routeConfig[key];
- }
- });
- return filteredConfig;
-}
-
-async function renderPageDocument(routeId: string, excuteServerEntry: ParseOptions['excuteServerEntry']): Promise {
- const serverContext = {
- req: {
- url: `/${routeId}`,
- },
- };
- const serverModule = await excuteServerEntry();
- if (serverModule) {
- const { value } = await serverModule.renderToHTML(serverContext, {
- documentOnly: true,
- serverOnlyBasename: '/',
- renderMode: 'SSG',
- });
- return value;
- }
-}
-
-async function getPageManifest(page: string | Page, options: ParseOptions): Promise {
- const { template, preload, excuteServerEntry, routesConfig, routeManifest } = options;
- // Page will be type string when it is a source frame.
- if (typeof page === 'string') {
- // Get html content by render document.
- const pageConfig = await getPageConfig(page, routeManifest, routesConfig);
- const { queryParams = '', ...rest } = pageConfig;
- const pageManifest = {
- key: page,
- ...rest,
- };
- if (template && !Array.isArray(pageConfig.frames)) {
- pageManifest.document = await renderPageDocument(page, excuteServerEntry);
- }
-
- if (preload) {
- let scripts = [];
- let stylesheets = [];
- function getPreload(dom) {
- if (
- dom.name === 'script' &&
- dom.attribs &&
- dom.attribs.src
- ) {
- scripts.push({
- src: dom.attribs.src,
- });
- } else if (
- dom.name === 'link' &&
- dom.attribs &&
- dom.attribs.href &&
- dom.attribs.rel === 'stylesheet'
- ) {
- stylesheets.push({
- src: dom.attribs.href,
- });
- }
-
- if (dom.children) {
- dom.children.forEach(getPreload);
- }
- }
- getPreload(htmlparser2.parseDocument(pageManifest.document));
- pageManifest.resourcePrefetch = [...scripts, ...stylesheets];
- }
-
- // Always need path for page item.
- pageManifest.path = `${getPageUrl(page, options)}${queryParams ? `?${queryParams}` : ''}`;
- return pageManifest;
- } else if (page.url) {
- // Url has the highest priority to overwrite config path.
- const { url, ...rest } = page;
- return {
- ...rest,
- path: url,
- };
- }
- // Return page config while it may config as pha manifest standard.
- return page;
-}
-
-const PAGE_SOURCE_REGEX = /^\.?\/?pages\//;
-
-function validateSource(source: string, key: string): boolean {
- if (!source.match(PAGE_SOURCE_REGEX)) {
- throw new Error(`${key} source must be written in pages folder`);
- }
- return true;
-}
-
-function parseRouteId(id: string): string {
- return id.replace(PAGE_SOURCE_REGEX, '');
-}
-
-async function getTabConfig(tabManifest: Manifest['tabBar'] | PageHeader, generateDocument: boolean, options: ParseOptions): Promise {
- const tabConfig: TabConfig = {
- name: '',
- url: '',
- };
- const tabRouteId = parseRouteId(tabManifest!.source);
- if (options.template && generateDocument && options.excuteServerEntry) {
- tabConfig.html = await renderPageDocument(tabRouteId, options.excuteServerEntry);
- }
-
- // TODO: iOS issue
- // TODO: should remove it in PHA 2.x
- // PHA 1.x should inject `url` to be a base url to load assets
- tabConfig.url = getPageUrl(tabRouteId, options);
- // TODO: Android issue
- // TODO: should remove it in PHA 2.x
- // same as iOS issue
- try {
- tabConfig.name = new URL(tabConfig.url).origin;
- } catch (e) {
- // HACK: build type of Weex will inject an invalid URL,
- // which will throw Error when stringify using `new URL()`
- // invalid URL: {{xxx}}/path
- // {{xxx}} will replace by server
- [tabConfig.name] = tabConfig.url.split('/');
- }
-
- return tabConfig;
-}
-
-export function getAppWorkerUrl(manifest: Manifest, workerDir: string): string {
- let appWorkerPath: string;
- const defaultAppWorker = path.join(workerDir, 'app-worker.ts');
- if (manifest?.appWorker?.url) {
- const appWorkUrl = path.join(workerDir, manifest.appWorker.url);
- if (!manifest?.appWorker?.url.startsWith('http')) {
- if (fs.existsSync(appWorkUrl)) {
- appWorkerPath = appWorkUrl;
- } else {
- consola.error(`PHA app worker url: ${manifest.appWorker.url} is not exists`);
- }
- }
- } else if (fs.existsSync(defaultAppWorker)) {
- appWorkerPath = defaultAppWorker;
- }
-
- return appWorkerPath;
-}
-
-export function rewriteAppWorker(manifest: Manifest): Manifest {
- let appWorker: Manifest['appWorker'] = {};
- if (manifest.appWorker) {
- appWorker = {
- ...manifest.appWorker,
- url: 'app-worker.js',
- };
- } else {
- appWorker = {
- url: 'app-worker.js',
- };
- }
- return {
- ...manifest,
- appWorker,
- };
-}
-export function getRouteIdByPage(routeManifest: string, page: Page) {
- const routes = getRouteManifest(routeManifest);
- const routeId = typeof page === 'string' ? page : page?.name;
- const locationArg = routeId?.startsWith('/') ? routeId : `/${routeId}`;
- const matches = matchRoutes(routes, locationArg);
- return (matches || []).map((match) => {
- return match?.route?.id;
- });
-}
-export async function parseManifest(manifest: Manifest, options: ParseOptions): Promise {
- const {
- publicPath,
- dataloaderConfig,
- routeManifest,
- } = options;
- const { appWorker, tabBar, routes } = manifest;
-
- if (appWorker?.url && !appWorker.url.startsWith('http')) {
- appWorker.url = `${publicPath}${appWorker.url}`;
- }
-
- if (tabBar?.source && validateSource(tabBar.source, 'tabBar')) {
- if (!tabBar.url) {
- manifest.tabBar = {
- ...tabBar,
- ...(await getTabConfig(tabBar, false, options)),
- };
- }
- // Remove tab_bar.source because pha manifest do not recognize it.
- delete manifest.tabBar.source;
- }
- // items is `undefined` will crash in PHA and it is not supported to config list.
- if (tabBar && !tabBar.items) {
- tabBar.items = [];
- }
-
- if (routes && routes.length > 0) {
- manifest.pages = await Promise.all(routes.map(async (page) => {
- const pageIds = getRouteIdByPage(routeManifest, page);
- const pageManifest = await getPageManifest(page, options);
-
- // The manifest configuration is the default value for the page configuration.
- pageDefaultValueKeys.forEach(key => {
- if (!(key in pageManifest) && (key in manifest)) {
- pageManifest[key] = manifest[key];
- }
- });
-
- // Set static dataloader to data_prefetch of page.
- pageIds.forEach((pageId) => {
- if (typeof page === 'string' && dataloaderConfig && dataloaderConfig[pageId] && dataloaderConfig[pageId].loader) {
- const staticDataLoaders = [];
- const { loader } = dataloaderConfig[pageId];
- if (Array.isArray(loader)) {
- dataloaderConfig[pageId].loader.forEach(item => {
- if (typeof item === 'object') {
- staticDataLoaders.push(item);
- }
- });
- } else if (typeof loader === 'object') {
- // Single prefetch loader config.
- staticDataLoaders.push(loader);
- }
- pageManifest.dataPrefetch = [...(pageManifest.dataPrefetch || []), ...staticDataLoaders];
- }
- });
-
- if (pageManifest.frames && pageManifest.frames.length > 0) {
- pageManifest.frames = await Promise.all(pageManifest.frames.map((frame) => getPageManifest(frame, options)));
- // Set static dataloader to dataPrefetch of frames.
- pageManifest.frames.forEach((frame: Frame) => {
- if (typeof frame === 'string') return;
- const title = frame.title || '';
- const titleIds = getRouteIdByPage(routeManifest, title);
- titleIds.forEach((titleId) => {
- if (dataloaderConfig && dataloaderConfig[titleId] && dataloaderConfig[titleId].loader) {
- const staticDataLoaders = [];
- const { loader } = dataloaderConfig[titleId];
- if (Array.isArray(loader)) {
- loader.forEach(item => {
- if (typeof item === 'object') {
- staticDataLoaders.push(item);
- }
- });
- } else if (typeof loader === 'object') {
- // Single prefetch loader config.
- staticDataLoaders.push(loader);
- }
-
- frame.dataPrefetch = [...(frame.dataPrefetch || []), ...staticDataLoaders];
- }
- });
- });
- }
-
- if (pageManifest?.pageHeader?.source) {
- if (!pageManifest.pageHeader.url) {
- pageManifest.pageHeader = {
- ...pageManifest.pageHeader,
- // Generate document logic is different from tabBar.
- ...(await getTabConfig(pageManifest.pageHeader, true, options)),
- };
- }
- delete pageManifest.pageHeader.source;
- }
- return pageManifest;
- }));
- // Delete manifest routes after transform.
- delete manifest.routes;
- }
-
- return transformManifestKeys(manifest, { isRoot: true });
-}
-
-export function getMultipleManifest(manifest: PHAManifest): Record {
- const multipleManifest = {};
- manifest.pages.forEach((page) => {
- let pageKey = page.key;
- // Generate manifest for each route.
- const copiedManifest = cloneDeep(manifest);
- // Reduce routes config by matched source.
- copiedManifest.pages = copiedManifest.pages.filter((copiedPage) => {
- if (copiedPage.frames && !pageKey) {
- // TODO: frames key may conflict with other page keys
- // https://github.com/raxjs/rax-app/blob/57a536723c8cc9ce7cd4892c1a5990854e395e2c/packages/plugin-rax-pha/src/plugins/AppToManifestPlugin.js#L110
- pageKey = page.frames[page.default_frame_index || 0].key;
- return pageKey === copiedPage.frames[copiedPage.default_frame_index || 0].key;
- } else {
- return pageKey === copiedPage.key;
- }
- });
- // take out the page data prefetch and assign it to the root node
- if (copiedManifest?.pages![0]?.data_prefetch) {
- copiedManifest.data_prefetch = copiedManifest.pages[0].data_prefetch;
- delete copiedManifest.pages[0].data_prefetch;
- }
- // take out the page preload and assign it to the root node
- if (copiedManifest?.pages![0]?.resource_prefetch) {
- copiedManifest.resource_prefetch = copiedManifest.pages[0].resource_prefetch;
- delete copiedManifest.pages[0].resource_prefetch;
- }
- multipleManifest[pageKey] = copiedManifest;
- });
- return multipleManifest;
-}
diff --git a/packages/plugin-pha/src/phaMiddleware.ts b/packages/plugin-pha/src/phaMiddleware.ts
deleted file mode 100644
index 9c91943162..0000000000
--- a/packages/plugin-pha/src/phaMiddleware.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import * as path from 'path';
-import type { ServerResponse } from 'http';
-import * as fs from 'fs';
-import type { ExpressRequestHandler } from 'webpack-dev-server';
-import { getCompilerConfig } from './constants.js';
-import { parseManifest, rewriteAppWorker, getAppWorkerUrl, getMultipleManifest, type ParseOptions } from './manifestHelpers.js';
-import { getAppWorkerContent, type Options } from './generateManifest.js';
-import type { Manifest } from './types.js';
-
-function sendResponse(res: ServerResponse, content: string, mime: string): void {
- res.statusCode = 200;
- res.setHeader('Content-Type', `${mime}; charset=utf-8`);
- res.end(content);
-}
-
-const createPHAMiddleware = ({
- rootDir,
- outputDir,
- parseOptions,
- getAllPlugin,
- getAppConfig,
- getRoutesConfig,
- getDataloaderConfig,
- compiler,
- logger,
-}: Options): ExpressRequestHandler => {
- const phaMiddleware: ExpressRequestHandler = async (req, res, next) => {
- // @ts-ignore
- const requestPath = path.basename(req._parsedUrl.pathname);
- const requestManifest = requestPath.endsWith('manifest.json');
-
- const requestAppWorker = req.url === '/app-worker.js';
- if (requestManifest || requestAppWorker) {
- const [appConfig, routesConfig] = await Promise.all([getAppConfig(['phaManifest']), getRoutesConfig()]);
-
- let dataloaderConfig;
- try {
- // dataLoader may have side effect code.
- dataloaderConfig = await getDataloaderConfig();
- } catch (err) {
- logger.briefError('GetDataloaderConfig failed.');
- logger.debug(err);
- }
-
- let manifest: Manifest = appConfig.phaManifest;
- const appWorkerPath = getAppWorkerUrl(manifest, path.join(rootDir, 'src'));
- if (appWorkerPath) {
- // over rewrite appWorker.url to app-worker.js
- manifest = rewriteAppWorker(manifest);
- if (requestAppWorker) {
- const entry = path.join(rootDir, './.ice/appWorker.ts');
- sendResponse(
- res,
- await getAppWorkerContent(compiler, {
- entry: fs.existsSync(entry) ? entry : appWorkerPath,
- outfile: path.join(outputDir, 'app-worker.js'),
- }, getCompilerConfig({
- getAllPlugin,
- })),
- 'text/javascript',
- );
- return;
- }
- }
- const phaManifest = await parseManifest(manifest, {
- ...parseOptions,
- routesConfig,
- dataloaderConfig,
- } as ParseOptions);
- if (!phaManifest?.tab_bar) {
- const multipleManifest = getMultipleManifest(phaManifest);
- const manifestKey = requestPath.replace('-manifest.json', '').replace(/^\//, '');
- if (multipleManifest[manifestKey]) {
- sendResponse(res, JSON.stringify(multipleManifest[manifestKey]), 'application/json');
- return;
- }
- } else if (requestPath === 'manifest.json') {
- sendResponse(res, JSON.stringify(phaManifest), 'application/json');
- return;
- }
- }
- next();
- };
- return phaMiddleware;
-};
-
-export default createPHAMiddleware;
diff --git a/packages/plugin-pha/src/types.ts b/packages/plugin-pha/src/types.ts
deleted file mode 100644
index 9b3309b4b7..0000000000
--- a/packages/plugin-pha/src/types.ts
+++ /dev/null
@@ -1,218 +0,0 @@
-export type PageHeader = Partial<{
- url: string;
- height: number;
- backgroundColor: string;
- position: 'absolute' | 'static';
- source: string;
- html: string;
- name: string;
- // only support Android 10.3.0+,iOS 10.2.0+
- includedSafeArea: boolean;
- heightUnit: 'rpx' | 'px';
-}>;
-
-interface Icon {
- src: string;
- type: string;
- sizes: string;
-}
-
-interface AppWorker {
- url?: string;
- source?: string;
- prefetch?: boolean;
-}
-
-interface DataPrefetchConfig {
- key: string;
- prefetchType: string;
- api: string;
- v: string;
- data: Record;
- extHeaders: Record;
- [key: string]: any;
-}
-
-type DataPrefetch = Partial;
-type PHADataPrefetch = Partial & {
- prefetch_type: string;
- ext_headers: Record;
- [key: string]: any;
-}>;
-
-type ResourcePrefetch = Array<{
- src: string;
- mime_type?: string;
- headers?: string;
- query_params?: string;
-}>;
-
-interface TabItem {
- name?: string;
- pagePath?: string;
- path?: string;
- text?: string;
- icon: string;
- activeIcon: string;
-}
-
-type TabBar = Partial<{
- // list convert to items
- source: string;
- items: (string | TabItem)[];
- textColor: string;
- selectedColor: string;
- backgroundColor: string;
- borderStyle: string;
- selectedIndex: number;
- iconSize: number;
- fontSize: number;
- lineHeight: number;
- height: number;
- spacing: number;
- position: 'static' | 'absolute';
- name: string;
- url: string;
- html: string;
- custom: boolean;
-}>;
-
-type PHAItem = Partial & {
- name: string;
- page_key: string;
- active_icon: string;
-}>;
-
-type PHATabBar = Partial & {
- name: string;
- key: string;
- text_color: string;
- selected_color: string;
- selected_index: number;
- background_color: string;
- border_style: string;
- icon_size: number;
- font_size: number;
- line_height: number;
- height: number;
- spacing: number;
- items: PHAItem[];
-}>;
-
-type Priority = 'high' | 'normal' | 'low';
-
-type FrameConfig = Partial<{
- url: string;
- priority?: Priority;
- title?: string;
- dataPrefetch?: DataPrefetch[];
-}> & WindowConfig;
-
-type WindowConfig = Partial<{
- backgroundColor: string;
- enablePullRefresh: boolean;
- name: string;
- icons: Icon[];
- title: string;
-}>;
-
-export interface PageConfig extends FrameConfig {
- name?: string;
- pageHeader?: PageHeader;
- frames?: Frame[];
- defaultFrameIndex?: number;
- dataPrefetch?: DataPrefetch[];
- queryParams?: string;
- pullRefresh?: PullRefresh;
- downgradeUrl?: string;
-}
-
-export type Page = string | PageConfig;
-export type Frame = string | FrameConfig;
-
-export type PHAFrame = Partial<{
- key: string;
- path: string;
- background_color: string;
- header_position: 'absolute' | 'static';
- enable_pull_refresh: boolean;
- pull_refresh: boolean;
- priority: Priority;
-} & Omit>;
-
-type TabHeader = Partial<{
- key: string;
- html: string;
- url: string;
- height: number;
- background_color: string;
- position: 'absolute' | 'static';
- selected_index: number;
-}>;
-
-export type PHAPage = Partial<{
- key: string;
- document: string;
- resource_prefetch: ResourcePrefetch;
- path: string;
- background_color: string;
- enable_pull_refresh: boolean;
- pull_refresh: boolean;
- priority: Priority;
- script: string;
- stylesheet: string;
- title: string;
- title_image: string;
- title_bar_color: string;
- external: string;
- request_headers: Record;
- tab_header: TabHeader;
- downgrade_url: string;
- default_frame_index: number;
- data_prefetch: PHADataPrefetch[];
- frames: PHAFrame[];
-}>;
-
-type PullRefresh = boolean | {
- reload: boolean;
-};
-
-export type Manifest = Partial<{
- enablePoplayer: boolean;
- disableCapture: boolean;
- tabBar: TabBar;
- queryParamsPassKeys: string[];
- queryParamsPassIgnoreKeys: string[];
- offlineResources: string[];
- dataPrefetch: (DataPrefetch & Record)[];
- expires: string;
- maxAge: number;
- appWorker: AppWorker;
- routes: Page[];
- enableExpiredManifest: boolean;
- pullRefresh?: PullRefresh;
- bounces: boolean;
-}> & WindowConfig & Record;
-
-export type PHAManifest = Partial<{
- name: string;
- background_color: string;
- splash_view_timeout: number;
- enable_poplayer: boolean;
- disable_capture: boolean;
- icons: Icon[];
- data_prefetch: PHADataPrefetch[];
- app_worker: AppWorker;
- enable_expired_manifest: boolean;
- tab_bar: PHATabBar;
- pages: PHAPage[];
- query_params_pass_keys: string[];
- query_params_pass_ignore_keys: string[];
- offline_resources: string[];
- built_in_library: string[];
- expires: string;
- max_age: number;
- package_resources: Record;
- resource_prefetch: ResourcePrefetch;
- bounces: boolean;
-}>;
diff --git a/packages/plugin-pha/template/appWorker.ejs b/packages/plugin-pha/template/appWorker.ejs
deleted file mode 100644
index 705fe49621..0000000000
--- a/packages/plugin-pha/template/appWorker.ejs
+++ /dev/null
@@ -1,24 +0,0 @@
-<% if(appWorkerPath) {-%>import '<%- appWorkerPath %>';<% } -%>
-<% if(!!loaders && !!dataLoader && useAppWorker) {-%>
-import dataloaderConfig from './dataloader-config';
-
-addEventListener('beforepageload', async (pageInfos = {}) => {
- const {
- key,
- } = pageInfos.detail || {};
- const config = dataloaderConfig[key];
- if (config) {
- if (typeof config === 'function') {
- const res = await config();
- pha.postMessage(res, '0');
- } else if (Array.isArray(config)) {
- config.forEach(async (item, index) => {
- if (typeof item === 'function') {
- const res = await item();
- pha.postMessage(res, `$index}`);
- }
- });
- }
- }
-});
-<% } -%>
diff --git a/packages/plugin-pha/tests/fixtures/export-specifier.ts b/packages/plugin-pha/tests/fixtures/export-specifier.ts
deleted file mode 100644
index d81e9a4991..0000000000
--- a/packages/plugin-pha/tests/fixtures/export-specifier.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-const pageConfig = () => {};
-const getData = () => {};
-export {
- pageConfig,
- getData,
-};
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/fixtures/export-variable.ts b/packages/plugin-pha/tests/fixtures/export-variable.ts
deleted file mode 100644
index a892dbfe96..0000000000
--- a/packages/plugin-pha/tests/fixtures/export-variable.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export const getData = () => {};
-export const pageConfig = () => {};
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/fixtures/function-exports.ts b/packages/plugin-pha/tests/fixtures/function-exports.ts
deleted file mode 100644
index 4987bdd7c1..0000000000
--- a/packages/plugin-pha/tests/fixtures/function-exports.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function Bar() {}
-export function pageConfig() {}
-export function getData() {}
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/fixtures/if.ts b/packages/plugin-pha/tests/fixtures/if.ts
deleted file mode 100644
index a9853fefda..0000000000
--- a/packages/plugin-pha/tests/fixtures/if.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-let a = 1;
-if (true) {
- a = 2;
-}
diff --git a/packages/plugin-pha/tests/fixtures/iife.ts b/packages/plugin-pha/tests/fixtures/iife.ts
deleted file mode 100644
index b23bbb7ea7..0000000000
--- a/packages/plugin-pha/tests/fixtures/iife.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-function a() {}
-a();
-console.log('test', window.a);
-const b = [];
-b.map(() => {});
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/fixtures/import.ts b/packages/plugin-pha/tests/fixtures/import.ts
deleted file mode 100644
index c3edf2f33e..0000000000
--- a/packages/plugin-pha/tests/fixtures/import.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { a, b } from 'test';
-import { a as c } from 'test-a';
-import d from 'test-d';
-import 'test-c';
-
-export function pageConfig() {
- return { a: 1 };
-}
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/fixtures/reference.ts b/packages/plugin-pha/tests/fixtures/reference.ts
deleted file mode 100644
index 885dc20aaf..0000000000
--- a/packages/plugin-pha/tests/fixtures/reference.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { a, b } from 'test';
-
-function test() {
- a();
-}
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/fixtures/vars.ts b/packages/plugin-pha/tests/fixtures/vars.ts
deleted file mode 100644
index f66497deb5..0000000000
--- a/packages/plugin-pha/tests/fixtures/vars.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { a, z } from 'a';
-import b from 'b';
-import c from 'c';
-import d from 'd';
-
-const [e, f, ...rest] = a;
-const { h, j } = b;
-const [x, ...m] = c;
-const zz = 'x';
-const { k, l, ...s } = d;
-
-export function pageConfig() {
- return {
- x,
- k,
- };
-}
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/fixtures/while.ts b/packages/plugin-pha/tests/fixtures/while.ts
deleted file mode 100644
index 992a786750..0000000000
--- a/packages/plugin-pha/tests/fixtures/while.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-let j = 2;
-let i = 2;
-while (j < 3) {
- j++;
-}
-do {
- i++;
-} while (i < 5);
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/manifestHelper.test.ts b/packages/plugin-pha/tests/manifestHelper.test.ts
deleted file mode 100644
index f2ab3a3da9..0000000000
--- a/packages/plugin-pha/tests/manifestHelper.test.ts
+++ /dev/null
@@ -1,843 +0,0 @@
-import * as path from 'path';
-import { fileURLToPath } from 'url';
-import { expect, it, describe } from 'vitest';
-import { transformManifestKeys, parseManifest, getAppWorkerUrl, rewriteAppWorker, getMultipleManifest } from '../src/manifestHelpers';
-import * as mockServer from './mockServer.mjs';
-
-const __dirname = path.dirname(fileURLToPath(import.meta.url));
-
-describe('get app work url', () => {
- it('app worker config as remote url', () => {
- const manifest = {
- appWorker: {
- url: 'http://remote/app-worker.js',
- },
- };
- const appWorkerPath = getAppWorkerUrl(manifest, __dirname);
- expect(appWorkerPath).toBeUndefined();
- });
-
- it('app worker config which do not exist', () => {
- const manifest = {
- appWorker: {
- url: 'app-worker.js',
- },
- };
- const appWorkerPath = getAppWorkerUrl(manifest, __dirname);
- expect(appWorkerPath).toBeUndefined();
- });
-
- it('app worker config which exists', () => {
- const manifest = {
- appWorker: {
- url: 'pha-work.js',
- },
- };
- const appWorkerPath = getAppWorkerUrl(manifest, __dirname);
- expect(appWorkerPath).toBe(path.join(__dirname, 'pha-work.js'));
- });
-
- it('found default app worker', () => {
- const manifest = {};
- const appWorkerPath = getAppWorkerUrl(manifest, __dirname);
- expect(appWorkerPath).toBe(path.join(__dirname, 'app-worker.ts'));
- });
-});
-
-describe('rewrite app worker url', () => {
- it('over write appWorker.url', () => {
- expect(rewriteAppWorker({
- appWorker: {
- url: 'pha-worker.js',
- source: 'test',
- },
- })).toMatchObject({
- appWorker: {
- url: 'app-worker.js',
- source: 'test',
- },
- });
- });
-
- it('config appWorker', () => {
- expect(rewriteAppWorker({})).toMatchObject({
- appWorker: {
- url: 'app-worker.js',
- },
- });
- });
-});
-
-
-describe('transform config keys', () => {
- it('should transform decamelize keys fields', () => {
- const manifestJSON = transformManifestKeys(
- {
- offlineResources: ['//g.alicdn.com/.*'],
- name: 'name',
- pages: [
- {
- pageHeader: {
- includedSafeArea: true,
- },
- downgradeUrl: 'http://www.taobao.com/',
- },
- ],
- },
- { isRoot: true },
- );
- expect(manifestJSON.name).toStrictEqual('name');
- expect(manifestJSON?.pages![0].downgrade_url).toStrictEqual('http://www.taobao.com/');
- expect(manifestJSON.offline_resources).toStrictEqual(['//g.alicdn.com/.*']);
- expect(manifestJSON?.pages![0].tab_header).toStrictEqual({ included_safe_area: true });
- });
-
- it('should transform dataPrefetch to data_prefetch', () => {
- const manifestJSON = transformManifestKeys(
- {
- dataPrefetch: [
- {
- api: '/a.com',
- data: {
- id: 123,
- taskId: 233,
- cId: {
- dId: true,
- },
- },
- header: {
- taskId: 455,
- },
- extHeaders: {
- id: 123,
- test_id: 234,
- },
- dataType: 'json',
- appKey: '12345',
- LoginRequest: true,
- },
- ],
- },
- { isRoot: true },
- );
- expect(manifestJSON?.data_prefetch?.length).toBe(1);
- expect(manifestJSON?.data_prefetch![0].data).toMatchObject({
- id: 123,
- taskId: 233,
- cId: {
- dId: true,
- },
- });
- expect(manifestJSON?.data_prefetch![0].header).toMatchObject({
- taskId: 455,
- });
- expect(manifestJSON?.data_prefetch![0].ext_headers).toMatchObject({ id: 123, test_id: 234 });
- expect(manifestJSON?.data_prefetch![0].dataType).toBe('json');
- expect(manifestJSON?.data_prefetch![0].appKey).toBe('12345');
- expect(manifestJSON?.data_prefetch![0].LoginRequest).toBe(true);
- expect(manifestJSON?.data_prefetch![0].prefetch_key).toBe('mtop');
- });
-
- it('should transform tabBar to tab_bar', () => {
- const manifestJSON = transformManifestKeys(
- {
- tabBar: {
- textColor: '',
- selectedColor: '',
- backgroundColor: '',
- items: [
- {
- path: 'tab1',
- name: '主会场',
- icon: '',
- activeIcon: '',
- },
- {
- // transform text to name
- text: 'text-name',
- icon: '',
- activeIcon: '',
- },
- ],
- },
- },
- { isRoot: true },
- );
-
- expect(manifestJSON.tab_bar).toBeTruthy();
- expect(manifestJSON?.tab_bar?.items![0]).toMatchObject({ path: 'tab1', name: '主会场', icon: '', active_icon: '' });
- });
-
- it('should transform pages keys', () => {
- const manifestJSON = transformManifestKeys(
- {
- pages: [
- {
- path: '/',
- name: 'home',
- source: 'pages/Home/index',
- dataPrefetch: [
- {
- url: '/a.com',
- data: {
- id: 123,
- },
- },
- ],
- },
- {
- path: '/home1',
- name: 'home1',
- source: 'pages/Home1/index',
- },
- ],
- },
- { isRoot: true },
- );
- expect(manifestJSON?.pages?.length).toBe(2);
- expect(manifestJSON?.pages![0].data_prefetch).toMatchObject([
- {
- url: '/a.com',
- data: {
- id: 123,
- },
- header: {},
- prefetch_key: 'mtop',
- },
- ]);
- });
-
- it('should not filter whitelist fields', () => {
- const manifestJSON = transformManifestKeys(
- {
- a: 123,
- },
- { isRoot: false },
- );
-
- expect(manifestJSON).toMatchObject({ a: 123 });
- });
-
- it('should transform enableExpiredManifest', () => {
- const manifestJSON = transformManifestKeys(
- {
- enableExpiredManifest: true,
- },
- { isRoot: false },
- );
-
- expect(manifestJSON).toMatchObject({ enable_expired_manifest: true });
- });
-
- it('should filter unknown fields in root', () => {
- const manifestJSON = transformManifestKeys(
- {
- a: 123,
- },
- { isRoot: true },
- );
-
- expect(manifestJSON).toMatchObject({});
- });
-
- it('should not transform requestHeaders', () => {
- const manifestJSON = transformManifestKeys(
- {
- requestHeaders: {
- 'U-Tag': '${storage.uTag}',
- },
- },
- { isRoot: false },
- );
- expect(manifestJSON).toMatchObject({ request_headers: { 'U-Tag': '${storage.uTag}' } });
- });
-});
-
-describe('parse manifest', async () => {
- const options = {
- publicPath: 'https://cdn-path.com/',
- urlPrefix: 'https://url-prefix.com/',
- routesConfig: (await import(path.join(__dirname, './mockConfig.mjs')))?.default,
- excuteServerEntry: async () => mockServer,
- routeManifest: path.join(__dirname, './route-manifest.json'),
- };
-
- it('should add urlPrefix to manifest', async () => {
- const phaManifest = {
- appWorker: {
- url: 'pha-worker.js',
- },
- routes: [
- 'home',
- 'about',
- 'app/nest',
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest?.pages![0].path).toBe('https://url-prefix.com/home');
- expect(manifest?.pages![0].key).toBe('home');
- expect(manifest?.pages![0].title).toBe('title-home');
- expect(manifest?.pages![0].priority).toBe('low');
- expect(manifest?.pages![1].path).toBe('https://url-prefix.com/about?c=123');
- expect(manifest?.pages![2]?.frames![1].path).toBe('https://m.taobao.com/');
- expect(manifest?.app_worker?.url).toBe('https://cdn-path.com/pha-worker.js');
- });
-
- it('multiple should work with frames', async () => {
- const phaManifest = {
- routes: [
- 'home',
- 'about',
- {
- defaultFrameIndex: 0,
- frames: ['home', 'about'],
- },
- ],
- };
-
- const manifest = await parseManifest(phaManifest, options);
- const remultipleManifests = await getMultipleManifest(manifest);
-
- expect(remultipleManifests['home']?.pages![0]?.frames?.length).toBe(2);
- });
-
- it('should work with enable pull refresh', async () => {
- const phaManifest = {
- appWorker: {
- url: 'pha-worker.js',
- },
- pullRefresh: {
- reload: false,
- },
- routes: [
- {
- path: '/',
- name: 'home',
- },
- {
- path: '/about',
- name: 'about',
- },
- {
- path: '/',
- name: 'frames',
- frames: [
- {
- name: 'frame1',
- url: 'https://m.taobao.com/',
- },
- {
- name: 'frame2',
- url: 'https://m.taobao.com/',
- },
- ],
- },
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest?.pages![0].enable_pull_refresh).toBe(true);
- expect(manifest?.pages![1].enable_pull_refresh).toBe(true);
- expect(manifest?.pages![2].enable_pull_refresh).toBe(true);
- });
-
- it('should work with enable pull refresh', async () => {
- const phaManifest = {
- appWorker: {
- url: 'pha-worker.js',
- },
- pullRefresh: {
- reload: true,
- },
- routes: [
- {
- path: '/',
- name: 'home',
- pullRefresh: {
- reload: true,
- },
- },
- {
- path: '/about',
- name: 'about',
-
- },
- {
- path: '/',
- name: 'frames',
- frames: [
- {
- name: 'frame1',
- url: 'https://m.taobao.com/',
- pullRefresh: {
- reload: true,
- },
- },
- {
- name: 'frame2',
- url: 'https://m.taobao.com/',
- pullRefresh: {
- reload: true,
- },
- },
- ],
- },
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest?.pages![0].pull_refresh).toBe(true);
- expect(manifest?.pages![1].pull_refresh).toBe(true);
- expect(manifest?.pages![2].frames![0].pull_refresh).toBe(true);
- expect(manifest?.pages![2].frames![1].pull_refresh).toBe(true);
- });
-
- it('pull refresh of manifest should be default value of page', async () => {
- const phaManifest = {
- appWorker: {
- url: 'pha-worker.js',
- },
- pullRefresh: {
- reload: true,
- },
- routes: [
- {
- path: '/',
- name: 'home',
- },
- {
- path: '/about',
- name: 'about',
- },
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest?.pages![0].pull_refresh).toBe(true);
- expect(manifest?.pages![1].pull_refresh).toBe(true);
- });
-
- it('enable pull refresh of manifest should be default value of page', async () => {
- const phaManifest = {
- appWorker: {
- url: 'pha-worker.js',
- },
- pullRefresh: true,
- routes: [
- {
- path: '/',
- name: 'home',
- },
- {
- path: '/about',
- name: 'about',
- },
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest?.pages![0].enable_pull_refresh).toBe(true);
- expect(manifest?.pages![1].enable_pull_refresh).toBe(true);
- });
-
- it('enable pull refresh of page should cover value of page', async () => {
- const phaManifest = {
- appWorker: {
- url: 'pha-worker.js',
- },
- pullRefresh: {
- reload: true,
- },
- routes: [
- {
- path: '/',
- name: 'home',
- pullRefresh: {
- reload: true,
- },
- },
- {
- path: '/about',
- name: 'about',
- },
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest?.pages![0].pull_refresh).toBe(true);
- expect(manifest?.pages![1].pull_refresh).toBe(true);
- });
-
- it('should work with enable pull refresh', async () => {
- const phaManifest = {
- appWorker: {
- url: 'pha-worker.js',
- },
- routes: [
- {
- path: '/',
- name: 'home',
- pullRefresh: true,
- },
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest?.pages![0].enable_pull_refresh).toBe(true);
- });
-
- it('should set document to manifest', async () => {
- const phaManifest = {
- routes: [
- 'home',
- 'about',
- 'app/nest',
- ],
- };
- const manifest = await parseManifest(phaManifest, {
- ...options,
- template: true,
- });
-
- expect(manifest?.pages![0].document).toBe('/home-document');
- expect(manifest?.pages![1].document).toBe('/about-document');
- expect(manifest?.pages![2]?.frames![0].document).toBe('/home-document');
- });
-
-
- it('should not support template', async () => {
- const phaManifest = {
- routes: [
- 'home',
- 'about',
- 'app/nest',
- '404',
- ],
- };
- const manifest = await parseManifest(phaManifest, {
- ...options,
- template: false,
- });
-
- expect(manifest.pages![0].script).toBeUndefined();
- expect(manifest.pages![0].stylesheet).toBeUndefined();
- expect(manifest.pages![0].document).toBeUndefined();
- });
-
-
- it('should config url to path when user config page.url', async () => {
- const phaManifest = {
- routes: [
- {
- path: '/',
- name: 'home',
- url: 'https://m.taobao.com/',
- },
- {
- pageHeader: {
- url: 'https://m.taobao.com/',
- source: 'pages/Header',
- },
- frames: [
- {
- path: '/frame1',
- name: 'frame1',
- url: 'https://m.taobao.com/',
- },
- ],
- },
- 'about',
- ],
- tabBar: {
- custom: true,
- items: ['home', 'frame1'],
- url: 'https://m.taobao.com/',
- },
- };
- // @ts-ignore ignore type error with mix config key
- const manifest = await parseManifest(phaManifest, options);
- expect(manifest.pages![0].path).toBe('https://m.taobao.com/');
- // @ts-ignore
- expect(manifest.pages![0].url).toBeUndefined();
- expect(manifest.pages![0].script).toBeUndefined();
- expect(manifest.pages![0].stylesheet).toBeUndefined();
-
- expect(manifest.pages![1]?.tab_header?.url).toBe('https://m.taobao.com/');
- // @ts-ignore
- expect(manifest.pages![1]?.tab_header?.source).toBeUndefined();
-
- expect(manifest.pages![1]?.frames![0].path).toBe('https://m.taobao.com/');
- // @ts-ignore
- expect(manifest.pages![1]?.frames![0].url).toBeUndefined();
- expect(manifest.pages![1]?.frames![0].script).toBeUndefined();
- expect(manifest.pages![1]?.frames![0].stylesheet).toBeUndefined();
-
- expect(manifest?.tab_bar?.url).toBe('https://m.taobao.com/');
- // @ts-ignore
- expect(manifest?.tab_bar?.source).toBeUndefined();
- expect(manifest?.tab_bar?.items).toHaveLength(2);
-
- expect(manifest.pages![2].path).toBe('https://url-prefix.com/about?c=123');
- });
-
- it('should not cover url by pageUrl', async () => {
- const phaManifest = {
- routes: [
- {
- pageHeader: {
- source: 'pages/header',
- },
- frames: [
- {
- name: 'frame1',
- url: 'https://m.taobao.com/',
- },
- ],
- },
- ],
- tabBar: {
- custom: true,
- source: 'pages/CustomTabBar',
- items: ['home', 'frame1'],
- },
- };
-
- const manifest = await parseManifest(phaManifest, {
- ...options,
- template: true,
- });
-
- expect(manifest.pages![0]?.tab_header?.url).toBe('https://url-prefix.com/header');
- expect(manifest.pages![0]?.tab_header?.html).toBe('/header-document');
- expect(manifest?.tab_bar?.url).toBe('https://url-prefix.com/CustomTabBar');
- });
-
- it('should not set html to tabBar when template is false', async () => {
- const phaManifest = {
- routes: [
- {
- pageHeader: {
- source: 'pages/header',
- },
- frames: [
- {
- name: 'frame1',
- url: 'https://m.taobao.com/',
- },
- ],
- },
- ],
- tabBar: {
- custom: true,
- source: 'pages/CustomTabBar',
- items: ['home', 'frame1'],
- },
- };
-
- const manifest = await parseManifest(phaManifest, {
- ...options,
- template: false,
- });
-
- expect(manifest.pages![0]?.tab_header?.html).toBeUndefined();
- });
-
- it('error source without pages', async () => {
- const phaManifest = {
- tabBar: {
- source: 'components/CustomTabBar',
- },
- };
- try {
- await parseManifest(phaManifest, options);
- expect(true).toBe(false);
- } catch (err) {
- expect(true).toBe(true);
- }
- });
-
- it('url failed with new URL', async () => {
- const phaManifest = {
- tabBar: {
- source: 'pages/tabBar',
- },
- };
- const manifest = await parseManifest(phaManifest, {
- ...options,
- urlPrefix: '{{xxx}}/',
- });
- expect(manifest.tab_bar?.url).toBe('{{xxx}}/tabBar');
- expect(manifest.tab_bar?.name).toBe('{{xxx}}');
- });
-
- it('should not inject html when tabHeader & tabBar have url field', async () => {
- const phaManifest = {
- routes: [
- {
- pageHeader: {
- source: 'pages/Header',
- url: 'https://m.taobao.com/',
- },
- },
- ],
- tabBar: {
- custom: true,
- source: 'pages/CustomTabBar',
- items: ['home', 'frame1'],
- },
- };
-
- const manifest = await parseManifest(phaManifest, {
- ...options,
- template: true,
- });
- expect(manifest.pages![0].tab_header?.url).toBe('https://m.taobao.com/');
- expect(manifest.pages![0].tab_header?.html).toBeUndefined();
-
- expect(manifest.tab_bar?.url).toBe('https://url-prefix.com/CustomTabBar');
- });
-
- it('should work with static dataloader', async () => {
- const phaManifest = {
- title: 'test',
- routes: [
- {
- pageHeader: {},
- frames: [
- 'blog',
- 'home',
- 'about',
- ],
- },
- 'home',
- 'about',
- ],
- };
-
- const staticDataloader = {
- key: 'dataLoader222',
- prefetch_type: 'mtop',
- api: 'query222',
- v: '0.0.1',
- data: {
- aaa: 111,
- },
- ext_headers: {},
- };
-
- const manifest = await parseManifest(phaManifest, {
- ...options,
- dataloaderConfig: {
- home: {
- loader: [
- () => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'About',
- });
- }, 1 * 100);
- });
- },
- staticDataloader,
- ],
- },
- },
- });
-
- expect(manifest.pages![0].frames![1].data_prefetch?.length).toBe(1);
- expect(manifest.pages![1].data_prefetch?.length).toBe(2);
- expect(manifest.pages![2].data_prefetch).toBeUndefined();
- });
-
- it('prefetch of dataloader should not be decamelized', async () => {
- const phaManifest = {
- title: 'test',
- routes: [
- {
- pageHeader: {},
- frames: [
- 'blog',
- 'home',
- 'about',
- ],
- },
- 'home',
- 'about',
- ],
- };
-
- const staticDataloader = {
- key: 'dataLoader222',
- prefetch_type: 'mtop',
- api: 'query222',
- v: '0.0.1',
- data: {
- aaa: 111,
- aaB: 222,
- },
- ext_headers: {},
- };
-
- const manifest = await parseManifest(phaManifest, {
- ...options,
- dataloaderConfig: {
- home: {
- loader: [
- () => {
- return new Promise((resolve) => {
- setTimeout(() => {
- resolve({
- name: 'About',
- });
- }, 1 * 100);
- });
- },
- staticDataloader,
- ],
- },
- },
- });
-
- expect(manifest.pages![1].data_prefetch![1]?.data.aaB).toBe(222);
- });
-});
-
-describe('get multiple manifest', async () => {
- const options = {
- publicPath: 'https://cdn-path.com/',
- urlPrefix: 'https://url-prefix.com/',
- routesConfig: (await import(path.join(__dirname, './mockConfig.mjs')))?.default,
- excuteServerEntry: async () => mockServer,
- routeManifest: path.join(__dirname, './route-manifest.json'),
- };
-
- it('simple routes', async () => {
- const phaManifest = {
- routes: [
- 'home',
- 'about',
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- const multipleManifest = getMultipleManifest(manifest);
- expect(multipleManifest?.home?.pages?.length).toBe(1);
- expect(multipleManifest?.home?.data_prefetch).toMatchObject([{ api: 'test/api' }]);
- expect(multipleManifest?.about?.pages?.length).toBe(1);
- });
-
- it('routes with frame', async () => {
- const phaManifest = {
- routes: [
- {
- frames: [
- 'app/nest',
- {
- url: 'https://m.taobao.com/',
- },
- ],
- },
- 'about',
- ],
- };
- const manifest = await parseManifest(phaManifest, options);
- const multipleManifest = getMultipleManifest(manifest);
- expect(multipleManifest?.['app/nest']?.pages?.length).toBe(1);
- expect(multipleManifest?.['app/nest']?.pages![0].frames?.length).toBe(2);
- expect(multipleManifest?.about?.pages?.length).toBe(1);
- });
-});
diff --git a/packages/plugin-pha/tests/mockConfig.mjs b/packages/plugin-pha/tests/mockConfig.mjs
deleted file mode 100644
index 01f05abbab..0000000000
--- a/packages/plugin-pha/tests/mockConfig.mjs
+++ /dev/null
@@ -1,40 +0,0 @@
-const configData = {
- home: {
- priority: 'low',
- dataPrefetch: [
- {
- api: 'test/api',
- },
- ],
- },
- about: {
- defaultFrameIndex: 0,
- queryParams: 'c=123',
- },
- 'app/nest': {
- frames: [
- 'home',
- {
- url: 'https://m.taobao.com/',
- },
- ],
- },
-};
-
-const config = new Proxy(configData, {
- get: function (obj, props) {
- if (props in obj) {
- const defaultConfig = {
- title: `title-${props.replace(/^\//, '')}`,
- };
- return () => ({
- ...defaultConfig,
- ...(obj[props] || {}),
- });
- } else {
- return undefined;
- }
- },
-});
-
-export default config;
\ No newline at end of file
diff --git a/packages/plugin-pha/tests/mockServer.mjs b/packages/plugin-pha/tests/mockServer.mjs
deleted file mode 100644
index 64123192a9..0000000000
--- a/packages/plugin-pha/tests/mockServer.mjs
+++ /dev/null
@@ -1,7 +0,0 @@
-export function renderToHTML(requestContext, documentOnly) {
- const { req } = requestContext;
- return {
- value: `${req.url}${documentOnly ? '-document' : ''}`,
- code: 200,
- };
-}
diff --git a/packages/plugin-pha/tests/route-manifest.json b/packages/plugin-pha/tests/route-manifest.json
deleted file mode 100644
index b6a2c3d50f..0000000000
--- a/packages/plugin-pha/tests/route-manifest.json
+++ /dev/null
@@ -1,14 +0,0 @@
-[
- {
- "path": "home",
- "id": "home"
- },
- {
- "path": "about",
- "id": "about"
- },
- {
- "path": "app/nest",
- "id": "app/nest"
- }
-]
\ No newline at end of file
diff --git a/packages/plugin-pha/tsconfig.json b/packages/plugin-pha/tsconfig.json
deleted file mode 100644
index 32f460e50f..0000000000
--- a/packages/plugin-pha/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- },
- "include": ["src"],
- "exclude": ["tests"]
-}
\ No newline at end of file
diff --git a/packages/plugin-pha/types.d.ts b/packages/plugin-pha/types.d.ts
deleted file mode 100644
index 8554e6cd41..0000000000
--- a/packages/plugin-pha/types.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/types';
diff --git a/packages/plugin-rax-compat/CHANGELOG.md b/packages/plugin-rax-compat/CHANGELOG.md
deleted file mode 100644
index ce0d59ef19..0000000000
--- a/packages/plugin-rax-compat/CHANGELOG.md
+++ /dev/null
@@ -1,147 +0,0 @@
-# Changelog
-
-## 0.4.0
-
-### Minor Changes
-
-- Updated dependencies [bbeeaf5d]
- - rax-compat@0.4.0
-
-## 0.3.2
-
-### Patch Changes
-
-- Updated dependencies [9926faae]
- - rax-compat@0.3.0
-
-## 0.3.1
-
-### Patch Changes
-
-- e4a32686: fix: support pass options for `compilationConfig`
-
-## 0.3.0
-
-### Minor Changes
-
-- 15e8200a: Refactor plugin and fix some issues:
-
- - The inlineStyleFilter doesnot work for server-side style process.
- - The inlineStyleFilter doesnot work for style file except vanilla css.
- - Supports sass-loader now.
- - Supports array type style in createElement.
-
-### Patch Changes
-
-- Updated dependencies [f7dd9fc5]
-- Updated dependencies [15e8200a]
-- Updated dependencies [45c61db8]
- - @ice/bundles@0.2.2
- - rax-compat@0.2.10
-
-## 0.2.10
-
-### Patch Changes
-
-- Updated dependencies [a68ff48d]
- - @ice/bundles@0.2.0
-
-## 0.2.9
-
-### Patch Changes
-
-- 4816afb5: support legacy option for legacy rax compat
-- 042b49b1: refactor: remove cloneDeep for performance
-
-## 0.2.8
-
-### Patch Changes
-
-- 47a7a25d: fix: user compilation config lose
-
-## 0.2.7
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-- Updated dependencies [b8b1d5e4]
- - rax-compat@0.2.8
- - @ice/bundles@0.1.16
-
-## 0.2.6
-
-### Patch Changes
-
-- 372699db: hotfix: less support inline style
-
-## 0.2.5
-
-### Patch Changes
-
-- 984979a3: fix inlineStyle filter function check
-
-## 0.2.4
-
-### Patch Changes
-
-- b58d38a1: inlineStyle filter support
-
-## 0.2.3
-
-### Patch Changes
-
-- dd297f96: fix: compilation config not extend
-- 7f718c5f: fix: fix Rax namespace typing compat with React v18
-- bf8af99d: remove server options setter
-
-## 0.2.2
-
-### Patch Changes
-
-- 45cb1c77: fix: auto add jsx comment
-
-## 0.2.1
-
-### Patch Changes
-
-- 65680d44: fix: support css modules and global css
-- Updated dependencies
- - @ice/bundles@0.1.10
- - rax-compat@0.2.1
-
-## 0.2.0
-
-### Minor Changes
-
-- 2debc7f7: fix: appear event should not work on component
-- Updated dependencies [ee4141d5]
- - rax-compat@0.2.0
- - @ice/bundles@0.1.7
-
-## 0.1.5
-
-### Patch Changes
-
-- 0fb80639: fix: improve performance by use async function
-- Updated dependencies
- - @ice/bundles@0.1.6
- - rax-compat@0.1.9
-
-## 0.1.4
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-- efba0cc4: fix: Using runtime: 'classic' mode when source has declare `@jsx createElement` comment
-- Updated dependencies [03acb898]
-- Updated dependencies [1e992472]
- - rax-compat@0.1.8
- - @ice/bundles@0.1.5
-
-## 0.1.3
-
-- [refactor] Using rax-compat/jsx-runtime to support rax components
-
-## 0.1.2
-
-- [fix] get css path by onLoad lifecycle.
diff --git a/packages/plugin-rax-compat/README.md b/packages/plugin-rax-compat/README.md
deleted file mode 100644
index d6221a93c0..0000000000
--- a/packages/plugin-rax-compat/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# @ice/plugin-rax-compat
-
-An ice.js plugin for migrating `rax-app` projects.
-
-## Usage
-
-Add plugin in `ice.config.mts`:
-
-```js
-import { defineConfig } from 'ice';
-import compatRax from '@ice/plugin-rax-compat';
-
-export default defineConfig(() => ({
- plugins: [compatRax({ /* options */ })],
-}));
-```
-
-## Options
-
-### `inlineStyle`
-
-- Default: `false`.
-- Enable stylesheet loader to import CSS files.
-
-### `cssModule`
-
-- Default: `true`
-- When `inlineStyle` enabled and `cssModule` disabled, process CSS Module files to inline included styles(not recommended).
-
-### `legacy`
-
-- Default: `false`
-- Enable legacy way to import rax as namespace, like `v0.6`:
-
-```typescript
-import Rax from 'rax';
-
-Rax.createContext();
-```
-
-## 说明
-
-这个插件将会处理这些兼容逻辑:
-
-- 类型定义,Rax 中的类型定义来自于 React 16.8 前,与 React 18 的类型定义存在一些差异。
- - 这个插件会新增一个对 Rax namespace 进行声明的 .d.ts 文件,内部使用 React 类型定义来进行声明。
-
-- 别名,将组成 rax 核心逻辑的 rax- 包,如 rax-children 等,映射到 rax-compat 的内部实现。
-
- - 同时,在启用 legacy 模式时,会将 rax 映射到 rax-compat-legacy-exports.ts,此文件支持了 Rax.createContext 这样的使用方式(Rax v0.6.x)。
-
-- JSX,插件内部将基于源码类型来调整 swc 的编译配置。
-
- - 在源码中使用了 `@jsx createElement` annotation 时,将设置 jsx runtime 为 classic。
- - 在源码导入了 rax 包时,将设置 importSource 为 rax-compat/runtime(与 React 18 保持一致)。
-
-- 样式,在启用 inlineStyle 时,插件内部将额外处理行内样式逻辑。
-
- - 首先,JSXClassNameTransformer 会将源码中的 `
` 的写法转换为 `
`。
- - 注意,只有项目源码内的代码才会被转换。
-
- - 注意,`
` 这样的写法不会被转换。
-
- - 注意,`import './x.module.css'` 这样的写法不会被转换。
-
- - 接着,在 ClientSide,插件会覆盖原本的 Webpack Ruleset:
-
- - 对于命中了 inlineStyle 的资源文件,会使用 stylesheet-loader 进行处理为 styleSheet 对象(非 css 文件还会先交由预处理器编译)。其它文件会保持原本的处理逻辑,即处理到额外的 CSS 文件中。
- - 注意,目前在 --speedup 下此逻辑无法生效。
- - 注意,如果禁用了 cssModule ,那么 .module.css(less/...) 文件也会被交由 stylesheet-loader 处理。
-
-- 在 ServerSide,对命中了 inlineStyle 的资源文件,会使用 esbuild 进行处理为 styleSheet 对象(文件的类型会被改变为 JS 文件)。
-
-关于行内样式的额外说明:
-
-- 只有项目源码中使用了 `className="xxx"` 的写法,才会被转换为 `style={styleSheet.xxx}` 的写法,因此 CSS Module 使用的 `className={styles.xxx}` 这种写法也不会被转换。另外,来自 node_modules 的代码不会被转换。
diff --git a/packages/plugin-rax-compat/package.json b/packages/plugin-rax-compat/package.json
deleted file mode 100644
index f465b9a044..0000000000
--- a/packages/plugin-rax-compat/package.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "name": "@ice/plugin-rax-compat",
- "version": "0.4.0",
- "description": "Provide rax compat support for ice.js",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./*": "./*"
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map"
- ],
- "dependencies": {
- "@babel/core": "^7.0.0",
- "@babel/plugin-proposal-export-default-from": "^7.18.9",
- "@ice/bundles": "^0.2.2",
- "babel-plugin-transform-jsx-stylesheet": "1.0.6",
- "consola": "^2.15.3",
- "css": "^2.2.1",
- "lodash-es": "^4.17.21",
- "rax-compat": "^0.4.0",
- "style-unit": "^3.0.5",
- "stylesheet-loader": "^0.9.1"
- },
- "devDependencies": {
- "@ice/app": "^3.4.10",
- "@types/lodash-es": "^4.17.7",
- "webpack": "^5.88.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-rax-compat"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "copy": "cp -R src/templates esm/templates",
- "build": "tsc && npm run copy"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-rax-compat/src/index.ts b/packages/plugin-rax-compat/src/index.ts
deleted file mode 100644
index 1c258e2645..0000000000
--- a/packages/plugin-rax-compat/src/index.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-import type { NormalizedRaxCompatPluginOptions, RaxCompatPluginOptions } from './typings';
-
-import { AliasService } from './services/alias.js';
-import { StyleService } from './services/styles/index.js';
-import { JSXService } from './services/jsx.js';
-import { TypingsService } from './services/typings.js';
-
-const normalizeOptions = (options?: RaxCompatPluginOptions): NormalizedRaxCompatPluginOptions => {
- const { inlineStyle = false, cssModule = true, legacy = false } = options ?? {};
-
- return {
- inlineStyle,
- cssModule,
- legacy,
- };
-};
-
-const RaxCompatPlugin: Plugin = (options?: RaxCompatPluginOptions) => {
- return {
- name: '@ice/plugin-rax-compat',
- setup: (api) => {
- const normalizedOptions = normalizeOptions(options);
-
- TypingsService.provide(api, normalizedOptions);
- AliasService.provide(api, normalizedOptions);
- JSXService.provide(api, normalizedOptions);
- StyleService.provide(api, normalizedOptions);
- },
- };
-};
-
-export default RaxCompatPlugin;
diff --git a/packages/plugin-rax-compat/src/lib/transform-styles.ts b/packages/plugin-rax-compat/src/lib/transform-styles.ts
deleted file mode 100644
index 55fdacdf95..0000000000
--- a/packages/plugin-rax-compat/src/lib/transform-styles.ts
+++ /dev/null
@@ -1,230 +0,0 @@
-import path from 'path';
-import { createRequire } from 'module';
-import css from 'css';
-import transformerModule from 'stylesheet-loader/lib/transformer.js';
-import globalCSSVariable from 'stylesheet-loader/lib/globalCSSVariable.js';
-import { getErrorMessages, getWarnMessages, resetMessage } from 'stylesheet-loader/lib/promptMessage.js';
-import { isPrefersColorScheme, processPrefersColorScheme } from 'stylesheet-loader/lib/processPrefersColorScheme.js';
-import { less, postcss, sass } from '@ice/bundles';
-
-import type { StyleKind } from '../typings';
-
-const require = createRequire(import.meta.url);
-
-const RULE = 'rule';
-const FONT_FACE_RULE = 'font-face';
-const MEDIA_RULE = 'media';
-const QUOTES_REG = /['|"]/g;
-// example "color: var(--name);" search string "var(" and ")"
-const VAR_KEY_VAL_REG = /"(.*?)"\s*:\s*"var\((.*)\)"/g;
-const GLOBAL_CSS_VAR = '__CSSVariables';
-const CSS_VAR_NAME = ':root';
-
-// @ts-ignore
-const transformer = transformerModule.default;
-
-async function styleSheetLoader(source: string, sourcePath: string, type: StyleKind = 'css') {
- let cssContent = source;
- if (type === 'less') {
- // compact for @import "http://github.com/~bootstrap/less/bootstrap";
- cssContent = cssContent.replace(/@import "http://github.com/~/g,'@import "');
- cssContent = (
- await less.render(cssContent, {
- // For relative @import path
- paths: [path.dirname(sourcePath), 'node_modules'],
- })
- ).css;
- }
-
- if (type === 'sass' || type === 'scss') {
- cssContent = (
- await sass.compileStringAsync(cssContent, {
- // For relative @import path
- url: new URL(`file://${sourcePath}`),
- })
- ).css;
- }
-
- const newContent = await postcss([
- require('@ice/bundles/compiled/postcss-plugin-rpx2vw/index.js')({
- unitPrecision: 4,
- }),
- ]).process(cssContent).css;
- const { stylesheet } = css.parse(newContent);
-
- if (stylesheet?.parsingErrors?.length) {
- throw new Error('StyleSheet Parsing Error occurred.');
- }
-
- // getOptions can return null if no query passed.
- const parsedQuery = {};
-
- const parsedData = parse(parsedQuery, stylesheet);
-
- return genStyleContent(parsedData, parsedQuery);
-}
-
-// export for test case
-const parse = (parsedQuery, stylesheet) => {
- const styles = {};
- const fontFaceRules: any[] = [];
- const mediaRules: any[] = [];
- const { transformDescendantCombinator } = parsedQuery;
-
- stylesheet.rules.forEach((rule) => {
- let style = {};
-
- // normal rule
- if (rule.type === RULE) {
- style = transformer.convert(rule, parsedQuery);
-
- rule.selectors.forEach((selector) => {
- let sanitizedSelector = transformer.sanitizeSelector(
- selector,
- transformDescendantCombinator,
- rule.position,
- parsedQuery.log,
- );
- if (sanitizedSelector) {
- // handle pseudo class
- const pseudoIndex = sanitizedSelector.indexOf(':');
- if (pseudoIndex > -1 && !parsedQuery.theme) {
- const pseudoStyle = {};
- const pseudoName = selector.slice(pseudoIndex + 1);
- sanitizedSelector = sanitizedSelector.slice(0, pseudoIndex);
-
- Object.keys(style).forEach((prop) => {
- pseudoStyle[prop + pseudoName] = style[prop];
- });
-
- style = pseudoStyle;
- }
- // eslint-disable-next-line eqeqeq
- if (sanitizedSelector == CSS_VAR_NAME && parsedQuery.theme) {
- sanitizedSelector = GLOBAL_CSS_VAR;
- }
-
- styles[sanitizedSelector] = Object.assign(styles[sanitizedSelector] || {}, style);
- }
- });
- }
-
- // font face rule
- if (rule.type === FONT_FACE_RULE) {
- const font = {};
- rule.declarations.forEach((declaration) => {
- font[declaration.property] = declaration.value;
- });
- fontFaceRules.push(font);
- }
-
- // media rule
- if (rule.type === MEDIA_RULE) {
- mediaRules.push({
- key: rule.media,
- data: parse(parsedQuery, rule).styles,
- });
- }
- });
-
- return {
- styles,
- fontFaceRules,
- mediaRules,
- };
-};
-
-const genStyleContent = (parsedData, parsedQuery) => {
- const { fontFaceRules, mediaRules } = parsedData;
- const styles = processPrefersColorScheme(mediaRules, parsedData.styles, parsedQuery.taskName);
-
- const fontFaceContent = getFontFaceContent(fontFaceRules);
- const mediaContent = getMediaContent(mediaRules, parsedQuery);
- const warnMessageOutput = parsedQuery.log ? getWarnMessageOutput() : '';
- resetMessage();
- return `${parsedQuery.theme ? globalCSSVariable({ styles, globalCSSVarName: GLOBAL_CSS_VAR }) : ''}
- var _styles = ${stringifyData(styles, parsedQuery.theme)};
-${fontFaceContent}
-${mediaContent}
-${warnMessageOutput}
- module.exports = _styles;
- `;
-};
-
-const getWarnMessageOutput = () => {
- const errorMessages = getErrorMessages();
- const warnMessages = getWarnMessages();
- let output = '';
-
- if (errorMessages) {
- output += `
- if (process.env.NODE_ENV !== 'production') {
- console.error('${errorMessages}');
- }
- `;
- }
- if (warnMessages) {
- output += `
- if (process.env.NODE_ENV !== 'production') {
- console.warn('${warnMessages}');
- }
- `;
- }
-
- return output;
-};
-
-const getMediaContent = (mediaRules, parsedQuery) => {
- let content = '';
-
- mediaRules.forEach((rule) => {
- // Weex no need to process prefers-color-scheme media
- if (parsedQuery.taskName !== 'weex' || !isPrefersColorScheme(rule.key)) {
- content += `
- if (window.matchMedia && window.matchMedia('${rule.key}').matches) {
- var ruleData = ${stringifyData(rule.data)};
- for(var key in ruleData) {
- _styles[key] = Object.assign(_styles[key] || {}, ruleData[key]);
- }
- }
- `;
- }
- });
-
- return content;
-};
-
-// export for test case
-const getFontFaceContent = (rules) => {
- let content = '';
-
- if (rules.length > 0) {
- content += `
- if (typeof FontFace === 'function') {
- `;
- }
-
- rules.forEach((rule, index) => {
- content += `
- var fontFace${index} = new FontFace('${rule['font-family'].replace(QUOTES_REG, '')}', '${rule.src.replace(
- QUOTES_REG,
- '"',
- )}');
- document.fonts.add(fontFace${index});
- `;
- });
-
- if (rules.length > 0) {
- content += `
- }
- `;
- }
- return content;
-};
-
-const stringifyData = (data, theme?: string) => {
- const str = JSON.stringify(data, undefined, ' ');
- return theme ? str.replace(VAR_KEY_VAL_REG, 'get $1(){return __getValue("$2")}') : str;
-};
-
-export default styleSheetLoader;
diff --git a/packages/plugin-rax-compat/src/services/alias.ts b/packages/plugin-rax-compat/src/services/alias.ts
deleted file mode 100644
index 87498f3545..0000000000
--- a/packages/plugin-rax-compat/src/services/alias.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import path from 'path';
-import { createRequire } from 'module';
-
-import type { NormalizedRaxCompatPluginOptions, PluginAPI } from '../typings';
-
-const require = createRequire(import.meta.url);
-
-export class AliasService {
- public static AliasRegistry: Record = {
- rax: require.resolve('rax-compat'),
- 'rax-children': require.resolve('rax-compat/children'),
- 'rax-clone-element': require.resolve('rax-compat/clone-element'),
- 'rax-create-class': require.resolve('rax-compat/create-class'),
- 'rax-create-factory': require.resolve('rax-compat/create-factory'),
- 'rax-create-portal': require.resolve('rax-compat/create-portal'),
- 'rax-find-dom-node': require.resolve('rax-compat/find-dom-node'),
- 'rax-is-valid-element': require.resolve('rax-compat/is-valid-element'),
- 'rax-unmount-component-at-node': require.resolve('rax-compat/unmount-component-at-node'),
- 'rax-compat/runtime/jsx-dev-runtime': require.resolve('rax-compat/runtime/jsx-dev-runtime'),
- 'rax-compat/runtime/jsx-runtime': require.resolve('rax-compat/runtime/jsx-runtime'),
- };
-
- public static provide(api: PluginAPI, options: NormalizedRaxCompatPluginOptions) {
- const logger = api.createLogger('rax-compat-plugin:alias');
-
- if (options.legacy) {
- logger.warn('Legacy mode should only be used for compatibility with rax v0.6.x.');
-
- const legacyEntryFile = 'rax-compat-legacy-exports.ts';
-
- // Create .ice/rax-compat-legacy-exports.ts as rax entry in legacy mode.
- api.generator.addRenderFile(
- path.join(__dirname, '../templates', `${legacyEntryFile}.template`),
- legacyEntryFile,
- {},
- );
-
- // Update alias to use rax-compat-legacy-exports.ts as rax entry.
- AliasService.AliasRegistry.rax = path.join(api.context.rootDir, '.ice', legacyEntryFile);
- }
-
- api.onGetConfig((config) => {
- config.alias ??= {};
-
- Object.assign(config.alias, AliasService.AliasRegistry);
- });
- }
-}
diff --git a/packages/plugin-rax-compat/src/services/jsx.ts b/packages/plugin-rax-compat/src/services/jsx.ts
deleted file mode 100644
index 9bf15f7098..0000000000
--- a/packages/plugin-rax-compat/src/services/jsx.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { merge, cloneDeep } from 'lodash-es';
-
-import type { NormalizedRaxCompatPluginOptions, PluginAPI } from '../typings';
-
-export class JSXService {
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- public static provide(api: PluginAPI, options: NormalizedRaxCompatPluginOptions) {
- api.onGetConfig((config) => {
- const originalSwcCompilationConfig =
- typeof config.swcOptions?.compilationConfig === 'object' ? cloneDeep(config.swcOptions.compilationConfig) : {};
-
- const originalSwcCompilationConfigFunc =
- typeof config.swcOptions?.compilationConfig === 'function'
- ? config.swcOptions.compilationConfig
- : () => originalSwcCompilationConfig;
-
- // Reset jsc.transform.react.runtime to classic.
- config.swcOptions = merge(config.swcOptions || {}, {
- compilationConfig: (source: string, id: string, compileOptions) => {
- let swcCompilationConfig = {};
- const hasJSXComment = source.indexOf('@jsx createElement') !== -1;
- const isRaxComponent = /(from|require\()\s*['"]rax['"]/.test(source);
-
- if (hasJSXComment) {
- swcCompilationConfig = {
- jsc: {
- transform: {
- react: {
- runtime: 'classic',
- },
- },
- },
- };
- } else if (isRaxComponent) {
- swcCompilationConfig = {
- jsc: {
- transform: {
- react: {
- importSource: 'rax-compat/runtime',
- },
- },
- },
- };
- }
-
- return merge({}, originalSwcCompilationConfigFunc(source, id, compileOptions), swcCompilationConfig);
- },
- });
- });
- }
-}
diff --git a/packages/plugin-rax-compat/src/services/styles/applyClientSideProcessor.ts b/packages/plugin-rax-compat/src/services/styles/applyClientSideProcessor.ts
deleted file mode 100644
index 89d235351f..0000000000
--- a/packages/plugin-rax-compat/src/services/styles/applyClientSideProcessor.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-import { createRequire } from 'module';
-
-import type { RuleSetRule } from 'webpack';
-import type { NormalizedRaxCompatPluginOptions, PluginAPI, StyleKind, WebpackConfiguration } from '../../typings';
-
-import { checkInlineStyleEnable } from '../../utils.js';
-
-const require = createRequire(import.meta.url);
-
-const stylesheetLoaderConfig = {
- loader: require.resolve('stylesheet-loader'),
- options: {},
-};
-
-const ruleSetStylesheet: RuleSetRule = {
- test: /\.css$/i,
- use: [stylesheetLoaderConfig],
-};
-
-const ruleSetStylesheetForLess: RuleSetRule = {
- test: /\.less$/i,
- use: [
- stylesheetLoaderConfig,
- {
- loader: require.resolve('@ice/bundles/compiled/less-loader'),
- options: {
- lessOptions: { javascriptEnabled: true },
- },
- },
- ],
-};
-
-const ruleSetStylesheetForSass: RuleSetRule = {
- test: /\.(scss|sass)$/i,
- use: [
- stylesheetLoaderConfig,
- {
- loader: require.resolve('@ice/bundles/compiled/sass-loader'),
- options: {},
- },
- ],
-};
-
-const styleRuleSet: Record = {
- css: ruleSetStylesheet,
- less: ruleSetStylesheetForLess,
- sass: ruleSetStylesheetForSass,
- scss: ruleSetStylesheetForSass,
-};
-
-const createStyleRuleSet = (ruleSet: RuleSetRule, styleKind: StyleKind, options: NormalizedRaxCompatPluginOptions) => {
- ruleSet.test = (id: string) => {
- // Is inlineStyle enabled for current file(completely or filter match)
- const inlineStyleEnabled = checkInlineStyleEnable(id, options.inlineStyle);
-
- /**
- * Should use common style loader for current file.
- *
- * 1. If cssModule enabled(by default), *.module.css file and *.global.css file
- * will be handled by common style loader.
- * 2. If cssModule disabled, only *.global.css file will be handled by common style loader,
- * the css module file will also be handled by stylesheet loader.
- */
- const commonStyleResourceMatcher = new RegExp(
- options.cssModule ? `(\\.module|global)\\.${styleKind}$` : `(\\.global)\\.${styleKind}$`,
- 'i',
- );
-
- // NOTE: The matched file will be handled by external stylesheet loader.
- const useCommonStyleLoader = commonStyleResourceMatcher.test(id) || !inlineStyleEnabled;
-
- return useCommonStyleLoader;
- };
-
- return {
- test: new RegExp(`\\.${styleKind}$`, 'i'),
- oneOf: [ruleSet, styleRuleSet[styleKind]],
- };
-};
-
-const isValidRuleSet = (ruleSet: any, sourceMatcher: string): ruleSet is NonNullable => {
- return Boolean(
- ruleSet &&
- typeof ruleSet === 'object' &&
- ruleSet.test &&
- ruleSet.test instanceof RegExp &&
- ruleSet.test.source.indexOf(sourceMatcher) > -1,
- );
-};
-
-const StyleSheetClientHandler = (api: PluginAPI, options: NormalizedRaxCompatPluginOptions): WebpackConfiguration => {
- return (config) => {
- const { rules } = config.module || {};
-
- if (!Array.isArray(rules)) return config;
-
- for (let i = 0, l = rules.length; i < l; i++) {
- const rule = rules[i];
-
- for (const styleKind of Object.keys(styleRuleSet)) {
- // Find matched rule set and inject stylesheet loader.
- if (isValidRuleSet(rule, `.${styleKind}`)) {
- rules[i] = createStyleRuleSet(rule, styleKind as StyleKind, options);
- }
- }
- }
-
- return config;
- };
-};
-
-export const applyClientSideStyleProcessor = (api: PluginAPI, options: NormalizedRaxCompatPluginOptions) => {
- api.onGetConfig((config) => {
- config.configureWebpack ??= [];
-
- config.configureWebpack.push(StyleSheetClientHandler(api, options));
- });
-};
diff --git a/packages/plugin-rax-compat/src/services/styles/applyJSXClassNameTransormer.ts b/packages/plugin-rax-compat/src/services/styles/applyJSXClassNameTransormer.ts
deleted file mode 100644
index 36c6f86a2c..0000000000
--- a/packages/plugin-rax-compat/src/services/styles/applyJSXClassNameTransormer.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { createRequire } from 'module';
-
-import { transformSync } from '@babel/core';
-
-import { checkInlineStyleEnable } from '../../utils.js';
-
-import type { NormalizedRaxCompatPluginOptions, PluginAPI, Transformer } from '../../typings';
-
-const require = createRequire(import.meta.url);
-
-const JSXClassNameToStyleTransformer = (api: PluginAPI, options: NormalizedRaxCompatPluginOptions): Transformer => {
- const { exportDefaultFrom } = api.context?.userConfig?.syntaxFeatures ?? {};
-
- const plugins: (string | [string, object])[] = [
- [
- require.resolve('babel-plugin-transform-jsx-stylesheet'),
- {
- retainClassName: true,
- forceEnableCSS: true,
- },
- ],
- ];
-
- if (exportDefaultFrom) {
- plugins.push(require.resolve('@babel/plugin-proposal-export-default-from'));
- }
-
- return async (sourceCode, id) => {
- // js file transform with rax-platform-loader and babel-plugin-transform-jsx-stylesheet
- if (id.includes('node_modules') || id.includes('react')) {
- return;
- }
-
- if (/\.(jsx?|tsx?|mjs)$/.test(id) === false) {
- return;
- }
-
- if (checkInlineStyleEnable(id, options.inlineStyle) === false) return;
-
- const parserPlugins = ['jsx', 'importMeta', 'topLevelAwait', 'classProperties', 'classPrivateMethods'];
-
- if (/\.tsx?$/.test(id)) {
- // When routes file is a typescript file, add ts parser plugins
- parserPlugins.push('typescript');
- parserPlugins.push('decorators-legacy');
- }
-
- const { code, map } = transformSync(sourceCode, {
- babelrc: false,
- configFile: false,
- filename: id,
- parserOpts: {
- sourceType: 'module',
- allowAwaitOutsideFunction: true,
- plugins: parserPlugins,
- },
- generatorOpts: {
- decoratorsBeforeExport: true,
- },
- sourceFileName: id,
- plugins,
- });
-
- return {
- code,
- map,
- };
- };
-};
-
-export const applyJSXClassNameTransformer = (api: PluginAPI, options: NormalizedRaxCompatPluginOptions) => {
- api.onGetConfig((config) => {
- config.transforms ??= [];
- config.transforms.push(JSXClassNameToStyleTransformer(api, options));
- });
-};
diff --git a/packages/plugin-rax-compat/src/services/styles/applyServerSideProcessor.ts b/packages/plugin-rax-compat/src/services/styles/applyServerSideProcessor.ts
deleted file mode 100644
index f3e25942f4..0000000000
--- a/packages/plugin-rax-compat/src/services/styles/applyServerSideProcessor.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import fs from 'fs';
-
-import styleSheetLoader from '../../lib/transform-styles.js';
-
-import { checkInlineStyleEnable, checkStyleKind } from '../../utils.js';
-
-import type { ESBuildPlugin, NormalizedRaxCompatPluginOptions, PluginAPI } from '../../typings';
-
-const ESBuildInlineStylePlugin = (options: NormalizedRaxCompatPluginOptions): ESBuildPlugin => {
- return {
- name: 'esbuild-inline-style',
- setup: (build) => {
- build.onLoad({ filter: /\.(css|sass|scss|less)$/ }, async (args) => {
- if (checkInlineStyleEnable(args.path, options.inlineStyle) === false) {
- return null;
- }
-
- const cssContent = await fs.promises.readFile(args.path, 'utf8');
- const content = await styleSheetLoader(cssContent, args.path, checkStyleKind(args.path));
-
- return {
- contents: content,
- loader: 'js',
- };
- });
- },
- };
-};
-
-export const applyServerSideStyleProcessor = (api: PluginAPI, options: NormalizedRaxCompatPluginOptions) => {
- const { userConfig } = api.context;
-
- if (!userConfig.ssr && !userConfig.ssg) {
- return;
- }
-
- api.onGetConfig((config) => {
- config.server ??= {};
- const previousBuildOptions = config.server.buildOptions;
- config.server.buildOptions = (buildOptions) => {
- const currentOptions = previousBuildOptions?.(buildOptions) ?? buildOptions ?? {};
-
- // Remove esbuild-empty-css while use inline style.
- currentOptions.plugins = currentOptions.plugins?.filter(({ name }) => name !== 'esbuild-empty-css');
-
- const cssModuleIndex = currentOptions.plugins?.findIndex(({ name }) => name === 'esbuild-css-modules') as number;
-
- // Add custom transform for server compile.
- currentOptions.plugins?.splice(
- options.cssModule ? cssModuleIndex + 1 : cssModuleIndex,
- 0,
- ESBuildInlineStylePlugin(options),
- );
-
- currentOptions.treeShaking = true;
- return currentOptions;
- };
- });
-};
diff --git a/packages/plugin-rax-compat/src/services/styles/index.ts b/packages/plugin-rax-compat/src/services/styles/index.ts
deleted file mode 100644
index c7f5df5ec3..0000000000
--- a/packages/plugin-rax-compat/src/services/styles/index.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import chalk from 'chalk';
-
-import type { NormalizedRaxCompatPluginOptions, PluginAPI } from '../../typings';
-
-import { applyClientSideStyleProcessor } from './applyClientSideProcessor.js';
-import { applyJSXClassNameTransformer } from './applyJSXClassNameTransormer.js';
-import { applyServerSideStyleProcessor } from './applyServerSideProcessor.js';
-
-/**
- * Handle inline style related.
- */
-export class StyleService {
- private static inlineStyleWarnOnce = false;
-
- public static provide(api: PluginAPI, options: NormalizedRaxCompatPluginOptions) {
- if (!options.inlineStyle) return;
-
- const logger = api.createLogger('rax-compat-plugin:style');
-
- if (!StyleService.inlineStyleWarnOnce && options.inlineStyle === true) {
- logger.warn(`通常情况下你不应该全量启用内联样式。请考虑使用函数式的写法来控制内联样式的影响范围:
- ${chalk.green("inlineStyle: (id) => id.includes('inline-style-module')")}`);
- StyleService.inlineStyleWarnOnce = true;
- }
-
- applyJSXClassNameTransformer(api, options);
-
- applyClientSideStyleProcessor(api, options);
- applyServerSideStyleProcessor(api, options);
- }
-}
diff --git a/packages/plugin-rax-compat/src/services/typings.ts b/packages/plugin-rax-compat/src/services/typings.ts
deleted file mode 100644
index 5a958bc69b..0000000000
--- a/packages/plugin-rax-compat/src/services/typings.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import path from 'path';
-import { fileURLToPath } from 'url';
-
-import type { NormalizedRaxCompatPluginOptions, PluginAPI } from '../typings';
-
-const dirname = path.dirname(fileURLToPath(import.meta.url));
-
-export class TypingsService {
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- public static provide(api: PluginAPI, options: NormalizedRaxCompatPluginOptions) {
- api.generator.addRenderFile(path.join(dirname, '../templates/rax-compat.d.ts'), 'rax-compat.d.ts', {});
-
- api.generator.addExport({
- // Avoid value import to cause Webpack compilation error:
- // 'Export assignment cannot be used when targeting ECMAScript modules.'
- specifier: ['type __UNUSED_TYPE_FOR_IMPORT_EFFECT_ONLY__'],
- source: './rax-compat.d',
- type: false,
- });
- }
-}
diff --git a/packages/plugin-rax-compat/src/templates/rax-compat-legacy-exports.ts.template b/packages/plugin-rax-compat/src/templates/rax-compat-legacy-exports.ts.template
deleted file mode 100644
index 71aef0c34c..0000000000
--- a/packages/plugin-rax-compat/src/templates/rax-compat-legacy-exports.ts.template
+++ /dev/null
@@ -1,28 +0,0 @@
-import * as rax from 'rax-compat';
-
-// For namespace / named import usage(v1.0)
-export * from 'rax-compat';
-
-// For legacy default import usage(v0.6+) like: import Rax from 'rax'
-export default { ...rax }
-
-const typeChecker = () => {};
-
-export const PropTypes = {
- array: typeChecker,
- bool: typeChecker,
- func: typeChecker,
- number: typeChecker,
- object: typeChecker,
- string: typeChecker,
- symbol: typeChecker,
- element: typeChecker,
- node: typeChecker,
- any: typeChecker,
- arrayOf: typeChecker,
- instanceOf: typeChecker,
- objectOf: typeChecker,
- oneOf: typeChecker,
- oneOfType: typeChecker,
- shape: typeChecker,
-};
diff --git a/packages/plugin-rax-compat/src/templates/rax-compat.d.ts b/packages/plugin-rax-compat/src/templates/rax-compat.d.ts
deleted file mode 100644
index dbf028122b..0000000000
--- a/packages/plugin-rax-compat/src/templates/rax-compat.d.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-// @ts-nocheck
-/* eslint-disable */
-import type * as React from 'react';
-
-/**
- * typing overrides from commits below(@types/react since v17):
- *
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/443451ccc5db3adf1865853e152636f1a9ba5dd5
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/b57d67064938d173fa950cd519524445d20d2ef7#diff-32cfd8cb197872bcba371f5018185d2e75fa540b52cda2dd7d8ac12dcc021299
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/220087807a5746367416c2a3ef87c17d7344f22f
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/89596431d2bf885a298b369e6e53d7ede6db72fa#diff-32cfd8cb197872bcba371f5018185d2e75fa540b52cda2dd7d8ac12dcc021299
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/55dc209ceb6dbcd59c4c68cc8dfb77faadd9de12#diff-32cfd8cb197872bcba371f5018185d2e75fa540b52cda2dd7d8ac12dcc021299
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/afd309b4193c1f448386bf8fe09e512e4422e69e
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/14f568cded146f89864a06da1884364bd4e6ced0
- * https://github.com/DefinitelyTyped/DefinitelyTyped/commit/684c905d533f1a4f5a62edf9011d5eca5a9458a6
- */
-declare namespace Rax {
- export type FC = React.FunctionComponent
;
- export type ForwardRefRenderFunction<
- T,
- P = {}
- > = React.ForwardRefRenderFunction
;
- export type VoidFunctionComponent
= React.VoidFunctionComponent
;
- export type ForwardRefExoticComponent
= React.ForwardRefExoticComponent
-
- export type JSXElementConstructor
=
- | ((
- props: P,
- /**
- * @deprecated https://legacy.reactjs.org/docs/legacy-context.html#referencing-context-in-stateless-function-components
- */
- deprecatedLegacyContext?: any
- ) => React.ReactNode)
- | (new (props: P) => React.Component);
-
- export type RaxNode = React.ReactNode;
-
- // Omit would not be sufficient for this. We'd like to avoid unnecessary mapping and need a distributive conditional to support unions.
- export type PropsWithoutRef = React.PropsWithoutRef
;
-
- export type PropsWithChildren
= React.PropsWithChildren
;
-
- export type RaxFragment = React.ReactFragment;
-
- export type ComponentPropsWithRef =
- React.ComponentPropsWithRef;
-
- export type DependencyList = React.DependencyList;
-
- export type RaxNodeArray = React.ReactNodeArray;
-
- export type RaxChildren = React.ReactChildren;
-}
-export = Rax;
-export as namespace Rax;
-
-export type __UNUSED_TYPE_FOR_IMPORT_EFFECT_ONLY__ = unknown;
diff --git a/packages/plugin-rax-compat/src/typings.ts b/packages/plugin-rax-compat/src/typings.ts
deleted file mode 100644
index 8344b4bffd..0000000000
--- a/packages/plugin-rax-compat/src/typings.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import type { PluginData } from '@ice/app/types';
-
-export type PluginAPI = Parameters[0];
-
-export type OnGetConfigInput = Parameters[0]>[0];
-
-export type ConfigServer = NonNullable;
-
-export type ConfigServerBuildOptions = ReturnType>;
-
-export type ESBuildPlugin = NonNullable[number];
-
-export type Transformer = NonNullable[number];
-
-export type WebpackConfiguration = NonNullable['configureWebpack']>[number];
-
-export type StyleKind = 'css' | 'less' | 'sass' | 'scss';
-
-export interface RaxCompatPluginOptions {
- /**
- * Enable inline style transform.
- *
- * @default false
- *
- * @example
- * ```js
- * inlineStyle: true;
- * inlineStyle: (id) => id.includes('feeds_module');
- * ```
- */
- inlineStyle?: boolean | ((id: string) => boolean);
- /**
- * Enable css module transform.
- *
- * @default true
- */
- cssModule?: boolean;
- /**
- * Compat for legacy rax version(`v 0.6.x`), add `PropTypes` as exports.
- *
- * @default false
- */
- legacy?: boolean;
-}
-
-export type NormalizedRaxCompatPluginOptions = Required;
diff --git a/packages/plugin-rax-compat/src/utils.ts b/packages/plugin-rax-compat/src/utils.ts
deleted file mode 100644
index 3a11bc4ec6..0000000000
--- a/packages/plugin-rax-compat/src/utils.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import type { NormalizedRaxCompatPluginOptions, StyleKind } from './typings';
-
-export const checkInlineStyleEnable = (
- id: string,
- inlineStyleFiler: NormalizedRaxCompatPluginOptions['inlineStyle'],
-) => {
- return typeof inlineStyleFiler === 'function' ? inlineStyleFiler(id) : inlineStyleFiler;
-};
-
-export const checkInlineStyleDisable = (
- id: string,
- inlineStyleFiler: NormalizedRaxCompatPluginOptions['inlineStyle'],
-) => {
- return typeof inlineStyleFiler === 'function' ? inlineStyleFiler(id) : inlineStyleFiler;
-};
-
-export const checkStyleKind = (path: string): StyleKind => {
- if (path.endsWith('.less')) {
- return 'less';
- }
-
- if (path.endsWith('.sass') || path.includes('.scss')) {
- return 'sass';
- }
-
- return 'css';
-};
diff --git a/packages/plugin-rax-compat/tsconfig.json b/packages/plugin-rax-compat/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-rax-compat/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-request/CHANGELOG.md b/packages/plugin-request/CHANGELOG.md
deleted file mode 100644
index 8917339495..0000000000
--- a/packages/plugin-request/CHANGELOG.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# CHANGELOG
-
-## 1.0.3
-
-### Patch Changes
-
-- 570205a8: chore: fix the default type of TParams
-
-## 1.0.2
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 1.0.1
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-- dae91e21: fix: request and useRequest type
- fix: useRequest usage
-
-## 1.0.0
-
-- The initial version of the plugin.
diff --git a/packages/plugin-request/README.md b/packages/plugin-request/README.md
deleted file mode 100644
index c24db7784e..0000000000
--- a/packages/plugin-request/README.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# @ice/plugin-request
-
-Provides a unified request method for ice.js projects.
-
-## Usage
-
-```bash
-$ npm i @ice/plugin-request -S
-```
-
-Add plugin.
-
-```js title="ice.config.mts"
-import { defineConfig } from '@ice/app';
-import request from '@ice/plugin-request';
-
-export default defineConfig(() => ({
- plugins: [
- request(),
- ],
-}));
-```
-
-## API
-
-### request
-
-```js title="service.ts"
-import { request } from 'ice';
-
-export async function getUser(id) {
- return await request(`/api/user/${id}`);
-}
-```
-
-### useRequest
-
-```js title="home.tsx"
-import { useEffect } from 'react';
-import { useRequest } from 'ice';
-
-export default function Home() {
- const {
- data,
- error,
- loading,
- request
- } = useRequest(service.getUser);
-
- useEffect(() => {
- request();
- }, []);
-
- if (error) {
- return failed to load
;
- }
- if (!data || loading) {
- return loading...
;
- }
- return (
-
- Name: {data.name} Age: {data.age}
-
- );
-}
-```
diff --git a/packages/plugin-request/hooks.d.ts b/packages/plugin-request/hooks.d.ts
deleted file mode 100644
index 82f45d2ab4..0000000000
--- a/packages/plugin-request/hooks.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/hooks';
\ No newline at end of file
diff --git a/packages/plugin-request/package.json b/packages/plugin-request/package.json
deleted file mode 100644
index 067ce807e4..0000000000
--- a/packages/plugin-request/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "name": "@ice/plugin-request",
- "version": "1.0.3",
- "description": "Request plugin for ice.",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./runtime": {
- "types": "./esm/runtime.d.ts",
- "import": "./esm/runtime.js",
- "default": "./esm/runtime.js"
- },
- "./hooks": {
- "types": "./esm/hooks.d.ts",
- "import": "./esm/hooks.js",
- "default": "./esm/hooks.js"
- },
- "./request": {
- "types": "./esm/request.d.ts",
- "import": "./esm/request.js",
- "default": "./esm/request.js"
- },
- "./types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- },
- "./esm/types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- },
- "./esm/runtime": {
- "types": "./esm/runtime.d.ts",
- "import": "./esm/runtime.js",
- "default": "./esm/runtime.js"
- }
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map",
- "*.d.ts"
- ],
- "dependencies": {
- "ahooks": "^3.0.0",
- "axios": "^0.27.2"
- },
- "devDependencies": {
- "@ice/app": "^3.4.9",
- "@ice/runtime": "^1.4.8",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "regenerator-runtime": "^0.13.9"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-request"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-request/request.d.ts b/packages/plugin-request/request.d.ts
deleted file mode 100644
index 68fdaad5a5..0000000000
--- a/packages/plugin-request/request.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/request';
diff --git a/packages/plugin-request/runtime.d.ts b/packages/plugin-request/runtime.d.ts
deleted file mode 100644
index 72417e24df..0000000000
--- a/packages/plugin-request/runtime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime';
diff --git a/packages/plugin-request/src/hooks.ts b/packages/plugin-request/src/hooks.ts
deleted file mode 100644
index 100219545b..0000000000
--- a/packages/plugin-request/src/hooks.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { useRequest as useAhooksRequest } from 'ahooks';
-import type { Options, Result, Service, Plugin } from 'ahooks/lib/useRequest/src/types';
-import type { AxiosRequestConfig } from 'axios';
-import { request } from './request.js';
-
-interface RequestResult extends Result {
- request: Result['run'];
- requestAsync: Result['runAsync'];
-}
-
-export function useRequest(
- service: string | AxiosRequestConfig | Service,
- options?: Options,
- plugins?: Plugin[]) {
- let s: Service;
- if (isFunction(service)) {
- s = service as Service;
- } else if (isString(service)) {
- s = async (...extraOptions: TParams) => {
- return request({ url: service, ...extraOptions });
- };
- } else {
- const options = service as AxiosRequestConfig;
- s = async (...extraOptions: TParams) => {
- return request({ ...options, ...extraOptions });
- };
- }
- const req = useAhooksRequest(s, {
- // Note:
- // ahooks/useRequest manual default to true.
- // ICE3/useRequest Default to manual request.
- manual: true,
- ...options,
- }, plugins);
- return {
- ...req,
- // Modify ahooks' useRequest `run` as `request`
- request: req.run,
- // Modify ahooks' useRequest `runAsync` as `requestAsync`
- requestAsync: req.runAsync,
- } as RequestResult;
-}
-
-function isString(str: any): str is string {
- return typeof str === 'string';
-}
-
-function isFunction(fn: any): fn is Function {
- return typeof fn === 'function';
-}
diff --git a/packages/plugin-request/src/index.ts b/packages/plugin-request/src/index.ts
deleted file mode 100644
index bc4be6e1df..0000000000
--- a/packages/plugin-request/src/index.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import type { Plugin } from '@ice/app/types';
-import type { Request, Interceptors, InterceptorRequest, InterceptorResponse } from './types';
-
-// @ts-ignore
-// eslint-disable-next-line
-interface PluginRequestOptions { }
-
-const PLUGIN_NAME = '@ice/plugin-request';
-
-const plugin: Plugin = () => ({
- name: PLUGIN_NAME,
- setup: ({ generator }) => {
- // Add useRequest export for 'ice'.
- // import { useRequest } from 'ice';
- generator.addExport({
- specifier: ['useRequest'],
- source: '@ice/plugin-request/hooks',
- type: false,
- });
- // import { request } from 'ice';
- generator.addExport({
- specifier: ['request'],
- source: '@ice/plugin-request/request',
- type: false,
- });
- },
- runtime: `${PLUGIN_NAME}/runtime`,
- staticRuntime: true,
- keepExports: ['requestConfig'],
-});
-
-export type {
- Request,
- Interceptors,
- InterceptorRequest,
- InterceptorResponse,
- PluginRequestOptions,
-};
-export default plugin;
diff --git a/packages/plugin-request/src/request.ts b/packages/plugin-request/src/request.ts
deleted file mode 100644
index 2395da679e..0000000000
--- a/packages/plugin-request/src/request.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import type { AxiosRequestConfig, CancelTokenStatic, CancelStatic } from 'axios';
-import axios from 'axios';
-
-// https://github.com/axios/axios#request-config
-const DEFAULT_CONFIG = {};
-
-const axiosInstances = {
- default: axios.create(DEFAULT_CONFIG),
-};
-
-/**
- * Create an axios instance.
- * @param instanceName
- */
-export function createAxiosInstance(instanceName?: string) {
- if (instanceName) {
- if (axiosInstances[instanceName]) {
- return axiosInstances;
- }
- axiosInstances[instanceName] = axios.create(DEFAULT_CONFIG);
- }
- return axiosInstances;
-}
-
-export function setAxiosInstance(requestConfig, axiosInstance) {
- const { interceptors = {}, ...requestOptions } = requestConfig;
- Object.keys(requestOptions).forEach(key => {
- axiosInstance.defaults[key] = requestOptions[key];
- });
-
- function isExist(handlers, [fulfilled, rejected]) {
- return handlers.some(item => item.fulfilled === fulfilled && item.rejected === rejected);
- }
-
- // Add request interceptor.
- if (interceptors.request) {
- const [fulfilled, rejected] = [
- interceptors.request.onConfig || function (config) { return config; },
- interceptors.request.onError || function (error) { return Promise.reject(error); },
- ];
- if (isExist(axiosInstance.interceptors.request.handlers, [fulfilled, rejected])) return;
- axiosInstance.interceptors.request.use(fulfilled, rejected);
- }
-
- // Add response interceptor.
- if (interceptors.response) {
- const [fulfilled, rejected] = [
- interceptors.response.onConfig || function (response) { return response; },
- interceptors.response.onError || function (error) { return Promise.reject(error); },
- ];
- if (isExist(axiosInstance.interceptors.response.handlers, [fulfilled, rejected])) return;
- axiosInstance.interceptors.response.use(fulfilled, rejected);
- }
-}
-
-interface RequestConfig extends AxiosRequestConfig {
- instanceName?: string;
- withFullResponse?: boolean;
-}
-
-export interface RequestProps {
- get: (url: string, config?: RequestConfig) => Promise;
- delete: (url: string, config?: RequestConfig) => Promise;
- head: (url: string, config?: RequestConfig) => Promise;
- options: (url: string, config?: RequestConfig) => Promise;
- post: (url: string, data?: D, config?: RequestConfig) => Promise;
- put: (url: string, data?: D, config?: RequestConfig) => Promise;
- patch: (url: string, data?: D, config?: RequestConfig) => Promise;
-}
-
-interface Request extends RequestProps {
- (options: RequestConfig): Promise;
- (url: string, config?: RequestConfig): Promise;
- Cancel: CancelStatic;
- CancelToken: CancelTokenStatic;
- isCancel: (value: any) => boolean;
-}
-
-/**
- * Request, return response.data | response
- * @param options Reference: https://github.com/axios/axios#request-config
- */
-const request = async function (options: RequestConfig): Promise {
- try {
- const instanceName = options.instanceName ? options.instanceName : 'default';
- const axiosInstance = createAxiosInstance()[instanceName];
- if (!(typeof axiosInstance === 'function')) {
- throw new Error(`unknown ${instanceName} in request method`);
- }
- const response = await axiosInstance(options);
- if (axiosInstance.defaults.withFullResponse || options.withFullResponse) {
- return response;
- }
- return response.data;
- } catch (error) {
- console.error(error);
- throw error;
- }
-} as Request;
-
-// Provide aliases for supported request methods
-['delete', 'get', 'head', 'options'].forEach((method) => {
- request[method] = function (url, config) {
- return request(Object.assign(config || {}, {
- method,
- url,
- }));
- };
-});
-
-['post', 'put', 'patch'].forEach((method) => {
- request[method] = function (url, data, config) {
- return request(Object.assign(config || {}, {
- method,
- url,
- data,
- }));
- };
-});
-
-request.CancelToken = axios.CancelToken;
-request.isCancel = axios.isCancel;
-
-export { request };
diff --git a/packages/plugin-request/src/runtime.ts b/packages/plugin-request/src/runtime.ts
deleted file mode 100644
index 5c4c8800f3..0000000000
--- a/packages/plugin-request/src/runtime.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import type { StaticRuntimePlugin } from '@ice/runtime/types';
-import { createAxiosInstance, setAxiosInstance } from './request.js';
-import type { RequestConfig } from './types';
-
-const EXPORT_NAME = 'requestConfig';
-
-const runtime: StaticRuntimePlugin = async ({ appContext }) => {
- const { appExport } = appContext;
- const exported = appExport[EXPORT_NAME];
- const requestConfig: RequestConfig = (typeof exported === 'function' ? await exported() : exported) || {};
-
- // Support multi configs.
- if (Array.isArray(requestConfig)) {
- requestConfig.forEach(requestItem => {
- const instanceName = requestItem.instanceName ? requestItem.instanceName : 'default';
- if (instanceName) {
- const axiosInstance = createAxiosInstance(instanceName)[instanceName];
- setAxiosInstance(requestItem, axiosInstance);
- }
- });
- } else {
- const axiosInstance = createAxiosInstance().default;
- setAxiosInstance(requestConfig, axiosInstance);
- }
-};
-
-export default runtime;
diff --git a/packages/plugin-request/src/types.ts b/packages/plugin-request/src/types.ts
deleted file mode 100644
index 57b9bd23f8..0000000000
--- a/packages/plugin-request/src/types.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import type { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
-
-export interface InterceptorRequest {
- onConfig?: (config: T) => T | Promise;
- onError?: (error: AxiosError) => Promise;
-}
-
-export interface InterceptorResponse {
- onConfig?: (response: K) => K | Promise;
- onError?: (error: AxiosError) => Promise;
-}
-
-export interface Interceptors {
- request?: InterceptorRequest;
- response?: InterceptorResponse;
-}
-
-interface CustomRequest extends AxiosRequestConfig {
- instanceName?: string;
- withFullResponse?: boolean;
- interceptors?: Interceptors;
-}
-
-export type Request = CustomRequest | CustomRequest[];
-export type RequestConfig = Request | object;
-
-export function defineRequestConfig(configOrDefineConfig: RequestConfig | (() => RequestConfig)): RequestConfig {
- if (typeof configOrDefineConfig === 'function') {
- return configOrDefineConfig();
- }
- return configOrDefineConfig;
-}
diff --git a/packages/plugin-request/tsconfig.json b/packages/plugin-request/tsconfig.json
deleted file mode 100644
index 769280c92d..0000000000
--- a/packages/plugin-request/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
diff --git a/packages/plugin-request/types.d.ts b/packages/plugin-request/types.d.ts
deleted file mode 100644
index 8554e6cd41..0000000000
--- a/packages/plugin-request/types.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/types';
diff --git a/packages/plugin-store/CHANGELOG.md b/packages/plugin-store/CHANGELOG.md
deleted file mode 100644
index 637c52af73..0000000000
--- a/packages/plugin-store/CHANGELOG.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# CHANGELOG
-
-## 1.1.2
-
-### Patch Changes
-
-- b8b1d5e4: fix: sourceMap url in prod files but not publish with sourceMap file
-
-## 1.1.1
-
-### Patch Changes
-
-- 5266fedc: fix: import store source before swc compiler
-
-## 1.1.0
-
-### Minor Changes
-
-- 1ed81fee: feat: refactor runtime api
-
-## 1.0.3
-
-### Patch Changes
-
-- 56fb406e: fix: support types definition without specify esm folder
-
-## 1.0.2
-
-- fix: improve code compatibility
-
-## 1.0.1
-
-- fix: compatible with win32
-
-## 1.0.0
-
-- feat: init plugin store
diff --git a/packages/plugin-store/README.md b/packages/plugin-store/README.md
deleted file mode 100644
index cec21037ad..0000000000
--- a/packages/plugin-store/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# @ice/plugin-store
-
-A plugin of state management base on Redux and React Redux used in ice.js`.
-
-## Usage
-
-```ts
-import { defineConfig } from '@ice/app';
-import store from '@ice/plugin-store';
-
-export default defineConfig(() => ({
- plugins: [
- store(),
- ],
-}));
-```
-
-## Options
-
-- `disableResetPageState`
- - The default value is `false`.
- - After it is turned on, the page state will not be reinitialized after switching the page and entering the original page again.
diff --git a/packages/plugin-store/package.json b/packages/plugin-store/package.json
deleted file mode 100644
index 894a3f15da..0000000000
--- a/packages/plugin-store/package.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "name": "@ice/plugin-store",
- "version": "1.1.2",
- "description": "",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./runtime": {
- "types": "./esm/runtime.d.ts",
- "import": "./esm/runtime.js",
- "default": "./esm/runtime.js"
- },
- "./esm/runtime": {
- "types": "./esm/runtime.d.ts",
- "import": "./esm/runtime.js",
- "default": "./esm/runtime.js"
- },
- "./types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- },
- "./esm/types": {
- "types": "./esm/types.d.ts",
- "import": "./esm/types.js",
- "default": "./esm/types.js"
- }
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map",
- "*.d.ts"
- ],
- "dependencies": {
- "@ice/store": "^2.0.3",
- "fast-glob": "^3.2.11",
- "micromatch": "^4.0.8"
- },
- "devDependencies": {
- "@ice/app": "workspace:^",
- "@ice/runtime": "workspace:^",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "@types/micromatch": "^4.0.2",
- "regenerator-runtime": "^0.13.9"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-store"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-store/runtime.d.ts b/packages/plugin-store/runtime.d.ts
deleted file mode 100644
index 72417e24df..0000000000
--- a/packages/plugin-store/runtime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/runtime';
diff --git a/packages/plugin-store/src/constants.ts b/packages/plugin-store/src/constants.ts
deleted file mode 100644
index 18067fa1ec..0000000000
--- a/packages/plugin-store/src/constants.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export const PAGE_STORE_MODULE = '__PAGE_STORE__';
-export const PAGE_STORE_PROVIDER = '__PAGE_STORE_PROVIDER__';
-export const PAGE_STORE_INITIAL_STATES = '__PAGE_STORE_INITIAL_STATES__';
diff --git a/packages/plugin-store/src/index.ts b/packages/plugin-store/src/index.ts
deleted file mode 100644
index 9a3d20783d..0000000000
--- a/packages/plugin-store/src/index.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-import * as path from 'path';
-import type { Config, Plugin } from '@ice/app/types';
-import micromatch from 'micromatch';
-import fg from 'fast-glob';
-import { PAGE_STORE_MODULE, PAGE_STORE_PROVIDER, PAGE_STORE_INITIAL_STATES } from './constants.js';
-
-interface Options {
- resetPageState?: boolean;
-}
-
-const PLUGIN_NAME = '@ice/plugin-store';
-const storeFilePattern = '**/store.{js,ts}';
-const ignoreStoreFilePatterns = ['**/models/**', storeFilePattern];
-
-const plugin: Plugin = (options) => ({
- name: PLUGIN_NAME,
- setup: ({ onGetConfig, modifyUserConfig, generator, context: { rootDir, userConfig }, watch }) => {
- const { resetPageState = false } = options || {};
- const srcDir = path.join(rootDir, 'src');
- const pageDir = path.join(srcDir, 'pages');
-
- modifyUserConfig('routes', {
- ...(userConfig.routes || {}),
- ignoreFiles: [...(userConfig?.routes?.ignoreFiles || []), ...ignoreStoreFilePatterns],
- });
-
- if (getAppStorePath(srcDir)) {
- generator.addRuntimeOptions({
- source: '@/store',
- specifier: 'appStore',
- });
- }
-
- watch.addEvent([
- /src\/store.(js|ts)$/,
- (event) => {
- if (event === 'unlink') {
- generator.removeRuntimeOptions('@/store');
- }
- if (event === 'add') {
- generator.addRuntimeOptions({
- source: '@/store',
- specifier: 'appStore',
- });
- }
- if (['add', 'unlink'].includes(event)) {
- generator.render();
- }
- },
- ]);
-
- onGetConfig(config => {
- config.transformPlugins = [
- ...(config.transformPlugins || []),
- exportStoreProviderPlugin({ pageDir, resetPageState }),
- ];
- return config;
- });
-
- // Export store api: createStore, createModel from `.ice/index.ts`.
- generator.addExport({
- specifier: ['createStore', 'createModel'],
- source: '@ice/plugin-store/runtime',
- type: false,
- });
- },
- runtime: `${PLUGIN_NAME}/runtime`,
-});
-const formatId = (id: string) => id.split(path.sep).join('/');
-function exportStoreProviderPlugin({ pageDir, resetPageState }: { pageDir: string; resetPageState: boolean }): Config['transformPlugins'][0] {
- return {
- name: 'export-store-provider',
- enforce: 'pre',
- transformInclude: (id) => {
- return (
- /\.[jt]sx?$/i.test(id) &&
- formatId(id).startsWith(formatId(pageDir)) &&
- !micromatch.isMatch(id, ignoreStoreFilePatterns)
- );
- },
- transform: async (source, id) => {
- const pageStorePath = getPageStorePath(id);
- if (pageStorePath) {
- if (
- isLayout(id) || // Current id is layout.
- !isLayoutExisted(id) // If current id is route and there is no layout in the current dir.
- ) {
- return exportPageStore(source, resetPageState);
- }
- }
- return source;
- },
- };
-}
-
-function exportPageStore(source: string, resetPageState: boolean) {
- const importStoreStatement = `import ${PAGE_STORE_MODULE} from './store';\n`;
- const exportStoreProviderStatement = resetPageState ? `
-const { Provider: ${PAGE_STORE_PROVIDER}, getState } = ${PAGE_STORE_MODULE};
-const ${PAGE_STORE_INITIAL_STATES} = getState();
-export { ${PAGE_STORE_PROVIDER}, ${PAGE_STORE_INITIAL_STATES} };` : `
-const { Provider: ${PAGE_STORE_PROVIDER} } = ${PAGE_STORE_MODULE};
-export { ${PAGE_STORE_PROVIDER} };`;
-
- return importStoreStatement + source + exportStoreProviderStatement;
-}
-
-/**
- * Get the page store path which is at the same directory level.
- * @param {string} id Route absolute path.
- * @returns {string|undefined}
- */
-function getPageStorePath(id: string): string | undefined {
- const dir = path.dirname(id);
- const result = fg.sync(storeFilePattern, { cwd: dir, deep: 1 });
- return result.length ? path.join(dir, result[0]) : undefined;
-}
-
-function isLayout(id: string): boolean {
- const extname = path.extname(id);
- const idWithoutExtname = id.substring(0, id.length - extname.length);
- return idWithoutExtname.endsWith('layout');
-}
-
-/**
- * Check the current route component if there is layout.tsx at the same directory level.
- * @param {string} id Route absolute path.
- * @returns {boolean}
- */
-function isLayoutExisted(id: string): boolean {
- const dir = path.dirname(id);
- const result = fg.sync('layout.{js,jsx,tsx}', { cwd: dir, deep: 1 });
- return !!result.length;
-}
-
-function getAppStorePath(srcPath: string) {
- const result = fg.sync(storeFilePattern, { cwd: srcPath, deep: 1 });
- return result.length ? path.join(srcPath, result[0]) : undefined;
-}
-
-export default plugin;
diff --git a/packages/plugin-store/src/runtime.tsx b/packages/plugin-store/src/runtime.tsx
deleted file mode 100644
index cfb6fc9b80..0000000000
--- a/packages/plugin-store/src/runtime.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import * as React from 'react';
-import type { RuntimePlugin, AppProvider, RouteWrapper } from '@ice/runtime/types';
-import { PAGE_STORE_INITIAL_STATES, PAGE_STORE_PROVIDER } from './constants.js';
-import type { StoreConfig } from './types.js';
-
-const EXPORT_CONFIG_NAME = 'storeConfig';
-
-const runtime: RuntimePlugin = async ({ appContext, addWrapper, addProvider }, runtimeOptions) => {
- const { appExport, appData } = appContext;
- const exported = appExport[EXPORT_CONFIG_NAME];
- const storeConfig: StoreConfig = (typeof exported === 'function' ? await exported(appData) : exported) || {};
- const { initialStates } = storeConfig;
-
- // Add app store .
- const StoreProvider: AppProvider = ({ children }) => {
- if (runtimeOptions?.appStore?.Provider) {
- const { Provider } = runtimeOptions.appStore;
- return (
-
- {children}
-
- );
- }
- return <>{children}>;
- };
-
- addProvider(StoreProvider);
-
- // Add page store .
- const StoreProviderWrapper: RouteWrapper = ({ routeExports, children }) => {
- if (routeExports?.[PAGE_STORE_PROVIDER]) {
- const Provider = routeExports[PAGE_STORE_PROVIDER];
- const initialStates = routeExports[PAGE_STORE_INITIAL_STATES];
- if (initialStates) {
- return {children} ;
- }
- return {children} ;
- }
- return <>{children}>;
- };
-
- addWrapper(StoreProviderWrapper, true);
-};
-
-export default runtime;
-
-export { createModel, createStore } from '@ice/store';
diff --git a/packages/plugin-store/src/types.ts b/packages/plugin-store/src/types.ts
deleted file mode 100644
index dad4c6ca64..0000000000
--- a/packages/plugin-store/src/types.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export interface StoreConfig {
- initialStates: Record;
-}
-
-type Store = ((data?: any) => Promise) | StoreConfig;
-
-function defineStoreConfig(fn: Store) {
- return fn;
-}
-
-export {
- defineStoreConfig,
-};
diff --git a/packages/plugin-store/tsconfig.json b/packages/plugin-store/tsconfig.json
deleted file mode 100644
index 972f3542f0..0000000000
--- a/packages/plugin-store/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "rootDir": "src",
- "outDir": "esm",
- "jsx": "react"
- },
- "include": ["src"]
-}
\ No newline at end of file
diff --git a/packages/plugin-store/types.d.ts b/packages/plugin-store/types.d.ts
deleted file mode 100644
index 8554e6cd41..0000000000
--- a/packages/plugin-store/types.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './esm/types';
diff --git a/packages/plugin-stream-error/CHANGELOG.md b/packages/plugin-stream-error/CHANGELOG.md
deleted file mode 100644
index 8549e0cb91..0000000000
--- a/packages/plugin-stream-error/CHANGELOG.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# @ice/plugin-stream-error
-
-## 1.0.3
-
-- feat: empty root element when stream error
-
-## 1.0.0
-
-### Major Changes
-
-- f2c7df96: feat: plugin deal with stream error
-
-## 1.0.1
-
-### Patch Change
-
-- 2928447c: plugin export head stream error recover component
-
-## 1.0.2
-
-### Patch Change
-
-- 069579a3: add head stream error types exports
diff --git a/packages/plugin-stream-error/README.md b/packages/plugin-stream-error/README.md
deleted file mode 100644
index 8d9e711a98..0000000000
--- a/packages/plugin-stream-error/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# @ice/plugin-stream-error
-
-A plugin for re-render app when stream error.
-
-## Usage
-
-```ts
-import { defineConfig } from '@ice/app';
-import streamError from '@ice/plugin-stream-error';
-
-export default defineConfig(() => ({
- plugins: [
- streamError(),
- ],
-}));
-```
-
-> Causion: This plugin only works when stream content ends with javascripts which triggered an custom event of `stream_end`
diff --git a/packages/plugin-stream-error/package.json b/packages/plugin-stream-error/package.json
deleted file mode 100644
index e2bbf6bfaf..0000000000
--- a/packages/plugin-stream-error/package.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "name": "@ice/plugin-stream-error",
- "version": "1.0.3",
- "description": "",
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "types": "./esm/index.d.ts",
- "import": "./esm/index.js",
- "default": "./esm/index.js"
- },
- "./head-stream-error": "./esm/components/headStreamErrorRecoverScript.js"
- },
- "typesVersions": {
- "*": {
- "head-stream-error": [
- "./esm/components/headStreamErrorRecoverScript.d.ts"
- ]
- }
- },
- "main": "./esm/index.js",
- "types": "./esm/index.d.ts",
- "files": [
- "esm",
- "!esm/**/*.map",
- "*.d.ts"
- ],
- "devDependencies": {
- "@ice/app": "workspace:^"
- },
- "repository": {
- "type": "http",
- "url": "https://github.com/alibaba/ice/tree/master/packages/plugin-store"
- },
- "scripts": {
- "watch": "tsc -w --sourceMap",
- "build": "tsc"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/plugin-stream-error/src/components/headStreamErrorRecoverScript.tsx b/packages/plugin-stream-error/src/components/headStreamErrorRecoverScript.tsx
deleted file mode 100644
index 1bd83d9a7d..0000000000
--- a/packages/plugin-stream-error/src/components/headStreamErrorRecoverScript.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-
-export default function HeadStreamErrorRecoverScript({ downgradeCSRHostname }) {
- return (
-
+
+
+
+
+
diff --git a/react-materials/blocks/ApplicationProgress/demo/index.js b/react-materials/blocks/ApplicationProgress/demo/index.js
new file mode 100644
index 0000000000..75db3e5a20
--- /dev/null
+++ b/react-materials/blocks/ApplicationProgress/demo/index.js
@@ -0,0 +1,19 @@
+import React, { Component } from 'react';
+import { render } from 'react-dom';
+
+// 载入默认全局样式 normalize 、.clearfix 和一些 mixin 方法等
+import '@icedesign/base/reset.scss';
+
+import DemoLayout from '@icedesign/demo-layout';
+import Block from '../src';
+
+const props = {
+ // ...
+};
+
+render(
+
+
+ ,
+ document.querySelector('#mountNode')
+);
diff --git a/react-materials/blocks/ApplicationProgress/mock/application-progress.json b/react-materials/blocks/ApplicationProgress/mock/application-progress.json
new file mode 100644
index 0000000000..eee2984fbe
--- /dev/null
+++ b/react-materials/blocks/ApplicationProgress/mock/application-progress.json
@@ -0,0 +1,4 @@
+{
+ "status": "SUCCESS",
+ "data": {}
+}
diff --git a/react-materials/blocks/ApplicationProgress/package.json b/react-materials/blocks/ApplicationProgress/package.json
new file mode 100644
index 0000000000..6e6626c1c8
--- /dev/null
+++ b/react-materials/blocks/ApplicationProgress/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "@icedesign/application-progress-block",
+ "version": "0.1.5",
+ "description": "申请进度信息展示",
+ "files": [
+ "src/",
+ "demo/",
+ "lib/",
+ "mock/"
+ ],
+ "author": {
+ "name": "ICE Team",
+ "email": "ice-admin@alibaba-inc.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/alibaba/ice"
+ },
+ "license": "MIT",
+ "keywords": [
+ "ice",
+ "ice-block"
+ ],
+ "dependencies": {
+ "@icedesign/base": "^0.2.0",
+ "@icedesign/container": "^0.1.0",
+ "enquire-js": "^0.1.2",
+ "prop-types": "^15.5.8"
+ },
+ "devDependencies": {
+ "@icedesign/demo-layout": "^0.1.0",
+ "@icedesign/skin": "^0.1.2",
+ "react": "*",
+ "react-dom": "*"
+ },
+ "blockConfig": {
+ "name": "application-progress",
+ "screenshot": "https://img.alicdn.com/tfs/TB1I67ih3vD8KJjy0FlXXagBFXa-947-929.png",
+ "themePackage": "@icedesign/skin",
+ "title": "申请进度信息展示",
+ "categories": [
+ "信息展示"
+ ]
+ },
+ "scripts": {
+ "start": "../../node_modules/.bin/ice block dev",
+ "prepublish": "../../node_modules/.bin/ice block build"
+ },
+ "publishConfig": {
+ "access": "public",
+ "registry": "http://registry.npmjs.com/"
+ }
+}
diff --git a/react-materials/blocks/ApplicationProgress/src/ApplicationProgress.jsx b/react-materials/blocks/ApplicationProgress/src/ApplicationProgress.jsx
new file mode 100644
index 0000000000..3459c28cab
--- /dev/null
+++ b/react-materials/blocks/ApplicationProgress/src/ApplicationProgress.jsx
@@ -0,0 +1,214 @@
+import React, { Component } from 'react';
+import { Button, Step, Grid, Icon } from '@icedesign/base';
+import IceContainer from '@icedesign/container';
+import { enquireScreen } from 'enquire-js';
+
+const dataSource = () => {
+ return [
+ {
+ condition: '校验条件',
+ validate: true,
+ url: 'https://img.alicdn.com/tps/TB18NwoNFXXXXXoXXXXXXXXXXXX-132-132.png',
+ operation: '查看',
+ description:
+ '说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案',
+ },
+ {
+ condition: '校验条件',
+ validate: false,
+ url: 'https://img.alicdn.com/tps/TB1VyMkNFXXXXc8XXXXXXXXXXXX-134-134.png',
+ operation: '解决方式链接',
+ description:
+ '说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案',
+ },
+ {
+ condition: '身份认证',
+ validate: true,
+ url: 'https://img.alicdn.com/tps/TB1QCMfNFXXXXaOXpXXXXXXXXXX-136-136.png',
+ operation: '查看',
+ description:
+ '说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案',
+ },
+ {
+ condition: '非卖家',
+ validate: false,
+ url: 'https://img.alicdn.com/tps/TB1mGnSNFXXXXbMaXXXXXXXXXXX-134-136.png',
+ operation: '解决方式链接',
+ description:
+ '说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案',
+ },
+ {
+ condition: '18岁以上',
+ validate: false,
+ url: 'https://img.alicdn.com/tps/TB1xwQiNFXXXXcfXXXXXXXXXXXX-136-134.png',
+ operation: '解决方式链接',
+ description:
+ '说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案说明以及解决方案',
+ },
+ ];
+};
+
+const { Row, Col } = Grid;
+
+export default class ApplicationProgress extends Component {
+ static displayName = 'ApplicationProgress';
+
+ static propTypes = {};
+
+ static defaultProps = {};
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ isMobile: false,
+ };
+ }
+
+ componentDidMount() {
+ this.enquireScreenRegister();
+ }
+
+ enquireScreenRegister = () => {
+ const mediaCondition = 'only screen and (max-width: 720px)';
+
+ enquireScreen((mobile) => {
+ this.setState({
+ isMobile: mobile,
+ });
+ }, mediaCondition);
+ };
+
+ render() {
+ const data = dataSource();
+ const { isMobile } = this.state;
+ return (
+
+
+
+
+
+
+
+
+
+ {data.map((item, index) => {
+ return (
+
+
+