diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..9cbc57e9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,38 @@ +on: + workflow_call: + inputs: + stage: + required: true + type: string + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + id: composer-dev-cache + with: + path: ./vendor + key: ${{ inputs.stage }}-dev-${{ hashFiles('./composer.lock') }} + - name: Install Composer Dependencies + if: steps.composer-dev-cache.outputs.cache-hit != 'true' + run: composer install + - uses: actions/cache@v4 + id: phpcs-cache + with: + path: ./phpcs-cache + key: ${{ inputs.stage }}-phpcs-${{ hashFiles('./phpcs-cache') }} + - run: composer lint + - run: corepack enable + - run: cd private && yarn + - run: cd private && yarn lint + - run: cd private && yarn build + - uses: actions/upload-artifact@v4 + with: + name: humanity-theme + overwrite: true + path: | + . + !./private/node_modules + !./vendor diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..14bb8620 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,23 @@ +on: + workflow_call: + inputs: + target: + required: true + type: string + +permissions: + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: humanity-theme + - run: bash ./private/bin/deploy.sh + env: + SSH_KEY: ${{ secrets.SSH_KEY }} + REMOTE_URL: ${{ secrets[inputs.target] }} + GITHUB_USERNAME: ${{ secrets.COMMITTER_NAME }} + GITHUB_EMAIL: ${{ secrets.COMMITTER_EMAIL }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..11361c2a --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,22 @@ +on: + workflow_call: + inputs: + stage: + required: true + type: string + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: humanity-theme + - run: wget -q https://github.com/phpDocumentor/phpDocumentor/releases/latest/download/phpDocumentor.phar + - run: php phpDocumentor.phar --extensions=php --defaultpackagename=Humanity --directory ./wp-content/themes/humanity-theme --target ./php-api-developer-documentation + - run: zip -r ./php-api-developer-documentation.zip ./php-api-developer-documentation + - uses: softprops/action-gh-release@v2 + with: + draft: true + files: php-api-developer-documentation.zip + target_commitish: ${{ inputs.stage }} diff --git a/.github/workflows/env-branch.yml b/.github/workflows/env-branch.yml new file mode 100644 index 00000000..1a5f4029 --- /dev/null +++ b/.github/workflows/env-branch.yml @@ -0,0 +1,12 @@ +on: + push: + branches-ignore: + - main + - staging + - develop + +jobs: + build: + uses: ./.github/workflows/build.yml + with: + stage: ${{ github.ref_name }} diff --git a/.github/workflows/env-develop.yml b/.github/workflows/env-develop.yml new file mode 100644 index 00000000..df40757c --- /dev/null +++ b/.github/workflows/env-develop.yml @@ -0,0 +1,25 @@ +on: + push: + branches: [develop] + +jobs: + build: + uses: ./.github/workflows/build.yml + with: + stage: ${{ github.ref_name }} + lang: + uses: ./.github/workflows/lang.yml + needs: build + with: + stage: ${{ github.ref_name }} + deploy: + needs: [build, lang] + secrets: inherit + uses: ./.github/workflows/deploy.yml + with: + target: ${{ matrix.target }} + strategy: + matrix: + target: + - REMOTE_RIKJ6NJG + - REMOTE_TQEI6PN8 diff --git a/.github/workflows/env-main.yml b/.github/workflows/env-main.yml new file mode 100644 index 00000000..cbcb155b --- /dev/null +++ b/.github/workflows/env-main.yml @@ -0,0 +1,50 @@ +on: + push: + branches: [main] + +jobs: + build: + uses: ./.github/workflows/build.yml + with: + stage: ${{ github.ref_name }} + lang: + uses: ./.github/workflows/lang.yml + needs: build + with: + stage: ${{ github.ref_name }} + docs: + uses: ./.github/workflows/docs.yml + needs: build + with: + stage: ${{ github.ref_name }} + bundle: + needs: [build, lang] + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: humanity-theme + - run: cd ./wp-content/themes/humanity-theme && zip -r ../../../humanity-theme.zip . + - uses: softprops/action-gh-release@v2 + with: + draft: true + files: ./humanity-theme.zip + target_commitish: ${{ inputs.stage }} + deploy-to-test: + needs: [build, lang] + secrets: inherit + uses: ./.github/workflows/deploy.yml + with: + target: REMOTE_MTIQTPPT + test: + needs: deploy-to-test + secrets: inherit + uses: ./.github/workflows/test.yml + with: + stage: ${{ github.ref_name }} + suite: ${{ matrix.suite }} + strategy: + matrix: + suite: + - 620b83b8329c2fb1fe6e1516 + - 621372745f85360d3fd03197 diff --git a/.github/workflows/env-pull-request.yml b/.github/workflows/env-pull-request.yml new file mode 100644 index 00000000..8fdc13a4 --- /dev/null +++ b/.github/workflows/env-pull-request.yml @@ -0,0 +1,9 @@ +on: + pull_request: + types: [opened] + +jobs: + build: + uses: ./.github/workflows/build.yml + with: + stage: ${{ github.ref_name }} diff --git a/.github/workflows/env-release.yml b/.github/workflows/env-release.yml new file mode 100644 index 00000000..a36fa158 --- /dev/null +++ b/.github/workflows/env-release.yml @@ -0,0 +1,53 @@ +on: + release: + types: [released] + +jobs: + build: + uses: ./.github/workflows/build.yml + with: + stage: release + lang: + uses: ./.github/workflows/lang.yml + needs: build + with: + stage: release + deploy: + needs: [build, lang] + secrets: inherit + uses: ./.github/workflows/deploy.yml + with: + target: ${{ matrix.target }} + strategy: + matrix: + target: + - REMOTE_XQVHDONU + - REMOTE_8MZ1QJ5P + - REMOTE_BCDKFWF4 + - REMOTE_XRWONKPA + - REMOTE_SUWSJWOQ + - REMOTE_010TDDVE + - REMOTE_DFOD8FOH + - REMOTE_JTO6MIPZ + - REMOTE_U0VS1DPC + - REMOTE_QEQJ6OJZ + - REMOTE_SIWVYQV9 + - REMOTE_PXW6K9EK + - REMOTE_DSCAUN4N + - REMOTE_CTJLPQAF + - REMOTE_5QCXZJSN + - REMOTE_GRILAXXQ + - REMOTE_8I8A5YIV + - REMOTE_I4P65VXK + - REMOTE_KKK3NEBU + - REMOTE_RCPWMD3K + - REMOTE_P5ZRTPZL + - REMOTE_MNEUQUDQ + - REMOTE_WQ1F95LK + - REMOTE_JQDZJMDS + - REMOTE_PSH9FHC4 + - REMOTE_BEMEBJ0I + - REMOTE_GIG4TDEB + - REMOTE_W3S9N9W9 + - REMOTE_VYFAA1BZ + - REMOTE_SUPOPLFU diff --git a/.github/workflows/env-staging.yml b/.github/workflows/env-staging.yml new file mode 100644 index 00000000..b8664c87 --- /dev/null +++ b/.github/workflows/env-staging.yml @@ -0,0 +1,53 @@ +on: + push: + branches: [staging] + +jobs: + build: + uses: ./.github/workflows/build.yml + with: + stage: ${{ github.ref_name }} + lang: + uses: ./.github/workflows/lang.yml + needs: build + with: + stage: ${{ github.ref_name }} + deploy: + needs: [build, lang] + secrets: inherit + uses: ./.github/workflows/deploy.yml + with: + target: ${{ matrix.target }} + strategy: + matrix: + target: + - REMOTE_SNLVE0IV + - REMOTE_PRARHNDE + - REMOTE_FBXMKHUU + - REMOTE_YTRLMNAJ + - REMOTE_IKYUX9HL + - REMOTE_LAHG9STV + - REMOTE_YCO8MWAV + - REMOTE_5WRJBPXY + - REMOTE_6N8ZE2WT + - REMOTE_AE3Y1NOK + - REMOTE_SWOLCKL2 + - REMOTE_HEPQKMWL + - REMOTE_BSNPC2YK + - REMOTE_Z0BKHBSA + - REMOTE_DUYWZXFR + - REMOTE_4QCECSET + - REMOTE_MX6YXRHR + - REMOTE_HNSJG6TQ + - REMOTE_RJFBZVDO + - REMOTE_FCLZFYWD + - REMOTE_1WQBMPOU + - REMOTE_N71QDXPW + - REMOTE_N0KJB6TO + - REMOTE_ZH7L9YLC + - REMOTE_YIZGEVBY + - REMOTE_NTSDHBCJ + - REMOTE_CGYVZUBX + - REMOTE_SCXSE3T6 + - REMOTE_GI2SVBTF + - REMOTE_RO2LS5IH diff --git a/.github/workflows/lang.yml b/.github/workflows/lang.yml new file mode 100644 index 00000000..ff104450 --- /dev/null +++ b/.github/workflows/lang.yml @@ -0,0 +1,35 @@ +on: + workflow_call: + inputs: + stage: + required: true + type: string + +jobs: + lang: + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: humanity-theme + - run: sudo rm /etc/php/8.3/cli/conf.d/20-xdebug.ini + - uses: actions/cache@v4 + id: composer-lang-cache + with: + path: ./vendor + key: ${{ inputs.stage }}-lang-${{ hashFiles('./composer.lock') }} + - name: Install Composer Dependencies + if: steps.composer-lang-cache.outputs.cache-hit != 'true' + run: composer install; composer require --dev wp-cli/wp-cli-bundle + - run: ./vendor/bin/wp i18n make-pot wp-content/themes/humanity-theme wp-content/themes/humanity-theme/languages/amnesty.pot --domain=amnesty --exclude=private + - run: ./vendor/bin/wp i18n update-po wp-content/themes/humanity-theme/languages/amnesty.pot + - run: ./vendor/bin/wp i18n make-mo wp-content/themes/humanity-theme/languages + - run: ./vendor/bin/wp i18n make-json wp-content/themes/humanity-theme/languages --no-purge + - uses: actions/upload-artifact@v4 + with: + name: humanity-theme + overwrite: true + path: | + . + !./private/node_modules + !./vendor diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..c09a49bf --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,24 @@ +on: + workflow_call: + inputs: + stage: + required: true + type: string + suite: + required: true + type: string + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/cache@v4 + id: gi-cache + with: + path: ./gi + key: ${{ inputs.stage }}-gi + - name: Download Ghost Inspector + if: steps.gi-cache.outputs.cache-hit != 'true' + run: curl -sL https://github.com/ghost-inspector/node-ghost-inspector/releases/latest/download/ghost-inspector-linux --output ./gi + - run: chmod +x ./gi + - run: ./gi suite execute ${{ inputs.suite }} --errorOnFail --errorOnScreenshotFail --apiKey=${{ secrets.GHOST_INSPECTOR_API_KEY }} diff --git a/.gitignore b/.gitignore index abfcb9bd..72e7be8f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ web.config /db-config.php /index.php +/private/.yarn /private/node_modules /readme.html /wp-activate.php @@ -22,6 +23,7 @@ web.config /wp-content/backup-db/* /wp-content/blogs.dir/* /wp-content/cache/* +/wp-content/debug.log /wp-content/index.php /wp-content/languages/* /wp-content/mu-plugins/* @@ -30,6 +32,7 @@ web.config /wp-content/themes/humanity-theme/assets/images/* /wp-content/themes/humanity-theme/assets/scripts/* /wp-content/themes/humanity-theme/assets/styles/* +/wp-content/themes/humanity-theme/build/* /wp-content/themes/index.php /wp-content/themes/twenty* /wp-content/upgrade/* diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1d4944ad..00000000 --- a/.travis.yml +++ /dev/null @@ -1,608 +0,0 @@ -os: linux -dist: jammy -language: php -php: - - 8.2 - -cache: - npm: true - yarn: true - directories: - - "$HOME/.composer/cache" - - "$HOME/.yarn" - - "$HOME/phpdoc-cache" - - ./private/node_modules - - ./vendor - -before_install: -- phpenv config-rm xdebug.ini - -stages: - - name: Lint - if: branch IS present - - - name: Deploy to RiKJ6Njg [DEV] - if: branch = develop AND type != pull_request - - name: Run Ghost Inspector on [DEV] - if: branch = develop AND type != pull_request - - name: Deploy to [DEV] - if: branch = develop AND type != pull_request - - - name: Deploy to ytrlMNAj [STG] - if: branch = staging AND type != pull_request - - name: Run Ghost Inspector on [STG] - if: branch = staging AND type != pull_request - - name: Deploy to [STG] - if: branch = staging AND type != pull_request - - - name: Deploy to MTIQTppT [PRD] - if: branch = main AND type != pull_request - - name: Run Ghost Inspector on MTIQTppT [PRD] - if: branch = main AND type != pull_request - - name: Attach build assets to GitHub Release - if: branch = main AND type != pull_request - - - name: Deploy to [PRD] - if: tag IS present AND tag =~ ^v - -jobs: - allow_failures: - - script: ./private/bin/run-tests.sh 65ce0877f59aa2b4f3a654a0 # core blocks DEV - - script: ./private/bin/run-tests.sh 65ce08acd76b6bca5fe60ae4 # custom blocks DEV - - script: ./private/bin/run-tests.sh 65ce0821d76b6bca5fe5ee6d # core blocks STG - - script: ./private/bin/run-tests.sh 65ce08a0d76b6bca5fe6075d # custom blocks STG - - include: - - stage: Lint - before_script: ./private/bin/install.sh - script: ./private/bin/lint.sh - - - - stage: Deploy to RiKJ6Njg [DEV] - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "LHADeIMvttzv57In+YzHsNGer660koX4ORoZeudxzjHi5oTF2DzNPriFnxeV1239IBMRDf4VcWeg2aToh/QnJggOSBnsJs+e9OIVpkxk1nvIUz51kNXTO47De1oUy9OdT7gdF12pPmj2FvINGlIf8dytVzMmJWQPpijmGwN1buXnb8zPDaOlztxlTHBvFtcodqBy+q9dyB/EBrLsTcA6lDNdoUO74r6jE9nVmiz59djfT2mSWVorf02dyxxVPDa6SyQ8wjZsbv245Ee2Elec0QSsKZE/47VMpU1uhX4WbL5v0YI3vma9PYh8T9mlSBeTx7jLhf/uPzD0fWZVBICQmkidwN43tNw2K/SOpGbp5dH8cgYzY/qAoREOy9gzmWtzO7ai8eXq2Cz4+Jq5lNTrQShUvoWRXan4Fek+Kale9DPb2atFpotRyJ3MbqCn2A0AIq6qMfGFTEGXQR5B9/i3NdfBsl1iW+DZXYUzESXsotEGB2zJvasqpLjQEi5f9zIL1ANYm8JgI55VhAmcJUOPPxrkcJWKGOycCQdwNA/KpOEmG2N95gf4Sp0aVsT5Vtw16ZmKJZTWIkOKs7eriHHbmuuAbhRrzzXIYfzvkMFFMr2sjNe2JpNljvCtvpIUeXQnVtd/LLp/EAoYKOA99wg/i5awST/S2tiVc+AKE2dDnaY=" - - stage: Run Ghost Inspector on [DEV] - script: ./private/bin/run-tests.sh 65ce0877f59aa2b4f3a654a0 - name: Core Blocks - - script: ./private/bin/run-tests.sh 65ce08acd76b6bca5fe60ae4 - name: Custom Blocks - - stage: Deploy to [DEV] - name: TQEi6pn8 - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "BcsbUsBNSX4/Ur8Co3iAWGPD/5CrXBuSEW59/iEya0iH6Fx2p2B7hcwh6ynUvGTDo32YrDE50Jsz3sFd6UarXZt6nRuH7rAvv+16mDkuBV8slhB5P9D83IuiUZqNy1SIkNThacLGQfiusyKI/aNNs5SSqJ1Ze2+0eEp65uI5bBvKC7DkH57xDvWn/CTncWVVnrdI+GRfFlEDTGe8GgloQkkLhBxyXVBBWzbm531zd6Ta2doNKz5bGzDUrp21zq7VvrfFaOxmChdzNyW+P+ERGeb7qhI0B3yJY77Pi4uSwETyZU8mjvTo9reD28II+AeXFbKl1Fhyr0AUrJbzGNiGX9cjZO86CMMh+pCA2QsJ3+Ha1FgLPK3BfkC+UJiPva3PUReaXS7B/m6x9q/cLWhoTQ74Y/m4DxO2Avwqz3ABY4C7XVr1HiWozkrkNaeelyS2ti7yd7ZsXq6zkTggAIZFaxvWpvqzNDXkr5txafaOVLTn9qtjH4n3O83lbpwu5I+dJ03QfTuV0yKV+8rlDF/8Jrfb7YrS7MaA2BIoaTqcN/U5MRogKLFE8hIMYGRZ3BcqXAlDincFHsF1GGO837f2U+uOFzjbl5BPl2tXM4qbaV0Er5gVqLea2yhnVKBTxv47/U52PsAAkMkc8NRN7B8P6kW4JK2EMun5QCwgs6N118k=" - - - - stage: Deploy to ytrlMNAj [STG] - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "mLiKaR22uJ7+85a9KnjUOyo5ugy8xf+ZnrieVvNNNMi5GNu+6dyayqFW7tofkGEvyE3HjvyaztBpC1iVjjj2gE1TcMOvq+ehd+AAxtbq++JT7TEIx8m4DrGfY/98hkOl+ojOP74Ph9Bc1rWVtjxN6NUbCsqPyxqKXMyqtp2eYF7HySTBv1Fg3sSChF6LiD3HQS/HBPVn9MrrFEWrcGF8Hx5ZSem8459KRSes02MT3o1OxthHFy+RxEO6FtWcRsxROKqyJ5SNUQtIMLOl+K3yVllJMPcAWt4+f3+tiVQpOAgKtcHk3GUTP0qJM+W/c69bhAj0ieQLW9v8Pm2VN4PLqSqrE+uDrwzJzJnV4xX2yuHGxWE50l7sBV4hv/AvEj4H4HN7QztdZDRPXbu/chO34oI21jZc8zcqjiMq63FN6MXR6l+sLvhj9XYTRWDAT1p20Vio790tGsPlN9U6oqTB1s4RCrl701YoDUZ5/eoDLcYWaNnEXc37HaXYqfVoun9eBlOBysRffcw2CTUVPMmUVDqOiN5t+7DA5L8ym8z/LCvMf8puPN6dD0fADtOK4Yq9iwSXY+2x/swdA2oBAUjLPpmVCTMdtztZRU0/MKQjSx8gHOOL18sCsBUSL3cnhNk8HGt/rCP+O0bJ4AAoOvbZjqOkt50XTqXZk38Ylq2b6ng=" - - stage: Run Ghost Inspector on [STG] - script: ./private/bin/run-tests.sh 65ce0821d76b6bca5fe5ee6d - name: Core Blocks - - script: ./private/bin/run-tests.sh 65ce08a0d76b6bca5fe6075d - name: Custom Blocks - - stage: Deploy to [STG] - name: SnlvE0IV - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "Tyo02tq7Qu33eSI4QzulMaka6AKZBP/ILab3FyYXIKLCmyT68VmxPajbmAgjDOsCQGSojmWOZ8vJwqgXGw3VJ5VMsP1G0Y5WPjKObVknRo6g0gHSg8g/dnnv9vuIDqA27N3q1ECea3Ajg41kMdZ7SVs+xZOd+WKxPG5ImP3Qd3uUCZvXw66De4ccNmL6UECZy3chCweCZ5RtrNEsD4zV0WG/7t6MxDKJd9/f60yW0hGyLJmsFV+F8ouxx+nc7HEbX8no75wJoRTANs5r8GujEBXw7zB9kbIlMlrkHuMP5b8aBHEUDFT57gnlbjatgP2voHxziKd8+bFOdR4XKa182Od/fFLnJzEM+GRhfE71+ydr3XQtjX+dihY+KUJ/Cr57NmAoYRcfmZ/uQlQDcjDXmU8thRDGF4QFKUylmw3vijYO4E2XKIk8R1rRM/ZglLPGXv5L8H+r9uC/mGzl7qRHlUfdHONwi/dxGVRZ0MZ/5dCQNTmV0qSdpZ37/PuTU364d1C+kCcYrmSLfuXJ5KJggqgs1mHFt7E1iC3FYN6NusoPqoyajOnePcizol0h+QS1I7JOul4P0eudfudlYZEpH4stQV/FRqLsow5z0zWByQ+ZYIfNQdZ1W1I7UEdxWA4ZB158a33c3w31IrtAkPa+D691h90F7c5vT5Bn5Y/8wWw=" - - stage: Deploy to [STG] - name: PrarhNDE - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "ETFKewNT2MQttfJTGjuCnvfFWKzoOOVOLq2MkpXBJtqH40CSSk6yNqySvhSTm+A8vWRIJ4doyspe+Qn3JSzFz8R4slkG6lgrctSuw0zSoWEOG2cC0ddjdLliDsS14rrnh0tmYYx31ew8P+Si+L9zmWvohgTEiVsFzfEMWAPMSHEBhX9ar+ewmTfq6mgEtciKZPrsIb2TeMrX2IzElHQbPzg8YRkHnslhGqXmDl9+N7/0LYwF4jIUcOemV7CXgef8C9aiyyuWpJe+x41pnCsRQtr2fan8vTW+tQ010/xF67QrXx9DKugc2NP0qOK6Hhh1UsX1XhwzL5qLjHD424Vhpu9YOR9BZrqdbKYHhrBM+Og4HWNf2ggEGleHE3U7/xZEh0lLeGz7Zgq5rMy/OEwHNrkfgtOLtnTi+RGhkbBay+73OuNRDkbZsycO3u2FU0C1l6wd9a+cUy/BqWBmkAcYKpEZt2zNimuNlQ3XoQ5YMnF2o6Wmefm/HfntwDunggE0YOHnRS/LvnwKFr3pKFcZ0oQPWgGPcAMAnXOGM2A0eAG649Wsie1ws/SV8OnWj3RZEQPy15mu9nGgIfGilg4mbsx5MjjfErgq3HjhstBNXaEFVFQZoz0J4Uvg32Q/++mDeVKpTh2h/zq266ordQ0lMhqp3EdPpbYmtFz944OcxTk=" - - stage: Deploy to [STG] - name: FBxmkHUU - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "QY2CQc/xwXmxs+xJy0r3BTCDWFuu+6+vPDiVWHwT1RJug5PTYiWn5zqQBHuHJzldkvPDcu3/mYdW/pRc5HlvALYoBBRAxfy0805l9+LLH2eRmJ7Gih54FZbKq1p69R7cvLVyqrsY1Kc9sR4IocliGKyYB/mSDwsZIdsOfIbSllqvFbwN53TAzOil86jvDGBmhF7/ESiJ9WSQ/ta5FPUa+hpzZgmAAwfIn2m5XAifmjZsss2PR3zG0XBr80BFy8czCxkMQe0cwGYyo1Ppmcy1vrGyEDr6BzXih/TPzCoYzL9GjW6dJTpcl/xZ5mh88qZYTt+qRfaGqprAkPi40xe6En/ekYsTSbDtilJTwdzfWfiNozw+K3y9rrC3GEnXr1s+yDPdVm9PgT2TDZqQoFmOfmUBS8TC+u12bEo2th0m3aJqEoBxwCws8wdel/kryv/L/S/6NvtyU9KnHgPBUY8jknSgilmiVGOhUQbC77csssvBjlFosMBIEg3OQeAZ/nP4+qcNvLHrs7LKg2STICn1xdNh7arWUE/AuYnTYkIA1n2ULp5DkjfEMAvr9Qp2R9KlvCUpvcOwuQtuJyRSC/HpeJwZq9qI3hffdboyaxRTxZaIiGaxWGmU2TvtBQLuE/WEjG8nko2pI9buG45xt4T9x/hOw/KJ1wBNKF2e99VIRHg=" - - stage: Deploy to [STG] - name: ytrlMNAj - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "BzrA22Lrrwzp9gcOZyeOFkxmvnostsc5Y+wrQwg0U/v9Y/ZXm3b8GB1crTxFpquNCovk2zt87fJ8jrlRovAu4n7voizzVpvy08k/+2fG5jYyMTcZmbBOesNaPdFgf9ww2PaTcrhYvAI8KWiCsNXJkBGI028maFap6VZ1IG3GmUfgLRtl7lV/qBsKsFiw5ftTDYggm2WjySt6a2URAIlb3WFcBtwVBI+lxF8HrDbW8lwAepIE5r7Z4epW21MNN0S41lNOnApS3M8gkZhVpxuPCIGDWbW0szDGdhp3agioDH8y8nh/QtwiohZSxrVd05rIYLa0K8CKkjiZZfUqlo+Y1gEjExlUgiIta0J+298C2B5bH4WrSXZSFqlp+zyZs184T7LSQJNRamSR7j6TkSYixD9YTXsSHMOsjSK0d4u8vOBh9AVn7ss/v7P2JzEVCQNstmvsEnaH/ElF4LkToENIFKwg8e5iSBZhqIF2Mp5MDxtSudsRAfB/5vlGfku0jv2VeJlTn4V2+xn44c3opEg0SNEgVWXIkuj/Bltt4IqNNRo8E32bsOFX7Mm0sjp1IAhBObvRByn5ovK2+bum2IGLZCFXQ+2Ct03g9ZixU/9/QbFQgveKnBdUNhUF/X2mUiyNvFDK5TP+hG/LNcnNPs8iSGuthInAgx7oM1TDqS+1QGw=" - - stage: Deploy to [STG] - name: IkYUX9hl - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "BTdQcyLvwRpfJqX5qBHFNgAcutU3Vqkl60/7kWVP8MjDNwGqXKGVtku0sr7BJDTyGzkf8Y/UvvmDK4rX3tgaKYwntYRRAsgqhd1W7I1ZtyyFH7EDHq8Scs1pqgTJ65PGZZn467DRPhhs7l2l+4R3n5jn9/OOCZget7+bBAcKl3wvnCGoAiQcV2CxVinyv+BKvImU7Afjn6fE/jvEvZAHRcy5ZzF2cnoit4OpItwxGSciPvOSOjM0KfMqD/1OWIBMsv0Vj5LoVk3Bpzlqi5o1lEwTnytXLxeqEbcYjEt6h1nN6o+66seal2bCNABeN5TkyunxvblOyHoub8GKJY3dTvi6+Z3ku2vGUPDjcD69q/67O+pB5Byg1GvUWqsy6mMzNGHta+5l6GisymZVhjtUNysVxHgv0NH2SDDFVn27MsctH8Du+sqZEctKjnc3QSbUJwZmUjJrvaMmvpicPA8YiHw1MvGJPZn9qndIWxNfA+iQAiX5Alj+kmjkdfsdJ+CQx1Hy8sNC3PM6Hk8EiyaRJIPW11A3ceks8cnLcVfh2uDzKscjVROsUoP2uEIXSvlTzHXC13cplqQpwa1w8O4zsIuZvQlipTGMv160ytHrZLey0WgEZdiX/27KjIUaTgpocWGcviHB6KP9Rma6b57FQ53G36FL/Ar30wW4QW3dbqM=" - - stage: Deploy to [STG] - name: lAhG9STv - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "NkHg4dTxMKdhRpM3/354bnDD9Yf/2wjJ0BiINX07SpwHd2fGCGyXzT+EeRYFg1YWSpJ/cBQ0neYDN60UH/9iOvy7SZeRwvi+KondYI3LB5pwb/4IeQl4MtlorJV6Cc+jD6k+BSQd52t+6VdBkAbAhWbbW3aBoGe+5jPBbPK2jFz6FStGJ8aiffZs3KUjp263zcXT6Yc8y8oKf40QJdaYeOQuG8F1m54mghvYQ2uV+buUXLTb9aN/1Nvx3tkfkzCkVW1g5LZsboHmExuFnP29zSf2zlqKXZbJD6lsJ0Qcp1CvPXeOTi0Lq4GMfSaEOf+YvOoC3OHa5Bhn0Mph4cQF//DRcwRmBN0hNVxCmPCBOSwNGCUkElXcJO2ufNhKFGDn4pwEVQWcf78g/3/Oc/Awuq9sKjOly+yHu548G33yiSmvgM6ZuYtCBLFEjY3ovkLsEGf8MVOgsRtnPtpGbCqdSVlXQV3xi+HIDBUcz6FEj/NnAHitWgTF1BmMYyZpfrMP6A4ZOuZOqCoPfQdifohguaE5qrgbyod9q9g+Pk7zfQifi1nq71yAm/rgIbnZdipQnMpVL0oYbyFjwcd2xcG7gHBTp/QPQdnTHWRlv0uPsx+MrnIbAVaC9ClIUP2/PdSa9Yv7H1vbTaLeCI8LS/KLpZ5jEx9eL0jmnIBVvHKOnZo=" - - stage: Deploy to [STG] - name: ycO8MWaV - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "IFkxbn9P7pnruyHrGVOW4B844nYFk267MZO8T6n49WzqVNmBaFFrWQGOubouR3XeGUfaoe9tKmEWutIu32OuBzyJzmnIHu8H8EFdNxK55cY2KAQTCP6PbJQ93vT8bKqw5DY9aVJR5coUylVXJfhJWUqkweNUnZV4vimTiuyYk2UYtdWir8nKG/Y3jmVF5J+uvwnDqQTxTYYDJefoAg3+rbBL9PwxrIim6+TlfChx6SE5Fyf0qWFnCYxHyluV43p4HYfQF01xyPeDc+kI412Zm7ms1QtGWtqM2QouhLOki57qPHan5EkxmH30I0k42APWbzVuMzkA7WvgWttQoax9lYfkxkX8vmw7/IsCkGjTLcT8vEUVLH/oYv7emuGgzzL7FIncL7sVM+e9oPkYu/t0AN8lo3GO1E956ySY8WvBMQp3mceNRz31Lmyymia2xROUk2l0zMZQc6udx6MpxCnOC4j90z0LaN8qslgMzcjSyDZYij4nAlEMV7KPpq7lXidYlDP6q5Y+XDKjvV0bRmQCfsMIQHuwS8FaVjwE7qEUDVhVTiyeWo5l5WEo+99H62xzZaKwQKaMGiL8tTk8OxqUS5/0etxYnPNPJKgAS6kli1MDePfwroeH7Vkl8NfiOKw080hmEjf26NvpscYBurAYlvyb7xI1ZtkUIJQsHLaee4g=" - - stage: Deploy to [STG] - name: 5WrJbPXy - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "QXvHvj+4Z6WRT21/7Tx+3EGD5pKvvC5DOkbVH0FzVHChOevQrn607sKt0khIaL7wvVo3cMd4q7sOxYRAXP4BnetMAu7gIv5t3bHHD2cqkHVQZXOy0PD4jdxuaLrn6SLfUk47yQQXQPaJDOYcc5DsTOkCdbUEy6Eflrp6C3E7+ZM80gMvCzPh15Az/mu40GdFIzHXb74UlWKeJkZ18+8Wx2MhOgGVIJl155hBtu/nN+LX+c7AEIOpb1i0SDHck0/7A/oa0lhi7w8oud4HCYgJwwe4ScU3ux5aLuyJLwu0Pp9MaTRCVBYgew2o4l68w3bW/9VlvSwgcU0d1WLUa3wCecSWag4G3GwWfdg7qIGVLu6up4uRUrFB8h2PpbghHTxJ+3NlO8jtoHm9TuAJaVE43G2jCNCxl2YCBbydbt4ZbgvBxWDIiqdDbBFNiyf//Wjpq/VFYkRNt7TByhzoep38hvUvdYmocxVHKvRqPvf9vT4xOCbPf1/JDgyWgv8rhCSCzw4quz37NFYhZ0Axhc1x9El5V0/M7DEE9GmDiMzhylhcXJdLNIRDdJRF3mZOqMwlr2Vb+vAwufkXgqyHIsTZ9CZ3sRa3Qf40wOUwa0WV1BEwSCUcEkEt84l7tk92RpZk107HFG1//+qzrExtZ3jFY6EAXeyNkEuPNYj7WL/st+I=" - - stage: Deploy to [STG] - name: 6N8ZE2wt - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "JnwcwK4NnguU8iByozh5URKTuT0tQHgbB6+nIkval1dFKgoxLC6VoXJVXlBlzE2J0AZ5lDpqB0Tkw7EUsuEUQifQHNXK1HmZTyzt9l/3WB4OyqwbTZWAaRbcilAlkC+4dj6kwiUicG9BI64BpVlyWcXVi7kJKtqqxKutmXwFhjmD2NM0E3Dnz8Xfd/Q8ZhsazrkUDau2YzCXW5VAX7iKeiRWQrPo1GHQ18OpWVgZ+Pc+KeLvmU5GCbc6qiZy4XpUmhjTFT++n/zqckf82hqPgtY0JDZpnVUn1hyp7HJ/7jH071IpIsBucR0ZrEJYfHiKZaeRUyUQo957otgMW4tUo06wrzYsexuAnSGUTO88QPulcR2mk5O0JkYKuuAhrdapYIj9LmvpdBnKQQE6ooQnspEXrDpIjtf5Pv6/Pn4a8u7AIe6VH124+gC0eE+WnSh4+M/o9pdcMG04h3Id2tpEYajppT0PXFQPx9CD0CC6QeCSAM2/yqlQpygjMMK39bA6l32olhTnpWldpSgizdkFwSunzPkk4eK5OPWkZlgc9xUxv/q35ZZFWftN9WeCXCLQDJubz3JRsIrQFQplo8rpaoGVpNgPBNJ8m5jwFvu1H3VDRRmBSl/O++OAtIM74GOVV4d0yHi2fv6GeZnVKTRQGd7sRU1jSjszxT35dvp0o3U=" - - stage: Deploy to [STG] - name: Ae3y1NOk - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "LNHKJJpeBAIyEBK7oCfDX54+EMgawqAwQXAb43mXIyF2OIg7uXqkPDElJtXiDe7f5wjLQfT2TyeFIQpUHUpRsVlyBNHprztE7wQdWuFIInCGkiNWjK63mrc7H6CeocRs5oNeQT8HfV12OKMFKp8pcKAZX2Oz/RtG0+GrztvzvSyo47sbbF2/eoIZArF0HX2t6FpfYKble1mEUQ9KD092lQH2mW9DPgjOMeYjHQOJsB1R8VpcwFUdaNb3d48kDFDnylsZSe1BUf2ZjXJroQYox0i4L5YkQkNQzT8cy9b8K5FzGJvp39fIyKgVf6gRGw+2tiEiI4lyQXqDqXzVBlM6L3y7zWN7SPThbP3me8NHfuARadP8DCSaPMyCRu3GukJNsFvRypG5VQowGTy7b49ggVAr1y3VMzGdmVBaPgK8S0p3k82tQv1Aer6IrnjuECwcZE4CbHsyHUO0MKSIcJyMSBcxvzw1Nzijoz4cbwoDNLlCzZbA+sW4Vl5XhQ62smdpq+D51nhRcz5OMIb53d1UyYSEqnPUfJG+M2BcP43g04tj9jl9ONjYZ6db5adrC3uKm69p77BdE1GobhsBc9kDU1ZxR6Xpq/yMZI29PZTuNd9+ajmVzrc3lhsKkCgpH92XzT7j6UNTrglMjZU72MKoUBOcSz0Z93vuT8LKPX4je04=" - - stage: Deploy to [STG] - name: sWoLcKl2 - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "DSFw5vYSKNfADhuH7Z9mMpbntM49xHb7VotCM4Fqw5dAdZGT97V0gpat/gwe09790W5Lpni9+Pq6SInRwEPRl0Wg1qM1hlf+0QPqAyqRw78PBARXuLV4vgdDz8s98cEge+/DHgpeMiUeVR1yuQrV1qGfTmJcGjmPMNNTTyvq3WYT8cRhBgNnXUPTJR+gc2IXuQ4WAdGCs/cTn1oOkENs5bWU0cEaP2kuhOwlGEZ/NXesvRrJpmFYrDLTAw4V3xP3ExEKMztPZiAk/XM1oH4xfLzS2J3KqagaPqSKcBfEctvBxFT4z9lxiYzUUnsuq/SqpF1SF2i+D38pW7YdbIy2pSdlNG1NTN0FIfMvLZ6OWVFrYWw3QbyoKNKZJKMbYLJVHNkn0NTmMPDFDCEg2/JV84HrV3t5IdEKf8V5LEN0K4VKIlW++QST+aoXzB0klCt3cti4DWNOFdVZfGMqMjWvgkmL5eZmiq4sxk78XKHPriRqA2oCRYD+MCSgvcRMM5dRkHG0NoVy2lWrDZf6fmLbRtQD2R7UheVcex/jieJlQlYNskXkDgp91RqKXEGwbJKqM7/0Yn1BDqXlIYadghA/gG4SQtRU0ABIbakHKc6/ewnM8oMAZ8rC/q5JCqMd906CY9c46RKUixEQyMK8A+vuQjOZvl12Lk5KUpx++IXgNLU=" - - stage: Deploy to [STG] - name: hEPQkmWl - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "ZJOhv+95O+t0C5O086SPfsrD78COdWA7qcCU4XvOvFVZYEwXD71BokYypEWHwy+yG6pISavwirp0GqzozBpvlLom7Stp3HrFovtiE19/xcprcchWmUUWF5WJkIZR8QKA5N//Hg/s108fFQfFLLCgT8fT8dXt45LhEaq8MXg/u1LbMOpBi4nQR+n56urD6hvbNLoJiZ7WDrINOXbol8GPQ5wiXOtoWxzEwrjqmHl5hiJeqQ3DoWUFhpQSRmk6qzNKJyyqvJ+whlsJdcky4NZnUe1PVvjyS9SYmb08JrjSeZuOdWHSx2K9xlDL/houDM85Tucr2pvHNYFhpagq/4/64tcJCgb5wueevCncrHhzCuwBr60k7qdQnFvJ5BmMSws15ZIXC2nFkwvwnpoJQJ6/T3zPDmNqYlYbbEjt1YIhag3hnPJexN5gBq7LklMQTImGD5aF0ZqewxCaydP4xUjNKWCyYEapHb9EWFoTntx1XLFhQMHr5jBrtzRo/56NTq/hBlBYwOmhbN+qV5p2HJD4NXDCwAE6/OsrfLFVrWccwkAYIu7XWLmgFbIdruCpp+Uggwp3J0ZJFAoy47f56p9Dzfp9dpuWpwt+okConli/UzAGsZuanhEXZAlEs4VoC42lpfrdrwQBGRyhS6MQrMDjP5+oHR9HgcrGteNWLZKOxKU=" - - stage: Deploy to [STG] - name: BSNpc2yk - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "c0Es67xz8xuK0HbzlnfCXfAL0qzrQ9h1zdv/PNC8xBXV40jiy3/krq43aHsffl+AJ+U+OM165fwsd+4iYAz0xhUVWUvXIc/9CMCrp2ReLf0h8mXYaAqOj9acXA/p2z88QaxOBK/Tbldd/gUF7NW5NH/w405l9kjIu4hf9AgHhsYwsB/3CLBQh9HGiUAtgcaPbvnfxVAl2n0ds9aLmiWmKS7t7JrYb12Z0JkNR9tGH+A2JtMDtU/AeJENPlcYzJ8IE85BKtrllPKB0pPuLhwLxemqz8qXP/vnnzqIhGbO5YDeSg1vP+XvKnQi5MvzUA2fbnUjqvkjXalawn7GxQVv5367YDmhz38yvBYlrlp5D2aGN1uSceQn4ali2oWVp23kdC57WuE17dRqIi5MirvkNW1oTGRIBjCtXTB9U1kqNP2DXlEBOktdh5B+MuLtkPgxmN/sm2dCHsyf5C3MiQlP0xk25aRzDCKe31QasljGlAHOaF4TedopkMBfKVxmtMygdERuI07dTBqVoQFkzAeQuQGKR2k05cKSQLBzOe7FSzCUgLCwF4KOjoJBUK9dGETsLNCz9PnEWU0PlXyg5vgVQbOta4Qawv9Mvht0xFLb/dzfFiC/NL8W2n8pZ9qol1rvo6dshgmD9tOwwZEVRSWdbgaN9oxbzbcsRKnwRTpun9c=" - - stage: Deploy to [STG] - name: z0bKHbsA - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "dQb9r6uYVwbBEam0Ao/DdFGyd068P4llvGHhenlea7rRTto44RzruGvhhJPa/QTjQSMbqidCKy1HSWDyyyc8ODD9GQFn8o0DPsIL/YODrDIQ8loAaFzLTyHNxX3oGZX0R2goel1kC8xGMtkJ0l4xVsTfLGQwGOwAKnSZ7Jp40u9DPoGQXGhYvlFNHWtJDViWIhSJ3BxSYwJHyJfZqTLDr3+lQH0cw6PyA63DTJnkN6k/nQ6KdFdWOlXOYBKxZZnpo9WgNFPzM0Wykvj1H5SVdfREkwA+vfDRVnzp2cRA9EoAWUPO112lAgMqLZtobbN81MIr4MPFBWcVr6xVWxOBPX7HwqaO4/GpUmT5D2vvQNt0BuQ6uGNQ5RRAOgHqanHoj4/7p6DnfzKyZ1W3E5UoUbdCJI9++FM3yFea8HAho/cytI5TlHBbzpx/Zg81JRtTtINJ+HWCvvYRIdWOvZ0w7kJ3NAq9FBxBtGNrAE4fZhmiIKt50tr+s/wQJ0NLsd0gFz5MhDxlaiOCkuDwWRh9NIcGy3vbTH8FjXLxMUlGBcpmc5ZcIBL12wdZfBZxC/AYYhNl1DrQoO+blwr90+F9cwGwSg5ILG482O9tBAq6KHnk+M6iIXOnWaoGFOgX0jkcCMnyMdv44yq7PXnin2HgLNOoGpYlYfHIBShPe/5aBWA=" - - stage: Deploy to [STG] - name: DuYwZXfr - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "EBMKV3a71ePUglDRE8+XkuYc9i/Gms2ntH/gEYSGR0ruo4w9O6Z3gLSsWJhrTusNd6deqL0rFUJuD1xL7VvBESLtSB0EM34+dQ0MIO/2gOG3Y62//5mqjD8J/zPVtMMDiRYiI/jgSJGphXb9vB419Ul80lvSWKoKI8TvYHTTK85QmyFaRoZBjp71xv6Bn84WfkL070++g3eb7kzYFZOV8SqALTNO2sJV40U/3IPaq7qidALO+2nNJO693UwipZU0UVpq3TQMYQapQ2LK7Oo5JP+QRHnZS5ONQ8KfBdtsFNYvJZwz/N2L0ZVGUN3/lldpxJGStdKtXRpZHIndkQjJZ0lfg8/ZsdGZ6vmzz2VuDQyv4mO7olVsrOKcoKvermdD6bxirwAP5fm5VQCdgnt/KUV0DN554w2ILtilixvSP5M3XTPbQe4/Ma+1D16p8NhUDxIJVVA5ZNS0qWxc1esqGem9UgTMB9hwGEMxFG49nBHmT0XQ/Tv68tPDxXXJUEkNiOBDV/SfS7Ghe6S3SqJ6N5DZt039koNOnkFOIsV9f8ie+/dT8LY6IIbuW2p5TXTHJObxQLP0G1OroeDkARwiwzGMUSjeDdqEKN+khLvi2PFgpL9TiJDsB8eC9M6GRiKAJyaH2mJjYSnn7KJqScJLL5hopv335+Yc3y7sW3vQoao=" - - stage: Deploy to [STG] - name: 4qcECSEt - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "ZlZNn8d0XQ/KE/JBRk6f4ZwL6JksXRjks4lUciOMB8jfB5U747HOsv/KUxQReji2KFuUrJwsIBAOYUkP8iaWNZdM9Pgcvh4XlaCCQjKVRI63g1oKkiJ1RQajYkqDHynoYWoKE4gLqhi4OMf0vECDpsIvSouSkL4pIEXqP1S0Qvj3ttoJng7gf2zfQc/9k90uv5LLJ3jTxjoWeC61HW0lsNYT/DEQKlRFFxflJVRv3NxaFpRHAExovH9FFKHIz3vxoOoUyZ+gcQTGflIg5xrU5xbLPpYC1n8uorkkEZtZJmA+5t8xx6ae3L+lz6wJy+4VoE9dlPVb4D1ws/LzE1gTSVbq6pAgXaWXJxh2M3D9eAN+/KIQ5sceoenYOWADiWAJElf4qyFqrEfyhvi88DBouKHX4VwL45tj2qrHZK9RvFyTE63rSVbto+Iw4H/9brGbEA1iWmadySjP7RAo/hKhbE8GRZe0NNZOUCCaUrvyxwXOVQl/zpr3MmimyUzBIOYOaSkMYCL7tUf9zdksliwqxuAFQWbEEijRoZIOTBcib8HqpOd/I82lLmbC1nIgDh28aVpfLbA/41l4zkPbeH8xY0oc2WORcWOZutBhJ/sMH1vDUjMTd9IYpFGX5TpgdjIsiUJfb3OEL0QRkqmGFPXYyT1MWsAEWwCMmMEITiXxlhM=" - - stage: Deploy to [STG] - name: Mx6yxrhr - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "NBTZdYz5j0zdZv+ULzxjdOtUSOUCbcz97g32ui3fjDqJC0A9F24i7U3PNvPA16ZMTilA4OX61m+EyQGbUUJgXXrlxRX66dDsbYIhzF6JgH460sl5l/kBgEI9oW5r1w1yPubXvEpNq6S2vDEujmk1DEBluh6+xV4vvRLaAhYHfMYpNYsF+0OiyhhOUOrlVwbVIMfhPqrwPaFRBSsY5C3TDgqaTtdVb968brCdjfp+m32sncL6mXnfoZhUu/Rr/kk3arff/5iDYdlOM7Xw0h4eKc7W0iy5PxkJv282N0hrAiKvvY8j5EqQ5OoF5+0/iZUBmaT49GblsMRFRgx4jUi7uf7jcH/6/GERXVsE3dzgmn2tnxU7v86ha4EEAH7w2yURMhCagzo6PMGsWyQngt/GPGFY2j/6sSWyLa8hyOehF0L9hODAm8uW7qbJVBaJrafN4jJ9KnIBLV0v2/mWvrux9QFKiTJaErADGa91NCqKy0HDAeeilLlvlv7coetYos/oAszcuiyh4l9HdJY09Hn7eZikyjR99pNjea+qKDyuwghEnlZqUYzzvQGOovR3ZlEEW6bf7Y4iFlk6y4cFivT1mm5GEaSpKo1G/kcqXPS5XVQfrvZ8f9WmFDBKmxoQdT34OU60yyDmTV3yaUZPavcPs5tbWgCTbUN844Sdzc4u9jk=" - - stage: Deploy to [STG] - name: HnSJG6TQ - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "HD/HghxxMrXiYu76j2iUHA1onU/ZC5yUHMkk+5xYmNdpPsS8xCfnl3FupV6ElcHjSJ201Qc6lGmFDDkXQ3Hy6Kvikn+luSvPwviX4zvoCPxOgw5HqiaMENdJ8xyWZmHbjDK9DKnonMiuAb+tPIKmoMbkwve/NITy9dgEVnxcvh3pdI0DWEG12g25zHlVx/cEVJYqPlIu8wFMx/OS9EsanOreL84POgaCMBEx1gJ+hMw50PNpp1rhAmH47VNfg5//2sTNqa/F/xdRS6rD5+o8Fljw8+0hedaAtMAy+s2UD+04BTp34l08hvhyvcI/1OtSZz7V2h0PEm/+vdX9ZYRGI1g7mPZwCjXfmLriNFMeeao8xVlnaqehIt/BFxrZeJJbBuBvnVWCTGYM87k5xTUVRKTm3L2ToVfcRUS38xGQDw9ZDgn/4OKvEBqED5lFcUhOgBW6i9D1qjgQ1IHjYIFwS2+Da+JEyFvEhHxy239dtnqgPAeuJzZ2Z/ZqbZlzaHcPzamqPxY7nVEE9170K9JCV4An2x4yjbourH7r1PuwMOVrh7JZZhxNyVjvIONWkFA4olBz7cNGA/oiUGNudSv5kbLItWwFrNTmRuGfxv2to/7yz7dzAnoDdzCB5o97x8sWsT+ZsjwT+1jIXNCxJ2hZQ5YN5kz0k0vlRd968SReJ4o=" - - stage: Deploy to [STG] - name: rJfbZvDo - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "AwpoUFm32A7Z65GrmakkIm9RUWVAd0g6XNVhy3SYES75T9XPEWWVZE0cmYNZW3WTd3MUublOQ5IHLzkPre+NSQaUQ53l5juDiRmP9JD56kX9vulwMBDMuchjebBl1ATqKUPj1vW/GHe9Kt3+ggJz2s3fCOMjlxOe3FZgi8QCCf04wzY+t5NeSzUkASVbAptyQxEiTfrciI0REtSNxUWhqd0HSdIKH4T6dg+Jk81wWcnHoYP/AZhoelzZbdIQWhJAKnu8ZDHf9I3IBFTdMD7P90SVhlKFosce1A+tB7Fr35RW198CE0TvDsUuilsaKYp1JlZaMxL0+7ykqAJmbU6CIYpId0Jopo572WeVQcsZrS07Bkjlu3SdXLPxFMDzH0e/aR/4A7pI27lT0Q/26e131UhWRQ/xTub4QsiDTufZe/9eVRzVcvKGbKq1zLFRsm5tRrpZzVNB/uG+Zw4TjQb9ChAo90l9Ym7pYHURjDpmuhdRqQHBUokR09u2Oi0ro/JGZvmbW7l980JkzJokJrjDSIdZ4hOuCI53XxMdYiOU+eN6NtXVB1IyAzqwNF1mlnDzr62cTFmEQJJ4i9FvVJ4LZifxc7mBT909HqsD3MN7Ebma4um5QmWVMj8kaSNUUVslRyduMrx1G68QgqXeMRT1kWsQ7Lr+0x7q+tx89ZJZjc8=" - - stage: Deploy to [STG] - name: FClzfYWd - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "T9VRm7XjF+Z9/2FPxEmnv8m3eSjW+ppXL0nEkb3fw6UD1KZONXjO+Tc1p7e84GhqjUWPE0LEj7AL6Iwc4POynLE3Qs5Ji4cjQzROjoWrMN9p9hNne5RLCn/5ZYeu+wVCU+HM+twQCyNR9TgCYan2DXCklcVlzfOu3Yjp4Jk/+r0rV4cjfYrtnnXL9vpcf9kO7mH7msXC6qWvQaytINjy6jUEnIdx0JXr/wStSpYlkcypkYIM25yKobY0T6qsb6EePg5zbQPHTZYoXKpvEj5AC0JBeC1zQp+6R6TBSRoRlYgMReiBeNeGpwTMJVty1h1C7iIpvsUScuNSwzPHweSrJOmBfKFX5+L5POc8rn+DMPXbP+t/ZTAcix3k70+fgz+iBJIaiXW7GJAMs354JHy0/cZ0chmXo96HvcA3EsiSuAxkWemePaXgFStpKVTl+B7JzIjOESA1BEwLKyededI1SWPEveJAu7JDpoRyNK3nmPRdkqtiG/eHcpp5ux4ez8faZpKkNGyATFkKYGmxm51AGduIOuQHf6qWUihZ9ix7SQXjOxOC/BIZwZnfvf7D6GonL+EEYTNiHBMBkIRLq7UFOl5OeZDJ5vxDmMOBky6b7w3hTF3nn92fhOwmybFV95+FqtXM3VyLbxhVWU27HKaUDc/XbEdmE1ts4QL4gM/ovUk=" - - stage: Deploy to [STG] - name: 1wQbmPOU - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "o8gAr+eSd3b2oX+vqPqsiqUjT72yCN1W3FB7hOq06/Jfy7vAp2V+EujAFjhzTs6HAXPTtaOU7Y9/K/UwozOYKKb/Sy9vOqDl367p887kadiERlHpp3HV1pyefN1YuJIVYkkD4nKbxmgsk5pYM4EupoEF/HyPeY9CMDABwla528HEWM6OG/A+YE/97Y6cwLF/jIqYLO+5/r3n3SnsvDK4/NPLIlfoLeR6/LsGGTc7/UBUMVQ1TVjNXA9MICuJJl8ORSvOWqxIumOycARmkP3fxkUg0cXLRH4vWqDhG3dUgqQPOkrZ0fCElWIjj6HzUEfMQAGSEZ4JH2hAMfb5+rtJogWeETE5E6a3Tlv+pMlk+j9sCSkiRnD8U8nVvy2xdWBHQz6eKVOc/GDOcDgkru14rYbucQdZuaydvPIdCXEtEn9PaqrNanSbkBL+9OGlPdHmw0hyDV9N3gfM17P9N4NU7DZSOPR/h2oMcXAtuHUdlkKDFj21r9t2vJMNk+wGUqU1Kv3m5XXp1yI5AgGx38caXT6xTVJZf4+kYSZ30ccM0DXgjammUpZkT+x463qxuB/javBUQldVwv2iAQ2Th/SJePIZVhF5T4Yyc/KI4tagWNlk3ffQRakuGofNNso3caodT6uvQcPlcEGkyM3V8AZ2vqFZe6Ptu0I94mAxRmPb/Ac=" - - stage: Deploy to [STG] - name: N71QDxPW - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "FO4oo8QtwDh8eRV+K8kH1xpgGIHo8pbY2klK7UfFadsv0Q4XqiN4cvgQI2qGnXvbuYonyZ+8+33KhfTqfSdbost2QhAQLE571+MBt9v3lsCtgDcPWNmrk4QmtZjbO3sSLwnnruQelCQvpaiOV5G8RTWdKZ4wdC5aIlxFACxet922WAmR+ssz9BhOteSciHy/92RerNRxf3oXhtkMS9D0UhGTK8Wwv1c0bLtlrcCK+JZUHz1L3BCYw2R8zDTGjNfdxsbcYEfsqGjXFX40FD2rFjGGdj1+9FMWILAsb9iM/uxVeXTJdI/cSwapMtMkrtOVM9cG+iHVKShhKB2H8c/PxFUFOyTa3AdSCumynm3F8YWzD3yf2y5oxI6fuE8n1+DLHWxqfU0CTU3Opme1wq1GQaqBKWsns+UXODaR4USHl7LH8T1U38KErga8yU/hxNIGvV2QUf++gUI3DsluEJ36blGndf24bzJZqq+aZyztavqm7NQJBuijUhI/EKEvT9LdUKvjcRCuTDkC4qkpCOcaJhCJHWXTuqgG1nn/An51xvLLvNVat2/uLL7SA7nOdOgK5illfxLfyDMl4FC6mvjQM/c2C42gUQ3ZbYrTq3NZHsLhGa5ieuiz/4bHPtEmAvPbu6k+qrvd3tW1EnSrfvRt6yKr+Scyt9u3K3gyJgp0T8Q=" - - stage: Deploy to [STG] - name: n0kJB6To - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "NOjznrB+ChMlCgqH7kK94L6oFAu8266l6Eu4gHg3/AJ5RYwUED+vMx5KahZSJpAql1ZMVKFIlt/vpnXIM7+TdAV+5Qy3gkC4XwbbO5rUaTv4WkFWV2U+dz03NUMpY+m6j7yCoesNoTpob3yVABDvn45u6mN93DUQuA9debdfI4MP2i7YZ7pFTbnHlnYMkvlJDUeJzr9x5Um9jNDmxwJ+h0bBBhYsChymwaFerlbhOLG7CMNITe1w5SkGAwHwSAqs56Y39P7BrjLLxtOVPw8vw7jZyHwIhEMPGRvq9cxQAaTErPMJYSYhQLeYnDs75JO1gHI4pDqnAaKLe1MwLdSlxwaoWy+7SkSMrwFJpAz7LQ4uEcW+ajn4VDDMRcz22JB2pMljTsv+S78kEJaIHattKvFS6eaxdy7RNyt4bsIkw67ahix5Yiq8S909QL+BhGTxceiopE/LwGMtItwO6lm//wBFCcPiI2ZkPHPTX0xNTTV/uyJc/BHaTkwo97ZlCM+0EQF2X5HsoS5J2Ma/s4vEPQAVqq8iN/8CYynlWNpLDDVM0CGk2QZSgFEPbILfcMwQ2xjqHiILI28PZb/c5CgCKn+Y2bD+P3sRrcr17NOQnlAu4vBEQ9XrQmkXfvzSoUYTj0CQPwYMtN2o5SUpLHuovLyNxBSmsooNAXNewKVPKoc=" - - stage: Deploy to [STG] - name: zH7L9yLC - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "AJXXVJfFhTtcYy7U/rMoPn1GCabka43CWOo/HIoX/UxGTlpewlx14jQe83hIyQfmpN1SyLPQU5Vedr6IqAGRLfCShHxBeavnGgv8Rsl+FA7Ara9p5GwWeKA31yKH18W8Y5KTlPcY+CSS7lNhqHE5T0SYLdLsremppRcoL7u3mWrZk1n7Na5oVRWav6I0svv+RGMU4NVs7aK+2Xkda78XVwJt6GAZYSUG8U1j/gzv1+k3Rbu40PfKfG+If+XOtXZmv65OF1y9zjmYz8yX5wJfhOQZb3ZCvH8WB3EcnPj6yopAqFuAtdRWgR74TYVjfiWIbjk+wdan1DWnEM+ewvu3jGdZ1FbSj3iQ3c6vll2fbei/8dgYR5bMPqCMUqy8TzNr87qIoCIOg8bPQhnssrDAVYxsACXzOy643CfCKcZreEzSRO/tQsPkbXuAov6VbRZKgolIX8DI99dG0Lpiy5BnKV9Or1+xHDTTvw5hJGSp/uDzqA9mE285Xm5JPEqhgheICaOlPp2rb+/yLu3kIWWcd3ZGMwZdH+zOSuUrfYO5HzCnwElzHvfXuZZu2aBMie5WGH5zjmAwvpDDfiSmfPcSY+tT/fdlXZfG6JiKFUbNTJ/mJZwFTJU+fVL7v9c1t0fOXki9YIO5RIr/Sngnwub6Et1NR8yh8/5smpkVjuS29WY=" - - stage: Deploy to [STG] - name: yIZGeVBy - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "MVXYvCBRl0QXx9S2mSPVbkqes+AyKVDVtxTHiEi3PXzjR/wVWgjZbDkzx0aUfJyJhhi5TmRQEO+OUIUKFNjPTgY/BpxLLMWJ5xZppVkUrzXQ3X1Wysox56xIyqU5G432I7FvDapcj1+nciUzuhtn7TD0+gijo7ykpU9chkkbCw23QV0A5qIM8/Oq2MM6Y9+oq3LXLrzx9rflvF3DI1k4NL+GqAYGcrurN54uMu/hp0ywL3NuRcoVljfoWfbsmObFNPtONA45s0jKyfRdOtw+xCz/xd0uFsK/s2EX4Y3lhjz14Xig/gW1JbSL6pV7RWJgJqOiKY44Ye+S5mF0pN/A4djlW3tBUrx3sclQf0JKqKws5hg5xQAhxOL9pliUxVQtaPezwrDqKINloQTnk6dFyDJUE1R19FUwmFXMEz89L+hIYCFgcbMkAX9g8sm3oNRt3YaVTseGYdYxUW9od2Xxtt34W5E6m5q075fvmuWzYhh53kr5x7NnE+uX+Q8CUr5p7SgYme82FsoZvGnbaEl0LZpVOJYjMLlDjDneEO0PbMILpWkdpZkc+nPvwc5sTco/DDATpRbBa4X9MDRqw1zmTA0mrmbUyEuECSjhODx137mwztt0U+iiiJ0vQI3dnb6YnPTIV6zvGG0skLpkb/8zs5gHHfcIsYhSTZBDCA1HMCg=" - - stage: Deploy to [STG] - name: ntsdHBcj - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "mFk0zCZq5KMDmrqgAVIGAoVVdnZS2j+BUrFm3jUISREEVUnGh+EGoTYBJEAXEIr39YuZvUs852oaareLnZk1t8ZIHcwe2DenuRExs/24fpGpoj0RMhUK1l1vGraeRaqfWpXU6CndT6lq/UQKWCQb7euUkd4ZFlSd60KkoVNJeFuR+NOIRElZ3j0DkHoRUHWMH34nLBKB2hUhPfeLFfeYn5M+6Av/tMVOlBnjnS0oHc5g2HF8dr5dIf0xUASETu4tel8KWJ/N76DzmdZYmVm3CtZMccy8OI5GP1JviMh+DlpAE8y1a1HIV4X1aVsv/kv3FCqvCo6a0Rzg2ZeJTnLYNXqISXDz4WAfn8yjCjp618GQleHb/2ANH8VfVFhtUhxi/ri9G1OAimrWMryMfamT4OWHeiisvE6QPi4KvlkumjRQtlLnZF/2xVugrNAwYWkWXarRyYx+ExUJEmo3GH2JzcyRQdQ5wx5QL0eEgv8z0lwkp6+CBF44xtdP6yO4iNi1tv/pACcI4ouxC2Bcbshy7n9z21uTpN870v/6BBw9Hw1jOMR9YbsmxBroGmBk/L9enJCojkKuf6uHwlMgcLiUKeRcRH15ekdkr9HdAKAAS9WmwNTTodGpEzIAB0sFjD1KppswXC3NRgdR+zoG3gi6Zgd2+dtpDOcA97tiQVtLLWQ=" - - stage: Deploy to [STG] - name: CgYvzUBX - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "VHsh0ynYwp5COHi9hnomhmPfpp/3kozON9+zCjdl2iO6BAtFvMBni36loCSiRotCo6TBXt6Y7tpGcInH1GJdPTJs1cARx6ValKH83Zzuuc93LgNPrkvkClPfgfpJljZ17MWjIogqA03aAU/P3rl163aBvWZ6CPca+O7+mp2W7ifUU4Q/NCKqBYuBmT01pKrhnSQaBZ/CLIoL3on1Yv6Bgs8cVfV7+8Z2RVYhJhNTwbJ6YjkuJb445A7B6UCxATT6mBEnYYi71DI2/jkFE1KoYqqC+Rwjb/5AXrf384wJsPt+vBgDBpC99asgw747CTM+HiMKoy/avOh0mTFCondCFyZCyntHbNhpxcQBFixS98S4FXhNREmn9kCC+x3xEBlDps1ytjuno5dVNMXuPj/LNuLEdprUZPAmJXIubZ+exKwLJYnDiP2ZjaeU5nvlUIAxcHpZB//vqJwKwKOrt1jMuEqBpUtvra/r1E2bDg17y/PB3/Do9NtjXQKcRATRdMdv6a5gbl3czjZ5LE8s+W8YPK77dknQlbLYckcxf8rYewgYZo3KbEkah8RGZSze7HAFqzbRDmkfBAtlAgjoxdv6N8zUnObm0UBKB06rjWdE0j2lrC7PP8eYc6mLL5dnAVV4H+TRgzUUFu7PIvQzlTaF/+6OrR5x72UWCzq7J0o1ZgQ=" - - stage: Deploy to [STG] - name: sCxSE3T6 - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "DNHa9kzEj01pZW7BeKmTMuiuk1ggXrA0hc79sisKjlOKX/obPjkf3hMJgicxFH1rBkWeNjuTYoIB6TcXgQh90N4UoaYQdeYDnpeyc65Vz5KsJ8zXq0oFIdD419R/7BJT9vqW/d5ByZ6foTtMnhrzpyY8krblmq3rB7lRzN2rhBzybvFzTZDILdsW9PkaVFWPVHq8jqvJLFuloO4B3ZlFgdxw2m0FlZkqT186cRmcwp44aEgBnbSookUZUc1fVMwuJfV9nXEco7+UZJclbOKXYZp2wfIy97+fHlG8IRd7auS6DenZ059jNc0VHmbHL8j8fhMdpw4EUuTaqhJ8n808etyczeRuqa+wwGjt1SCvWRCWR+h8eQv4Am9d1PfibRraIvmHd4tlntXOhpsqZMbuH4Pn1UqQNxqQuTJ5UTzUlhxnU67GpWI5PCNZvNj7ICWuRddqVgm6mT+KtE/0BRraBbj3PBm5PP/cEw5IC58446dqNQrjKQLzeo7qmySXQqN2hQEfvotnnshhnF6i6cfZmV/0lK3uGOGckqzJGrdU4zzM2uEil74WXD8aJzbxSvvdqZjU9k8CZoCT0/W8CT7KTlu3KRYoPHIOrPn0lNhsccu7dyHpEEm5em9+5SKwehXiV+iyWNbqlyyLUUvNBb+hMLTw1cUYlDpaPeo2zkOAb7c=" - - stage: Deploy to [STG] - name: Gi2SVBtf - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "JJbUinKUv7mh34OrT4CbECY+3O1lSefyXObSj9qkcqrFDvnaVIdWnzoVpg4nGY7OE5UJV9KUb8+PJvH4YwlNb1DLdUD01xQ2yDBP1iPrlMDxnk6ygcjm7D/ji/IA8yUHuJCaZvdyoRcGcURToYlhh2fuvTRoganue8zrhLByY2uioZmt86QvZnBnNhNverpS0PfaXFdV6jumYmj4WJ7ha3CLPMVX1GngLUoEvXH9/+8bHl5LbAIGWlf3/bJjVihjHWMB7AcRENLSfHjgvohxIRrW7rxoxA3RzxR9lEylTp1GPDkBnm/8GnqIbjJVDqrI6F9O89+yMe5lOpL1a3KXLVsvVLdk3CIa0EU518MT0UKk7fQUmw35cl8qAZzJMK+h9037o/SCtR7/batmpa8xvg1J0jvkv1Y/bbLgYisLCVwrAJu0x3zY7sViHbzm06TAEO+3jf36VfFfnXvtit8WkBjv3dXRIEeDGuGxp6LRtQjdKBIXLxK9kB/i5WXakacT/WpyM0oCA2/MV3FT7HByYEfRHhkGKjwNXm1PMWJvKURjy5BBYK/BFcrsgAM5cg2CBWOS6wNXUCLL8mY2lFo3OavY1knUptgf/pmL8nNmnTA5ghimrbRNP4ncX0Vht5pHb8j7NtrfDkaRUYA8KR7iAPYZWF4uODR4ctxTBH33Zpw=" - - stage: Deploy to [STG] - name: RO2lS5iH - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "WwJFpsLCed+bgiCOpC0uwz4tn/ZIKSnOneugftvwMd/rdgEN2WAqDUDJQBguCnBAansU7wccdGrIxjw89gFopDphvUBpH97PmwdzZ7fNHrOsC0YzjATCIxCOfNudoG2qs8dwqPV12dhpqYKe2mV979xd5xXhrWIhNhVUN9f9GM1ghZ7s/xsNmZ33YUatAyBXcGW35Yf+yue1nYsQ/Mtf71DvW6fZtqs3MXdNf5NOaQoxewSulp976nXBmMAJLlnh0WI+Hq3Oq7K5V9rSNkAoO+N3GAyvZ7F6659InEFZHeKvFETeJhv584WcFPnFJpasxl2PCcVOAIfEyhFb6ioj774myYO9mSgPDGKjjBikvBOJu8/nvICgNVn9L23362OjfmvXl25+z07jXQrWVqe38Upe7QlNOP7pezCMskPp1gyFI1ygwNVL6pWYXDFCtrFaDiRzqYl8JZTcIjAuxlFKePeBupFOTG/73uzXojNe9+N63iZRxkBExzRAwoU/63ldWQqvojbJmWl9MNZfMR1DW2/BFZBdN+ffZI2kN1M0PMrfHnB/oqoCHtMUKRT1AuXwGR92ybahcd2cp5gpPuMyFCHRgDs1B7cnzGDlqIZsC+UgmoqBFN/CGLeNmk0zQDNEuqGEuUz23ttgBMp2xksJ1oYWw1yhHeDh44wToNdtuvw=" - - - - stage: Deploy to MTIQTppT [PRD] - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "aGohhiErGxfBLasrgKBFmcKESr1Lym5xqsumqPn4Ygaab4lU1E4u/+ov7/8PkWuKncyrImg1p95fFtSfx7TN4VrCYGwg1w0XOo1cvUYfY9Mkrrb4As7BFTaERVZadlsCBmThU1kHoA4BTwyBDiqZcFyEgY7alGz9Vkn0TA7YIE8Ba67+am1u3jfe7yD5WINilT1yLMemU3uvBBfN5ULyVjokHPDuAGJfMIhQ2gWBzDmWVUfTauufO0b8/veMADJWMB8sPtd2qormY+sCy3iV5HaaJNJXeNrz05pMStcRPiEbrmPBB0zyYJLhJebeLF7bVGjN1nnu/oIxWBSwwFY9rO8yb5vo39tAQBFE+RhNumlqWmymUptblpErbLisfR0YvskTdlxmEULEc+liEt7XVhGMz3zl2g4ED+r+yHvmSyqSwMso3nusaZSANitNzkNAQBZqtRu13k6cPaEP5J445RHncV4v/bOoylecLu3V+1HaE22vwuE2m3mByjw3CkEjdgRCZLvoM4YVyH8abaf5MUb3RsL08CgTKCHiEH7mV7hyYicivUSSRf4sPg7uRG5VSz9wmWGrkBd8+KXyv5HQ8H/p0IwcJ0DSnoWSu93aHFda0KyU9eT7p/7LtYN6igsKlxg9sQzzOqJmMK+aYraZtWxD+okBpYbYA952/KGk8DY=" - - stage: Run Ghost Inspector on MTIQTppT [PRD] - script: ./private/bin/run-tests.sh 620b83b8329c2fb1fe6e1516 - name: Core Blocks - - script: ./private/bin/run-tests.sh 621372745f85360d3fd03197 - name: Custom Blocks - - stage: Attach build assets to GitHub Release - install: ./private/bin/install.sh - script: - - ./private/bin/build.sh - - ./private/bin/docgen.sh - deploy: - provider: releases - token: - secure: "ntGrTcHs5CEG/sND+mpRKFNpx7z+bAY3aKF6Hfb1WoFrR2Xd7dX5NByaHBiegfT2kJ5h5XIJyG99lahbm+jVRHF0S+G2/vd324OFM1ksEzbElEOv9BWhwfw5EZtxawq6oleiWBvvTvRNoq5HhbmtySF9K164NUQ+/ntSvTJ5WXWXmskgcqQfwqKOoKQuGgCfHi3CczBsbMA3BgGQfvbCwL3Q6i4VRft3LnxCFVCHSs7lZQ5wTQIogEOI44hL9ahExwI7DORjwNdx6mDe46pKtEkBd7QRHrOEleF47Xg7Lz7EF1nVxY5BkmaQ0S21z/7WRQR5WCEWCXjykmBVd4jhwN+YVin0krDeO1nfaj3w3t/r67eIFZUX3hClaJ8O4p00Pd9PJ2TuMCP4cttTNBZkTtUvWlLTbEv4V2v0yTVX3Be2xACHlodwREL+JGYwOfAh2o8ZWoD8N0EbIoWfjiWaulCD2oXQSJnbG6hqM0vHEwLKzFd08elr0SYg5T7utGbTsrpBxoXxSjtc06Le3mnZZRjcVtRRA9WM86OUWzr3y6siSMO7vUm5dSA/QD52WFHKgvmByfbOmW5R9jdtjW44MbOH5UeiJkb6mtVuSpMEjWb7129Li4OnrmwcTP4QYt0CFMJGMz3HFujYH0PYhKhwnyTDAIQfELizoMBaHP3uonI=" - file: - - ./humanity-theme.zip - - ./php-api-developer-documentation.zip - edge: true - draft: true - overwrite: true - on: - repo: amnestywebsite/humanity-theme - branch: main - - - - stage: Deploy to [PRD] - name: XQvhdoNu - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "H+XyPpetXJ11FCatG26piAfC5YSciYmtgV81+b8inWSIn+j46HOuGECn9rcXclrjc6ayUHXs1xvQRAOH+hcrsu4LCd1lPasVBlrFkixqn/xJYquRcTM6SmgmJqFOgGlX9eeTyAw8p18qmaNDm/3YgbgtA23IZTSpYUhSKt8lE6uN01WlWOcwy1UAyRp6GtUeH05JjNW6r5b3bspGYKVcFFnRUMEXPKFVJv04nqoZIeHQKL362EKcPRjIKawXkrr2DrQj7gmjqFCEhoy0kdkg8G8fv2lA0WF8cqj5vFHqGab5ag0Zw6/qw6Dug9KHuP0gFMppi1IVpC3Aw9JpISWzt8Df6gmSXcU4AeNXoGqK80gC2z2cm7p/KRiIQqcGgHxAjVORKkhz9rAS9uN3TjnUIAfHk+y8crGj1i/jBm4Q4+1SAEcGQDveMw1xZYf6Jefv7KCEH/9MSUallSu+vB7bFhYSmiOiUFT3gO0c2OWir80PGt3MOSmPuID2wyz2YJ2XJwZZUgVr42UqH7JA5mlxELNieLulzOnkDLDRjkPJnRo6/zX2aZ+TcwYTtAiELX0wcf/iyg5Ricb35YLndS67kL/o3dTr6li+tZiWCZm07GcJMVWasp+xRWMuF7Tf1E5rYCT3bhMewAsYUa8PimpNbEWMIQj8Nh1qT1GTwD1tSyk=" - - stage: Deploy to [PRD] - name: 8Mz1qj5P - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "JVJ97lDELT6YS882YoeE2YUCOepwKnnp2xK9GKlvGVIfnRSxsnw3HR43m4+cZBfZ3xzBtFBSps9r2hV0qkebBEj2rEj6Durr+x8MX0lyDZhUaC4yNKHgVuQHuiyycUL8k4JeuGyIjdOaQ1ghsQLP1gWEVV/oq1lV7EQjdmCHwdWCv+u+5cZMGrnz5dIa5+0ixekwmRN5hFdzXiKYkVuRWF+WMvWr32VlBuk9g+rh1RLEVMSKr+9xN0ju4QewMXDYHMOFzMQYSH3JJly7UVsIcUIUTJGuxj8wS90hOfY+us+H1HortmUoS14x/gN8tTgMlHD3Ed7peJSQi8JL9ehYaCrm5gV2+rUJpO6GzBaYVOuTAIFzhFX925UO6vgvlDaDBBWDBh3317St00iNZHU5MHA03SEwqbSDc0A8QhC0wiRPzcc0+TtD3G/MdA+PJvUShN156DmmntwdV4IFG5WwIq1GpdS1fBGMcT0jPp4iPAtmDCslMOJ9kF1Gx2paU1bBYKaDao5M8F7/k8XxHMwMp40kCPFRSULQl2fRS6JjsSMORdOqfCLpiWrJ9p77BJUKD1PKLvhpoczJMfSubhvVs9X9iWVnWM5v1t0DVJeK8Cu23GqJo70rZKDV/YXh7+zXs0AydfBgJZkelwAFjpqu776DY7obrH7GAqdrWEoxjv0=" - - stage: Deploy to [PRD] - name: BCDKfWF4 - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "Eb7tqJTi6k0Yx5VRQXqebHidD7R7zamshKEEXrU2QCcj2bJpUMDPHCVIj1bbPxBgTXIbHH94nmmoR+62kflde8JFnE7OjKPz3WCsRWomW3TmuolCHPbxqitEJKLKVflm/VYpBwSLP5Gp8mFsNqvph7vV4k7X0NxtmeK3+r6Cq3YeISgQCejTE8JFPKeHLPti/UEz+ioHVht+18hpNYjGMjgWa1HUy/u6RPgMQBfPaurkDPQa0/YckVv1XuT7psnfykJoxsDzBCIh/44V1O9Pww/LIQ/4VFXkAJ07WExkBaV3g/M2islJcPOJlw60yQfY2GmE3RUcI9POzOuzDR6WW/pUdjIaYYPOwD4aT5qZLFKNtbGLYFNFUZD0Pzpncn6XUUBTinj3gWMBXXKR2oL3x2pFjvAR9T3rYe4rikDL4obJ9Pui2eKt9pOduy2hPazx8casVO6KQ6bmwyaCk/DDfDydWrJ366n/wrXCvhdmsyH49pwU+TP+quMhkWsgOyOOCNFTC2uJun7LWp9Z6Y5dIB6XzYOb1viw1HuzrDzhWRAD/g5D9+/W+rGt/sm1RtSD0zumPr7AZx+bEOyAgMtmNTgbhI/It/gNADCwhOiFOx7eLBnkqzVHytb/tRM+h0jO4a0BnHUDk2YzY4AGYaWZCpr8xxWCdiwFS0XYTUHUJ0c=" - - stage: Deploy to [PRD] - name: MTIQTppT - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "aGohhiErGxfBLasrgKBFmcKESr1Lym5xqsumqPn4Ygaab4lU1E4u/+ov7/8PkWuKncyrImg1p95fFtSfx7TN4VrCYGwg1w0XOo1cvUYfY9Mkrrb4As7BFTaERVZadlsCBmThU1kHoA4BTwyBDiqZcFyEgY7alGz9Vkn0TA7YIE8Ba67+am1u3jfe7yD5WINilT1yLMemU3uvBBfN5ULyVjokHPDuAGJfMIhQ2gWBzDmWVUfTauufO0b8/veMADJWMB8sPtd2qormY+sCy3iV5HaaJNJXeNrz05pMStcRPiEbrmPBB0zyYJLhJebeLF7bVGjN1nnu/oIxWBSwwFY9rO8yb5vo39tAQBFE+RhNumlqWmymUptblpErbLisfR0YvskTdlxmEULEc+liEt7XVhGMz3zl2g4ED+r+yHvmSyqSwMso3nusaZSANitNzkNAQBZqtRu13k6cPaEP5J445RHncV4v/bOoylecLu3V+1HaE22vwuE2m3mByjw3CkEjdgRCZLvoM4YVyH8abaf5MUb3RsL08CgTKCHiEH7mV7hyYicivUSSRf4sPg7uRG5VSz9wmWGrkBd8+KXyv5HQ8H/p0IwcJ0DSnoWSu93aHFda0KyU9eT7p/7LtYN6igsKlxg9sQzzOqJmMK+aYraZtWxD+okBpYbYA952/KGk8DY=" - - stage: Deploy to [PRD] - name: xrwoNKpA - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "eRzWyD1HzDOF7t+koSGZr5AR1kA9eYRblHzj2Zx0BXTPQLWfsIv1R0CV15QTKQ37FLAB32wnIPtGpS3kFLKwb9sqtxCQGU+VuuiG2QWh8Wfu/vGLQaC1v+3uCLYIfm3Jj/9r5xBav/xYwpwNbYkvIvNa/JtCuknh6GbNYH0y9sw+QAeRNXH417Wv/gezROxJ1VcRn1IE7ONGsVDgQAsNoutRfJklYtuscCrOb7oB0IFeI3nFjsygE4COwnqyIg4nthfVX84CS/aNfI+2g/ZDs9Y7PNq+tZpFt4Ut4CJnmooJ52KVotL2UFB739CZUbebeaVszPJgA4ncRzFxSXC3ss+r3vYoLNWogcTQ/iv12/hgiW+D4CUeIN2WlDhZkX/Vh41padplMGXy5XeYwj+4Xr9zBI1iaQcJgWH9Q5B3bUGSmrFBCXQeQNg0RZlddGQ6ROddZ4+w5gEQrIeM48dApb9qKOfX54K99az9C0m3q0/Pfp7a4A3kssXVRPyXjoX1ebO4JbFEncZb3XFGH7Whu2RKxE/DfHG8N1CdbQ3jgvav0I6JG7sUAn1AaM8X291xMVwbhBOz63NXZC2Pp64od63YxVS8J6E9mzf+AhSICSO3gN9zyCVtVEm5r/0vRYI2moCAIg5vruqmLl7vd8f3ElCU4XgPL2BjINTRemZ+yeA=" - - stage: Deploy to [PRD] - name: sUwSjWoQ - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "EQUbK5kh0her0wCCtETSCznKVRgXG034jLaurHekZt+Vm9GXLTc++5OETlEF9Xv95MJvbqLvupEpax+vFWNKAs2PS6X7xbsG1gBeSLqqkqrIdmBjUE/zj5UoGXRrm+Qb089Gt7XhYDF67/SmIuaSUmttK7K0s8Q7GRON7UB0joWI0ROpEUX4GkY28mekssleR8gxO1ejNZI+Ke3UeT+9FlOL0SWUhU6m9itSA3YeNzItIie2DIoCcovwurnVrGwl95e0eH52vVpL+af9CNilQ9gsnb4rqk6ADERUtYtjVDlM72UE17k8nflyFL5w2O4O0/oOdkBwZpGYsnZYDfyogWVaYqdeXuqwit+SiA34cMxO30k8LCXlbC6EVKSi7QorRE6Ilb/UXx8sViy8oFhzg8a8xw7LlDP7OcVEMWYM2m2gKNLmFgv3QxgnO1R4taCzj6fZ0afKPESBTijckh5Bwax17qzePZdTtuigyZPreboFLYu0pjN8EgOWvNWlQjbIrELVOHQBBwPvDyBTgWpnGH7gnpxkA/53TwnJqyTiEaZVwqJsBnZRaMvXvUOFzJVtbAdsqUO+D0pMbJ2RzYc+QatM0LLS/7ka7DBTcF3NFl7vZLX9NWOOagnfQTaSY3BwXGjC0DoY+rXrMPnZKYjzCDj5c2oi4c7jyUypW2ttj6I=" - - stage: Deploy to [PRD] - name: 010TdDve - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "IFp56p4nBQFy4Omu+kay09Mc56GsTAWNgVQk85PpnfiffDApiGa0j+3q9N5Vf/oQS5bv+jSMcQ6GQUyeDKBvONP9lTkX13dep8sIQuybOmfJJJHO9zcU8zSXtT5aJx+MJQKncqMSfKGDV8LfDS+H3LcRKh/wemi4fSkXp09l4VkDRqpdXnknPm75GU+xVDLpGsa8988LXq/pqpjzvw4Y7A9AwvOeJT4finNc5GzM9/OkLi//0g7WZMvR0i+McfSDNd+UgNK76wJlc7Zfi7lRb+oDpqAK/UXSrYYz1Qf0PTKzbLesAGjIaVa3lVfhi2IOLSV1BHoFji5eDS//QeVSPjU8vox4OtdNqL5E8lx1YWT1KM1j8gN8TP3CxVMVfyU9XJAbD0Tsb9JEMaCLFlsrUUzSIulMgbGPBYjhLu4yJdMjPAj0wM3o1twPR6MBAGyTE1sCjaP7KWO+Bj5Si53+TMcCnTCTUxYY7HpDfNZo/A3ZU7O2g5A4jJbILyE4ObP9bBCfYtUuCWLl9nb63QsAd7/nTvSsoQMHPZUsI4ZcN9l4rPUH2/SZzpKW67z6ACFMyQhvW4edCkSBXNvYBR2Mun4PAi6YwzR+roPTdG6JUCCLcYQM/NXxaCIWQP3a+q5+SGV6qZ1RZM3Wv7e+qeLquzIubPP/n9RTqiKKSkqwyAg=" - - stage: Deploy to [PRD] - name: dfOd8FOh - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "AggG9bhtyM30Q+KnFy6OnvqSlxqqL3r3EQerRYLPu6jCx42sm7/TZF57os2APdLfMGyl6IIZ1eC/ZC1hweIsp6MIlD9FDtQwUFL8otIORZRxiZCHZZEqoCr8nR4sasEvMLopiyOVRaALqY6oDzkWrz/ie01ZyoW0SGMWwxrmPNBtm9LYyI7L1WUQWXFbKN/A++lSduVFDqR/53zH6k5v7Ey27aU10e2k8l59c3YKLLpACpbmG7GdTLnp1Rgm6YEyhMV4iF7BhiNswJ3DtVJpntNFffAGiW3NXCxK+vAq5wxEoQQuy2VtPoUQ6s/l5HFdfmxemIMNxOl0Hnxbe3ACM1u9i9pVIjsq2iFFigf2WjplrJCf/chRBRYWIFbu2Ktr9UUuVqdA5AaPR789Obp1Q5NaGZFwUvoSoG2n4gQlJqGN1Fl3qE2LtlJBJ5G9EBc/NpqPjpe6zpbed3r22ACDibw3QsVVKiFFtATGfs7l+Us1cMVWZbomc9S0BOtQRdOtT2ny7YmJ5OGktvcUoynE3ooRvSc8YPTLxgKYLq2nwuGTVlh9G659gN4UEXdTxOQc+FIuNKTdYwntjWNAq+oxC6pvJ6PR6m0SQqGbhEtF5jupDXmQVNBEGV4SrlgaEWfFzZ1LAALMErp55Y0xFn1IdKJPacc/67u64eq5qKbqws8=" - - stage: Deploy to [PRD] - name: jTo6Mipz - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "PlGsMRYLe54YFSvavs1KP+loTGYPlN4Ajbf1zZOacGW+dbsr0vivXJ6dsLytkBaOMllA5tIKDwPP/MDtpYqhhg3hcHEaPjDcGEJeRf28VI5l5UoRjRpOZ0z3REveEilIa5lRwHPcP18xRflPIQ3ZL9d7CBJ/yxQ3W92EZz2YBneNO0/5VqhU5JU26enggi3IZIbmVsPUuDN7KEH3KUKJYFl/+bHppCfsdM2C2IgiAmhAnNCYMnRO2Og+I2Ea6CR9kX8yHMbowWbv966y8fU3Y3J81rz/0jklTqfKQyqYUti/N/GEYtAEWawcARSIkiLqufJ3VX+eN4ue4va05GaY5hBB35/p44ECKB7qaqSz5dqLSiLDLBHWkWo6oLDY8/AUKGFCAdBmqtw09wMizsqtYZmKZgPb6xY58JYYOws7DQN3+Qwdc9bijHDNIJwoY5Ms9jOU7ti01MZIHbR1xusQIHyapsPh0yVM8DVjE9EZe0NkBHEls+wq5Gvrf2Sz8vsENOlnmawev/RIyF3Nl8ewQWG+9iYXfgUWq2xeWzKZ5aJxtkQDsEKM1pdZRMwPzAZLqjn1dnapKbv/AdZndzkrsL9qkW1w37eD4SEMXiGD48DQh5Lq0O8gOuP3cAnz9JQTSWWFEmTSJ1VX4FGJECLCw1qvDvkbKLn5cW81X9iiPrI=" - - stage: Deploy to [PRD] - name: U0VS1dpc - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "Yi6oDfxq5L3xIP8PgFXI4DT7EWFXE3wkJooJqRGHVjRS/24jD0GeZVhln3xibKEYbkSqhVhbVEv6mhC2YKoZYqlNS6VSql3Tc0pAfbzjyqGQryd6MS5YvTQv0qWu/aYiJivxkdUstxp7QbqpJIFES2uI/TZRFEty7GnhZ2eQSRpJOLtAVAUqBmuAl1v01XM0eVs/qwSo7udvZIFLzWyUqH4PPyxO+peQIT5DXQcUVL2pXUf9LoBX/GekgJshiZ6jAP7WbCouxsCyx02FlcZcyj0bmJIGtFJMbCzzr1cDdbUzxr1qvSQP2R6Vy0IMht3OvoFoTrJmZvYG6bFWGX6JxnPfji0pkKi30i5PkVlzDmzUuIEL3CZf2ZtW1VygG25efGfUL7GscvKB2A91R/3ZaCLfUrcsaDic608YMXfnlksynK2Ys7aIdpQBaMRxQhn4gjdF1X1oXRolixlIznfx81a6RVrL2/ngt5OiqTIKRPNQ1kmTCUxCJw7lFWLgrnoPwWDmWJybHW5rOk64FiI3+i74pqP9s3hvBPgNsXVlAlw8NgyFMC8Tg1V8NrL4h2oCTRSpWLEShls8D6bP4YzZM245ff4WMTfZKQmeMlpsMMUxiEOKnic7VyQJOQlPpZBMMM/qeJQ8AfY468dhYR4pieglZwOVK6EwaJUEx5jG2aU=" - - stage: Deploy to [PRD] - name: qEQj6OJZ - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "IlAT2SyeXZTX09s9ZfblUUD84HdnIXtQ8hrvT0mT1Sg483yiMT0fiwn+xrVJyAgTFzGk9vD/bSR6Oo6UqV+8+I+5Cp03Iy+9Mk7PM/oGuI6pHZz5h4zhsKkRmpGarGtPJeOl8yHnDSGqZOk5uE73+HubrfjbrAC/jRZy+JQIC3oma2nXmAH4mul2AQMcfdZsPsQwc/+NCKz+uGLLn9JWs+7k9Gys9d9DugQDxEFdC8yczYBBQJ/m9MQPQqqIHaSI93gNC1+SIOX0aKSmLNI/S4cEpgxzn68PEhM4AgF5bWctaOflABlyxRyqVlc7rn8oR+tnv9lOv3RmK8lpWFS+dYXYx6IeNsyfhVw9kvB4jzEltsSfffnqxUxcJjupaJDDw87dAwaV8NdMPo+vwJmaU8Dmi9IxH6KNBKVsIKv40vRIgpvA65c0YKAWnck19vD3Gjq2zjr1NStNfs3AQ1t9wVsBAB0x8Jce/cJ9Q3v2Ja517ilB1Kh2ICHJFQjQwuqpFEcBw/CWGe2Lr977WY6EczS8e9Z/mbgNoRgVHM8QIro267laDF4TN4HEm++teDqNrPNtalpZjQDv1J4GNmy15PjaKEgVTT3fYwM1D+NNnjGa5UIkSZOTNOxb03SUmslc856/bvnE8iacHZS7pgnY1cSgrJmd5HNpXAYMyCW02Bo=" - - stage: Deploy to [PRD] - name: SiwvYQv9 - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "eP0VV9mGEE1LXX2ykZfkdjhTdTDULvtYeYKbgEzzaD2SL1Pp86q/J8Jf4Ixo86z4+vuQCinNQelnL5QsHy0R0n271uHtGLZlFpL6eIc7a8mwxSsC0UkTDYDsJElUa1+lbKxpik4vbWqYYXtQ9nHcjvXiNHQa4N3DPcOV8m5GN7Jt/lOdo1rDaaeEoGuzbQOQRgIgBcUcl+YpWVZsN8ZSFvBd81TovWDu4I8uI58cGGSnBUALLCecqGLSvMo2g/4nO96qu1wxgmCu7A65nYWnHdEEBF9scjnr6LlVF7ILTKr8PhE///AsBOmBUFO3s6BqHtVkpNWAOwSzWsr1xPihK0+nFYrQHH8NNaoX48+JHslpYa0yteV2jvTzrobijys+1zvU45mBV0lApnbICfrVHh7zNx+ZNVegz/kub8h5OR1JNk/MBiRqSR+i27lS7LBVjMS0eS+zS7fCzaz47wcaOTp3llL8Yd5hjbbDiauoKcKxBSjsXkHwEj2jbco15jXyasossi8x5kRB1f/8+2QpwATHxh14OT7iYqypbTi8QmjW3nbZ4GOUJeH3+TjPlhRFFLZXcdwtvPsSN0Ae3G0u/Vau742UbOTs4O47r7QafKBvvWa1zgqFPTKh6ddVV4OO6VfIGRRQ17Q70RRn64MQr+4AegXVUU7rDREp87BSaIs=" - - stage: Deploy to [PRD] - name: PxW6k9EK - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "VRsZe5l2Wh5wiRANcCxB2cstL/hsucL7O7wXmX192/6SPff7FBf+MAlrKg3PxocCMo0N+5OrtbtyyaknHkZnjAwFHWrsogr8NbwVf4PcbJoNpqKoLPr4tNECKGqbKA73Rk3chFWWJ3LSLdrDrQWf4QJqJrIucpkzbSLvoShxdFhqfEXpM0jgp1v+cJpmWf7NjPpSYdM/j5FRfDC1OoRovFeTENzCg9u61Hjf/3mhAxQWAe12xToeDCZ0DOhNOpZn3H7dwOtNdbHd7sho4BmvQ4OO0Aou82KOkeuD2NOXd1fPweAaI/fcQwDXQacCA9WfWd7lAjnWSecoDsAjDOhLJug2jCv7gX75tGE+7ULF+R5CxM162eCDvdNlkaWrG0r/GvqKRxewJlVJ/GUM0LjNUgDMcZTh7RmmsElau57xm/scyoJIhm2I0KuGufzS3RFNNnbK7He3Eq8EjvfxZDkW/wV6biuJMY1wCt22+//fREX5jj5rQ3dfxgQJRYwySpFbeYBVdm7LgJ67D0FSLgFPXPT9hw/z8INvn8jQpd9QwDjyRl3illsIHt+S0uIW9+OC3dZnd15H7Qr/CjeWANfMvL5PO3DBGCgRh8vEV+SMOScim0/rVEp6jx7fezWrQ6GgqIDDmMt8fDcIQz2DMFVVKWv4QPBuhQnMErRG8X0VMTo=" - - stage: Deploy to [PRD] - name: dScaun4N - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "GSGf3OSN0sRxY85I9dM2Ns0/c37gl7d0ZGUZmEp+C2Up8PGzMEycy5sFm+upUp/HSuoOgWTEQxNXfNeg7uHzzWqWNKFUCGf0wFPGWoAgYtXPdOD/jD3u4uPoiZ6W/4qtC4ntWvgt2rsy3vy5zM21tgGckK9mFySmr4wA7Jn4cBm1TGjlqojbCGr5DhbTZNaOcWYg6Jx86S001jPvmc6m1qmx+uspfB9Hdbt8XcoXYUnSuEXesF2bI5pjbArCKrC0O2VNTAUpHTquiG5re08i7PxygKLMIQOqbyZ2yyAiHDT1OKwzz+LKdjVMEUcFT2VPyE6LauoJAI/fqQgt+stENfbnDC5ZauQUM4BOa13sPQhP9e+4QXhqtd6zbr9KUXogd9MSmVRm/L3CDNy59PeqRLO0nn44eYuilYvd1CBVum+2TZRLFm4zqRoLw+jND1kW+X/vV7x1ELJyBR1/94m1LyYEbUsg18OreJTj0xZQe7RTedaC/VdIGMk1Ufxk85pBXH8N986+FXmO9Q//GlpwJVYtxyGOH8C7IAZw00fdzIt2M7Sq1pwbubIeUe+RhTKSPmgI94G5H5VjUwGWzW/oZ2YYXoIYUl+26VoR6VhUM/uiP7sSY1G8qNtQRoEwhLdkCm/9pzVWskJr+x9/r2riL033prDWTq97urkm1apu1WQ=" - - stage: Deploy to [PRD] - name: CTjlpqAf - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "mVbz1/aM6KCyNm8mpJeKVFDte3kTtLSh9uQf2eTW1gAQqn4klVeajE/hK0p3fkKT8fsMNw04yDWDmVIgekio7wgSuziLabj+y10357mIVpwtVozM4dnFfxh8ifdqemFcYPmWHZrg9S8nlAg7J/UcLWI5amyTWPN3ZKOYBNeQNnWB3INokbBv5iONsdb9hHDwoBzUwWKgXDFytzz05ECYyAoGn8TXFucyrxvPuR6wZbav9V9EKjd0OyTX8E7jjWl3G//FL72eUG2MNiMIX/oai+7W+Z9WnnVb0cfZ5Di87HYodL3H5Q3FRRRiRmVCaHIz8YdOzVhq4pNCEX7hdL+qYMP8ZXvFJzINzRlzTiKKq0HEFlM9yRtQFmNktT4pj28P2Gy6jyYbsqXu53EjwkgHSjaXB2YV4MOf3uvgzCDdB6hBok0BnBrlseY6GR78EHAidy/7wm1KUDpNX1H2IElnmv2dqRkPfCmgYaaX6TDo8vKuRRFnEafJThkvbJFU5eb6r4Q7rWDqK5/fpCBYMcLISMFhNfgGzb7vqkRYubnACIkKv6xIHj2GnuHhq8rSznCqRNGRspoNm45hPAwTplS9JWHu9HZFqdq86T4hkxcUXcmXjxK7KVetnraJ5JU4SV1I+uPv7IJ4DyNSxlsF1m6JOVLR4D0944PVbxIRzz+QVmU=" - - stage: Deploy to [PRD] - name: 5qCxZJSn - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "cWSWlRzHTrJnXx/aVoCrTaoXyLdljWNtipZpz4BNAavcAJ3Lc0dMjquRMIB+GI0DfYFWOGChlALy4hlb86XWxFlNPDm7TijKmdYBl/smrwIftccFrPSLeEyZOFCQa88X1zXtvOXDf6Wvi8++uQptbVvnapkV81tA8MiIV7E60ywUhlMN3w5wqXacaiteKKmmZNWtAqOJxkYCwRnF1dCpMewmTojG/7mycOvUHDByxdZCqi4YE2tj+tWa1wKMoseVm8vOoTaBtRMT3FdNcjyMlb9BW9VBuxYSVx8f0kcbwFs8ohV3FJmFClaXh55wjEObF8yx7Z7pT+8DYPsvy3Q5reBa+f8wYa6Wk/Rr/R3Z02MiFMVdZyjkXONQyNEXvTW+ffjuYzzQ2HpW5us96z0sehRZU/juxh08b2YT9pNP98i4txM0ROVB+MBZpESJFmbVKeAKiuE5nxotvZEFuBe6Dz6KxhruNp/2eWoJyYYZ6tKsE0SVeu+fB1psYP3yK9wZEnAzmvyzT2bIlwj9BCtznpfLDiMXclzzLevFo1QpQ5Z/iwN2Nny6rGv0rEOW258bIGePRLe7LkQRvBoHu+E4nUPHu7NAHjoq6+kwj3jhT032c2ibow3BDrSYtl48V3bQ12jY2bYfvnSrgUlEpzaSleDcP2SebFF6svN+jHzgFBY=" - - stage: Deploy to [PRD] - name: GriLaxXQ - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "cvxxSywqweDrwPamE9qur50KzYbyQXFWd1MoSSF37rDU20hq5Ikypb43DEyV6srop9FnRMQmO+y1iQpGCZcxLleJuerFphTGpq+ajr0VxF0TIm2E6tGvETMCQcstyNzvGAeHMB4v+q4bnU31QwscflgB3xrzlGdIJc+fWYv7eKRKjjVKDEcipalfDCEE56RYs3BdvDWsrYegV7OmIASbRxr8secyfnv7InW/nukty27ZaAN8Mhnz+CdQy/vTnmni1husaXmx217qLlaSZervzR8EPN53vNkLrRGyinfD4l7mfKOCVX7NSQJoR86gdj4o2JAKdSfw/juLwdYJIhLFudbFjYxBz3VF9UHjDGf/NX+4YswP9N02xlNkGMA/EcRk1UHXIxsCHCICsK5J57K/W8N0QE78840mpXOl7Z8Kdcn8xcPz/DySZaMGetJplR8HNJ4o8GhxMSgIoQUP6MBEcxY5RnZWdhNNJaJBj2OdkhC0TJ4VF/PejUp2ogl3XGsOf3yg82wh4MGe8VJFhBsPNRMrOm9VP/hfywsHRC2s3br9aEuVttrKAtMYsHCN6RmaX/vTHMixJrwzI/nL5vnqExSiwbjG2eqWcCHYRIgjfjMm/28Ksx9Cz1zEz8i7t9NN6txkWCL+FUhFP9FSbhqOS0+MNTOjc4+nc7+abk+mmog=" - - stage: Deploy to [PRD] - name: 8i8A5yiV - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "mQebOTIj6t6oGORhdbTz9RIg+T2I5qZGfFKobFz5Ncu+e/kJvdx4nFH3LayUUuva4/i+gAgK/XB3pEoNwLCVbuM3F3oG7MenshLAatD7m4lf7H6AlNfbfMF6ymW/Hnhlii2Pq7RyOK9GzSYVrt+s3U4CSB1gjMrclNptfagYSJWXGgkJDh1zTaMPRPbZdfYhGJ9IOgb89/jyEHFgXWPSeJzXsBHF8WPwXf9i0mgd4cXpczwnwq8oVaDS61WR+EBvqoKQHgPDgEdbeLogdIgl2uQtdDQGSaV2uF0QumcIkAGLYwqKNCdoeN48D89+6wnQR5bC1M5koykJhxt5p7eXjmt5Mo73ipCzGdX3adB4rteZw+gHUQEKGwHra8k5ywBxRxBW2gZsqm25Y2vdtctgtrz9QHSMNAQsm85Nga3qks183GU7olB3p++kjQ2xJh+klmotSZ8JSiL13fZ9yfq0KdFtsyY6mM6UBnP3Lkgk065uV1CQa+/XUN0yKHPEK2EdYgYLu9ulxpUG52kCkVjlFSaAXdPim1Zexo+0k2yw1nCk9DEGkaILrnCIEYgR9PeL6uoWfxafqOrZ0HFhsowoGb4ftz0vsP8AhuagX9AkYO7s+UdVjF9ZkzCrGCs9GijsSUOS821gSAkQpDOfbywvd/SGWJnPJmqdLOXlagzxaak=" - - stage: Deploy to [PRD] - name: I4p65vxk - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "Iu5LEVBO9SpYqRnWNUxcu1UJ5bwJOWcbk4LF9pIFTNVF8sJFw6o/PLQryKnlOm1RFcxE9sNyKHOLTpFpN2FFpvj5sMe5Y+CXtxLx6xsB6gSw74IFBCA74fftKyQawaUf5QydDypVtqdvN5HC6696YuqaOoEogBPCblpMnBcLYj8HxUJbm79R+psdGolFVNpi0NQnmQSZaqm6xBu8D43c14NLqFcs6kjHoUvusyAGHSEPoMydskYW2d7iwy6AqRbtD6q/FbN5G+dON//g0xUl10rTqnQNsHQj5GXJ4QTc9s5xHFmZruu0fnzGwqkDqIs/FU3VVMS0FPfg/b997w95KirZMn5gLnk/ipqUjsrz41DMvv+r0c0C8U6BmGUrKBi2duW982muhZS2/Yb2PY6P1kFUnJPQ3mdGtBAxgKAtAGWSBuf0MndLRZf3ECuPqsv1MecOyooEGqMrHCQgUs3pLCduhFcYAju3kYOUtdhkjBKi/0fJRFMUYfHLl3iivd5V0PbyA8ol9bCKidj7LvHhCsMVVXmu3awUSW43gMZ73juOuicghlw1z0LSmCmplaNeXTUWwFyOvPMzNU09mBHWL86xEXRaIDCkutxtbqFF7NMi0cFy30EZq2E+PTuHDEqS3df1OAXT+l+iX+3MRIO0iBVJTSAOYjDdQ4sUmeos0PI=" - - stage: Deploy to [PRD] - name: KkK3NeBU - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "U9S+n9oUHvc8bC6Qu8EYhvWWUrsantLO/waUuJLBwEdvXUzGgIiBYSMjCSR6t6KZXefYZg7AZEVxrZJrmqxfLazCX7vwwy8Mcv4oLyA0F+YvelwZIyD7kPpB5d26NGyc0zGzMMc957crzoaWy8XA0WjBhl+z8Iz8X+J5zZ+fMYODHFVRsDX2RFCOl0nm1JrQQ5UaYu9jDF2p1E/pzTY0UYjze7+F8+uj+hGTRNqT+B/Z4Mu8dN9Lj4dH/FBQK9SltEkz9C2ODfGJruYJLDZS8XVvkIYZagm842tIiWTwRS3yiM9lhat4RVAitcD2It1aadaLFazwepVFRsALacVsgLbmXPay5JbOjlWQKSHl8Gcm1Q7I49yYXnd0//pPRxtXRVIwffbE1pYjKtEcuqkDIGpo1kR7akgqfYTGfzG1ExCTI69GfpL/bMgUlbDUZ1WmzNjO7tHb3VwphrvpMQvNJhxJIwcjjpaVitVjRcgD/wdLIbyUw2GWKz5VnFNeKzzuetr6S+lA9jcflO7+EeqdUl3hjohsN4ke1qap+9Knu0+j4V8yVyaqO+ZfWaurX1GM4tWxYs0loOaTlWRfZM/z6zOjoNUISiXddwkLIpVvxiTW53DsqnQzzWuH2IygFo08Ap4lCTPNTXM5TmXaT8yZu7AjY5jLKB1uJVEXB5MQLrY=" - - stage: Deploy to [PRD] - name: P5ZRtPzl - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "Ve5M4QVBp637i05W3EHCBe/xflMpWlNR6wwTy1HA67mOrJ9VEgFVraQWXmRIxcl0YiLLCvUiPsPlkqg1IszZc4ZuCZOlz3F+UxDqu2MWPPmQ6j2jgyCC0F5pbgzrU0KC6QC0EnvUzkjxmsizBETn4kdWwM65TL3vLMpT4/KNsB2k6/cQ/dXAz8wcn+leY1FB0BfNgV+wXXqelXMItgpXu54T7iLWrvN2XNGiCIENufGscnKU3coxtqebfixNgL+9bSvl+IRm/Q9rZ3bZvGON+dssVp1+Xvc03gyIeJLPhyUGPOIt+LNKmR49bkyf+XtHk0SIFYSs+HoxFDAA9fvnowOs+Cv//E0/o+uu0TJfczcavVSWi2MsErVxBbQ9iqgJg2nMPCi0HdImcmxz4YLa6HXW7T32yk40YGp69+QEtAQensiTUC+Gzz8FOB/qy2TtTbNwu9vZY2uTNRYS/gz+0zla1JF7T651Wfv5j4/KWmAcE84yRSOqB+4F3jfK3v3BUntjhcIWsENhnakkziaaf3pBPaK6rH8fYUYnpbL5cGk1mEnMgSWG3P+z/5L/C+iJRUqb0tzupHpPikMFqQll1VrJALOTaqLFX5vc/6nOCDXIj6h7kyK8ZYr6abdmyeVWOm1Tzg5RVF9Dvsl5ZE5u1jlI8dOgzVF9TsKC60QABTI=" - - stage: Deploy to [PRD] - name: MNEUqUdq - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "qW88IHt8nMSnZLMBJTypKTJwsgXo41ssRHaANr0bIWipg9CQ8rqk8shtVetY9rf9rQlmQdq0saumyOIhrIfu6v1xQQ03+KNjUycJu7zJ56b1UCpgZC3s8/0W4V5yvJ4nmsoxU9E/lQm40fa7ChIOr/9Tkt0pT4dHcpfmMLdAxFMt5VwglWHeQSr8LiS2XzrVld+3MPyQ2AkbLMMlcCBlOp5ykU3fdup8LiCM3eWppi2D7zCJWVlqomTROpiQH+TcrnI0jNQNEV5bkeiNplLuv++tjXQcA3AnLU7gUZHYppgqKIMtyK3Ds1iMOBFDcILUedYdZL09T5mTAcpTnnooXmPegdI8jGttWVaibDT3jplh2X0M3Pc9rEuN1sEhVCZAC/GE0l4ATcpGeNdWUaV+/eKm1H8eaGSMmOAos9JR36BXN+ggUz8oXhQKCYQesK7DXVbaXkHA30Eu8B3GYCf6PScXm6ETZWlgMq16iZymlRr5Rsco9aHy7ed/oi3FzVHWCJHT9k7o2pTjuW16szVx0TkwQTMQWJ7xMOtNYGbXL774frNq7gesjBrN1SPkIi2ovmb1tXkMsbFdmZhT6Gf+7PFdPsYISfO+VCN6geiY+ESa4EgIXoLI7uFQCKLG0wMg8KxXGbGe/XTUng87SxsgWXs3AEkjOW/VoDa0U+7nMLw=" - - stage: Deploy to [PRD] - name: wq1f95lK - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "EbeOJMRgvZqd8ecgmPfTxpVgDpfP2TLsPZGXLbph0wXjvaUwTx9YAIfOHu1JdKSZqDYS0USgbBe0H2X1Fz9IQ92ZYfq55vzJ86Tl2bPg3QkoJrH/lq/cfai8N5RnPTT08RTzxNTza0IkvJB/YMDdc7udJDkaqEGJToiU8vAVy56P1ADlvs5AAXyGDoimUG7t+W1PkiDNtQLeJtwko7FtPHcZ9xRG4dHz7kEeoxJrLPnITLFqrT/gNNYfFhBLrrJdQLC7CtGticfqinOUimyDV79yjtPG7bSgtZnaPX7jNXJXlQNX7OMd3bjLrNqV/iKWn5Y/PujfiWB34IJFz5We+prFRj6cx5sxPUImHEeU3hmkuzADYKMU9bov2kmkMKaIRrXNsT79Jbm4tPm5D7cp2bkyOcGj+nBPE7v1J/9fDv3YQ9FsalmAcxOJTrE+hNDtgiy/ZIbjbwV+GMSLAGMqOGKXi5SzwOydMlVGkDXQ2GbZ3alilZTx9CiR93C5FWPOMR5U6xqR+7Uk53ulBQ5BtdmtJggN42gnT4Hf1UNAuk0xphyCRwwDjBaM3rzfuLokYPljBy2dPV67B+xZDs4pVy0ydiNb34M0OaF2bTuhczOhq5HIdy4Lr7CwU3EpJjVrskQ8/ROaEMTM02D67BIKtOA6PimEoX6rvr7KgwWBhoY=" - - stage: Deploy to [PRD] - name: jQDZjmds - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "hnZFEHA6Rn4fvs2lZh/xP9Z4/B5LOXHuJlLbJz0xvHAidkrGDyZvKFVmRbjAb7FDNm48qxP2+kJqXlWm/wOMvf/CLTIC7oAn9yQpaumdqJ1C01ZIQ06uEFEkoa5GckDJ5rc1UJehT1Lq1BAaMFCqx+rd29nm0k2H/H/XEmTvZ4gxa/pgYn5pbNmrfWWTeIszggXlMBDWDYUSgKwh32J/luVQe9AHMvij2R+NdOKllHI8mmoMAIAD/VtvcU3iBf7acbIsvgov2RVhYIrAmYAtErKrjzI8ddsEkRG0GNcJnmSILgyG4sqkbYTplT8vIYWQqsJB6rkEUXP2qIVsmQiRrSunDrFIzJafC8piYgOHW+A6nzOts4d27MHlJMUiKBardx3+frzqCvEd2EbVMZq/NGZaUAyhYdcR8/USVjlkXFTxogC/Zws4cc1zUhdl2F0ACYJ02QBEKQOZWLZuKj1FKrZu3bCDVTuLGZC0PbVWOhnJjjtDjN29O93HxzGtEYcVSZkahSAYXQFixkYjHY5lWuN6CJZ/zZm6NI/zZiLLnIexHatZG+2gQ1kE9eWe9XBxUixYp9KKk5XyTdVqbIjl8e0NxAOMQeg+dP8ova6BRyB6ig0PgQn5ociYon+BAu8BfDTKDNWSVDKFel/4sTsEAvOkbrMOQTAqbYSDt+1kCu8=" - - stage: Deploy to [PRD] - name: pSh9fhC4 - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "fhCQw5pWuPSvc0TMovnWMWPRaqPcmqQeKWOW+bv1Jp9/uUF/IfXZbHE5B/Znvkig68zLiX8jtKHhyaUwtG/z/q9WQH2mTDxIPTBynp9wFjGi8KDer3rGHX+ZSPtJKE6pLSRjA0ejVfY3hnriWxLpsz/djEuVhNnMh6Jh18nbDLEX8O6jcrsK9LsCiOdR1Ik1E3eHpmVl+u80Rqoe6A4ENGFNDEgp0124DiFOjsiT+MojvOPiKR1qsBGM1YI21AxGzb4kyvDdpybQ1TEyvgo1YlQY588uObe/9b0OD35eSwrIhgB9/fgzOW0KeBY6pm028mRQXyasVTos/GBZpW3mCKDQTvWWeJJhUcAVvz7PIqWPS88G/6YK/Fs6CfnyTgzsOiGQdhiALaDHvXF4Z18cIEnnESJBhJfaL8i3uRyMhOdyqNI3XvtjR+ADcfMRJ7RO3eWW3ueSn93oKfHjlSlOjP8VKSdkVPThR+UI650iUybDbO2Vy4wt30b2TcG+qZbweYJgFI0AeKzHaoyFkTYATYq4V5xXYWyxKGkOj9Wa4KPLknE66OkSeZXuvaeKJq3CQbVvjZKhQK4/+6pjGqH0yBwF2bYnUWrfxSbS8s2fXaRFz7mEBJB5BtweKJ9HZQJcjn7zfaUhA3AbTvLhcZ8OkJSsWxuAus2A/C0nWkifNXU=" - - stage: Deploy to [PRD] - name: BemEbj0i - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "B/41mjCB6XI7R1msMYg4t0cof29FGHUcvq7N3GJlb7PsnowkbL1El+kG1DwTa4hoSWD8FGSv8EscGoGVLvi/yirDbWhXnLGmIMyqLLlaVd2SOjyh3jMtj8JBcEukAw2Ta1I5o1CF6fEe6eIvpKpjHMAYa0H6EOFPS90W3toV8/0fJLxl6U6kyKnV5UkWvhUZInbY+wMUafpoS5CmazUKdGW0VHGEyjjDdu64E8mL/B2MxVtjnlqFcUOiz/9H6fkyBP7rL1UlN00le13HTdkJxcQCXhq0PGLfF8VuXpu5+HF5TCqskE1xEuAMozj9Z7wdRyKGayqdhwnDOvxexzdk+wD4YdahlGTimk6NuO/Z7sO4PaEA1n4sN0Q8waKAn4RiBcIOo5m0iKo44RB6wdMrbVLJYlGuf0lsIr65HtTfXiH5xzSXKqBSPE5R7eY0AVSRQQk02xnXSfjpFVAv9p4iG9Fl4Q/lQyqPkUo4Qq9CZUZE72RoBqZ8dJQhXY0eoJW51isAUGzm3XupVY22BlvKijyePgksstHwx676xHjX60Lq0gzrRHIEt1/FLAgriOuYh808EvIPakDBP8DPXEHFkrX/Qdy3XBj/Vn60MkidYYdF/RPazhR58i5fV6KsNsGiTiET9SmXkalciSNxYZL4wUDAtPujFFdAeMttjcU8Kic=" - - stage: Deploy to [PRD] - name: GIg4tDeB - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "L6JdFJh8R++ROo5iMHOhQQCruimn709JtNaKqsEG6DI/FVhqXi2YRlSzGc5xFp1HJM0jtm/dTtFZx2YKEaASO/EBOJ8HGJF2gYVpei1t5S4Pt8X+IlF34yshkR8BHLuPZXfgJsUfcU96S3vu2+l7+E8G2TXS5ch86IcGhmAM7gbkUdTo370nD0SziXQ9zvrAN060EYMZn+5a4LUN0oPf2N2N2ae5CXrljW+Nyt1QfehVip7nKihr1ktAXRs7om13GdNp2DLoXcUo2S4DKALSNZqNqMudZOw4qk1avXSwvJ5Be71deKykAvjbgTGttbzIQcAUKhwl1W/NpnZbqb7tblkakGzTevOvSZ9c+rd7fgEWfIhs0UHdq6ZNUs8/cmjt1jURg1FtlEatX424A5CdWBGfq3rGP5aDJPgtCdS2aijmBUGCFhh+DNNMkZH9wCdC8gwEupkASFtt0AOmzjOoNRpGUcG8pXgjVBXeqdvTlJaBSVlDbcGkHjlp/amaPjgmLebmUxA0XQILEIKHWd5uzkd+P7w4Pih3Lukemcci2SAf/V40M24PUfeLzbqlbhF+ccCZ3DeLhdMDBZkNxbJVPro8wjjPJhfBwMZpJXT48exYsBAGmTXWAO9+pLh8HdOVDIeoEQIxYKAxHMb7q6ZJQJ6POciEQ06OkPpN4ZkBJS8=" - - stage: Deploy to [PRD] - name: w3S9N9w9 - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "ZlkNX0L6sZv0F+/KnHY8hlxszMCyOsWg+qQ97phzUXIpS/n1jbuMK9rHJoy9TAKBGcBlE+SzFrFOEXjZ33fzU4xBlAIP+6vU+GlMRfb7Ow+OgrvDSyCKgP2nMTuBdk4KaxVfTSEM55tRASDiHB5Mc6/b0CqEbP9lK0fdi4bKP549jlQa5adVzwPuXFqoFy6Ma+LAqeUUP+Vgp9oixHrYHbJNY6MPCfwotCnLHxByj6CjGuUGsyv4UG573769YL87vm0N9IAutpjrvUu0LkHOCnGKsmeRrM7Uux2kt7OmQwvBacx3pQ9cRSplEPzpCjvr5I7pLt7gTnSFDLySzyYkKDY1PGetzHsVzgWNtqCAnj9/5WPwyIlpgB1t1IZcye+CGso6wY8WcQUToUE6jr2hrYyDbIcRYREqOiJ4mzaOh1azMo0RISNonRUwdCbe9jrS5hat7WC9U0WoVNUohcmxlRD/BCz3AET+/Ir73xyamitUOZz361cWuAWkUHIaAyNkskk/BPOYbp2B+5ju3/aFHEvIeC3VjAGyxCPVe3jxQ1w2smXjQj4uGOv9B56pM4wxU0dr0K86rYwikPB4UWx5jvP0H7dALbtPBnX4zFA+Vu9ZTc99/8dcvdrWEXDxXdJ3J+OUUhJibgXT70JIAhqY683dT6V9WKSWkho0v0m7n+g=" - - stage: Deploy to [PRD] - name: VYfaa1Bz - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "UBXTmdg9x9dROLpkK9ILvSH9SyuOsHG6YXvzsG8Ww94PMFO0I6RuBBd40VsSn7kPNM6Lcd4hSyi44oPmurcIcv7tC53unGJIrovX7jbfDOSXMPNPfc1Inrl7BqZvV8wyEJz1MORn/U2ny5onBeKnHcs1PcwilmQ2SpYOyG3skjbKK7eCuYgCPHVSAvvZQBcU0hRiT8GR0SE045RrUeaJF0d5gNRI/XwiL4E4Q2vm9ufEI3xwa8wWzp0IE+/0Utdz/oxUyzgy7OWEsoePa69hIkL7/1jvaVw1Of7+kMOAP39+XxsJy8nu7+naZPsI28OXJp2B8DT3U7jmsLMkYn8mzkhxoEM3KXnMbD4hOqRihnV4N8vMSk33yGenpxd245aLkL8zAaMEPJfAFLiIrVlwe+c9BqR6FlgHyOciNj6P3SRLS2sDUEIyvfvhDGnxSaODfZ1Rg64kS7GSNsEfurE8seco4BwwK9IJpy7q9HZQ/tKuzWNML73iKIVgn904MUzT+LDiaiGsfxQdKOQZzZTS8YkOR8lLcsJlpuc2S25gApmOvGbpOWNq/nZ3Sl7zcRlnhd0E0fEkMeezZ3vAisymt+W6hTaiXMxDmUcFKD40RXhfDW7Eg/wTBF/eCVX3aLx1boGQhGDG2Uc9zUqCm3Pt0DeUe84cFprIDwSchguOVGg=" - - stage: Deploy to [PRD] - name: sUpOpLFU (STG) - before_install: openssl aes-256-cbc -K $encrypted_264f0dad5034_key -iv $encrypted_264f0dad5034_iv -in private/key.enc -out ~/.ssh/id_rsa -d && chmod 0600 ~/.ssh/id_rsa - install: ./private/bin/install.sh - before_script: ./private/bin/build.sh - script: ./private/bin/deploy.sh - env: - secure: "TMqk/hVinpN6CWJAaumnF8wt/UmPAhFif8JdLWTg+FLnDULXPkPVsFWRw4nCTJ5AC7rtyv3yiR7DwA5vq25XTIYCY7D9IKothqc/RRlEtSRBmaqIDpxOswL3o15bTKe7moEAu2NGdtK3kZdvKdw5v8j8b5VT8tu7CKDU0QRuJCtrJqkwJh5UudRA237pOAiZHWPjmPX3NMdljS54dsvnK3J0NoNz+pAvqvsC1RGo5hQZs9xOt7OQu8+/DXEZz/kNPx1mYZdyEP7mtKsB+VanDDsDQSwi/As9gr+yVpBulFzuxCJWMOSPN40jhaotqNHbOv9HWY/+tmXZ5UwdtS9scWSycPfuXLnrcF8V0ldB8B628aGijB9R35GKf4Cl57w5zD3hwuSlPrEivKo/TopFKbNEH4yC2/LsTWzRxtS9kniI5mVy7xazR4LWBjLpQljXQAoZsQeqP2yn9uFJGUHYRpNOlG03qq3+Di8u0ZqX7MSGHlKzY5fZJo0UWQI3/fIb59JSnU4pgklNHYDA15F9iQCzf/2+dxLeFxQ0UKUqAwaRrCx8EMNFnWn8mmsMneSwpY8Fyfk0hL9o5sH7R10eLTnehbOEueSVQ9B7VRtfIOq+KgXfN6pBE9lBZinPZeLyAGE0PQbipPEg3E3o1Aq/RK65s+SFsCVKiJ0GiW7a7hw=" diff --git a/CHANGELOG.md b/CHANGELOG.md index 7797e123..c78a4ca4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +### v2.0.12 +Fixes: +- GTM initialisation when not running Consent Mode + +CI: +- Remove old deployment targets + ### v2.0.11 Fixes: - Incorrect slug handling in Petition List block diff --git a/phpcs.xml b/phpcs.xml index c3810f54..1c5454be 100755 --- a/phpcs.xml +++ b/phpcs.xml @@ -3,4 +3,5 @@ PHPCS linting rules for the Humanity Theme + ./build/**/*.asset.php diff --git a/private/.eslintrc b/private/.eslintrc index b98515f4..6e5ef356 100644 --- a/private/.eslintrc +++ b/private/.eslintrc @@ -24,11 +24,11 @@ "prettier/prettier": ["error"], "react/prop-types": "off", "import/no-extraneous-dependencies": ["error", { "devDependencies": true }], - "@wordpress/i18n-text-domain": ["error", { "allowedTextDomain": ["amnesty", "default"] }] + "@wordpress/i18n-text-domain": ["error", { "allowedTextDomain": ["amnesty", "default"]}] }, "settings": { "react": { - "version": "18.2.0" + "version": "18.3.1" } } } diff --git a/private/.gitignore b/private/.gitignore deleted file mode 100644 index 4bd7cf14..00000000 --- a/private/.gitignore +++ /dev/null @@ -1,86 +0,0 @@ -# WordPress -public/wordpress -public/content/uploads/* -# public/content/themes/* -# public/content/plugins/* - -# Sass -.sass-cache - -# Docs -docs/sassdoc -docs/styleguide/assets - -## Node.js -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz -pids -logs/* -npm-debug.log -node_modules - -# Map files -.map - -# Local testing folders -testing -public/local - -# Env file -.env - -# Vagrant -.vagrant - -# Web/PHPstorm -.idea - -# Visual studio code -.vscode - -# Sublime -*.sublime-workspace -*.sublime-project - -# Atom -.imdone - -# Provided App Template -app/* - -# PHP Testing -!app/phpspec.yaml -!app/phpunit.xml - -# Jest -coverage - -# OS X -.DS_Store -.AppleDouble -.LSOverride -Icon -._* -.Spotlight-V100 -.Trashes - -# Windows -Thumbs.db -ehthumbs.db -Desktop.ini -$RECYCLE.BIN/ - -# Composer -vendor - -# Webpack stats -stats.json - -# Ignore root dist folder -/dist/ diff --git a/private/.prettierrc b/private/.prettierrc index 5e2863a1..ad37a1f7 100644 --- a/private/.prettierrc +++ b/private/.prettierrc @@ -1,5 +1,8 @@ { + "arrowParens": "always", + "endOfLine": "auto", "printWidth": 100, "singleQuote": true, - "trailingComma": "all" + "trailingComma": "all", + "semi": true } diff --git a/private/bin/build.sh b/private/bin/build.sh deleted file mode 100755 index 3f6610a5..00000000 --- a/private/bin/build.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env sh - -# exit when any command fails -set -e - -# vaguely posix-compliant way of retrieving last command -last_command() { - (fc -n -l -1 -1) -} - -# output error message before throwing -error_out() { - printf '%s failed with exit code %s.' "$(last_command)" "$?" -} - -# refresh POMO, build zip -build_zip() { - ./private/bin/lang.sh - cd ./wp-content/themes/humanity-theme - zip -r ../../../humanity-theme.zip ./* -} - -# trap errors from any failing command -trap error_out 1 2 3 6 - -# build assets -cd ./private -yarn build -cd .. - -# build archive on main only -case "$TRAVIS_BRANCH" in - main) build_zip ;; - *) ;; -esac - -echo "Build complete." diff --git a/private/bin/deploy.sh b/private/bin/deploy.sh index 28aec7d5..1c154061 100755 --- a/private/bin/deploy.sh +++ b/private/bin/deploy.sh @@ -23,16 +23,17 @@ if [ -z "$REMOTE_URL" ] || [ -z "$GITHUB_USERNAME" ] || [ -z "$GITHUB_EMAIL" ]; fi # known hosts setup +mkdir -p ~/.ssh cat "$PWD/private/known_hosts" >> ~/.ssh/known_hosts # directory setup theme_dir="wp-content/themes/humanity-theme" -source_dir="${TRAVIS_BUILD_DIR:-$PWD}/${theme_dir}" -temp_dir="$(mktemp -d 2> /dev/null || mktemp -d -t "$TRAVIS_BRANCH")" +source_dir="$PWD/$theme_dir" +temp_dir="$(mktemp -d 2> /dev/null || mktemp -d -t "${GITHUB_REF_NAME/\//-/}")" cd "$temp_dir" # bring in repo from remote -git clone --depth=50 "$REMOTE_URL" "$temp_dir" +ssh-agent bash -c "ssh-add <(echo \"$SSH_KEY\"); git clone --depth=50 \"$REMOTE_URL\" \"$temp_dir\"" git config user.name "$GITHUB_USERNAME" git config user.email "$GITHUB_EMAIL" @@ -40,11 +41,10 @@ git config user.email "$GITHUB_EMAIL" mkdir -p "$temp_dir/${theme_dir}" # copy deployment files -rsync --delete -a "$source_dir/" "$temp_dir/${theme_dir}" --exclude='.git/' +rsync --delete -a "$source_dir/" "$temp_dir/$theme_dir" --exclude='.git/' # stage all changes git add --all . -git add --force "./$theme_dir/assets" # nothing has changed, don't bother committing if [ -z "$(git status --porcelain)" ]; then @@ -53,8 +53,8 @@ if [ -z "$(git status --porcelain)" ]; then fi # commit && deploy -commit_message="$(printf "Travis CI build number %s\n\nCommit range: %s" "$TRAVIS_BUILD_NUMBER" "$TRAVIS_COMMIT_RANGE")" +commit_message="$(printf "GitHub Actions build number %s\n\nCommit range: %s" "$GITHUB_RUN_ID" "$GITHUB_SHA")" git commit --author="$GITHUB_USERNAME <$GITHUB_EMAIL>" -m "$commit_message" -git push origin master > /dev/null 2>&1 || exit 1 +ssh-agent bash -c "ssh-add <(echo \"$SSH_KEY\"); git push origin master > /dev/null 2>&1" echo "Deployment complete." diff --git a/private/bin/docgen.sh b/private/bin/docgen.sh deleted file mode 100755 index 8123fcb6..00000000 --- a/private/bin/docgen.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env sh - -# exit when any command fails -set -e - -# vaguely posix-compliant way of retrieving last command -last_command() { - (fc -n -l -1 -1) -} - -# output error message before throwing -error_out() { - printf '%s failed with exit code %s.' "$(last_command)" "$?" -} - -# download phpDocumentorx -download_phpdoc() { - wget -q https://github.com/phpDocumentor/phpDocumentor/releases/latest/download/phpDocumentor.phar -} - -# generate the documentation using phpDocumentor -generate_docs() { - php phpDocumentor.phar \ - --cache-folder="$HOME/phpdoc-cache" \ - --extensions=php \ - --defaultpackagename=Humanity \ - --directory ./wp-content/themes/humanity-theme \ - --target ./php-api-developer-documentation -} - -# package up the documentation -zip_docs() { - zip -r ./php-api-developer-documentation.zip ./php-api-developer-documentation - rm -r ./php-api-developer-documentation/ -} - -# run the build -build_docs() { - download_phpdoc - generate_docs - zip_docs -} - -# trap errors from any failing command -trap error_out 1 2 3 6 - -# build archive on main only -case "$TRAVIS_BRANCH" in - main) build_docs ;; - *) ;; -esac - -echo "Documentation generation complete." diff --git a/private/bin/install.sh b/private/bin/install.sh deleted file mode 100755 index fd8f32f3..00000000 --- a/private/bin/install.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -# exit when any command fails -set -eo pipefail - -composer install -nvm install 20 && nvm use 20 -corepack enable -cd private && yarn && cd .. - -echo "Setup complete." diff --git a/private/bin/lang.sh b/private/bin/lang.sh deleted file mode 100755 index 59c6b8aa..00000000 --- a/private/bin/lang.sh +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env sh - -#################################################################### -# Refreshes POT, updates PO from POT, and compiles PO into MO. # -# # -# NB: if running this script on OS X, first install GNU sed, # -# following the instructions from Homebrew to add it to your PATH: # -# $ brew install gnu-sed # -#################################################################### - -basedir="$(git rev-parse --show-toplevel)" - -# remove changes that only touch refresh header and do nothing else: -remove_date_only_changes() { - if ! git ls-files "$1" --error-unmatch > /dev/null 2>&1; then - return - fi - - changes=$(git diff "$1" | grep '^[+-][^+-]' | grep -vc '\(PO-Revision\|POT-Creation\)-Date') - - if [ "$changes" -eq 0 ]; then - git checkout "$1" > /dev/null 2>&1 - fi -} - -# scrap rubbish from gettext-generated file -fixup_header_information() { - thedate=$(date '+%Y-%m-%d %H:%M%z') - - # replace placeholder information - sed -i "s/FULL NAME //g" "$1" - sed -i "s/LANGUAGE //g" "$1" - sed -i "s/YEAR-MO-DA HO:MI+ZONE/$thedate/g" "$1" - sed -i -e '1,4d' "$1" -} - -# add headers required for usage in poedit -insert_poedit_headers() { - # create temporary empty file for poedit headers - touch "$basedir/wp-content/themes/humanity-theme/languages/header.txt" - truncate -s 0 "$basedir/wp-content/themes/humanity-theme/languages/header.txt" - - # insert poedit headers - tee "$basedir/wp-content/themes/humanity-theme/languages/header.txt" << EOF > /dev/null -"X-Generator: Poedit 2.2.1" -"X-Poedit-Basepath: .." -"X-Poedit-Flags-xgettext: --add-comments=translators:" -"X-Poedit-WPHeader: style.css" -"X-Poedit-SourceCharset: UTF-8" -"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" -"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" -"_nx_noop:3c,1,2;__ngettext_noop:1,2" -"PO-Revision-Date: " -"X-Poedit-SearchPath-0: ." -"X-Poedit-SearchPathExcluded-0: *.js" -EOF - - # backup POT file - mv "$1" "$1.bak" - # insert headers from backup POT file into new POT file - sed -e '/^$/,$d' "$1.bak" > "$1" - # append poedit headers to new POT file - cat "$basedir/wp-content/themes/humanity-theme/languages/header.txt" >> "$1" - # append everything after the headers in backup POT file into new POT file - sed -e '1,27d' "$1.bak" >> "$1" - - # cleanup - rm "$basedir/wp-content/themes/humanity-theme/languages/header.txt" - rm "$1.bak" -} - -touch "$basedir/wp-content/themes/humanity-theme/languages/_amnesty.pot" - -# pass all found PHP files to gettext -find . -name "*.php" | grep -vi '^\.\/\.git' | xargs xgettext \ - --language="PHP" \ - --output="$basedir/wp-content/themes/humanity-theme/languages/_amnesty.pot" \ - --force-po \ - --add-location \ - --from-code="UTF-8" \ - --foreign-user \ - --copyright-holder="" \ - --add-comments="translators:" \ - --package-name="Amnesty WP Theme" \ - --msgid-bugs-address="@github:amnestywebsite/humanity-theme/issues" \ - -k_ \ - -kgettext \ - -kdgettext:2 \ - -kdcgettext:2 \ - -kngettext:1,2 \ - -kdngettext:2,3 \ - -kdcngettext:2,3 \ - -k__ \ - -k_e \ - -k_n:1,2 \ - -k_x:1,2c \ - -k_ex:1,2c \ - -k_nx:4c,1,2 \ - -kesc_attr__ \ - -kesc_attr_e \ - -kesc_attr_x:1,2c \ - -kesc_html__ \ - -kesc_html_e \ - -kesc_html_x:1,2c \ - -k_n_noop:1,2 \ - -k_nx_noop:3c,1,2 \ - -k__ngettext_noop:1,2 - -# cleanup temporary POT file -fixup_header_information "$basedir/wp-content/themes/humanity-theme/languages/_amnesty.pot" -insert_poedit_headers "$basedir/wp-content/themes/humanity-theme/languages/_amnesty.pot" - -# copy to actual POT file -msgcat -o "$basedir/wp-content/themes/humanity-theme/languages/amnesty.pot" "$basedir/wp-content/themes/humanity-theme/languages/_amnesty.pot" -rm "$basedir/wp-content/themes/humanity-theme/languages/_amnesty.pot" - -# if only the timestamp has changed, don't bother with it -remove_date_only_changes "$basedir/wp-content/themes/humanity-theme/languages/amnesty.pot" - -# Merge changes with PO files: -for p in "$basedir"/wp-content/themes/humanity-theme/languages/*.po; do - msgmerge --quiet -o "$p.tmp" --no-fuzzy-matching "$p" "$basedir/wp-content/themes/humanity-theme/languages/amnesty.pot" - msgattrib --no-obsolete -o "$p" "$p.tmp" - rm "$p.tmp" - remove_date_only_changes "$p" -done - -# validate and compile MO files: -for i in "$basedir"/wp-content/themes/humanity-theme/languages/*.po; do - msgfmt "$i" -c -o "${i%.*}.mo" -done - -echo "Language file refresh complete." diff --git a/private/bin/lint.sh b/private/bin/lint.sh deleted file mode 100755 index 1941c7ff..00000000 --- a/private/bin/lint.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env sh - -# exit when any command fails -set -e - -# vaguely posix-compliant way of retrieving last command -last_command() { - (fc -n -l -1 -1) -} - -# output error message before throwing -error_out() { - printf '%s failed with exit code %s.' "$(last_command)" "$?" -} - -# trap errors from any failing command -trap error_out 1 2 3 6 - -# lint all the things -composer lint -cd ./private -yarn lint:scripts -yarn lint:styles -cd .. - -if which shfmt > /dev/null; then - for file in ./private/bin/*.sh; do - shfmt -i 2 -ln=bash -bn -ci -sr -kp -d "$file" > /dev/null - done -fi - -if which shellcheck > /dev/null; then - shellcheck ./private/bin/* -fi - -echo "Linting complete." diff --git a/private/bin/run-tests.sh b/private/bin/run-tests.sh deleted file mode 100755 index 86ea8fe2..00000000 --- a/private/bin/run-tests.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env sh - -# Download CLI binary -curl -sL https://github.com/ghost-inspector/node-ghost-inspector/releases/latest/download/ghost-inspector-linux --output ./private/bin/ghost-inspector - -# Make it executable -chmod +x ./private/bin/ghost-inspector - -# Travis CI will handle setting its API Key as an environment variable - -echo "Test setup complete." - -./private/bin/ghost-inspector suite execute "$1" --errorOnFail --errorOnScreenshotFail diff --git a/private/package.json b/private/package.json index e7e3b04d..d1973e14 100644 --- a/private/package.json +++ b/private/package.json @@ -6,81 +6,71 @@ "license": "GPL-2.0-or-later", "packageManager": "yarn@4.3.1", "scripts": { - "build:dev": "webpack --mode development", - "build:prod": "webpack --mode production", - "build:static": "webpack --mode production --env static", - "build": "webpack --mode production", - "watch:dev": "webpack --mode development --watch", - "watch:prod": "webpack --mode production --watch", - "watch": "webpack --mode development --watch", - "lint:scripts": "eslint ./src/", - "lint:styles": "stylelint \"src/**/*.scss\"", - "lint": "yarn lint:scripts; yarn lint:styles", + "build": "wp-scripts build --webpack-copy-php --source-path=./src --output-path=../wp-content/themes/humanity-theme/build", + "watch": "wp-scripts start --webpack-copy-php --source-path=./src --output-path=../wp-content/themes/humanity-theme/build", + "lint": "yarn lint:scss; yarn lint:js", + "lint:scss": "stylelint ./src/**/*.scss", + "lint:js": "eslint ./src/**/*.(js|jsx)", "env": "yarn dlx @wordpress/env" }, "devDependencies": { - "@babel/cli": "^7.16.0", - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@babel/plugin-proposal-pipeline-operator": "^7.16.0", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/preset-env": "^7.16.8", - "@babel/preset-react": "^7.16.7", - "@wordpress/eslint-plugin": "^17.4.0", - "@wordpress/i18n": "^4.2.4", - "autoprefixer": "^10.4.0", - "babel-loader": "^9.1.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.8.1", - "esbuild-loader": "^4.0.2", - "eslint": "^8.3.0", + "@babel/core": "^7.26.0", + "@babel/plugin-proposal-pipeline-operator": "^7.25.9", + "@playwright/test": "^1.49.1", + "@types/react": "^19.0.8", + "autoprefixer": "^10.4.20", + "eslint": "^8.2.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-prettier": "^5.0.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-webpack-plugin": "^4.0.1", - "expose-loader": "^4.0.0", - "file-loader": "^6.2.0", - "mini-css-extract-plugin": "^2.4.5", - "node-normalize-scss": "^8.1.2", - "postcss": "^8.4.32", - "postcss-banner": "^4.0.1", - "postcss-loader": "^7.0.1", - "postcss-pxtorem": "^6.0.0", - "postcss-reporter": "^7.0.4", - "postcss-scss": "^4.0.3", - "prettier": "^3.1.0", - "react": "^18", - "react-dom": "^18", - "resolve-url-loader": "^5.0.0", - "sass": "^1.62.1", - "sass-loader": "^13.2.2", - "sass-mq": "^6.0.0", - "style-loader": "^3.3.1", - "stylelint": "^15.11.0", - "stylelint-config-recommended-scss": "^13.1.0", - "stylelint-scss": "^5.3.1", - "stylelint-webpack-plugin": "^4.1.1", - "typescript": "^5.3.2", - "webpack": "^5.94.0", - "webpack-cli": "^5.0.0" + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.3", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-webpack-plugin": "^4.2.0", + "postcss": "^8.4.49", + "postcss-pxtorem": "^6.1.0", + "postcss-reporter": "^7.1.0", + "prettier": "^3.4.2", + "react": "18.3.1", + "react-dom": "18.3.1", + "sass": "^1.83.1", + "sass-loader": "^16.0.4", + "stylelint": "^16.12.0", + "stylelint-config-recommended-scss": "^14.1.0", + "stylelint-scss": "^6.10.0", + "stylelint-webpack-plugin": "^5.0.1", + "typescript": "^5.7.3", + "webpack": "^5.97.1", + "webpack-cli": "^6.0.1" }, "dependencies": { - "@braintree/sanitize-url": "^7.0.1", - "classnames": "^2.3.1", - "core-js": "^3.19.1", - "css-vars-ponyfill": "^2.4.7", - "delegate": "^3.2.0", - "flickity": "^2.2.2", - "flickity-as-nav-for": "^2.0.1", - "intersection-observer": "^0.12.0", - "js-cookie": "^3.0.1", - "memize": "^1.1.0", - "object-fit-images": "^3.2.4", - "react-beautiful-dnd": "^13.1.0", - "react-select": "^5.7.2" + "@braintree/sanitize-url": "^7.1.1", + "@hello-pangea/dnd": "^18.0.1", + "@wordpress/api-fetch": "^7.15.1", + "@wordpress/block-editor": "^14.10.1", + "@wordpress/blocks": "^14.4.1", + "@wordpress/components": "^29.1.1", + "@wordpress/compose": "^7.15.1", + "@wordpress/core-data": "^7.15.1", + "@wordpress/data": "^10.15.1", + "@wordpress/dom": "^4.18.0", + "@wordpress/editor": "^14.15.1", + "@wordpress/element": "^6.15.1", + "@wordpress/eslint-plugin": "^22.2.0", + "@wordpress/hooks": "^4.15.0", + "@wordpress/i18n": "^5.15.1", + "@wordpress/plugins": "^7.17.0", + "@wordpress/scripts": "^30.8.1", + "@wordpress/server-side-render": "^5.15.1", + "@wordpress/url": "^4.15.0", + "classnames": "^2.5.1", + "core-js": "^3.40.0", + "flickity": "^3.0.0", + "flickity-as-nav-for": "^3.0.0", + "intersection-observer": "^0.12.2", + "js-cookie": "^3.0.5", + "lodash": "^4.17.21", + "memize": "^2.1.0", + "react-select": "^5.9.0" } } diff --git a/private/postcss.config.js b/private/postcss.config.js index 3586ee89..85ed6739 100644 --- a/private/postcss.config.js +++ b/private/postcss.config.js @@ -2,12 +2,10 @@ const autoprefixer = require('autoprefixer'); const pxtorem = require('postcss-pxtorem'); const reporter = require('postcss-reporter'); -module.exports = { - plugins: [ - autoprefixer(), - pxtorem({ - prop_white_list: ['font', 'font-size', 'line-height', 'letter-spacing'], - }), - reporter({ clearMessages: true }), - ], -}; +module.exports = [ + autoprefixer(), + pxtorem({ + prop_white_list: ['font', 'font-size', 'line-height', 'letter-spacing'], + }), + reporter({ clearMessages: true }), +]; diff --git a/private/src/styles/admin/_cmb2.scss b/private/src/admin/_cmb2.scss similarity index 100% rename from private/src/styles/admin/_cmb2.scss rename to private/src/admin/_cmb2.scss diff --git a/private/src/styles/admin/_localisation-options.scss b/private/src/admin/_localisation-options.scss similarity index 100% rename from private/src/styles/admin/_localisation-options.scss rename to private/src/admin/_localisation-options.scss diff --git a/private/src/styles/admin/_user-profile.scss b/private/src/admin/_user-profile.scss similarity index 100% rename from private/src/styles/admin/_user-profile.scss rename to private/src/admin/_user-profile.scss diff --git a/private/src/scripts/admin/cmb-events.js b/private/src/admin/cmb-events.js similarity index 94% rename from private/src/scripts/admin/cmb-events.js rename to private/src/admin/cmb-events.js index 0c460809..d56f7cae 100644 --- a/private/src/scripts/admin/cmb-events.js +++ b/private/src/admin/cmb-events.js @@ -1,5 +1,5 @@ -const { isFunction } = lodash; -const { applyFilters } = wp.hooks; +import { isFunction } from 'lodash'; +import { applyFilters } from '@wordpress/hooks'; let globalChangeEvent; diff --git a/private/src/admin/cmb-font-options.js b/private/src/admin/cmb-font-options.js new file mode 100644 index 00000000..8c183765 --- /dev/null +++ b/private/src/admin/cmb-font-options.js @@ -0,0 +1,31 @@ +document.addEventListener('DOMContentLoaded', () => { + const form = document.getElementById('#cmb2-metabox-amnesty_font_options_page'); + + if (!form) { + return; + } + + const initial = form.querySelector('.cmb2-option[name="font_load_type"]:checked').value; + + const repaint = (selector, compare) => { + form.querySelectorAll(selector).forEach((el) => { + if (el.dataset.showFor.indexOf(compare) !== -1) { + // eslint-disable-next-line no-param-reassign + el.closest('.cmb-row').style.display = 'block'; + } else { + // eslint-disable-next-line no-param-reassign + el.closest('.cmb-row').style.display = 'none'; + } + }); + }; + + repaint('[data-show-for]', initial); + + form.addEventListener('click', (e) => { + if (!e.target.classList.contains('cmb2-options')) { + return; + } + + repaint('[data-show-for]', e.target.value); + }); +}); diff --git a/private/src/scripts/admin/cmb-term-type.js b/private/src/admin/cmb-term-type.js similarity index 95% rename from private/src/scripts/admin/cmb-term-type.js rename to private/src/admin/cmb-term-type.js index 0b423c53..21ec3b82 100644 --- a/private/src/scripts/admin/cmb-term-type.js +++ b/private/src/admin/cmb-term-type.js @@ -1,4 +1,4 @@ -const { addFilter } = wp.hooks; +import { addFilter } from '@wordpress/hooks'; addFilter('amnesty.cmb2.change.type', 'amnesty/cmb2', () => (event, $form) => { const type = event.target.value; diff --git a/private/src/admin/index.js b/private/src/admin/index.js new file mode 100644 index 00000000..1b0b48c0 --- /dev/null +++ b/private/src/admin/index.js @@ -0,0 +1,6 @@ +import './index.scss'; +import './cmb-events'; +import './cmb-font-options'; +import './cmb-term-type'; +import './ordered-list-preview'; +import './options-general'; diff --git a/private/src/admin/index.scss b/private/src/admin/index.scss new file mode 100644 index 00000000..4364171b --- /dev/null +++ b/private/src/admin/index.scss @@ -0,0 +1,11 @@ +@use "cmb2"; +@use "user-profile"; +@use "localisation-options"; + +:root { + --wp--preset--layout--contentSize: 1468px; +} + +.is-hidden { + display: none; +} diff --git a/private/src/scripts/admin/options-general.js b/private/src/admin/options-general.js similarity index 100% rename from private/src/scripts/admin/options-general.js rename to private/src/admin/options-general.js diff --git a/private/src/scripts/admin/ordered-list-preview.js b/private/src/admin/ordered-list-preview.js similarity index 100% rename from private/src/scripts/admin/ordered-list-preview.js rename to private/src/admin/ordered-list-preview.js diff --git a/private/src/block-styles/bigbite-tabs.php b/private/src/block-styles/bigbite-tabs.php new file mode 100644 index 00000000..e016a7d7 --- /dev/null +++ b/private/src/block-styles/bigbite-tabs.php @@ -0,0 +1,31 @@ + 'light', + 'label' => _x( 'Light', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'bigbite/tabs', + [ + // translators: [admin] + 'name' => 'grey', + 'label' => _x( 'Grey', 'block style', 'amnesty' ), + 'is_default' => true, + ], + ); + } +} diff --git a/private/src/block-styles/core-button.php b/private/src/block-styles/core-button.php new file mode 100644 index 00000000..6dcecce7 --- /dev/null +++ b/private/src/block-styles/core-button.php @@ -0,0 +1,42 @@ + 'dark', + 'label' => _x( 'Dark', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/button', + [ + // translators: [admin] + 'name' => 'link', + 'label' => _x( 'Back link', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/button', + [ + // translators: [admin] + 'name' => 'search', + 'label' => _x( 'Search', 'block style', 'amnesty' ), + ], + ); + } +} diff --git a/private/src/block-styles/core-group.php b/private/src/block-styles/core-group.php new file mode 100644 index 00000000..cc113bf4 --- /dev/null +++ b/private/src/block-styles/core-group.php @@ -0,0 +1,48 @@ + 'square-border', + 'label' => _x( 'Square Border', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/group', + [ + // translators: [admin] + 'name' => 'light', + 'label' => _x( 'Light Background', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/group', + [ + // translators: [admin] + 'name' => 'dark', + 'label' => _x( 'Dark Background', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/group', + [ + // translators: [admin] + 'name' => 'top-and-bottom-border', + 'label' => _x( 'Top and Bottom Border', 'block style', 'amnesty' ), + ], + ); + } +} diff --git a/private/src/block-styles/core-social-links.php b/private/src/block-styles/core-social-links.php new file mode 100644 index 00000000..9d0882a0 --- /dev/null +++ b/private/src/block-styles/core-social-links.php @@ -0,0 +1,75 @@ + 'dark', + 'label' => _x( 'Dark', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/social-links', + [ + // translators: [admin] + 'name' => 'dark-circle', + 'label' => _x( 'Dark Circle', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/social-links', + [ + // translators: [admin] + 'name' => 'light', + 'label' => _x( 'Light', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/social-links', + [ + // translators: [admin] + 'name' => 'light-circle', + 'label' => _x( 'Light Circle', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/social-links', + [ + // translators: [admin] + 'name' => 'light-circle', + 'label' => _x( 'Light Circle', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/social-links', + [ + // translators: [admin] + 'name' => 'logos-only-dark', + 'label' => _x( 'Logos Only Dark', 'block style', 'amnesty' ), + ], + ); + + register_block_style( + 'core/social-links', + [ + // translators: [admin] + 'name' => 'logos-only-light', + 'label' => _x( 'Logos Only Light', 'block style', 'amnesty' ), + ], + ); + } +} diff --git a/private/src/block-styles/core-table.php b/private/src/block-styles/core-table.php new file mode 100644 index 00000000..bb908522 --- /dev/null +++ b/private/src/block-styles/core-table.php @@ -0,0 +1,21 @@ + 'responsive', + 'label' => _x( 'Responsive', 'block style', 'amnesty' ), + ], + ); + } +} diff --git a/private/src/blocks/_deprecated/background-media-column/block.json b/private/src/blocks/_deprecated/background-media-column/block.json new file mode 100644 index 00000000..7297fc4b --- /dev/null +++ b/private/src/blocks/_deprecated/background-media-column/block.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/background-media-column", + "parent": ["amnesty-core/background-media"], + "title": "Background Media Column", + "category": "amnesty-core", + "description": "Column layout for Background Media block", + "icon": "", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "render": "file:./render.php", + "supports": { + "alignWide": false, + "className": false, + "customClassName": false, + "defaultStylePicker": false, + "inserter": false, + "reusable": false + }, + "attributes": { + "uniqId": { + "type": "string", + "default": "", + "source": "attribute", + "selector": "div", + "attribute": "id" + }, + "horizontalAlignment": { + "type": "string", + "default": "" + }, + "verticalAlignment": { + "type": "string", + "default": "" + }, + "image": { + "type": "number", + "default": 0 + }, + "background": { + "type": "string", + "default": "" + }, + "opacity": { + "type": "number", + "default": 1 + }, + "focalPoint": { + "type": "object", + "default": { + "x": 0.5, + "y": 0.5 + } + } + } +} diff --git a/private/src/blocks/_deprecated/background-media-column/deprecated.jsx b/private/src/blocks/_deprecated/background-media-column/deprecated.jsx new file mode 100644 index 00000000..aba011f6 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media-column/deprecated.jsx @@ -0,0 +1,266 @@ +import classnames from 'classnames'; +import { assign, isObject, isString } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; + +import { getSaveCss } from '../background-media/utils'; + +const v4 = { + supports: { + alignWide: false, + className: false, + customClassName: false, + defaultStylePicker: false, + inserter: false, + reusable: false, + }, + attributes: { + uniqId: { + type: 'string', + default: '', + source: 'attribute', + selector: 'div', + attribute: 'id', + }, + horizontalAlignment: { + type: 'string', + }, + verticalAlignment: { + type: 'string', + }, + image: { + type: 'object', + default: '', + }, + background: { + type: 'string', + }, + opacity: { + type: 'number', + default: 1, + }, + focalPoint: { + type: 'object', + default: { + x: 0.5, + y: 0.5, + }, + }, + }, + migrate(attributes, innerBlocks) { + if (isObject(attributes.image)) { + return [assign({}, attributes, { image: parseInt(attributes.image.id, 10) }), innerBlocks]; + } + + if (isString(attributes.image) && attributes.image) { + return [assign({}, attributes, { image: parseInt(attributes.image, 10) }), innerBlocks]; + } + + return [attributes, innerBlocks]; + }, + save({ attributes }) { + const { background, horizontalAlignment, uniqId, verticalAlignment } = attributes; + + const containerClasses = classnames('text-media--itemContainer', { + [`align${horizontalAlignment}`]: !!horizontalAlignment, + [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, + [`has-${background}-background-color`]: !!background, + }); + + const css = getSaveCss(attributes); + + return ( + <> + {css && } +
+ +
+ + ); + }, +}; + +const v3 = { + supports: { + alignWide: false, + className: false, + customClassName: false, + defaultStylePicker: false, + inserter: false, + reusable: false, + }, + attributes: { + uniqId: { + type: 'string', + default: '', + source: 'attribute', + selector: 'div', + attribute: 'id', + }, + horizontalAlignment: { + type: 'string', + }, + verticalAlignment: { + type: 'string', + }, + image: { + type: 'object', + default: '', + }, + background: { + type: 'string', + }, + opacity: { + type: 'number', + default: 1, + }, + focalPoint: { + type: 'object', + default: { + x: 0.5, + y: 0.5, + }, + }, + }, + save({ attributes }) { + const { background, horizontalAlignment, uniqId, verticalAlignment, image } = attributes; + + const containerClasses = classnames('text-media--itemContainer', { + [`align${horizontalAlignment}`]: !!horizontalAlignment, + [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, + [`has-${background}-background-color`]: !!background, + }); + + const css = getSaveCss(attributes); + + return ( + <> + {css && } +
+ + {image &&
} +
+ + ); + }, +}; + +const v2 = { + attributes: { + uniqId: { + type: 'string', + default: '', + source: 'attribute', + selector: 'div', + attribute: 'id', + }, + horizontalAlignment: { + type: 'string', + }, + verticalAlignment: { + type: 'string', + }, + image: { + type: 'object', + default: '', + }, + background: { + type: 'string', + }, + opacity: { + type: 'number', + default: 1, + }, + focalPoint: { + type: 'object', + default: { + x: 0.5, + y: 0.5, + }, + }, + }, + save({ attributes }) { + const { background, horizontalAlignment, uniqId, verticalAlignment, image } = attributes; + + const containerClasses = classnames('text-media--itemContainer', { + [`align${horizontalAlignment}`]: !!horizontalAlignment, + [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, + [`has-${background}-background-color`]: !!background, + }); + + const css = getSaveCss(attributes); + + return ( + <> + {css && } +
+ + {image && ( +
+ {image.description} +
+ )} +
+ + ); + }, +}; + +const v1 = { + attributes: { + uniqId: { + type: 'string', + default: '', + source: 'attribute', + selector: 'div', + attribute: 'id', + }, + horizontalAlignment: { + type: 'string', + }, + verticalAlignment: { + type: 'string', + }, + image: { + type: 'object', + default: '', + }, + background: { + type: 'string', + }, + opacity: { + type: 'number', + default: 1, + }, + focalPoint: { + type: 'object', + default: { + x: 0.5, + y: 0.5, + }, + }, + }, + save({ attributes }) { + const { background, horizontalAlignment, uniqId, verticalAlignment } = attributes; + + const containerClasses = classnames('text-media--itemContainer', { + [`align${horizontalAlignment}`]: !!horizontalAlignment, + [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, + [`has-${background}-background-color`]: !!background, + }); + + const css = getSaveCss(attributes); + + return ( + <> + {css && } +
+ +
+ + ); + }, +}; + +const deprecated = [v4, v3, v2, v1]; + +export default deprecated; diff --git a/private/src/blocks/_deprecated/background-media-column/edit.jsx b/private/src/blocks/_deprecated/background-media-column/edit.jsx new file mode 100644 index 00000000..b115e1ac --- /dev/null +++ b/private/src/blocks/_deprecated/background-media-column/edit.jsx @@ -0,0 +1,186 @@ +import classnames from 'classnames'; +import { isObject } from 'lodash'; +import apiFetch from '@wordpress/api-fetch'; +import { + BlockAlignmentToolbar, + BlockControls, + BlockVerticalAlignmentToolbar, + InnerBlocks, + InspectorControls, + MediaUpload, + MediaUploadCheck, + useBlockProps, +} from '@wordpress/block-editor'; +import { + Button, + FocalPointPicker, + PanelBody, + RangeControl, + SelectControl, +} from '@wordpress/components'; +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { getEditorCssV2, getDimensionsV2, getUrlV2, randId } from '../background-media/utils'; + +const ALLOWED_BLOCKS = [ + 'core/heading', + 'core/paragraph', + 'core/list', + 'core/buttons', + 'core/button', +]; + +export default function Edit(props) { + const { attributes, clientId, setAttributes } = props; + const { background, horizontalAlignment, image, uniqId, verticalAlignment } = attributes; + const [focalPoint, setFocalPoint] = useState({ x: 0.5, y: 0.5 }); + const [opacity, setOpacity] = useState(1); + const [imageObject, setImageObject] = useState({}); + + // componentDidMount + const mounted = useRef(); + useEffect(() => { + if (mounted.current) { + return; + } + + mounted.current = true; + + if (!uniqId) { + setAttributes({ uniqId: randId() }); + } + + if (!image) { + return; + } + + if (isObject(image)) { + setAttributes({ image: image.id }); + return; + } + + if (!imageObject?.id) { + apiFetch({ path: `wp/v2/media/${image}` }).then(setImageObject); + } + }, [image, uniqId, setAttributes, imageObject]); + + // componentDidUpdate + useEffect(() => { + if (!mounted.current) { + return; + } + + setAttributes({ focalPoint, opacity }); + + if (!image) { + return; + } + + if (!imageObject?.id) { + apiFetch({ path: `wp/v2/media/${image}` }).then(setImageObject); + } + }, [focalPoint, image, imageObject, opacity, setAttributes]); + + const containerClasses = classnames('text-media--itemContainer', { + [`align${horizontalAlignment}`]: !!horizontalAlignment, + [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, + [`has-${background}-background-color`]: !!background, + }); + + const blockProps = useBlockProps({ + className: containerClasses, + }); + + const css = getEditorCssV2(imageObject, `block-${clientId}`, focalPoint, opacity); + + return ( + <> + + {imageObject && ( + + + setOpacity(value)} + /> + + )} + {!image && ( + /* translators: [admin] */ + + setAttributes({ background: value })} + options={[ + { + /* translators: [admin] */ + label: __('White', 'amnesty'), + value: '', + }, + { + /* translators: [admin] */ + label: __('Grey', 'amnesty'), + value: 'very-light-gray', + }, + ]} + /> + + )} + + + setAttributes({ horizontalAlignment: value })} + /> + setAttributes({ verticalAlignment: value })} + /> + + {css && } +
+
+ + setAttributes({ image: media.id })} + allowedTypes={['image']} + value={isObject(image) ? image.id : image} + render={({ open }) => ( + + )} + /> + + {image ? ( + + ) : null} +
+
+ +
+
+ + ); +} diff --git a/private/src/blocks/_deprecated/background-media-column/index.jsx b/private/src/blocks/_deprecated/background-media-column/index.jsx new file mode 100644 index 00000000..1d9913b2 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media-column/index.jsx @@ -0,0 +1,14 @@ +import { assign } from 'lodash'; +import { registerBlockType } from '@wordpress/blocks'; +import { InnerBlocks } from '@wordpress/block-editor'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: assign(() => , { displayName: 'BackgroundMediaColumnBlockSave' }), +}); diff --git a/private/src/blocks/_deprecated/background-media-column/render.php b/private/src/blocks/_deprecated/background-media-column/render.php new file mode 100644 index 00000000..c139050c --- /dev/null +++ b/private/src/blocks/_deprecated/background-media-column/render.php @@ -0,0 +1,46 @@ + (bool) $attributes['horizontalAlignment'], + "is-vertically-aligned-{$attributes['verticalAlignment']}" => (bool) $attributes['verticalAlignment'], + "has-{$attributes['background']}-background-color" => (bool) $attributes['background'], + ] +); + +if ( 0 === absint( $attributes['image'] ) ) : + + ?> + +
+ +
+ + 'wp-block-cover__image-background wp-image-' . $attributes['image'], + 'style' => 'background-position:' . $x_offset . '% ' . $y_offset . '%;opacity:' . $opacity, + ], +); + +?> + +
+ +
+
diff --git a/private/src/blocks/_deprecated/background-media/block.json b/private/src/blocks/_deprecated/background-media/block.json new file mode 100644 index 00000000..6d0240e9 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media/block.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/background-media", + "allowedBlocks": ["amnesty-core/background-media-column"], + "title": "Background Media", + "category": "amnesty-core", + "keywords": ["Background", "Media", "Text"], + "description": "Two-column layout with background images", + "icon": "", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": ["wp-block-cover", "file:./style-index.css"], + "render": "file:./render.php", + "attributes": {} +} diff --git a/private/src/blocks/_deprecated/background-media/deprecated.jsx b/private/src/blocks/_deprecated/background-media/deprecated.jsx new file mode 100644 index 00000000..acdf5aba --- /dev/null +++ b/private/src/blocks/_deprecated/background-media/deprecated.jsx @@ -0,0 +1,25 @@ +import classnames from 'classnames'; + +import { InnerBlocks } from '@wordpress/block-editor'; + +const v1 = { + save({ className, innerBlocks }) { + const leftImage = innerBlocks[0]?.attributes?.image?.id; + const rightImage = innerBlocks[1]?.attributes?.image?.id; + + const blockClasses = classnames(className, { + 'has-imageLeft': !!leftImage, + 'has-imageRight': !!rightImage, + }); + + return ( +
+ +
+ ); + }, +}; + +const deprecated = [v1]; + +export default deprecated; diff --git a/private/src/blocks/_deprecated/background-media/edit.jsx b/private/src/blocks/_deprecated/background-media/edit.jsx new file mode 100644 index 00000000..e8491e75 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media/edit.jsx @@ -0,0 +1,14 @@ +import { useBlockProps, InnerBlocks } from '@wordpress/block-editor'; + +const TEMPLATE = [ + ['amnesty-core/background-media-column', { deletable: false }], + ['amnesty-core/background-media-column', { deletable: false }], +]; + +export default function Edit() { + return ( +
+ +
+ ); +} diff --git a/private/src/styles/blocks/text-media/_editor.scss b/private/src/blocks/_deprecated/background-media/editor.scss similarity index 100% rename from private/src/styles/blocks/text-media/_editor.scss rename to private/src/blocks/_deprecated/background-media/editor.scss diff --git a/private/src/blocks/_deprecated/background-media/index.jsx b/private/src/blocks/_deprecated/background-media/index.jsx new file mode 100644 index 00000000..9f8e5602 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media/index.jsx @@ -0,0 +1,17 @@ +import './style.scss'; +import './editor.scss'; + +import { assign } from 'lodash'; +import { registerBlockType } from '@wordpress/blocks'; +import { InnerBlocks } from '@wordpress/block-editor'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: assign(() => , { displayName: 'BackgroundMediaBlockSave' }), +}); diff --git a/private/src/blocks/_deprecated/background-media/render.php b/private/src/blocks/_deprecated/background-media/render.php new file mode 100644 index 00000000..7fa4f659 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media/render.php @@ -0,0 +1,3 @@ +
> + +
diff --git a/private/src/blocks/_deprecated/background-media/style.scss b/private/src/blocks/_deprecated/background-media/style.scss new file mode 100644 index 00000000..45910fd8 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media/style.scss @@ -0,0 +1,88 @@ +.wp-block-amnesty-core-background-media { + display: flex; + width: 100%; + flex-direction: column; + + @media all and (min-width: 760px) { + width: 100%; + flex-direction: row; + } + + .mobile-hide-panel .text-media--backgroundImage { + @media all and (max-width: 760px) { + display: none !important; + } + } +} + +.wp-block-amnesty-core-background-media .text-media--itemContainer { + display: flex; + width: 100%; + padding: 24px; + min-height: 400px; + position: relative; + padding-bottom: 40px; + word-break: break-word; + background-repeat: no-repeat; + background-size: cover; + flex-direction: column; +} + +.wp-block-amnesty-core-background-media .text-media--itemContainer > * { + width: 100%; + margin-left: 10px; + margin-right: 10px; +} + +.text-media--itemContainer.is-vertically-aligned-center { + flex-direction: column; + justify-content: center; +} + +.text-media--itemContainer.alignleft { + flex-direction: column; + align-items: flex-start; + text-align: left; + + .rtl & { + align-items: flex-end; + text-align: right; + } +} + +.text-media--itemContainer.alignright { + flex-direction: column; + align-items: flex-end; + text-align: right; + + .rtl & { + align-items: flex-start; + text-align: left; + } +} + +.text-media--itemContainer.aligncenter { + flex-direction: column; + align-items: center; + text-align: center; +} + +.wp-block-amnesty-core-background-media.has-imageRight { + div:nth-child(1) { + @media all and (min-width: 760px) and (max-width: 940px) { + width: 66%; + } + } +} + +.wp-block-amnesty-core-background-media.has-imageLeft { + div:first-child { + @media all and (min-width: 760px) and (max-width: 940px) { + width: 66%; + } + } +} + +.wp-block-amnesty-core-background-media.has-textShadow { + text-shadow: 1px 1px 2px rgba(0, 0, 0, 1), 0 0 .75em rgba(0, 0, 0, 1), 0 0 1.25em rgba(0, 0, 0, 1); +} diff --git a/private/src/blocks/_deprecated/background-media/utils.js b/private/src/blocks/_deprecated/background-media/utils.js new file mode 100644 index 00000000..aaed30d0 --- /dev/null +++ b/private/src/blocks/_deprecated/background-media/utils.js @@ -0,0 +1,151 @@ +import { pick } from 'lodash'; + +export const getUrlV2 = (image, size) => { + // eslint-disable-next-line camelcase + if (!image || !image?.media_details) { + return ''; + } + + // eslint-disable-next-line camelcase + const { sizes } = image.media_details; + + if (!sizes) { + return ''; + } + + // eslint-disable-next-line camelcase + if (sizes[size] && sizes[size]?.source_url) { + return encodeURI(sizes[size].source_url); + } + + // eslint-disable-next-line camelcase + if (sizes?.full?.source_url) { + return encodeURI(sizes.full.source_url); + } + + return ''; +}; + +export const getDimensionsV2 = (image, size) => { + const fallback = { height: 0, width: 0 }; + + // eslint-disable-next-line camelcase + if (!image || !image?.media_details) { + return fallback; + } + + // eslint-disable-next-line camelcase + const { sizes } = image.media_details; + + if (!sizes) { + return fallback; + } + + // eslint-disable-next-line camelcase + if (sizes[size]) { + return pick(sizes[size], ['height', 'width']); + } + + // eslint-disable-next-line camelcase + if (sizes.full) { + return pick(sizes.full, ['height', 'width']); + } + + return fallback; +}; + +export const getEditorCssV2 = (imageObject, uniqId, focalPoint, opacity) => { + if (!imageObject) { + return ''; + } + + const bgopacity = parseFloat((1 - parseFloat(opacity)).toPrecision(2)); + const x = Math.round(parseFloat(focalPoint.x) * 100); + const y = Math.round(parseFloat(focalPoint.y) * 100); + const lg = '@media screen and (min-width:1440px)'; + let gradient = `linear-gradient(rgba(255,255,255,${bgopacity}),rgba(255,255,255,${bgopacity})),`; + + if (bgopacity === 0) { + gradient = ''; + } + + return ` + #${uniqId}{background-position:${x}% ${y}%} + #${uniqId}{background-image:${gradient}url("${getUrlV2(imageObject, 'lwi-block-sm@2x')}")} + ${lg}{#${uniqId}{background-image:${gradient}url("${getUrlV2(imageObject, 'lwi-block-lg@2x')}")}} + `.replace(/\s+/, ''); +}; + +export const getUrl = (image, size) => { + if (!image) { + return ''; + } + + const obj = image.sizes[size] || image.sizes.full || { url: '' }; + return encodeURI(obj.url); +}; + +export const getSaveCss = ({ focalPoint, image, opacity, uniqId }) => { + if (!image) { + return ''; + } + + const bgopacity = parseFloat((1 - parseFloat(opacity)).toPrecision(2)); + const x = parseFloat(focalPoint.x) * 100; + const y = parseFloat(focalPoint.y) * 100; + const med = '@media screen and (min-width:770px)'; + const lg = '@media screen and (min-width:1440px)'; + let gradient = `linear-gradient(rgba(255,255,255,${bgopacity}),rgba(255,255,255,${bgopacity})),`; + + if (bgopacity === 0) { + gradient = ''; + } + + return ` + #${uniqId}{background-position:${x}% ${y}%} + #${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")} + ${med}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")}} + ${lg}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-lg@2x')}")}} + `.replace(/\s+/, ''); +}; + +export const getEditorCss = ({ image, uniqId }, focalPoint, opacity) => { + if (!image) { + return ''; + } + + const bgopacity = parseFloat((1 - parseFloat(opacity)).toPrecision(2)); + const x = Math.round(parseFloat(focalPoint.x) * 100); + const y = Math.round(parseFloat(focalPoint.y) * 100); + const med = '@media screen and (min-width:770px)'; + const lg = '@media screen and (min-width:1440px)'; + let gradient = `linear-gradient(rgba(255,255,255,${bgopacity}),rgba(255,255,255,${bgopacity})),`; + + if (bgopacity === 0) { + gradient = ''; + } + + return ` + #${uniqId}{background-position:${x}% ${y}%} + #${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")} + ${med}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")}} + ${lg}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-lg@2x')}")}} + `.replace(/\s+/, ''); +}; + +export const getDimensions = (image, size) => { + const fallback = { height: 0, width: 0 }; + + if (!image) { + return fallback; + } + + const obj = image.sizes[size] || image.sizes.full || fallback; + return pick(obj, ['height', 'width']); +}; + +export const randId = () => + Math.random() + .toString(36) + .replace(/[^a-z]+/g, '') + .substr(2, 10); diff --git a/private/src/blocks/_deprecated/banner/block.json b/private/src/blocks/_deprecated/banner/block.json new file mode 100644 index 00000000..d1edaa81 --- /dev/null +++ b/private/src/blocks/_deprecated/banner/block.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/header", + "title": "Banner", + "category": "amnesty-core", + "keywords": ["Banner", "Amnesty"], + "description": "Banner block", + "icon": "format-image", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": false, + "inserter": false + }, + "attributes": { + "title": { + "type": "string" + }, + "content": { + "type": "string" + }, + "ctaLink": { + "type": "string" + }, + "ctaText": { + "type": "string" + }, + "alignment": { + "type": "string" + }, + "background": { + "type": "string" + }, + "hideImageCaption": { + "type": "boolean", + "default": true + }, + "hideImageCopyright": { + "type": "boolean", + "default": false + }, + "size": { + "type": "string" + }, + "type": { + "type": "string" + }, + "embed": { + "type": "string" + }, + "imageID": { + "type": "integer" + }, + "imageURL": { + "type": "string" + }, + "featuredVideoId": { + "type": "integer" + } + } +} diff --git a/private/src/scripts/editor/components/MediaMetadata.jsx b/private/src/blocks/_deprecated/banner/components/MediaMetadata.jsx similarity index 100% rename from private/src/scripts/editor/components/MediaMetadata.jsx rename to private/src/blocks/_deprecated/banner/components/MediaMetadata.jsx diff --git a/private/src/blocks/_deprecated/banner/components/MediaMetadataVisibilityControls.jsx b/private/src/blocks/_deprecated/banner/components/MediaMetadataVisibilityControls.jsx new file mode 100644 index 00000000..fe271ea9 --- /dev/null +++ b/private/src/blocks/_deprecated/banner/components/MediaMetadataVisibilityControls.jsx @@ -0,0 +1,33 @@ +import { ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +const MediaMetadataVisibilityControls = ({ type, hideCaption, hideCopyright, setAttributes }) => { + /* translators: [admin] */ + let captionLabel = __('Hide Image Caption', 'amnesty'); + /* translators: [admin] */ + let copyrightLabel = __('Hide Image Credit', 'amnesty'); + + if (type === 'video') { + /* translators: [admin] */ + captionLabel = __('Hide Video Caption', 'amnesty'); + /* translators: [admin] */ + copyrightLabel = __('Hide Video Credit', 'amnesty'); + } + + return ( + <> + setAttributes({ hideImageCaption: !hideCaption })} + /> + setAttributes({ hideImageCopyright: !hideCopyright })} + /> + + ); +}; + +export default MediaMetadataVisibilityControls; diff --git a/private/src/blocks/_deprecated/banner/components/PostFeaturedVideo.jsx b/private/src/blocks/_deprecated/banner/components/PostFeaturedVideo.jsx new file mode 100644 index 00000000..b8c22426 --- /dev/null +++ b/private/src/blocks/_deprecated/banner/components/PostFeaturedVideo.jsx @@ -0,0 +1,111 @@ +import { MediaUpload } from '@wordpress/block-editor'; +import { Button } from '@wordpress/components'; +import { Component } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/* translators: [admin] */ +const DEFAULT_SET_FEATURE_VIDEO_LABEL = __('Set featured video', 'amnesty'); +/* translators: [admin] */ +const DEFAULT_REMOVE_FEATURE_VIDEO_LABEL = __('Remove featured video', 'amnesty'); + +class PostFeaturedVideo extends Component { + constructor(...args) { + super(...args); + + this.state = { + media: false, + }; + } + + componentDidMount() { + if (this.props.featuredVideoId && !this.state.media) { + this.fetchMediaObject(); + } + } + + fetchMediaObject() { + const { featuredVideoId } = this.props; + wp.apiRequest({ + path: `/wp/v2/media/${featuredVideoId}`, + }).then((resp) => { + this.setState({ + media: { ...resp }, + }); + }); + } + + onUpdateVideo = (media) => { + if (!media) { + this.setState({ media: false }); + + this.props.onUpdate(''); + return; + } + + this.setState({ media }); + this.props.onUpdate(media.id); + }; + + onRemoveVideo = () => this.onUpdateVideo(false); + + render() { + const { featuredVideoId } = this.props; + const { media } = this.state; + + return ( +
+ {!!featuredVideoId && ( + ( + +
+ )} + /> + )} + {!featuredVideoId && ( +
+ ( + + )} + /> +
+ )} + {!!featuredVideoId && ( + + )} + + ); + } +} + +export default PostFeaturedVideo; diff --git a/private/src/blocks/_deprecated/banner/edit.jsx b/private/src/blocks/_deprecated/banner/edit.jsx new file mode 100644 index 00000000..963e5492 --- /dev/null +++ b/private/src/blocks/_deprecated/banner/edit.jsx @@ -0,0 +1,288 @@ +import classnames from 'classnames'; +import { InspectorControls, MediaUpload, RichText, URLInputButton } from '@wordpress/block-editor'; +import { IconButton, PanelBody, SelectControl, TextControl } from '@wordpress/components'; +import { Component, Fragment } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { addQueryArgs } from '@wordpress/url'; + +import MediaMetadata from './components/MediaMetadata.jsx'; +import MediaMetadataVisibilityControls from './components/MediaMetadataVisibilityControls.jsx'; +import PostFeaturedVideo from './components/PostFeaturedVideo.jsx'; + +export default class DisplayComponent extends Component { + state = { + imageData: null, + videoData: null, + }; + + fetchMediaMetadata = (id, type) => { + const key = `${type}Data`; + const cached = this.state[key]?.id; + + if (id === 0) { + if (cached) { + this.setState({ [key]: null }); + } + return; + } + + if (cached && cached === id) { + return; + } + + const path = addQueryArgs(`/wp/v2/media/${id}`, { + context: 'edit', + _fields: 'id,source_url,caption,description', + }); + + wp.apiRequest({ path }).then((resp) => { + this.setState({ + [key]: { + id: resp.id, + url: resp.source_url, + caption: resp.caption.raw, + description: resp.description.raw, + }, + }); + }); + }; + + componentDidMount() { + const { imageID, type, featuredVideoId } = this.props.attributes; + + if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { + this.fetchMediaMetadata(featuredVideoId, 'video'); + } + + if (type !== 'video' && !this.state.imageData && imageID) { + this.fetchMediaMetadata(imageID, 'image'); + } + } + + componentDidUpdate(prevProps) { + const { imageID, type, featuredVideoId } = this.props.attributes; + + if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { + this.fetchMediaMetadata(featuredVideoId, 'video'); + } + + if ( + type !== 'video' && + (imageID !== prevProps.imageID || this.state.imageData?.id !== imageID) + ) { + this.fetchMediaMetadata(imageID, 'image'); + } + } + + render() { + const { attributes = {}, setAttributes } = this.props; + const { + size = false, + background = false, + alignment = false, + + content, + ctaLink, + ctaText, + embed, + featuredVideoId, + imageID, + title, + } = attributes; + + let { type } = attributes; + if (!type) { + type = 'image'; + } + + const classes = classnames('page-hero', 'headerBlock', { + 'page-heroSize--full': !size, + 'page-heroBackground--transparent': !background, + 'page-heroAlignment--left': !alignment, + 'page-hero--video': type === 'video', + [`page-heroSize--${size}`]: size, + [`page-heroBackground--${background}`]: background, + [`page-heroAlignment--${alignment}`]: alignment, + }); + + const sectionStyles = {}; + if (type === 'image' && this.state.imageData?.url) { + sectionStyles.backgroundImage = `url("${this.state.imageData.url}")`; + } + + const caption = this.state[`${type}Data`]?.caption; + const copyright = this.state[`${type}Data`]?.description; + + return ( + + + + setAttributes({ alignment: newAlignment })} + /> + setAttributes({ background: newBackground })} + /> + setAttributes({ size: newSize })} + /> + setAttributes({ type: newType })} + /> + + setAttributes({ embed: newEmbed })} + /> + + {type === 'video' && ( + + setAttributes({ featuredVideoId: newVideoID })} + /> + + )} + +
+ {type !== 'video' && ( +
+ {imageID ? ( + setAttributes({ imageID: 0 })} + /> + ) : ( + setAttributes({ imageID: media.id })} + render={({ open }) => } + /> + )} +
+ )} + + {this.state.videoData?.url && ( +
+ +
+ )} +
+
+ setAttributes({ title: newTitle })} + /> + setAttributes({ content: newContent })} + /> +
+
+ {embed && } + setAttributes({ ctaText: newCtaText })} + /> + {(!embed || embed.length < 1) && ( + setAttributes({ ctaLink: newCtaLink })} + /> + )} +
+
+
+
+ +
+
+ ); + } +} diff --git a/private/src/blocks/_deprecated/banner/editor.scss b/private/src/blocks/_deprecated/banner/editor.scss new file mode 100644 index 00000000..9d420e1e --- /dev/null +++ b/private/src/blocks/_deprecated/banner/editor.scss @@ -0,0 +1,122 @@ +[data-type="amnesty-core/header"] { + max-width: 100% !important; + width: 100% !important; +} + +.headerBlock .container { + padding: 0 flexy-gutter(); + display: flex; +} + +.headerBlock .page-heroTitle span { + line-height: 1.2; +} + +.headerBlock .hero-content { + display: flex; + flex-direction: column; + align-items: flex-start; +} + +.headerBlock.headerBlock.page-heroAlignment--centre .hero-content { + align-items: center; +} + +.page-heroAlignment--center .container { + display: flex; + justify-content: center; +} + +.page-heroAlignment--right .container { + display: flex; + justify-content: space-between; +} + +.page-heroAlignment--left .container { + display: flex; + justify-content: space-between; +} + +.page-hero .donation { + margin-right: auto; + margin-left: auto; +} + +.page-hero .container .hero-content { + flex-direction: column; + + > * { + margin-bottom: 12px; + } +} + +.page-hero .container { + @media all and (min-width: 465px) and (max-width: 840px) { + flex-wrap: nowrap; + } +} + +.page-heroAlignment--right .container .hero-content { + order: 2; +} + +.page-heroAlignment--right .container .page-heroCta { + order: 2; + margin-right: 0; + margin-left: auto; +} + +.page-heroAlignment--right .page-heroTitle { + margin-left: 0; +} + +.page-heroAlignment--center .donation { + margin-left: 0; + margin-right: 0; +} + +.page-heroAlignment--right .donation { + margin-left: auto; + margin-right: auto; +} + +.rtl .page-heroAlignment--right .page-heroContent { + margin-right: 0; +} + +.rtl .page-heroAlignment--left .page-heroContent { + margin-left: 0; +} + +.rtl .page-heroAlignment--center .container .hero-content { + margin-left: 10%; + margin-right: auto; + order: 2; +} + +.rtl .page-heroAlignment--center .donation { + margin-right: 0; + margin-left: 0; +} + +.rtl .page-heroAlignment--left .container .hero-content { + margin-left: 20%; + order: 2; + text-align: end; +} + +.rtl .page-heroAlignment--right .container .hero-content { + order: 0; + text-align: left; + margin-right: 20%; + margin-left: 10%; +} + +.rtl .page-heroAlignment--right .page-heroTitle { + margin-right: 0; +} + +.rtl .page-heroAlignment--left .container .page-heroCta { + margin-right: 0; + margin-left: auto; +} diff --git a/private/src/blocks/_deprecated/banner/index.js b/private/src/blocks/_deprecated/banner/index.js new file mode 100644 index 00000000..c7e3dcd0 --- /dev/null +++ b/private/src/blocks/_deprecated/banner/index.js @@ -0,0 +1,13 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/_deprecated/banner/render.php b/private/src/blocks/_deprecated/banner/render.php new file mode 100644 index 00000000..060d86be --- /dev/null +++ b/private/src/blocks/_deprecated/banner/render.php @@ -0,0 +1,4 @@ + *:not(:last-child) { + margin-bottom: 12px; + } +} + +.page-heroAlignment--right .container { + align-content: center; + flex-direction: column; + align-items: center; + + @media all and (min-width: 596px) { + flex-direction: row-reverse; + justify-content: space-between; + align-items: flex-start; + } + + .rtl & { + @media all and (min-width: 596px) { + // this is required because the order is incorrect in the dom order when using right posiiton + /* stylelint-disable */ + flex-direction: unset; + flex-direction: row-reverse; + /* stylelint-enable */ + } + } +} + +.page-heroAlignment--right .container .hero-content, +.page-heroAlignment--left .container .hero-content { + flex-direction: column; + position: relative; + margin-bottom: 5%; +} + +.page-heroAlignment--right .donation { + flex-direction: column; + position: relative; +} + +.page-heroAlignment--center .container .hero-content { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + position: relative; + margin-bottom: 5%; + margin-right: 0; +} + +.page-heroAlignment--center .donation { + margin-left: 2%; + + @media all and (min-width: 596px) and (max-width: 1110px) { + flex-direction: column; + position: relative; + } +} + +.page-heroAlignment--left .donation { + flex-direction: column; + position: relative; +} + +.rtl .page-heroAlignment--right .container .page-heroCta { + margin-right: auto; + margin-left: 0; +} + +.rtl .page-heroAlignment--center .container .donation { + @media all and (min-width: 596px) { + margin-right: 2%; + margin-left: 0; + } +} + +.page-heroAlignment--left .container .donation { + @media all and (min-width: 596px) { + margin-right: 0; + margin-left: 2%; + } + + .rtl & { + @media all and (min-width: 596px) { + margin-right: 2%; + margin-left: 0; + } + } +} + +.headerBlock .content-type-container { + position: absolute; + bottom: 0; + display: flex; + justify-content: flex-start; + margin: 0 auto; + max-width: 1468px; + margin-right: auto; + margin-left: auto; + left: 0; + right: 0; + padding: 0 20px; + height: 27px; +} + +.headerBlock .content-type-container li { + list-style-type: none; +} + +.headerBlock .content-type-container a { + text-decoration: none; + font-family: var(--wp--preset--font-family--secondary); + padding: 5px; + font-size: var(--wp--preset--font-size--regular); + color: var(--wp--preset--color--white); + background-color: var(--wp--preset--color--black); +} + +.rtl .headerBlock .page-heroTitle span { + padding: 10px 0; + line-height: 1.6; +} + +.page-heroAlignment--center .container .hero-content.has-donation-block { + align-items: center; + + @media all and (min-width: 596px) { + align-items: flex-start; + } +} + +.page-heroAlignment--center .container .hero-content .page-heroTitle { + text-align: center; +} + +.page-heroAlignment--left .container .hero-content .page-heroTitle { + text-align: center; + + @media all and (min-width: 596px) { + text-align: start; + } +} + +.page-heroAlignment--right .container .hero-content .page-heroTitle { + text-align: center; + + @media all and (min-width: 596px) { + text-align: end; + } +} + +.page-heroAlignment--center .container .hero-content.has-donation-block .page-heroTitle { + text-align: center; + + @media all and (min-width: 596px) { + text-align: left; + } +} + +.page-hero .image-metadata.is-image { + display: flex; +} + +.page-hero .image-metadata.is-video { + display: none; +} + +.page-hero.page-hero--video .image-metadata.is-image { + display: flex; + + @media all and (min-width: 760px) { + display: none; + } +} + +.page-hero.page-hero--video .image-metadata.is-video { + display: none; + + @media all and (min-width: 760px) { + display: flex; + } +} + +:lang(fa-IR) .headerBlock .page-heroTitle span { + line-height: 1.73; + + @media all and (min-width: 760px) { + line-height: 1.71; + } +} + +:lang(fa-IR) .rtl .headerBlock .page-heroTitle span { + padding: 0 0; + + @media all and (min-width: 760px) { + padding: 10px 0; + line-height: 2.01; + } +} + +:lang(fa-IR) .headerBlock .tag-li { + display: none; +} + +.headerBlock .page-heroContent, +.headerBlock .page-heroCta, +.headerBlock .page-heroTitle { + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent) !important; +} + +.headerBlock.page-heroBackground--dark .page-heroContent, +.headerBlock.page-heroBackground--dark .page-heroCta, +.headerBlock.page-heroBackground--dark .page-heroTitle { + background-color: var(--wp--preset--color--black); +} + +.headerBlock.page-heroBackground--light .page-heroContent, +.headerBlock.page-heroBackground--light .page-heroCta, +.headerBlock.page-heroBackground--light .page-heroTitle { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.headerBlock.page-heroBackground--none .page-heroContent, +.headerBlock.page-heroBackground--none .page-heroCta, +.headerBlock.page-heroBackground--none .page-heroTitle { + background-color: transparent; + color: var(--wp--preset--color--white); +} diff --git a/private/src/blocks/_deprecated/button/block.json b/private/src/blocks/_deprecated/button/block.json new file mode 100644 index 00000000..5740ac29 --- /dev/null +++ b/private/src/blocks/_deprecated/button/block.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-button", + "title": "Button", + "category": "amnesty-core", + "keywords": ["Button"], + "icon": "megaphone", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "render": "file:./render.php", + "supports": { + "className": true, + "inserter": false, + "multiple": true + }, + "attributes": { + "ctaLink": { + "type":"string" + }, + "ctaText": { + "type":"string" + }, + "style": { + "type": "string" + } + } +} diff --git a/private/src/blocks/_deprecated/button/edit.jsx b/private/src/blocks/_deprecated/button/edit.jsx new file mode 100644 index 00000000..9f240b91 --- /dev/null +++ b/private/src/blocks/_deprecated/button/edit.jsx @@ -0,0 +1,71 @@ +import classnames from 'classnames'; + +import { InspectorControls, RichText, URLInputButton } from '@wordpress/block-editor'; +import { PanelBody, SelectControl } from '@wordpress/components'; +import { Component, Fragment } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/** + * This is the component that renders the edit screen in the panel. + */ +class DisplayComponent extends Component { + /** + * Higher order component that takes the attribute key, + * this then returns a function which takes a value, + * when called it updates the attribute with the key. + * @param key + * @returns {function(*): *} + */ + createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); + + render() { + const { attributes } = this.props; + const { ctaLink, ctaText, style } = attributes; + + return ( + + + + + + + +
+ +
+ +
+ ); + } +} + +export default DisplayComponent; diff --git a/private/src/styles/blocks/button/_editor.scss b/private/src/blocks/_deprecated/button/editor.scss similarity index 100% rename from private/src/styles/blocks/button/_editor.scss rename to private/src/blocks/_deprecated/button/editor.scss diff --git a/private/src/blocks/_deprecated/button/index.js b/private/src/blocks/_deprecated/button/index.js new file mode 100644 index 00000000..5b61ece8 --- /dev/null +++ b/private/src/blocks/_deprecated/button/index.js @@ -0,0 +1,12 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/_deprecated/button/render.php b/private/src/blocks/_deprecated/button/render.php new file mode 100644 index 00000000..9944eacd --- /dev/null +++ b/private/src/blocks/_deprecated/button/render.php @@ -0,0 +1,11 @@ + + + sprintf( 'btn btn--%s', $attributes['style'] ) ] ) ); ?> href=""> + + diff --git a/private/src/blocks/_deprecated/collapsable/block.json b/private/src/blocks/_deprecated/collapsable/block.json new file mode 100644 index 00000000..7822ebb7 --- /dev/null +++ b/private/src/blocks/_deprecated/collapsable/block.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/collapsable", + "title": "Collapsable", + "category": "amnesty-core", + "keywords": ["Collapsible", "accordion", "drawer", "open", "closed"], + "description": "", + "icon": "arrow-down-alt2", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "viewScript": "file:./view.js", + "viewStyle": "file:./style-view.css", + "render": "file:./render.php", + "supports": { + "className": true, + "inserter": false + }, + "attributes": { + "anchor": { + "type": "string", + "default": "" + }, + "collapsed": { + "type": "boolean", + "default": false + }, + "title": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/_deprecated/collapsable/edit.jsx b/private/src/blocks/_deprecated/collapsable/edit.jsx new file mode 100644 index 00000000..dcb731dd --- /dev/null +++ b/private/src/blocks/_deprecated/collapsable/edit.jsx @@ -0,0 +1,86 @@ +import classnames from 'classnames'; + +import { InnerBlocks, InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, PanelRow, TextControl, ToggleControl } from '@wordpress/components'; +import { applyFilters } from '@wordpress/hooks'; +import { __ } from '@wordpress/i18n'; + +const ALLOWED_BLOCKS = applyFilters('amnesty.blocks.collapsable.allowedBlocks', [ + 'amnesty-core/block-call-to-action', + 'amnesty-core/block-download', + 'amnesty-core/block-section', + 'amnesty-core/countdown-timer', + 'amnesty-core/counter', + 'amnesty-core/custom-card', + 'amnesty-core/embed-flourish', + 'amnesty-core/embed-infogram', + 'amnesty-core/embed-sutori', + 'amnesty-core/embed-tickcounter', + 'amnesty-core/quote', + 'amnesty-core/tweet-block', + 'core/buttons', + 'core/embed', + 'core/heading', + 'core/image', + 'core/list', + 'core/paragraph', + 'core/spacer', +]); + +export default function Edit({ attributes, className, setAttributes }) { + const extraProps = { + className: classnames(className, { + 'is-collapsed': attributes.collapsed, + }), + }; + + const blockProps = useBlockProps(extraProps); + + return ( + <> + + {/* translators: [admin] */} + + + + + setAttributes({ anchor })} + /> + + + +
+
+ setAttributes({ title })} + /> + setAttributes({ collapsed: !attributes.collapsed })} + /> +
+
+ +
+
+ + ); +} diff --git a/private/src/blocks/_deprecated/collapsable/editor.scss b/private/src/blocks/_deprecated/collapsable/editor.scss new file mode 100644 index 00000000..41edc94f --- /dev/null +++ b/private/src/blocks/_deprecated/collapsable/editor.scss @@ -0,0 +1,20 @@ +.wp-block-amnesty-core-collapsable figcaption { + position: relative; +} + +.wp-block-amnesty-core-collapsable .dashicon { + position: absolute; + top: 25%; + right: 0; + cursor: pointer; + pointer-events: all; +} + +.wp-block-amnesty-core-collapsable-inner { + border: 1px dashed; + min-height: 70px; +} + +.wp-block-amnesty-core-collapsable.is-collapsed .wp-block-amnesty-core-collapsable-inner { + min-height: unset; +} diff --git a/private/src/blocks/_deprecated/collapsable/index.jsx b/private/src/blocks/_deprecated/collapsable/index.jsx new file mode 100644 index 00000000..d04bf694 --- /dev/null +++ b/private/src/blocks/_deprecated/collapsable/index.jsx @@ -0,0 +1,14 @@ +import './editor.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: assign(() => , { displayName: 'CollapsableBlockSave' }), +}); diff --git a/private/src/blocks/_deprecated/collapsable/render.php b/private/src/blocks/_deprecated/collapsable/render.php new file mode 100644 index 00000000..312d026c --- /dev/null +++ b/private/src/blocks/_deprecated/collapsable/render.php @@ -0,0 +1,18 @@ + +
> +
+

+ +
+
+
diff --git a/private/src/blocks/_deprecated/collapsable/style.scss b/private/src/blocks/_deprecated/collapsable/style.scss new file mode 100644 index 00000000..b0acaf39 --- /dev/null +++ b/private/src/blocks/_deprecated/collapsable/style.scss @@ -0,0 +1,86 @@ +// author styles define this class without scope +.wp-block-amnesty-core-collapsable.is-collapsed { + max-height: unset; + padding: unset; + position: unset; + overflow: unset; + content: unset; +} + +.wp-block-amnesty-core-collapsable.is-collapsed::before { + content: unset; +} + +.wp-block-amnesty-core-collapsable figcaption { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + margin: 0 auto; + padding: var(--wp--preset--spacing--half) 0; + border-bottom: 1px solid var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-collapsable + .wp-block-amnesty-core-collapsable { + margin-top: var(--wp--preset--spacing--half); +} + +.wp-block-amnesty-core-collapsable + .wp-block-amnesty-core-collapsable figcaption { + padding-top: 0; +} + +.wp-block-amnesty-core-collapsable figcaption h2 { + margin: 0 !important; + font-size: var(--wp--preset--font-size--heading-3); +} + +.wp-block-amnesty-core-collapsable .btn--blank { + position: absolute; + right: 0; + display: flex; + align-items: center; + justify-content: center; + border-radius: 0; + width: 32px; + height: 32px; + cursor: pointer; + outline: none; +} + +.wp-block-amnesty-core-collapsable .btn--blank:focus-visible { + border: 1px solid var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-collapsable .icon { + display: block; + pointer-events: none; + transform: rotate(180deg); + transition: transform .3s ease-in-out; +} + +.wp-block-amnesty-core-collapsable .icon-arrow-down { + background-size: 469.5px 450px; + background-position: -406.5px -322.5px; + transform: rotate(180deg); + width: 24px; + height: 24px; +} + +.wp-block-amnesty-core-collapsable.is-collapsed .icon-arrow-down { + transform: rotate(0deg); +} + +.wp-block-amnesty-core-collapsable-inner { + padding-top: var(--wp--preset--spacing--half); + max-height: 2000px; +} + +.wp-block-amnesty-core-collapsable.is-collapsed .wp-block-amnesty-core-collapsable-inner { + padding-top: 0; + max-height: 0; + overflow-y: hidden; +} + +.wp-block-amnesty-core-collapsable-inner > *:last-child { + margin-bottom: 0; +} diff --git a/private/src/blocks/_deprecated/collapsable/view.js b/private/src/blocks/_deprecated/collapsable/view.js new file mode 100644 index 00000000..a4fdfaa8 --- /dev/null +++ b/private/src/blocks/_deprecated/collapsable/view.js @@ -0,0 +1,14 @@ +import './style.scss'; + +const init = (block) => (event) => { + if (event.target.matches('.btn--blank')) { + block.classList.toggle('is-collapsed'); + } +}; + +const collapsableBlock = () => { + const blocks = Array.from(document.getElementsByClassName('wp-block-amnesty-core-collapsable')); + blocks.forEach((block) => block.addEventListener('click', init(block))); +}; + +document.addEventListener('DOMContentLoaded', collapsableBlock); diff --git a/private/src/blocks/_deprecated/columns/block.json b/private/src/blocks/_deprecated/columns/block.json new file mode 100644 index 00000000..e3401a1b --- /dev/null +++ b/private/src/blocks/_deprecated/columns/block.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-row", + "title": "Columns", + "category": "amnesty-core", + "keywords": ["Columns", "Amnesty", "Row", "Content"], + "description": "Columns block", + "icon": "format-image", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "attributes": { + "layout": { + "type": "string", + "default": "1/2|1/2" + } + }, + "supports": { + "inserter": false + } +} diff --git a/private/src/blocks/_deprecated/columns/edit.jsx b/private/src/blocks/_deprecated/columns/edit.jsx new file mode 100644 index 00000000..2a7658bb --- /dev/null +++ b/private/src/blocks/_deprecated/columns/edit.jsx @@ -0,0 +1,57 @@ +import classNames from 'classnames'; +import { times } from 'lodash'; +import { useBlockProps, InnerBlocks, InspectorControls } from '@wordpress/block-editor'; +import { PanelBody, SelectControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +import layouts from './layouts'; + +export default function Edit({ attributes, setAttributes }) { + // Create the update function for attribute change + const createUpdateAttribute = (key) => (value) => setAttributes({ [key]: value }); + + // Generate layout options for the SelectControl + const options = Object.keys(layouts).map((key) => ({ + value: key, + label: layouts[key].name, + })); + + // Default layout key, ensuring it is valid + const layoutKey = attributes.layout && layouts[attributes.layout] ? attributes.layout : '1/2|1/2'; + + // Generate current template based on layout columns + const currentTemplate = layouts[layoutKey] + ? times(layouts[layoutKey].columns, () => ['amnesty-core/block-row-column']) + : []; + + // Block props for styling + const blockProps = useBlockProps({ + className: classNames({ + row: true, + [`layout-${layoutKey}`]: true, + }), + }); + + return ( + <> + + + + + +
+ +
+ + ); +} diff --git a/private/src/blocks/_deprecated/columns/index.jsx b/private/src/blocks/_deprecated/columns/index.jsx new file mode 100644 index 00000000..c74de992 --- /dev/null +++ b/private/src/blocks/_deprecated/columns/index.jsx @@ -0,0 +1,47 @@ +import './style.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { createBlock, registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: assign(() => , { displayName: 'columnsBlock' }), +}); + +const findBlockType = (blocks, type) => { + let found = []; + + // eslint-disable-next-line no-restricted-syntax + for (const block of blocks) { + if (block.name === type) { + found.push(block.clientId); + } + + if (block.innerBlocks.length) { + found = [...found, ...findBlockType(block.innerBlocks, type)]; + } + } + + return found; +}; + +wp.domReady(() => { + const select = wp.data.select('core/block-editor'); + const dispatch = wp.data.dispatch('core/block-editor'); + const allBlocks = select.getBlocks(); + const columnRows = findBlockType(allBlocks, 'amnesty-core/block-row'); + + select.getBlocksByClientId(columnRows).forEach((row) => { + const rowColumns = findBlockType(row.innerBlocks, 'amnesty-core/block-row-column'); + const newColumns = select + .getBlocksByClientId(rowColumns) + .map((column) => createBlock('core/column', {}, column.innerBlocks)); + + dispatch.replaceBlocks([row.clientId], [createBlock('core/columns', {}, newColumns)]); + }); +}); diff --git a/private/src/scripts/editor/blocks-deprecated/columns/layouts.js b/private/src/blocks/_deprecated/columns/layouts.js similarity index 76% rename from private/src/scripts/editor/blocks-deprecated/columns/layouts.js rename to private/src/blocks/_deprecated/columns/layouts.js index efff4138..f7ae6ed6 100644 --- a/private/src/scripts/editor/blocks-deprecated/columns/layouts.js +++ b/private/src/blocks/_deprecated/columns/layouts.js @@ -2,56 +2,56 @@ const { __ } = wp.i18n; export default { '1/2|1/2': { - // translators: [admin] + /* translators: [admin] */ name: __('50% | 50%', 'amnesty'), icon: '', columns: 2, }, '2/3|1/3': { - // translators: [admin] + /* translators: [admin] */ name: __('66.6% | 33.3%', 'amnesty'), icon: '', columns: 2, }, '1/3|2/3': { - // translators: [admin] + /* translators: [admin] */ name: __('33.3% | 66.6%', 'amnesty'), icon: '', columns: 2, }, '1/3|1/3|1/3': { - // translators: [admin] + /* translators: [admin] */ name: __('33.3% | 33.3% | 33.3%', 'amnesty'), icon: '', columns: 3, }, '1/2|1/4|1/4': { - // translators: [admin] + /* translators: [admin] */ name: __('50% | 25% | 25%', 'amnesty'), icon: '', columns: 3, }, '1/4|1/2|1/4': { - // translators: [admin] + /* translators: [admin] */ name: __('25% | 50% | 25%', 'amnesty'), icon: '', columns: 3, }, '1/4|1/4|1/2': { - // translators: [admin] + /* translators: [admin] */ name: __('25% | 25% | 50%', 'amnesty'), icon: '', columns: 3, }, '1/4|1/4|1/4|1/4': { - // translators: [admin] + /* translators: [admin] */ name: __('25% | 25% | 25% | 25%', 'amnesty'), icon: '', columns: 4, diff --git a/private/src/blocks/_deprecated/columns/render.php b/private/src/blocks/_deprecated/columns/render.php new file mode 100644 index 00000000..af921620 --- /dev/null +++ b/private/src/blocks/_deprecated/columns/render.php @@ -0,0 +1,5 @@ +
sprintf( 'row layout-%s', $attributes['layout'] ) ] ) ); ?>> +
+ +
+
diff --git a/private/src/blocks/_deprecated/columns/style.scss b/private/src/blocks/_deprecated/columns/style.scss new file mode 100644 index 00000000..b061029c --- /dev/null +++ b/private/src/blocks/_deprecated/columns/style.scss @@ -0,0 +1,71 @@ +// Mixin for defining the grid layout based on columns +@mixin grid-layout($columns) { + display: grid; + grid-template-columns: repeat($columns, 1fr); // Default for equal widths +} + +.wp-block-amnesty-core-block-row { + min-height: 200px; + position: relative; + overflow: hidden; // Prevent child elements from overflowing +} + +.layout-1\/2\|1\/2.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(2); + grid-template-columns: 50% 50%; +} + +.layout-2\/3\|1\/3.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(2); + grid-template-columns: 66.6% 33.3%; +} + +.layout-1\/3\|2\/3.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(2); + grid-template-columns: 33.3% 66.6%; +} + +.layout-1\/3\|1\/3\|1\/3.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(3); + grid-template-columns: 33.3% 33.3% 33.3%; +} + +.layout-1\/2\|1\/4\|1\/4.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(3); + grid-template-columns: 50% 25% 25%; +} + +.layout-1\/4\|1\/2\|1\/4.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(3); + grid-template-columns: 25% 50% 25%; +} + +.layout-1\/4\|1\/4\|1\/2.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(3); + grid-template-columns: 25% 25% 50%; +} + +.layout-1\/4\|1\/4\|1\/4\|1\/4.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @include grid-layout(4); + grid-template-columns: 25% 25% 25% 25%; +} + +.wp-block-amnesty-core-block-row .block-editor-block-list__layout { + @media all and (max-width: 760px) { + display: flex !important; + flex-direction: column; + } +} + +.rowColumn { + margin: 10px; + min-height: 100px; + display: flex; +} + +.rowColumn .block-editor-block-list__layout { + display: flex !important; + flex-direction: column; + justify-content: center; + align-items: center; +} diff --git a/private/src/blocks/_deprecated/custom-card/block.json b/private/src/blocks/_deprecated/custom-card/block.json new file mode 100644 index 00000000..eb0bd488 --- /dev/null +++ b/private/src/blocks/_deprecated/custom-card/block.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/custom-card", + "title": "Custom Card", + "category": "amnesty-core", + "description": "Customisable card block", + "icon": "megaphone", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": false, + "align": true, + "inserter": false + }, + "attributes": { + "style": { + "type": "string", + "default": "standard" + }, + "centred": { + "type": "boolean", + "default": false + }, + "label": { + "type": "string", + "default": "" + }, + "content": { + "type": "string", + "default": "" + }, + "imageID": { + "type": "integer", + "default": 0 + }, + "imageURL": { + "type": "string", + "default": "" + }, + "imageAlt": { + "type": "string", + "default": "" + }, + "link": { + "type": "string", + "default": "" + }, + "scrollLink": { + "type": "string", + "default": "" + }, + "linkText": { + "type": "string", + "default": "" + }, + "largeImageURL": { + "type": "string", + "default": "" + } + }, + "styles": [ + { + "name": "style-1", + "label": "Style 1", + "isDefault": true + }, + { + "name": "style-1", + "label": "Style 1", + "isDefault": false + }, + { + "name": "style-1", + "label": "Style 1", + "isDefault": false + } + ] +} diff --git a/private/src/scripts/editor/blocks-deprecated/custom-card/deprecated.jsx b/private/src/blocks/_deprecated/custom-card/deprecated.jsx similarity index 100% rename from private/src/scripts/editor/blocks-deprecated/custom-card/deprecated.jsx rename to private/src/blocks/_deprecated/custom-card/deprecated.jsx diff --git a/private/src/blocks/_deprecated/custom-card/edit.jsx b/private/src/blocks/_deprecated/custom-card/edit.jsx new file mode 100644 index 00000000..99ca277d --- /dev/null +++ b/private/src/blocks/_deprecated/custom-card/edit.jsx @@ -0,0 +1,121 @@ +import classnames from 'classnames'; + +import { InspectorControls, MediaUpload, PlainText, URLInputButton } from '@wordpress/block-editor'; +import { IconButton, PanelBody, SelectControl, TextControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +const setURL = (image) => { + if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'large')) { + return image.url; + } + + return image.sizes.large.url; +}; + +const setLargeURL = (image) => { + if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'action-wide@2x')) { + return image.url; + } + + return image.sizes['action-wide@2x'].url; +}; + +export default function Edit({ attributes, className, setAttributes }) { + const classes = classnames('customCard', className, { + 'customCard--wide': attributes.style === 'wide', + 'is-centred': attributes.centred, + }); + + const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); + + return ( + <> + + + setAttributes({ style })} + options={[ + /* translators: [admin] */ + { value: 'standard', label: __('Standard', 'amnesty') }, + /* translators: [admin] */ + { value: 'wide', label: __('Wide', 'amnesty') }, + ]} + /> + setAttributes({ scrollLink })} + /> + + +
+ setAttributes({ label })} + /> + <div className="customCard-figure"> + <div className="linkList-options"> + {attributes.imageID ? ( + <IconButton + icon="no-alt" + /* translators: [admin] */ + label={__('Remove Image', 'amnesty')} + onClick={() => setAttributes({ imageID: 0, imageURL: '', imageAlt: '' })} + /> + ) : ( + <MediaUpload + allowedTypes={['image']} + value={attributes.imageID} + onSelect={(media) => + setAttributes({ + imageID: media.id, + imageURL: setURL(media), + largeImageURL: setLargeURL(media), + imageAlt: media.alt, + }) + } + render={({ open }) => <IconButton icon="format-image" onClick={open} />} + /> + )} + </div> + {attributes.style === 'wide' && ( + <img + className="customCard-image" + src={attributes.largeImageURL} + alt={attributes.imageAlt} + /> + )} + {attributes.style === 'standard' && ( + <img className="customCard-image" src={attributes.imageURL} alt={attributes.imageAlt} /> + )} + </div> + <figcaption className="customCard-content"> + <PlainText + /* translators: [admin] */ + placeholder={__('Content', 'amnesty')} + rows="3" + value={attributes.content} + onChange={(content) => setAttributes({ content })} + /> + <PlainText + className={buttonClasses} + /* translators: [admin] */ + placeholder={__('Button Text', 'amnesty')} + rows="1" + value={attributes.linkText} + onChange={(linkText) => setAttributes({ linkText })} + /> + <URLInputButton url={attributes.link} onChange={(link) => setAttributes({ link })} /> + </figcaption> + </figure> + </> + ); +} diff --git a/private/src/blocks/_deprecated/custom-card/editor.scss b/private/src/blocks/_deprecated/custom-card/editor.scss new file mode 100644 index 00000000..a10f45ec --- /dev/null +++ b/private/src/blocks/_deprecated/custom-card/editor.scss @@ -0,0 +1,37 @@ +.customCard textarea.customCard-label { + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--black)-mid-dark; +} + +.customCard-content textarea { + text-align: center; + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--black)-mid-dark; +} + +.customCard-content .btn { + color: var(--wp--preset--color--black)-mid-dark; + background-color: var(--wp--preset--color--primary); +} + +.is-style-style-2 textarea.customCard-label, +.is-style-style-2 .customCard-content textarea { + background-color: var(--wp--preset--color--black)-x-dark; + color: var(--wp--preset--color--white); +} + +.is-style-style-2 .customCard-content .btn { + color: var(--wp--preset--color--black)-mid-dark; + background-color: var(--wp--preset--color--primary); +} + +.is-style-style-3 textarea.customCard-label, +.is-style-style-3 .customCard-content textarea { + background-color: var(--wp--preset--color--primary); + color: var(--wp--preset--color--black)-mid-dark; +} + +.is-style-style-3 .customCard-content .btn { + color: var(--wp--preset--color--white); + background-color: var(--wp--preset--color--black)-x-dark; +} diff --git a/private/src/blocks/_deprecated/custom-card/index.js b/private/src/blocks/_deprecated/custom-card/index.js new file mode 100644 index 00000000..bbabe72c --- /dev/null +++ b/private/src/blocks/_deprecated/custom-card/index.js @@ -0,0 +1,15 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/_deprecated/custom-card/render.php b/private/src/blocks/_deprecated/custom-card/render.php new file mode 100644 index 00000000..b0bd0b1c --- /dev/null +++ b/private/src/blocks/_deprecated/custom-card/render.php @@ -0,0 +1,32 @@ +<?php + +// phpcs:disable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned +$block_classes = classnames( + 'customCard', + $attributes['className'], + [ + sprintf( 'align%s', $attributes['align'] ) => (bool) $attributes['align'], + 'actionBlock--wide' => 'wide' === $attributes['style'], + 'is-centred' => (bool) $attributes['centred'], + ] +); +// phpcs:enable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned + +$button_classes = classnames( 'btn', 'btn--fill', 'btn--large' ); + +$image_size = 'post-half'; +if ( 'wide' === $attributes['style'] ) { + $image_size = 'action-wide'; +} + +?> +<figure class="<?php echo esc_attr( $block_classes ); ?>"> + <span class="customCard-label"><?php echo esc_html( $attributes['label'] ); ?></span> + <div class="customCard-figure"> + <?php echo wp_get_attachment_image( absint( $attributes['imageID'] ), $image_size, false, [ 'class' => 'customCard-image aiic-ignore' ] ); ?> + </div> + <figcaption class="customCard-content"> + <p><?php echo esc_html( $attributes['content'] ); ?></p> + <a class="btn btn--fill btn--large" href="<?php echo esc_url( $attributes['scrollLink'] ?: $attributes['link'] ); ?>"><?php echo esc_html( $attributes['linkText'] ); ?></a> + </figcaption> +</figure> diff --git a/private/src/blocks/_deprecated/custom-card/style.scss b/private/src/blocks/_deprecated/custom-card/style.scss new file mode 100644 index 00000000..e120bf19 --- /dev/null +++ b/private/src/blocks/_deprecated/custom-card/style.scss @@ -0,0 +1,97 @@ +.customCard { + position: relative; + margin: 0; + width: 350px !important; + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + background-color: var(--wp--preset--color--grey-lighter); + display: flex; + flex-direction: column; + height: 100%; +} + +.customCard.is-centred { + margin-right: auto; + margin-left: auto; +} + +.customCard.customCard--wide, +.customCard.actionBlock--wide { + width: 480px !important; + max-width: 100%; +} + +.customCard-figure { + position: relative; + height: 230px; + overflow: hidden; +} + +.customCard-image { + display: block; + width: 100%; + height: 100%; + object-fit: cover; + background-color: rgba(var(--wp--preset--color--black), .25); +} + +.customCard-image img { + object-fit: cover; + width: 100%; + height: 100%; +} + +.customCard-label { + display: block; + text-align: center; + padding: 8px; + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--black)-mid-dark; + font-size: 24px; + text-transform: uppercase; +} + +.customCard-content { + text-align: center; + font-weight: normal; + font-family: var(--wp--preset--font-family--primary); + padding: 10px; + font-size: 16px; + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--black)-mid-dark; + margin-top: auto; +} + +.customCard.aligncenter { + display: flex; + margin-right: auto; + margin-left: auto; +} + +.customCard.is-style-style-2 { + background-color: var(--wp--preset--color--black)-x-dark; +} + +.customCard.is-style-style-3 { + background-color: var(--wp--preset--color--primary); +} + +.is-style-style-2 .customCard-label, +.is-style-style-2 .customCard-content, +.is-style-style-2 .customCard { + background-color: var(--wp--preset--color--black)-x-dark; + color: var(--wp--preset--color--white); +} + +.is-style-style-3 .customCard-label, +.is-style-style-3 .customCard-content, +.is-style-style-3 .customCard { + background-color: var(--wp--preset--color--primary); + color: var(--wp--preset--color--black)-mid-dark; +} + +.is-style-style-3 .btn, +.is-style-style-3 .customCard { + background-color: var(--wp--preset--color--black)-x-dark; + color: var(--wp--preset--color--white); +} diff --git a/private/src/blocks/_deprecated/header/block.json b/private/src/blocks/_deprecated/header/block.json new file mode 100644 index 00000000..1e41b89f --- /dev/null +++ b/private/src/blocks/_deprecated/header/block.json @@ -0,0 +1,86 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-hero", + "title": "Header", + "category": "amnesty-core", + "keywords": ["Header", "amnesty"], + "description": "A Header block", + "icon": "format-image", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "multiple": false, + "inserter": true + }, + "attributes": { + "title": { + "type": "string", + "source": "meta", + "meta": "_hero_title" + }, + "content": { + "type": "string", + "source": "meta", + "meta": "_hero_content" + }, + "ctaLink": { + "type": "string", + "source": "meta", + "meta": "_hero_cta_link" + }, + "ctaText": { + "type": "string", + "source": "meta", + "meta": "_hero_cta_text" + }, + "alignment": { + "type": "string", + "source": "meta", + "meta": "_hero_alignment" + }, + "background": { + "type": "string", + "source": "meta", + "meta": "_hero_background", + "default": "dark" + }, + "hideImageCaption": { + "type": "boolean", + "source": "meta", + "meta": "_hero_hide_image_caption", + "default": true + }, + "hideImageCopyright": { + "type": "boolean", + "source": "meta", + "meta": "_hero_hide_image_copyright", + "default": false + }, + "size": { + "type": "string", + "source": "meta", + "meta": "_hero_size", + "default": "small" + }, + "type": { + "type": "string", + "source": "meta", + "meta": "_hero_type" + }, + "embed": { + "type": "string", + "source": "meta", + "meta": "_hero_embed" + }, + "featuredVideoId": { + "type": "string", + "source": "meta", + "meta": "_hero_video_id" + } + }, + "usesContext": ["postId", "postType"] +} diff --git a/wp-content/themes/humanity-theme/includes/blocks/_deprecated/header/class-header-block-renderer.php b/private/src/blocks/_deprecated/header/class-header-block-renderer.php similarity index 98% rename from wp-content/themes/humanity-theme/includes/blocks/_deprecated/header/class-header-block-renderer.php rename to private/src/blocks/_deprecated/header/class-header-block-renderer.php index 31ad2acb..a2e095cc 100644 --- a/wp-content/themes/humanity-theme/includes/blocks/_deprecated/header/class-header-block-renderer.php +++ b/private/src/blocks/_deprecated/header/class-header-block-renderer.php @@ -20,6 +20,12 @@ * @return string */ function amnesty_render_header_block( array $attributes = [], string $content = '' ): string { + if ( ! isset( $attributes['imageID'] ) ) { + return ''; + } + + wp_enqueue_style( 'amnesty-header-style' ); + $renderer = new Header_Block_Renderer( $attributes, $content ); return $renderer->render(); } diff --git a/private/src/blocks/_deprecated/header/edit.jsx b/private/src/blocks/_deprecated/header/edit.jsx new file mode 100644 index 00000000..54386209 --- /dev/null +++ b/private/src/blocks/_deprecated/header/edit.jsx @@ -0,0 +1,314 @@ +import classnames from 'classnames'; +import { InnerBlocks, InspectorControls, RichText, URLInputButton } from '@wordpress/block-editor'; +import { PanelBody, SelectControl, withFilters } from '@wordpress/components'; +import { compose } from '@wordpress/compose'; +import { select } from '@wordpress/data'; +import { PostFeaturedImage } from '@wordpress/editor'; +import { Component, Fragment } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { addQueryArgs } from '@wordpress/url'; + +import MediaMetadata from '../../../components/MediaMetadata.jsx'; +import MediaMetadataVisibilityControls from '../../../components/MediaMetadataVisibilityControls.jsx'; +import PostFeaturedVideo from '../../../components/PostFeaturedVideo.jsx'; + +class DisplayComponent extends Component { + state = { + imageData: null, + videoData: null, + featuredImageId: 0, + hasInnerBlock: false, + }; + + constructor(props) { + super(props); + + const { + clientId, + context: { postId, postType }, + } = this.props; + + const post = select('core').getEntityRecord('postType', postType, postId); + const blocks = select('core/block-editor').getBlocks(clientId); + + if (post?.featured_media) { + this.state.featuredImageId = post.featured_media; + } + + if (blocks?.length > 0) { + this.state.hasInnerBlock = true; + } + } + + fetchMediaMetadata = (id, type) => { + const key = `${type}Data`; + const cached = this.state[key]?.id; + + if (id === 0) { + if (cached) { + this.setState({ [key]: null }); + } + return; + } + + if (cached && cached === id) { + return; + } + + const path = addQueryArgs(`/wp/v2/media/${id}`, { + context: 'edit', + _fields: 'id,source_url,caption,description', + }); + + wp.apiRequest({ path }).then((resp) => { + this.setState({ + [key]: { + id: resp.id, + url: resp.source_url, + caption: resp.caption.raw, + description: resp.description.raw, + }, + }); + }); + }; + + componentDidMount() { + const { featuredImageId } = this.state; + const { type, featuredVideoId } = this.props.attributes; + + if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { + this.fetchMediaMetadata(featuredVideoId, 'video'); + } + + if (type !== 'video' && featuredImageId && this.state.imageData?.id !== featuredImageId) { + this.fetchMediaMetadata(featuredImageId, 'image'); + } + } + + componentDidUpdate(prevProps) { + const { featuredImageId } = this.state; + const { type, featuredVideoId } = this.props.attributes; + + if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { + this.fetchMediaMetadata(featuredVideoId, 'video'); + } + + if ( + type !== 'video' && + (featuredImageId !== prevProps.featuredImageId || + this.state.imageData?.id !== featuredImageId) + ) { + this.fetchMediaMetadata(featuredImageId, 'image'); + } + } + + /** + * Higher order component that takes the attribute key, + * this then returns a function which takes a value, + * when called it updates the attribute with the key. + * @param key + * @returns {function(*): *} + */ + createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); + + render() { + const { attributes = {}, setAttributes } = this.props; + + let { type } = attributes; + if (!type) { + type = 'image'; + } + + const classes = classnames('page-hero', { + 'page-heroSize--full': attributes.size === 'large', + 'page-heroBackground--transparent': !attributes.background, + 'page-heroAlignment--left': !attributes.alignment, + [`page-heroSize--${attributes.size}`]: attributes.size, + [`page-heroBackground--${attributes.background || 'dark'}`]: attributes.background || true, + [`page-heroAlignment--${attributes.alignment}`]: attributes.alignment || false, + 'page-hero--video': type === 'video', + }); + + const contentClasses = classnames('hero-content', { + 'has-donation-block': this.state.hasInnerBlock, + }); + + const sectionStyles = {}; + if (type === 'image' && this.state.imageData?.url) { + sectionStyles.backgroundImage = `url("${this.state.imageData.url}")`; + } + + const caption = this.state[`${type}Data`]?.caption; + const copyright = this.state[`${type}Data`]?.description; + + return ( + <Fragment> + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + <SelectControl + /* translators: [admin] */ + label={__('Alignment', 'amnesty')} + options={[ + { + /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ + label: __('Left', 'amnesty'), + value: 'left', + }, + { + /* translators: [admin] text alignment. */ + label: __('Centre', 'amnesty'), + value: 'center', + }, + { + /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ + label: __('Right', 'amnesty'), + value: 'right', + }, + ]} + value={attributes.alignment} + onChange={this.createUpdateAttribute('alignment')} + /> + <SelectControl + /* translators: [admin] */ + label={__('Background Colour', 'amnesty')} + options={[ + { + /* translators: [admin] */ + label: __('White', 'amnesty'), + value: 'light', + }, + { + /* translators: [admin] */ + label: __('Black', 'amnesty'), + value: 'dark', + }, + ]} + value={attributes.background || 'dark'} + onChange={this.createUpdateAttribute('background')} + /> + <SelectControl + /* translators: [admin] */ + label={__('Size', 'amnesty')} + options={[ + { + /* translators: [admin] */ + label: __('Normal', 'amnesty'), + value: 'small', + }, + { + /* translators: [admin] */ + label: __('Large', 'amnesty'), + value: 'large', + }, + ]} + value={attributes.size} + onChange={this.createUpdateAttribute('size')} + /> + + <SelectControl + /* translators: [admin] */ + label={__('Background Type', 'amnesty')} + options={[ + { + /* translators: [admin] */ + label: __('Image', 'amnesty'), + value: '', + }, + { + /* translators: [admin] */ + label: __('Video', 'amnesty'), + value: 'video', + }, + ]} + value={attributes.type} + onChange={this.createUpdateAttribute('type')} + /> + <MediaMetadataVisibilityControls + type={attributes.type} + hideCaption={attributes.hideImageCaption} + hideCopyright={attributes.hideImageCopyright} + setAttributes={setAttributes} + /> + </PanelBody> + <PanelBody + title={ + attributes.type === 'video' + ? /* translators: [admin] */ + __('Background Image', 'amnesty') + : /* translators: [admin] */ + __('Featured Image', 'amnesty') + } + > + <PostFeaturedImage /> + </PanelBody> + {attributes.type === 'video' && ( + <PanelBody title={/* translators: [admin] */ __('Featured Video', 'amnesty')}> + <PostFeaturedVideo + featuredVideoId={attributes.featuredVideoId} + onUpdate={this.createUpdateAttribute('featuredVideoId')} + /> + </PanelBody> + )} + </InspectorControls> + <section className={classes} style={sectionStyles}> + {this.state.videoData?.url && ( + <div className="page-heroVideoContainer"> + <video className="page-heroVideo"> + <source src={this.state.videoData.url} /> + </video> + </div> + )} + <div className="container"> + <div className={contentClasses}> + <h1> + <RichText + tagName="span" + className="page-heroTitle" + value={attributes.title} + /* translators: [admin] */ + placeholder={__('(Header Title)', 'amnesty')} + format="string" + onChange={this.createUpdateAttribute('title')} + /> + </h1> + <RichText + tagName="p" + className="page-heroContent" + value={attributes.content} + /* translators: [admin] */ + placeholder={__('(Header Content)', 'amnesty')} + format="string" + onChange={this.createUpdateAttribute('content')} + /> + <div className="page-heroCta"> + <div className="btn btn--large"> + {attributes.embed && <i className="play-icon"></i>} + <RichText + tagName="span" + value={attributes.ctaText} + /* translators: [admin] */ + placeholder={__('(Call to action)', 'amnesty')} + format="string" + onChange={this.createUpdateAttribute('ctaText')} + /> + <URLInputButton + url={attributes.ctaLink} + onChange={this.createUpdateAttribute('ctaLink')} + /> + </div> + </div> + </div> + <InnerBlocks allowedBlocks={['amnesty-wc/donation']} orientation="horizontal" /> + </div> + <MediaMetadata + media={{ caption, copyright }} + showMediaCaption={!attributes.hideImageCaption} + showMediaCopyright={!attributes.hideImageCopyright} + /> + </section> + </Fragment> + ); + } +} + +export default compose(withFilters('editor.PostFeaturedImage'))(DisplayComponent); diff --git a/private/src/blocks/_deprecated/header/editor.scss b/private/src/blocks/_deprecated/header/editor.scss new file mode 100644 index 00000000..95452485 --- /dev/null +++ b/private/src/blocks/_deprecated/header/editor.scss @@ -0,0 +1,192 @@ +[data-type="amnesty-core/block-hero"] { + max-width: 100% !important; + width: 100% !important; +} + +.headerBlock { + padding-top: 111px; + padding-bottom: 80px; + min-height: 450px; + background-size: cover; + background-position: center center; + color: var(--wp--preset--color--white); + +} + +.headerBlock + .components-base-control { + display: none; +} + +.page-heroTitle { + margin: 0; + padding: 0 20px; + font-size: var(--wp--preset--font-size--heading-1); + line-height: 1.3 !important; + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + color: var(--wp--preset--color--white); + box-decoration-break: clone; +} + +p.page-heroContent { + margin-top: 0; + margin-bottom: 0; + padding: 10px 20px; + max-width: 460px; + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--heading-5); + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + color: var(--wp--preset--color--white); +} + +.page-heroCta { + position: relative; + display: inline-flex; + align-items: center; + padding: 20px; + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + + .editor-url-input__button { + position: relative; + transform: translateX(50%); + + .rtl & { + transform: translateX(-50%); + } + } + + .editor-url-input__button-modal { + position: absolute; + left: 0; + width: 340px; + } + + .page-heroAlignment--right & .editor-url-input__button-modal { + left: initial; + right: 0; + } + + .page-heroAlignment--center & .editor-url-input__button-modal { + left: initial; + right: calc(50% - 170px); + } +} + +.page-heroSize--small { + min-height: 450px; +} + +.page-heroSize--large { + min-height: 710px; +} + +.page-heroBackground--dark .page-heroContent, +.page-heroBackground--dark .page-heroCta, +.page-heroBackground--dark .page-heroTitle { + background-color: var(--wp--preset--color--black); +} + +.page-heroBackground--light .page-heroContent, +.page-heroBackground--light .page-heroCta, +.page-heroBackground--light .page-heroTitle { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.page-heroBackground--none .page-heroContent, +.page-heroBackground--none .page-heroCta, +.page-heroBackground--none .page-heroTitle { + background-color: transparent; + color: var(--wp--preset--color--white); +} + +.headerBlock .container { + width: 100%; + max-width: var(--wp--style--global--content-size); + margin: 0 auto; + + .hero-content { + max-width: 840px; + } +} + +.page-heroAlignment--center .hero-content { + text-align: center; + max-width: 840px; +} + +.page-heroAlignment--center .page-heroContent { + margin: 0 auto; +} + +.page-heroAlignment--center .page-heroTitle.editor-rich-text__tinymce.mce-content-body { + left: 0; +} + +.editor-rich-text__tinymce + .editor-rich-text__tinymce { + background-color: transparent; +} + +.page-heroAlignment--right .hero-content { + margin-left: auto; + text-align: right; + max-width: 840px; + + .rtl & { + margin-left: 0; + margin-right: auto; + text-align: left; + } +} + +.page-heroAlignment--right .page-heroContent { + margin-left: auto; + text-align: right; + + .rtl & { + margin-left: 0; + margin-right: auto; + } +} + +.page-heroAlignment--left .page-heroContent.mce-content-body { + left: 0; + + .rtl & { + right: 0; + } +} + +.page-heroAlignment--right .page-heroContent.mce-content-body { + right: 0; + + .rtl & { + left: 0; + } +} + +.page-heroAlignment--center .page-heroContent.mce-content-body:not(:last-child) { + left: 50%; + transform: translateX(-50%); + margin: 0; +} + +.page-heroAlignment--right .editor-rich-text__tinymce[data-is-placeholder-visible="true"] { + right: 0; +} + +.page-heroCta .editor-rich-text__tinymce.mce-content-body { + line-height: 1; +} + +.page-heroCta .btn { + display: flex; + align-items: center; +} + +.page-heroAlignment--center .has-donation-block .page-heroContent { + margin: 0; +} + +.page-heroAlignment--center .hero-content.has-donation-block { + text-align: left; +} diff --git a/private/src/blocks/_deprecated/header/index.jsx b/private/src/blocks/_deprecated/header/index.jsx new file mode 100644 index 00000000..f8315895 --- /dev/null +++ b/private/src/blocks/_deprecated/header/index.jsx @@ -0,0 +1,40 @@ +import './style.scss'; +import './editor.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { createBlock, registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'HeaderBlockSave' }), + + transforms: { + from: [ + { + type: 'block', + isMultiBlock: false, + blocks: ['amnesty-core/header'], + transform: (attributes) => createBlock('amnesty-core/block-hero', attributes), + }, + ], + to: [ + { + type: 'block', + isMultiBlock: false, + blocks: ['amnesty-core/header'], + transform: (attributes) => createBlock('amnesty-core/header', attributes), + }, + { + type: 'block', + isMultiBlock: true, + blocks: ['amnesty-core/hero'], + transform: (attributes) => createBlock('amnesty-core/hero', attributes), + }, + ], + }, +}); diff --git a/private/src/blocks/_deprecated/header/render.php b/private/src/blocks/_deprecated/header/render.php new file mode 100644 index 00000000..edf9aed7 --- /dev/null +++ b/private/src/blocks/_deprecated/header/render.php @@ -0,0 +1,4 @@ +<?php + +// use the amnesty_render_header_block function to render the header block +echo wp_kses_post( \Amnesty\Blocks\amnesty_render_header_block( $attributes, $content ) ); diff --git a/private/src/blocks/_deprecated/header/style.scss b/private/src/blocks/_deprecated/header/style.scss new file mode 100644 index 00000000..cc2222a2 --- /dev/null +++ b/private/src/blocks/_deprecated/header/style.scss @@ -0,0 +1,235 @@ +.headerBlock { + position: relative; + padding-top: 111px; + padding-bottom: 110px; + background-size: cover; + background-position: center center; + color: var(--wp--preset--color--white); + max-width: 1468px; + margin: 0 auto; + width: 100%; + + @media all and (min-width: 760px) { + padding-bottom: 80px; + min-height: 450px; + max-height: none; + height: auto; + } +} + +.headerBlock .container { + padding: 0 spacing(); // @TODO: fix +} + +.headerBlock .container .hero-content > * { + margin-bottom: 12px; +} + +.headerBlock.page-heroAlignment--left .container .hero-content > * { + margin-left: 0; + margin-right: auto; +} + +.headerBlock.page-heroAlignment--center .container .hero-content { + max-width: none !important; +} + +.headerBlock.page-heroAlignment--center .container .hero-content > * { + margin-left: auto; + margin-right: auto; +} + +.headerBlock.page-heroAlignment--right .container .hero-content > * { + margin-left: auto; + margin-right: 0; +} + +.headerBlock:has(+ main) { + margin-bottom: var(--wp--preset--spacing--double); +} + +.page-heroTitle { + max-width: 840px; + margin: 0; + padding: 0 16px; + font-size: var(--wp--preset--font-size--heading-1); + line-height: 1.2; + text-transform: uppercase; + + @media all and (min-width: 465px) { + padding: 0 20px; + } +} + +.page-heroTitle span { + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + color: var(--wp--preset--color--white); + box-shadow: 20px 0 0 color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent), -20px 0 0 color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + box-decoration-break: clone; +} + +p.page-heroContent { + display: table; + margin-bottom: 0; + padding: 10px 16px; + max-width: 460px; + font-size: var(--wp--preset--font-size--regular); + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + font-family: var(--wp--preset--font-family--secondary); + + @media all and (min-width: 465px) { + padding: 10px 20px; + } +} + +.page-heroContent a { + color: inherit; + text-decoration: underline; +} + +.page-heroCta { + display: inline-block; + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + padding: 16px; + + .btn { + font-size: var(--wp--preset--font-size--heading-5); + padding: 10px 14px; + font-family: var(--wp--preset--font-family--secondary); + + @media all and (min-width: 465px) { + padding: 11px 20px; + } + } + + @media all and (min-width: 465px) { + padding: 20px; + } +} + +.page-heroSize--small { + @media all and (min-width: 760px) { + min-height: 450px; + } +} + +.page-heroSize--large { + @media all and (min-width: 760px) { + min-height: 710px; + } +} + +.page-heroBackground--dark .page-heroContent, +.page-heroBackground--dark .page-heroCta, +.page-heroBackground--dark .page-heroTitle span { + background-color: var(--wp--preset--color--black); +} + +.page-heroBackground--dark .page-heroTitle span { + box-shadow: 16px 0 0 var(--wp--preset--color--black), -16px 0 0 var(--wp--preset--color--black); + + @media all and (min-width: 465px) { + box-shadow: 20px 0 0 var(--wp--preset--color--black), -20px 0 0 var(--wp--preset--color--black); + } +} + +.page-heroBackground--light .page-heroContent, +.page-heroBackground--light .page-heroCta, +.page-heroBackground--light .page-heroTitle span { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.page-heroBackground--light .page-heroTitle span { + box-shadow: 16px 0 0 var(--wp--preset--color--white), -16px 0 0 var(--wp--preset--color--white); + + @media all and (min-width: 465px) { + box-shadow: 20px 0 0 var(--wp--preset--color--white), -20px 0 0 var(--wp--preset--color--white); + } +} + +.page-heroBackground--light .btn { + border-color: var(--wp--preset--color--black); + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + + &:hover, + &:focus { + background-color: color-mix(in srgb, var(--wp--preset--color--black) 80%, transparent); + color: var(--wp--preset--color--white); + } +} + +.page-heroBackground--none .page-heroContent, +.page-heroBackground--none .page-heroCta, +.page-heroBackground--none .page-heroTitle, +.page-heroBackground--none .page-heroTitle span { + padding-left: 0; + padding-right: 0; + color: var(--wp--preset--color--white); + background-color: transparent; +} + +.page-heroBackground--none .page-heroTitle span { + box-shadow: none; +} + +.page-hero--video { + position: relative; + z-index: 0; +} + +.page-heroVideoContainer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: -1; +} + +.page-heroVideo { + position: absolute; + top: 50%; + left: 50%; + display: none; + min-width: 100%; + min-height: 100%; + transform: translate(-50%, -50%); + object-fit: cover; + + @media all and (min-width: 760px) { + display: block; + } +} + +.play-icon { + display: inline-block; + width: 0; + height: 0; + margin-right: 12px; + border-style: solid; + border-width: 10px 0 10px 18px; + border-color: transparent transparent transparent var(--wp--preset--color--black); + text-indent: -1000vw; + overflow: hidden; +} + +.page-heroBackground--light .play-icon { + border-color: transparent transparent transparent var(--wp--preset--color--white); +} + +.headerBlock + main .article-container { + padding-top: 0; +} + +.rtl .headerBlock.page-heroAlignment--left .container .hero-content > * { + margin-left: auto; + margin-right: 0; +} + +.rtl .headerBlock.page-heroAlignment--right .container .hero-content > * { + margin-left: 0; + margin-right: auto; +} diff --git a/private/src/blocks/_deprecated/image/block.json b/private/src/blocks/_deprecated/image/block.json new file mode 100644 index 00000000..e5cb6174 --- /dev/null +++ b/private/src/blocks/_deprecated/image/block.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/image-block", + "title": "Image Block", + "category": "amnesty-core", + "description": "Add a flexible image block with optional overlay", + "icon": "format-image", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "inserter": true + }, + "attributes": { + "type": { + "type": "string" + }, + "style": { + "type": "string" + }, + "align": { + "type": "string" + }, + "hasOverlay": { + "type": "boolean" + }, + "parallax": { + "type": "boolean" + }, + "identifier": { + "type": "string", + "source": "attribute", + "selector": ".imageBlock", + "attribute": "class" + }, + "imageID": { + "type": "integer" + }, + "imageURL": { + "type": "string" + }, + "videoID": { + "type": "integer" + }, + "videoURL": { + "type": "string" + }, + "title": { + "type": "string" + }, + "content": { + "type": "string" + }, + "buttons": { + "type": "array", + "default": [] + }, + "caption": { + "type": "string" + } + } +} diff --git a/private/src/blocks/_deprecated/image/deprecated.jsx b/private/src/blocks/_deprecated/image/deprecated.jsx new file mode 100644 index 00000000..e60659cd --- /dev/null +++ b/private/src/blocks/_deprecated/image/deprecated.jsx @@ -0,0 +1,301 @@ +import classnames from 'classnames'; +import { RichText } from '@wordpress/block-editor'; + +import { uniqueId } from './utils'; + +const blockAttributes = { + type: { + type: 'string', + }, + style: { + type: 'string', + }, + align: { + type: 'string', + }, + hasOverlay: { + type: 'boolean', + }, + parallax: { + type: 'boolean', + }, + identifier: { + type: 'string', + source: 'attribute', + selector: '.imageBlock', + attribute: 'class', + }, + + imageID: { + type: 'integer', + }, + imageURL: { + type: 'string', + }, + + videoID: { + type: 'integer', + }, + videoURL: { + type: 'string', + }, + + title: { + type: 'string', + }, + content: { + type: 'string', + }, + buttons: { + type: 'array', + default: [], + }, + caption: { + type: 'string', + }, +}; + +const v2 = { + attributes: blockAttributes, + save({ attributes }) { + const { + type = '', + style = 'loose', + hasOverlay = false, + parallax = false, + align = 'default', + + imageURL = '', + videoURL = '', + + title, + content, + caption, + buttons = [], + } = attributes; + + let identifier; + if (attributes.identifier) { + // pull existing id from outer div instead of generating it. + identifier = attributes.identifier + .replace(/imageBlock\s+imageBlock-([0-9a-zA-Z]*?)\s+(?:has-parallax)?/, '$1') + .trim(); + } + + if (!identifier) { + identifier = uniqueId(); + } + + const classes = classnames('imageBlock', { + [`imageBlock-${identifier}`]: parallax, + 'imageBlock--fixed': style === 'fixed', + 'has-video': type === 'video', + 'has-parallax': parallax, + }); + + const capClasses = classnames('imageBlock-caption', { + [`align${align}`]: align !== 'default', + }); + + if (parallax) { + const css = `.imageBlock-${identifier} .imageBlock-overlay{background-image: url('${encodeURI( + imageURL, + )}')}`; + + return ( + <> + <div className={classes}> + <style>{css}</style> + {hasOverlay ? ( + <div className="imageBlock-overlay"> + <div className="imageBlock-title">{title}</div> + <div className="imageBlock-content"> + <RichText.Content tagName="p" value={content} /> + </div> + <div className="imageBlock-buttonWrapper"> + {buttons.map((button) => ( + <a key={button.url} className="btn btn--white" href={button.url}> + {button.text} + </a> + ))} + </div> + </div> + ) : ( + <div className="imageBlock-overlay"></div> + )} + </div> + {caption && <div className={capClasses}>{caption}</div>} + </> + ); + } + + const block = ( + <> + <div className={classes}> + {!type && <img className="imageBlock-image" src={encodeURI(imageURL)} />} + {type === 'video' && ( + <video className="imageBlock-video" autoPlay loop muted> + <source src={encodeURI(videoURL)} /> + </video> + )} + {hasOverlay && ( + <div className="imageBlock-overlay"> + <div className="imageBlock-title">{title}</div> + <div className="imageBlock-content"> + <RichText.Content tagName="p" value={content} /> + </div> + <div className="imageBlock-buttonWrapper"> + {buttons.map((button) => ( + <a key={encodeURI(button.url)} className="btn btn--white" href={button.url}> + {button.text} + </a> + ))} + </div> + </div> + )} + </div> + {caption && <div className={capClasses}>{caption}</div>} + </> + ); + + if (align === 'default') { + return block; + } + + const wrapperClasses = classnames('imageBlock-wrapper', 'u-cf', { + [`align${align}`]: align !== 'default', + }); + + return <div className={wrapperClasses}>{block}</div>; + }, +}; + +const v1 = { + supports: { + className: false, + }, + attributes: blockAttributes, + save({ attributes }) { + const { + type = '', + style = 'loose', + hasOverlay = false, + parallax = false, + align = 'default', + + imageURL = '', + videoURL = '', + + title, + content, + caption, + buttons = [], + } = attributes; + + let identifier; + if (attributes.identifier) { + // pull existing id from outer div instead of generating it. + identifier = attributes.identifier + .replace(/imageBlock\s+imageBlock-([0-9a-zA-Z]*?)\s+(?:has-parallax)?/, '$1') + .trim(); + } + + if (!identifier) { + identifier = uniqueId(); + } + + const classes = classnames('imageBlock', { + [`imageBlock-${identifier}`]: parallax, + 'imageBlock--fixed': style === 'fixed', + 'has-video': type === 'video', + 'has-parallax': parallax, + }); + + const capClasses = classnames('imageBlock-caption', { + [`align${align}`]: align !== 'default', + }); + + if (parallax) { + const css = `.imageBlock-${identifier} .imageBlock-overlay{background-image: url('${encodeURI( + imageURL, + )}')}`; + + return ( + <> + <div className={classes}> + <style>{css}</style> + {hasOverlay ? ( + <div className="imageBlock-overlay"> + <div className="imageBlock-title">{title}</div> + <div className="imageBlock-content"> + <RichText.Content tagName="p" value={content} /> + </div> + <div className="imageBlock-buttonWrapper"> + {buttons.map((button) => ( + <a + key={encodeURI(button.url)} + className="btn btn--white btn--ghost" + href={button.url} + > + {button.text} + </a> + ))} + </div> + </div> + ) : ( + <div className="imageBlock-overlay"></div> + )} + </div> + {caption && <div className={capClasses}>{caption}</div>} + </> + ); + } + + const block = ( + <> + <div className={classes}> + {!type && <img className="imageBlock-image" src={encodeURI(imageURL)} />} + {type === 'video' && ( + <video className="imageBlock-video" autoPlay loop muted> + <source src={encodeURI(videoURL)} /> + </video> + )} + {hasOverlay && ( + <div className="imageBlock-overlay"> + <div className="imageBlock-title">{title}</div> + <div className="imageBlock-content"> + <RichText.Content tagName="p" value={content} /> + </div> + <div className="imageBlock-buttonWrapper"> + {buttons.map((button) => ( + <a + key={encodeURI(button.url)} + className="btn btn--white btn--ghost" + href={button.url} + > + {button.text} + </a> + ))} + </div> + </div> + )} + </div> + {caption && <div className={capClasses}>{caption}</div>} + </> + ); + + if (align === 'default') { + return block; + } + + const wrapperClasses = classnames('imageBlock-wrapper', 'u-cf', { + [`align${align}`]: align !== 'default', + }); + + return <div className={wrapperClasses}>{block}</div>; + }, +}; + +const deprecated = [v2, v1]; + +export default deprecated; diff --git a/private/src/blocks/_deprecated/image/edit.jsx b/private/src/blocks/_deprecated/image/edit.jsx new file mode 100644 index 00000000..3771bdfd --- /dev/null +++ b/private/src/blocks/_deprecated/image/edit.jsx @@ -0,0 +1,450 @@ +import classnames from 'classnames'; + +import { + InspectorControls, + MediaUpload, + PlainText, + RichText, + URLInputButton, +} from '@wordpress/block-editor'; +import { Button, IconButton, PanelBody, SelectControl, ToggleControl } from '@wordpress/components'; +import { Component, Fragment } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const getClosestSize = (media) => { + const sizeList = media.sizes || media.media_details.sizes; + const sizes = {}; + + Object.keys(sizeList).forEach((size) => { + sizes[size] = sizeList[size].height; + }); + + let closest = 'full'; + + Object.keys(sizes).forEach((size) => { + if (Math.abs(600 - sizes[size]) < Math.abs(600 - sizes[closest])) { + closest = size; + } + }); + + return closest; +}; + +export default class DisplayComponent extends Component { + state = { + image: {}, + video: {}, + }; + + componentDidMount() { + const { attributes } = this.props; + const { type, imageID = 0, videoID = 0 } = attributes; + + let mediaID = imageID; + let key = 'image'; + + if (type === 'video') { + mediaID = videoID; + key = 'video'; + } + + wp.apiRequest({ path: `/wp/v2/media/${mediaID}` }).then((response) => + this.setState({ [key]: response }), + ); + } + + updateImage(media, style = 'loose') { + let size = 'full'; + if (style === 'fixed') { + size = getClosestSize(media); + } + + const sizeList = media.sizes || media.media_details.sizes; + const url = sizeList[size].url || sizeList[size].source_url; + + this.setState({ image: media }); + this.props.setAttributes({ imageID: media.id, imageURL: url }); + } + + removeImage = () => { + this.setState({ image: {} }); + this.props.setAttributes({ imageID: 0, imageURL: '' }); + }; + + updateVideo = (media) => { + this.removeVideo(); + + this.setState({ video: media }); + this.props.setAttributes({ videoID: media.id, videoURL: media.source_url || media.url }); + }; + + removeVideo = () => { + this.setState({ video: {} }); + this.props.setAttributes({ videoID: 0, videoURL: '' }); + }; + + updateStyle = (style) => { + this.props.setAttributes({ style }); + + if (this.state.image) { + this.updateImage(this.state.image, style); + } + }; + + updateButtonAttribute(index, attribute, value) { + const { attributes, setAttributes } = this.props; + const { buttons } = attributes; + + return setAttributes({ + buttons: [ + // old buttons up to current index + ...buttons.slice(0, Math.max(0, index)), + // current button + { + ...buttons[index], + [attribute]: value, + }, + // old buttons after current index + ...buttons.slice(index + 1, buttons.length), + ], + }); + } + + createButton(index = -1) { + const { attributes } = this.props; + const { buttons } = attributes; + + if (!buttons[index]) { + buttons[index] = { + text: '', + url: '', + }; + } + + return ( + <div style={{ position: 'relative' }} key={index}> + <div className="imageBlock-buttonWrapper"> + <PlainText + className="btn btn--white" + rows="1" + /* translators: [admin] */ + placeholder={__('(Link Text)', 'amnesty')} + value={buttons[index].text} + onChange={(text) => this.updateButtonAttribute(index, 'text', text)} + /> + </div> + <div className="linkList-options"> + {buttons.length > 1 && ( + <IconButton + icon="no-alt" + /* translators: [admin] */ + label={__('Remove Button', 'amnesty')} + onClick={() => this.removeButton(index)} + /> + )} + <URLInputButton + url={buttons[index].url} + onChange={(url) => this.updateButtonAttribute(index, 'url', url)} + /> + </div> + </div> + ); + } + + removeButton(index) { + const { attributes, setAttributes } = this.props; + const { buttons } = attributes; + + const newButtons = [ + ...buttons.slice(0, Math.max(0, index)), + ...buttons.slice(index + 1, buttons.length), + ]; + + setAttributes({ buttons: newButtons }); + } + + imagePanelControls() { + const { attributes, setAttributes } = this.props; + const { type = '', parallax = false, align = 'default', style = 'loose' } = attributes; + + if (parallax || type === 'video') { + return ''; + } + + return ( + <PanelBody> + <SelectControl + /* translators: [admin] */ + label={__('Image Style', 'amnesty')} + value={style} + onChange={(newStyle) => this.updateStyle(newStyle)} + options={[ + /* translators: [admin] */ + { value: 'fixed', label: __('Fixed Height (600px)', 'amnesty') }, + /* translators: [admin] */ + { value: 'loose', label: __('Actual Height', 'amnesty') }, + ]} + /> + <SelectControl + /* translators: [admin] */ + label={__('Alignment', 'amnesty')} + /* translators: [admin] */ + help={__('Only has an effect on images smaller than their container', 'amnesty')} + value={align} + onChange={(newAlign) => setAttributes({ align: newAlign })} + options={[ + /* translators: [admin] text alignment/. */ + { value: 'default', label: __('Default', 'amnesty') }, + /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ + { value: 'left', label: __('Left', 'amnesty') }, + /* translators: [admin] text alignment. */ + { value: 'centre', label: __('Centre', 'amnesty') }, + /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ + { value: 'right', label: __('Right', 'amnesty') }, + ]} + /> + </PanelBody> + ); + } + + imageInlineControls() { + const { type = '', imageID = 0 } = this.props.attributes; + + if (type === 'video') { + return ''; + } + + return ( + <div className="linkList-options imageBlock-action"> + {imageID ? ( + <IconButton + icon="no-alt" + /* translators: [admin] */ + label={__('Remove Image', 'amnesty')} + onClick={this.removeImage} + /> + ) : ( + <MediaUpload + allowedTypes={['image']} + value={imageID} + onSelect={(media) => { + /** + * MediaUpload component doesn't return full sizes array, so we need to + * grab it from the API again. Inefficient, but it's a Gutenberg core issue + * that was supposedly resolved in https://github.com/WordPress/gutenberg/pull/7605, + * but either wasn't, or was subject to a regression failure. + */ + wp.apiRequest({ path: `/wp/v2/media/${media.id}` }).then((response) => { + this.updateImage({ + id: response.id, + sizes: response.media_details.sizes, + }); + }); + }} + render={({ open }) => <IconButton icon="format-image" onClick={open} />} + /> + )} + </div> + ); + } + + overlayInputFields() { + const { attributes, setAttributes } = this.props; + const { hasOverlay = false, title = '', content = '', buttons = [] } = attributes; + + if (!hasOverlay) { + return ''; + } + + return ( + <div className="imageBlock-overlay"> + <RichText + className="imageBlock-title" + rows="1" + /* translators: [admin] */ + placeholder={__('(Title)', 'amnesty')} + value={title} + onChange={(newTitle) => setAttributes({ title: newTitle })} + /> + <RichText + className="imageBlock-content" + /* translators: [admin] */ + placeholder={__('(Content)', 'amnesty')} + value={content} + format="string" + onChange={(newContent) => setAttributes({ content: newContent })} + /> + <div className="imageBlock-buttonsContainer"> + {buttons.map((button, index) => this.createButton(index, button))} + {buttons.length < 1 && this.createButton(0)} + <IconButton + icon="plus" + /* translators: [admin] */ + label={__('Add Button', 'amnesty')} + onClick={() => setAttributes({ buttons: [...buttons, { text: '', url: '' }] })} + /> + </div> + </div> + ); + } + + videoPanelControls() { + const { attributes } = this.props; + const { videoURL = '', type = '' } = attributes; + + if (type !== 'video') { + return ''; + } + + if (!videoURL) { + return ( + <PanelBody> + <MediaUpload + title={__('Choose Video', 'amnesty')} + onSelect={(media) => this.updateVideo(media)} + allowedTypes={['video']} + modalClass="editor-post-featured-image__media-modal" + render={({ open }) => ( + <Button className="editor-post-featured-image__toggle" onClick={open}> + {/* translators: [admin] */ __('Choose Video', 'amnesty')} + </Button> + )} + /> + </PanelBody> + ); + } + + return ( + <PanelBody> + <MediaUpload + /* translators: [admin] */ + title={__('Replace Video', 'amnesty')} + onSelect={(media) => this.updateVideo(media)} + allowedTypes={['video']} + modalClass="editor-post-featured-image__media-modal" + render={({ open }) => ( + <div> + <video> + <source src={videoURL} /> + </video> + <Button onClick={open} isSecondary isLarge> + {/* translators: [admin] */ __('Replace Video', 'amnesty')} + </Button> + </div> + )} + /> + <Button onClick={this.removeVideo} isLink isDestructive> + {/* translators: [admin] */ __('Remove Video', 'amnesty')} + </Button> + </PanelBody> + ); + } + + backgroundMediaFields() { + const { type = '', imageURL = '', videoURL = '' } = this.props.attributes; + + if (!type && imageURL) { + return <img className="imageBlock-image" src={imageURL} />; + } + + if (videoURL && (this.state.video.source_url || this.state.video.url)) { + return ( + <video className="imageBlock-video"> + <source src={videoURL} /> + </video> + ); + } + + return ''; + } + + render() { + const { attributes, setAttributes } = this.props; + const { + type = '', + style = 'loose', + parallax = false, + align = 'default', + hasOverlay = false, + caption, + } = attributes; + + const classes = classnames('imageBlock', { + 'imageBlock--fixed': style === 'fixed', + 'has-video': type === 'video', + 'has-parallax': parallax, + [`align${align}`]: align !== 'default', + }); + + const capClasses = classnames('imageBlock-caption', { + [`align${align}`]: align !== 'default', + }); + + return ( + <Fragment> + <InspectorControls> + <PanelBody> + <SelectControl + /* translators: [admin] */ + label={__('Background Type', 'amnesty')} + options={[ + { + /* translators: [admin] */ + label: __('Image', 'amnesty'), + value: '', + }, + { + /* translators: [admin] */ + label: __('Video', 'amnesty'), + value: 'video', + }, + ]} + value={type} + onChange={(newType) => setAttributes({ type: newType })} + /> + </PanelBody> + + {this.imagePanelControls()} + + <PanelBody> + <ToggleControl + /* translators: [admin] */ + label={__('Display Overlay', 'amnesty')} + checked={hasOverlay} + onChange={(newHasOverlay) => setAttributes({ hasOverlay: newHasOverlay })} + /> + <ToggleControl + /* translators: [admin] */ + label={__('Enable Parallax', 'amnesty')} + checked={parallax} + onChange={(newParallax) => + setAttributes({ + parallax: newParallax, + style: newParallax ? 'loose' : style, + }) + } + /> + </PanelBody> + + {this.videoPanelControls()} + </InspectorControls> + + <div className={classes}> + {this.backgroundMediaFields()} + {this.overlayInputFields()} + {this.imageInlineControls()} + </div> + + <RichText + className={capClasses} + rows="1" + /* translators: [admin] */ + placeholder={__('(Insert Caption, if required)', 'amnesty')} + value={caption} + onChange={(newCaption) => setAttributes({ caption: newCaption })} + /> + <div className="clear"></div> + </Fragment> + ); + } +} diff --git a/private/src/blocks/_deprecated/image/editor.scss b/private/src/blocks/_deprecated/image/editor.scss new file mode 100644 index 00000000..d1c488f1 --- /dev/null +++ b/private/src/blocks/_deprecated/image/editor.scss @@ -0,0 +1,113 @@ +@use '../../../utils/mixins/placeholder' as p; + +.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/image-block"] { + max-width: 100%; + width: 100%; +} + +.imageBlock { + display: block; + max-width: 100% !important; + min-height: 400px; + background-color: var(--wp--preset--color--grey-light); +} + +.imageBlock.imageBlock.has-parallax { + overflow-y: hidden; +} + +.imageBlock.has-parallax .imageBlock-overlay { + z-index: 1 !important; +} + +.imageBlock.alignright .imageBlock-image { + float: right; +} + +.imageBlock.aligncentre .imageBlock-image { + display: block; + margin: 0 auto; +} + +.imageBlock.alignleft .imageBlock-image { + float: left; +} + +.imageBlock-overlay > * + * { + margin-top: 40px !important; +} + +.imageBlock-title, +.imageBlock-content { + max-width: none; + background-color: transparent !important; + text-align: center; + color: var(--wp--preset--color--white) !important; +} + +.imageBlock-buttonsContainer { + display: flex; + align-items: flex-start; + justify-content: center; + align-content: flex-start; + min-width: 600px; + position: relative; + + > * { + margin: 0 10px; + } +} + +.imageBlock-buttonsContainer .linkList-options { + position: absolute; + display: flex; + margin-top: 5px; + background: none; + bottom: 0; + right: 0; + top: auto; +} + +.imageBlock-buttonWrapper { + position: relative; +} + +.imageBlock-buttonWrapper .btn.btn--white { + padding: 10px !important; + color: var(--wp--preset--color--black) !important; + border: 1px solid var(--wp--preset--color--black) !important; + background-color: var(--wp--preset--color--white) !important; + border-radius: 0 !important; + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + font-size: var(--wp--preset--font-size--small); + text-transform: uppercase; + + @include p.placeholder { + color: var(--wp--preset--color--black) !important; + } +} + +.imageBlock-overlay .editor-url-input__button button, +.imageBlock-overlay .components-icon-button { + background-color: var(--wp--preset--color--white); + border-radius: 0; + color: var(--wp--preset--color--black)-light; +} + +.imageBlock-copyright { + padding: 5px 10px 5px 5px !important; + width: auto !important; + font-size: var(--wp--preset--font-size--x-small) !important; + color: var(--wp--preset--color--white) !important; +} + +.imageBlock-title, +.imageBlock-content p, +.imageBlock-copyright { + color: var(--wp--preset--color--white) !important; + + @include p.placeholder { + color: var(--wp--preset--color--white) !important; + } +} diff --git a/private/src/blocks/_deprecated/image/index.js b/private/src/blocks/_deprecated/image/index.js new file mode 100644 index 00000000..bbabe72c --- /dev/null +++ b/private/src/blocks/_deprecated/image/index.js @@ -0,0 +1,15 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/_deprecated/image/render-block.php b/private/src/blocks/_deprecated/image/render-block.php new file mode 100644 index 00000000..2f93476a --- /dev/null +++ b/private/src/blocks/_deprecated/image/render-block.php @@ -0,0 +1,49 @@ +<?php + +// used in views +$block_classes = classnames( + 'imageBlock', + [ + "imageBlock-{$attributes['identifier']}" => (bool) $attributes['parallax'], + 'imageBlock--fixed' => 'fixed' === $attributes['style'], + 'has-video' => 'video' === $attributes['type'], + 'has-parallax' => (bool) $attributes['parallax'], + "align{$attributes['align']}" => $attributes['align'], + ], +); + +$caption_classes = classnames( + 'imageBlock-caption', + [ + sprintf( 'align%s', $attributes['align'] ) => 'default' !== $attributes['align'], + ] +); + +?> + +<div class="<?php echo esc_attr( $block_classes ); ?>"> +<?php if ( ! $attributes['type'] ) : ?> + <?php echo wp_get_attachment_image( absint( $attributes['imageID'] ), 'fixed' === $attributes['style'] ? 'image-block' : 'full' ); ?> +<?php endif; ?> +<?php if ( 'video' === $attributes['type'] ) : ?> + <video class="imageBlock-video" autoPlay loop muted> + <source src="<?php echo esc_url( $attributes['videoURL'] ); ?>"> + </video> +<?php endif; ?> +<?php if ( $attributes['hasOverlay'] ) : ?> + <div class="imageBlock-overlay"> + <div class="imageBlock-title"><?php echo esc_html( $attributes['title'] ); ?></div> + <div class="imageBlock-content"> + <p><?php echo esc_html( $attributes['content'] ); ?></p> + </div> + <div class="imageBlock-buttonWrapper"> + <?php foreach ( $attributes['buttons'] as $button ) : ?> + <a class="btn btn--white" href="<?php echo esc_url( $button['url'] ); ?>"><?php echo esc_html( $button['text'] ); ?></a> + <?php endforeach; ?> + </div> + </div> +<?php endif; ?> +</div> +<?php if ( $attributes['caption'] ) : ?> + <div class="<?php echo esc_attr( $caption_classes ); ?>"><?php echo esc_html( $attributes['caption'] ); ?></div> +<?php endif; ?> diff --git a/private/src/blocks/_deprecated/image/render-parallax.php b/private/src/blocks/_deprecated/image/render-parallax.php new file mode 100644 index 00000000..60f633f0 --- /dev/null +++ b/private/src/blocks/_deprecated/image/render-parallax.php @@ -0,0 +1,43 @@ +<?php + +$block_classes = classnames( + 'imageBlock', + [ + "imageBlock-{$attributes['identifier']}" => (bool) $attributes['parallax'], + 'imageBlock--fixed' => 'fixed' === $attributes['style'], + 'has-video' => 'video' === $attributes['type'], + 'has-parallax' => (bool) $attributes['parallax'], + ] +); + +$caption_classes = classnames( + 'imageBlock-caption', + [ + sprintf( 'align%s', $attributes['align'] ) => 'default' !== $attributes['align'], + ] +); + +?> + +<?php $image_url = wp_get_attachment_image_url( absint( $attributes['imageID'] ), 'hero-lg' ); ?> +<div class="<?php echo esc_attr( $block_classes ); ?>"> +<style>.imageBlock-<?php echo esc_attr( $attributes['identifier'] ); ?> .imageBlock-overlay{background-image:url('<?php echo esc_url( $image_url ); ?>')}</style> +<?php if ( $attributes['hasOverlay'] ) : ?> +<div class="imageBlock-overlay"> + <div class="imageBlock-title"><?php echo esc_html( $attributes['title'] ); ?></div> + <div class="imageBlock-content"> + <p><?php echo esc_html( $attributes['content'] ); ?></p> + </div> + <div class="imageBlock-buttonWrapper"> + <?php foreach ( $attributes['buttons'] as $button ) : ?> + <a class="btn btn--white" href="<?php echo esc_url( $button['url'] ); ?>"><?php echo esc_html( $button['text'] ); ?></a> + <?php endforeach; ?> + </div> +</div> +<?php else : ?> + <div class="imageBlock-overlay"></div> +<?php endif; ?> +</div> +<?php if ( $attributes['caption'] ) : ?> + <div class="<?php echo esc_attr( $caption_classes ); ?>"><?php echo esc_html( $attributes['caption'] ); ?></div> +<?php endif; ?> diff --git a/private/src/blocks/_deprecated/image/render.php b/private/src/blocks/_deprecated/image/render.php new file mode 100644 index 00000000..e73e1b7f --- /dev/null +++ b/private/src/blocks/_deprecated/image/render.php @@ -0,0 +1,31 @@ +<?php + +if ( $attributes['parallax'] ) { + require realpath( __DIR__ . '/render-parallax.php' ); +} + +// the srcset declaration, for the fixed height style, causes much larger images to load than is necessary +$remove_srcset = function ( array $props ) use ( $attributes ): array { + if ( 'fixed' !== $attributes['style'] ) { + return $props; + } + + unset( $props['srcset'], $props['sizes'] ); + return $props; +}; + +add_filter( 'wp_get_attachment_image_attributes', $remove_srcset ); + +if ( ! $attributes['parallax'] ) { + require realpath( __DIR__ . '/render-block.php' ); +} + +remove_filter( 'wp_get_attachment_image_attributes', $remove_srcset ); + +$wrapper_classes = classnames( + 'imageBlock-wrapper', + 'u-cf', + [ + sprintf( 'align%s', $attributes['align'] ) => 'default' !== $attributes['align'], + ] +); diff --git a/private/src/blocks/_deprecated/image/style.scss b/private/src/blocks/_deprecated/image/style.scss new file mode 100644 index 00000000..9d828eac --- /dev/null +++ b/private/src/blocks/_deprecated/image/style.scss @@ -0,0 +1,180 @@ +.imageBlock { + position: relative; + display: inline-block; + max-width: 100%; + height: auto; + width: 100%; +} + +.imageBlock img { + max-width: 100%; + height: auto; +} + +.imageBlock.alignleft { + text-align: left; + float: unset !important; +} + +.imageBlock.alignright { + text-align: right; + float: unset !important; +} + +.imageBlock.aligncentre { + text-align: center; + float: unset !important; +} + +.imageBlock-wrapper.alignright .imageBlock, +.imageBlock-caption.alignright { + float: right; +} + +.imageBlock-wrapper.aligncentre { + text-align: center; + + .imageBlock { + display: inline-block; + } +} + +.imageBlock-caption.aligncentre { + display: block; + text-align: center; +} + +.imageBlock-wrapper.alignleft .imageBlock, +.imageBlock-caption.alignleft { + float: left; +} + +.imageBlock-caption.alignright, +.imageBlock-caption.alignleft { + width: 100%; +} + +.imageBlock-caption.alignright { + text-align: right; +} + +.imageBlock--fixed { + display: block; + min-height: 600px; + height: 600px; + max-height: 600px; + overflow: hidden; +} + +.imageBlock-wrapper.aligncentre .imageBlock--fixed { + background-color: var(--wp--preset--color--grey-lighter); +} + +.imageBlock-wrapper.aligncentre .imageBlock-image img { + display: block; + margin: 0 auto; +} + +.imageBlock--fixed .imageBlock-image { + min-width: 0; + max-width: 100%; +} + +.imageBlock-video { + display: block; + min-width: 100%; + min-height: 100%; + width: 100%; +} + +.imageBlock--fixed .imageBlock-image.has-caption { + display: inline-block; + height: 100%; + + img { + max-width: none; + min-height: 100%; + } +} + +.imageBlock-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background: color-mix(in srgb, var(--wp--preset--color--black) 25%, transparent); +} + +.imageBlock-title, +.imageBlock-content { + margin-right: auto; + margin-left: auto; + max-width: 50%; + text-align: center; + color: var(--wp--preset--color--white); +} + +.imageBlock-overlay > * + * { + margin-top: 30px; +} + +.imageBlock-overlay .imageBlock-title + .imageBlock-content { + margin-top: 15px; +} + +.imageBlock-title { + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--huge); + font-weight: bold; +} + +.imageBlock-content { + font-family: var(--wp--preset--font-family--primary); + font-size: var(--wp--preset--font-size--regular); + + > p:last-child { + margin-bottom: 0; + } +} + +.imageBlock-buttonWrapper .btn + .btn { + margin-left: 24px; +} + +.imageBlock-buttonWrapper .btn { + padding: 12px; +} + +.imageBlock-caption { + margin-top: 7px !important; + font-size: var(--wp--preset--font-size--x-small); + font-family: var(--wp--preset--font-family--primary); + line-height: 1.4; + color: var(--wp--preset--color--grey-base); +} + +.imageBlock.has-parallax { + display: block; + height: 600px; +} + +.imageBlock.has-parallax .imageBlock-overlay { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-repeat: no-repeat; + background-size: cover; + + @media all and (min-width: 840px) { + background-attachment: fixed; + } +} diff --git a/private/src/scripts/editor/blocks-deprecated/image/utils.js b/private/src/blocks/_deprecated/image/utils.js similarity index 100% rename from private/src/scripts/editor/blocks-deprecated/image/utils.js rename to private/src/blocks/_deprecated/image/utils.js diff --git a/private/src/styles/blocks/links-with-icons/_elements.scss b/private/src/blocks/_deprecated/links-with-icons/_elements.scss similarity index 94% rename from private/src/styles/blocks/links-with-icons/_elements.scss rename to private/src/blocks/_deprecated/links-with-icons/_elements.scss index 40758065..58f9fb9c 100644 --- a/private/src/styles/blocks/links-with-icons/_elements.scss +++ b/private/src/blocks/_deprecated/links-with-icons/_elements.scss @@ -15,7 +15,7 @@ & + * { margin-top: 20px; - @include mq(980px) { + @media all and (min-width: 980px) { margin-top: 24px; } } @@ -47,7 +47,7 @@ margin-left: auto; max-width: 40%; - @include mq(medium-sm) { + @media all and (min-width: 840px) { max-width: 60%; } } @@ -59,7 +59,7 @@ .linksWithIcons-imageWrapper.is-large { max-width: 55%; - @include mq(medium-sm) { + @media all and (min-width: 840px) { max-width: 75%; } } @@ -67,7 +67,7 @@ .linksWithIcons-imageWrapper.is-small { max-width: 25%; - @include mq(medium-sm) { + @media all and (min-width: 840px) { max-width: 45%; } } diff --git a/private/src/blocks/_deprecated/links-with-icons/_group.scss b/private/src/blocks/_deprecated/links-with-icons/_group.scss new file mode 100644 index 00000000..db084094 --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/_group.scss @@ -0,0 +1,189 @@ +@use '../../../utils/mixins/icon' as i; + +.linksWithIcons-group { + display: flex; + align-items: flex-start; + justify-content: center; + flex-wrap: wrap; + + @media all and (min-width: 840px) { + justify-content: space-around; + align-items: stretch; + } +} + +.linksWithIcons-group.has-background { + padding: 12px 0; +} + +.linksWithIcons-group.has-1-items { + padding: 0; +} + +.linksWithIcons-group.has-1-items.has-background { + padding: 60px 0; +} + +.linksWithIcons-group .linksWithIcons { + flex-basis: 100%; +} + +.linksWithIcons-group.is-vertical { + flex-direction: column; + justify-content: space-between; + margin: 0 auto; + max-width: 456px; +} + +.linksWithIcons-group.is-vertical .linksWithIcons, +.linksWithIcons-group.is-vertical .linksWithIcons-spacer { + display: flex; + flex-direction: column; + align-items: center; + flex-basis: auto; + align-self: center; +} + +.linksWithIcons-group.is-horizontal:not(.is-style-square) { + flex-direction: row; + align-items: flex-start; + justify-content: space-evenly; +} + +.linksWithIcons-group.is-horizontal .linksWithIcons { + @media all and (min-width: 840px) { + flex-basis: 33%; + } +} + +.linksWithIcons-group.has-2-items .linksWithIcons { + @media all and (min-width: 840px) { + flex-basis: 49%; + } +} + +.linksWithIcons-group.has-3-items .linksWithIcons { + @media all and (min-width: 840px) { + flex-basis: 33%; + } +} + +.linksWithIcons-group.is-horizontal.has-4-items .linksWithIcons { + @media all and (min-width: 540px) { + padding: 0 5px; + + &:nth-child(7) { + margin-top: 60px; + } + } + + @media all and (min-width: 840px) { + flex-basis: 24%; + } +} + +.rowColumn .linksWithIcons-spacer { + @media all and (min-width: 840px) { + display: none !important; + } +} + +.linksWithIcons-group.icon-none .linksWithIcons-spacer::before +.linksWithIcons-group.icon-none .linksWithIcons-spacer::after { + display: none !important; +} + +.linksWithIcons-group.icon-arrow .linksWithIcons-spacer, +.linksWithIcons-group.icon-ampersand .linksWithIcons-spacer { + position: relative; +} + +.linksWithIcons-group.icon-arrow .linksWithIcons-spacer::before, +.linksWithIcons-group.icon-arrow .linksWithIcons-spacer::after { + @include i.icon(10px, 162px, 40px, 40px); + position: absolute; + top: calc(50% - 20px); + left: calc(50% - 20px); + z-index: 1; + display: block; + content: ""; +} + +.linksWithIcons-group.icon-arrow .linksWithIcons-spacer::before { + background-color: var(--wp--preset--color--black); +} + +.linksWithIcons-group.icon-arrow.is-horizontal .linksWithIcons-spacer::after { + @media all and (min-width: 840px) { + transform: rotate(-90deg); + + .rtl & { + transform: rotate(90deg); + } + } +} + +.linksWithIcons-group.icon-ampersand .linksWithIcons-spacer::before { + pointer-events: none; + position: absolute; + left: calc(50% - 20px); + top: calc(50% - 20px); + z-index: 1; + display: block; + width: 40px; + height: 40px; + content: ""; + background: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); +} + +.linksWithIcons-group.icon-ampersand .linksWithIcons-spacer::after { + pointer-events: none; + position: absolute; + left: 50%; + top: 50%; + z-index: 1; + display: block; + content: "\0026"; + font-weight: bold; + font-style: italic; + font-size: 30px; + color: var(--wp--preset--color--white); + transform: translateY(-50%) translateX(-50%); + + .rtl & { + transform: translateY(-50%) translateX(-50%) rotateY(180deg); + } +} + +.linksWithIcons-group.has-very-light-gray-background-color { + background-color: var(--wp--preset--color--grey-lighter); +} + +.linksWithIcons-group.is-style-square { + display: grid; + column-gap: var(--wp--preset--spacing--single); + row-gap: var(--wp--preset--spacing--single); + grid-template-columns: repeat(1, 1fr); + grid-auto-rows: 1fr; + + @media all and (min-width: 540px) { + grid-template-columns: repeat(2, 1fr); + } + + @media all and (min-width: 760px) { + grid-template-columns: repeat(3, 1fr); + } + + @media all and (min-width: 1110px) { + grid-template-columns: repeat(4, 1fr); + } +} + +.linksWithIcons-group.is-style-square.linksWithIcons-group.has-1-items, +.linksWithIcons-group.is-style-square.linksWithIcons-group.has-2-items, +.linksWithIcons-group.is-style-square.linksWithIcons-group.has-3-items { + @media all and (min-width: 1110px) { + grid-template-columns: repeat(3, 1fr); + } +} diff --git a/private/src/styles/blocks/links-with-icons/_spacer.scss b/private/src/blocks/_deprecated/links-with-icons/_spacer.scss similarity index 92% rename from private/src/styles/blocks/links-with-icons/_spacer.scss rename to private/src/blocks/_deprecated/links-with-icons/_spacer.scss index ed83220d..d44120c2 100644 --- a/private/src/styles/blocks/links-with-icons/_spacer.scss +++ b/private/src/blocks/_deprecated/links-with-icons/_spacer.scss @@ -5,7 +5,7 @@ height: 2px; background-color: color-mix(in srgb, var(--wp--preset--color--black) 30%, transparent); - @include mq(x-small) { + @media all and (min-width: 540px) { margin-top: 30px; margin-bottom: 30px; } @@ -30,7 +30,7 @@ .linksWithIcons-group.is-horizontal .linksWithIcons-spacer { @include spacer-horizontal; - @include mq(medium-sm) { + @media all and (min-width: 840px) { @include spacer-vertical; &:nth-child(4) { diff --git a/private/src/blocks/_deprecated/links-with-icons/block.json b/private/src/blocks/_deprecated/links-with-icons/block.json new file mode 100644 index 00000000..8c782c7f --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/block.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/repeatable-block", + "title": "Links with Icons Group", + "category": "amnesty-core", + "description": "Add a repeatable links-with-icons block", + "icon": "images-alt", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "inserter": false + }, + "attributes": { + "backgroundColor": { + "type": "string" + }, + "orientation": { + "type": "string", + "default": "horizontal" + }, + "quantity": { + "type": "number", + "default": 2 + }, + "hideLines": { + "type": "boolean", + "default": false + }, + "dividerIcon": { + "type": "string", + "default": "none" + } + } +} diff --git a/private/src/blocks/_deprecated/links-with-icons/deprecated.jsx b/private/src/blocks/_deprecated/links-with-icons/deprecated.jsx new file mode 100644 index 00000000..1350b080 --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/deprecated.jsx @@ -0,0 +1,85 @@ +import classnames from 'classnames'; + +import { omit } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; + +const blockAttributes = { + backgroundColor: { + type: 'string', + }, + orientation: { + type: 'string', + default: 'horizontal', + }, + quantity: { + type: 'number', + default: 2, + }, + hideLines: { + type: 'boolean', + default: false, + }, + dividerIcon: { + type: 'text', + default: 'none', + }, +}; + +const v1 = { + attributes: omit(blockAttributes, ['dividerIcon']), + save({ attributes, className }) { + const { quantity, orientation = 'horizontal', backgroundColor, hideLines } = attributes; + const classes = classnames( + 'linksWithIcons-group', + `is-${orientation}`, + `has-${quantity}-items`, + { + 'has-background': !!backgroundColor, + [`has-${backgroundColor}-background-color`]: !!backgroundColor, + 'has-no-lines': !!hideLines, + className: !!className, + }, + ); + + return ( + <div className={classes}> + <InnerBlocks.Content /> + </div> + ); + }, +}; + +const v2 = { + attributes: blockAttributes, + save({ attributes, className }) { + const { + quantity, + orientation = 'horizontal', + backgroundColor, + hideLines, + dividerIcon = 'none', + } = attributes; + const classes = classnames( + 'linksWithIcons-group', + `is-${orientation}`, + `has-${quantity}-items`, + { + className: !!className, + 'has-background': !!backgroundColor, + 'has-no-lines': !!hideLines, + [`has-${backgroundColor}-background-color`]: !!backgroundColor, + [`icon-${dividerIcon}`]: !!dividerIcon, + }, + ); + + return ( + <div className={classes}> + <InnerBlocks.Content /> + </div> + ); + }, +}; + +const deprecated = [v2, v1]; + +export default deprecated; diff --git a/private/src/blocks/_deprecated/links-with-icons/edit.jsx b/private/src/blocks/_deprecated/links-with-icons/edit.jsx new file mode 100644 index 00000000..34459ea9 --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/edit.jsx @@ -0,0 +1,140 @@ +/** + * Third-party + */ +import classnames from 'classnames'; +import memoize from 'memize'; + +/** + * WordPress + */ +import { times } from 'lodash'; +import { InnerBlocks, InspectorControls } from '@wordpress/block-editor'; +import { PanelBody, RangeControl, SelectControl, ToggleControl } from '@wordpress/components'; +import { Component, Fragment } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/** + * Module-specific + */ +// blocks allowed to be contained within the repeatable block +const ALLOWED_BLOCKS = ['amnesty-core/links-with-icons']; +// Returns the layouts configuration for a given number of repeats. +const getLayoutTemplate = memoize((blocks) => times(blocks, () => ALLOWED_BLOCKS)); +export default class DisplayComponent extends Component { + render = () => { + const { attributes, setAttributes } = this.props; + + const buttonIconOptions = [ + { + /* translators: [admin] */ + label: __('None', 'amnesty'), + value: 'none', + }, + { + /* translators: [admin] */ + label: __('Arrow', 'amnesty'), + value: 'arrow', + }, + { + /* translators: [admin] */ + label: __('Ampersand', 'amnesty'), + value: 'ampersand', + }, + ]; + + const { + backgroundColor, + className, + hideLines, + orientation = 'horizontal', + quantity, + dividerIcon = 'none', + style, + } = attributes; + + const classes = classnames( + 'linksWithIcons-group', + `is-${orientation}`, + `has-${quantity}-items`, + { + [className]: !!className, + 'has-background': !!backgroundColor, + 'has-no-lines': !!hideLines, + [`has-${backgroundColor}-background-color`]: !!backgroundColor, + [`icon-${dividerIcon}`]: !!dividerIcon, + }, + ); + + if (style === 'square' && orientation !== 'horizontal') { + setAttributes({ orientation: 'horizontal' }); + } + + return ( + <Fragment> + <InspectorControls> + <PanelBody> + <RangeControl + /* translators: [admin] */ + label={__('Quantity', 'amnesty')} + value={quantity} + onChange={(newQuantity) => setAttributes({ quantity: newQuantity })} + min={1} + max={24} + /> + {style !== 'square' && ( + <SelectControl + /* translators: [admin] */ + label={__('Orientation', 'amnesty')} + value={orientation} + onChange={(newOrientation) => setAttributes({ orientation: newOrientation })} + options={[ + /* translators: [admin] */ + { value: 'horizontal', label: __('Horizontal', 'amnesty') }, + /* translators: [admin] */ + { value: 'vertical', label: __('Vertical', 'amnesty') }, + ]} + /> + )} + <SelectControl + /* translators: [admin] */ + label={__('Background Colour', 'amnesty')} + value={backgroundColor} + onChange={(newBgColor) => setAttributes({ backgroundColor: newBgColor })} + options={[ + /* translators: [admin] */ + { value: '', label: __('None', 'amnesty') }, + /* translators: [admin] */ + { value: 'very-light-gray', label: __('Grey', 'amnesty') }, + ]} + /> + {style !== 'square' && ( + <ToggleControl + /* translators: [admin] */ + label={__('Hide Lines', 'amnesty')} + checked={hideLines} + onChange={(newHideLines) => setAttributes({ hideLines: newHideLines })} + /> + )} + <SelectControl + className="radio-control-icons" + /* translators: [admin] */ + label={__('Divider Style', 'amnesty')} + value={attributes.dividerIcon} + onChange={(value) => { + setAttributes({ dividerIcon: value }); + }} + options={buttonIconOptions} + /> + </PanelBody> + </InspectorControls> + <div className={classes}> + <InnerBlocks + template={getLayoutTemplate(quantity)} + templateLock="all" + allowedBlocks={ALLOWED_BLOCKS} + /> + </div> + </Fragment> + ); + }; +} diff --git a/private/src/blocks/_deprecated/links-with-icons/editor.scss b/private/src/blocks/_deprecated/links-with-icons/editor.scss new file mode 100644 index 00000000..e44720d9 --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/editor.scss @@ -0,0 +1,216 @@ +.wide-column-left .block-editor-block-list__block:first-child, +.wide-column-right .block-editor-block-list__block:last-child { + flex-basis: calc((100% / 3) * 2) !important; +} + +.wide-column-left .block-editor-block-list__block:not(:first-child), +.wide-column-right .block-editor-block-list__block:not(:last-child) { + flex-basis: calc(100% / 3) !important; +} + +.linksWithIcons-group { + display: block; + margin: 0 -30px; + padding: 30px; + font-family: var(--wp--preset--font-family--primary); +} + +.linksWithIcons > * { + margin-top: 40px !important; + margin-right: auto; + margin-left: auto; +} + +.linksWithIcons-group.is-style-square { + display: block; + grid-template-columns: repeat(1, 1fr) !important; +} + +.linksWithIcons-group.is-style-square .linksWithIcons > * { + margin-top: var(--wp--preset--spacing--single) !important; +} + +.linksWithIcons-bigtext { + line-height: 1em !important; +} + +.linksWithIcons-group.is-vertical .block-editor-block-list__block-edit:first-child { + margin-top: 0; +} + +.linksWithIcons-group .block-editor-block-list__layout:first-child { + margin-left: -20px; +} + +.linksWithIcons-group .block-editor-block-list__layout:last-child { + margin-right: -20px; +} + +.linksWithIcons-group.is-style-square .block-editor-block-list__layout:first-child { + margin-left: 0; +} + +.linksWithIcons-group.is-style-square .block-editor-block-list__layout:last-child { + margin-right: 0; +} + +.block-editor-block-list__layout .block-editor-block-list__block[data-type="amnesty-core/repeatable-block"] > .block-editor-block-list__block-edit { + margin-top: 0 !important; + margin-bottom: 0 !important; + padding: 0 30px; +} + +.block-editor-block-list__layout .block-editor-block-list__block[data-type="amnesty-core/repeatable-block"] > .block-editor-block-list__block-edit::before { + bottom: 5px; +} + +.linksWithIcons-group > .block-editor-inner-blocks > .block-editor-block-list__layout { + display: flex; + flex-wrap: wrap; +} + +.linksWithIcons-group > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="amnesty-core/repeatable-block"] { + display: flex; + flex-direction: column; + flex: 1; + width: 0; +} + +.linksWithIcons-group > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="amnesty-core/repeatable-block"] .block-editor-block-list__block-edit { + flex-basis: 100%; +} + +.linksWithIcons-group.is-vertical .block-editor-block-list__layout { + flex-direction: column; +} + +.linksWithIcons-group.is-style-square .block-editor-block-list__block { + margin-bottom: 24px; +} + +.linksWithIcons-group.is-horizontal.is-style-square .block-editor-block-list__block { + margin-top: 0; + margin-right: 0; + margin-left: 24px; + flex: 0 0 calc((100% - (24px * 3)) / 4); + max-width: calc((100% - (24px * 3)) / 4); + + &:first-child, + &:nth-child(4n+5) { + margin-left: 0; + } +} + +@for $cols from 2 through 4 { + .linksWithIcons-group.is-horizontal.has-#{$cols}-items .block-editor-block-list__block { + flex: 0 0 calc(100% / #{$cols}); + max-width: calc(100% / #{$cols}); + } + + .linksWithIcons-group.is-horizontal.is-style-square.has-#{$cols}-items .block-editor-block-list__block { + flex: 0 0 calc((100% - (24px * 3)) / #{$cols}); + max-width: calc((100% - (24px * 3)) / #{$cols}); + } +} + +.linksWithIcons-group.is-horizontal.is-style-square .block-editor-block-list__block .linksWithIcons { + flex-basis: unset; + max-width: 100%; +} + +.linksWithIcons-group .linksWithIcons { + max-width: none; +} + +.linksWithIcons-group .linksWithIcons-bigtext [data-rich-text-placeholder] { + font-size: var(--wp--preset--font-size--huge); +} + +.linksWithIcons-group.is-style-square .linksWithIcons { + flex: 0 0 100%; + max-width: 100%; + margin: 0; + height: 100%; + padding-top: 0; + padding-bottom: 0; +} + +.linksWithIcons-group.is-vertical .block-editor-block-list__block { + margin-right: initial; + margin-left: initial; + flex: 1 0 50%; + max-width: 100%; +} + +.linksWithIcons-group.is-vertical .block-editor-block-list__block-edit { + margin-right: 30px; + margin-left: 30px; +} + +@media all and (min-width: 600px) { + .linksWithIcons-group .block-editor-block-list__block .block-editor-block-contextual-toolbar { + top: 100%; + } +} + +.linksWithIcons-group.has-1-items.has-background .linksWithIcons { + padding: 20px; +} + +.linksWithIcons-bigtext.has-underline[data-is-placeholder-visible="true"] { + left: 0; + border-bottom: none; +} + +.linksWithIcons-buttonWrapper { + position: relative; +} + +.linksWithIcons-buttonWrapper > div { + display: inline-block; + vertical-align: middle; +} + +.editor-rich-text__tinymce.mce-content-body.linksWithIcons-button { + line-height: 36px; +} + +.linksWithIcons-buttonWrapper .editor-url-input__button { + position: absolute; +} + +.linksWithIcons-buttonWrapper .editor-url-input__button-modal { + position: absolute; + min-width: 300px; + left: -150px; + top: 110%; +} + +.linksWithIcons-group.icon-arrow.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer, +.linksWithIcons-group.icon-ampersand.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer, +.linksWithIcons-group.icon-none.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer { + display: block !important; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); +} + +.linksWithIcons-group.icon-arrow.is-vertical .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer { + display: block !important; +} + +.linksWithIcons-group.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"]:last-child .linksWithIcons-spacer, +.linksWithIcons-group.is-vertical .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"]:last-child .linksWithIcons-spacer { + display: none !important; +} + +.linksWithIcons-group .linksWithIcons-spacer:last-child { + display: block !important; + margin-left: auto; + margin-right: auto; +} + +.linksWithIcons-group.has-no-lines .linksWithIcons-spacer:last-child { + display: none !important; +} diff --git a/private/src/blocks/_deprecated/links-with-icons/index.jsx b/private/src/blocks/_deprecated/links-with-icons/index.jsx new file mode 100644 index 00000000..53a5d509 --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/index.jsx @@ -0,0 +1,24 @@ +import './style.scss'; +import './editor.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { registerBlockType, registerBlockStyle } from '@wordpress/blocks'; +import { __ } from '@wordpress/i18n'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'LinksWithIconsBlockSave' }), +}); + +registerBlockStyle('amnesty-core/repeatable-block', { + name: 'square', + /* translators: [admin] */ + label: __('Square', 'amnesty'), +}); diff --git a/private/src/blocks/_deprecated/links-with-icons/render.php b/private/src/blocks/_deprecated/links-with-icons/render.php new file mode 100644 index 00000000..021b531a --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/render.php @@ -0,0 +1,23 @@ +<?php + +$classes = classnames( + 'linksWithIcons-group', + sprintf( 'is-%s', $attributes['orientation'] ), + sprintf( 'has-%s-items', $attributes['quantity'] ), + $attributes['className'], + [ + 'has-background' => $attributes['backgroundColor'], + 'has-no-lines' => $attributes['hideLines'], + ], + [ + sprintf( 'has-%s-background-color', $attributes['backgroundColor'] ) => $attributes['backgroundColor'], + sprintf( 'icon-%s', $attributes['dividerIcon'] ) => $attributes['dividerIcon'], + ] +); + +?> + +<div class="<?php echo esc_attr( $classes ); ?>"> + <?php echo wp_kses_post( $content ); ?> +</div> + diff --git a/private/src/blocks/_deprecated/links-with-icons/style.scss b/private/src/blocks/_deprecated/links-with-icons/style.scss new file mode 100644 index 00000000..c4e00c20 --- /dev/null +++ b/private/src/blocks/_deprecated/links-with-icons/style.scss @@ -0,0 +1,7 @@ +@use "./group"; +@use "./elements"; +@use "./spacer"; + +.rowColumn .linksWithIcons { + margin: 0 auto; +} diff --git a/private/src/scripts/editor/blocks/post-list/PostListEdit.jsx b/private/src/blocks/_deprecated/post-list/PostListEdit.jsx similarity index 100% rename from private/src/scripts/editor/blocks/post-list/PostListEdit.jsx rename to private/src/blocks/_deprecated/post-list/PostListEdit.jsx diff --git a/private/src/scripts/editor/blocks/post-list/PostsWrapper.jsx b/private/src/blocks/_deprecated/post-list/PostsWrapper.jsx similarity index 94% rename from private/src/scripts/editor/blocks/post-list/PostsWrapper.jsx rename to private/src/blocks/_deprecated/post-list/PostsWrapper.jsx index 640115a8..4866217d 100644 --- a/private/src/scripts/editor/blocks/post-list/PostsWrapper.jsx +++ b/private/src/blocks/_deprecated/post-list/PostsWrapper.jsx @@ -102,12 +102,12 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { let defaultStyleOptions = [ { - // translators: [admin] + /* translators: [admin] */ label: __('Link List', 'amnesty'), value: 'list', }, { - // translators: [admin] + /* translators: [admin] */ label: __('Grid', 'amnesty'), value: 'grid', }, @@ -115,27 +115,27 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { let defaultDisplayTypes = [ { - // translators: [admin] + /* translators: [admin] */ label: __('Category', 'amnesty'), value: 'category', }, { - // translators: [admin] + /* translators: [admin] */ label: __('Object Selection', 'amnesty'), value: 'select', }, { - // translators: [admin] + /* translators: [admin] */ label: __('Custom', 'amnesty'), value: 'custom', }, { - // translators: [admin] + /* translators: [admin] */ label: __('Taxonomy', 'amnesty'), value: 'taxonomy', }, { - // translators: [admin] + /* translators: [admin] */ label: __('Author', 'amnesty'), value: 'author', }, @@ -168,7 +168,7 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> {defaultStyleOptions.length > 0 && ( <SelectControl - // translators: [admin] + /* translators: [admin] */ label={__('Style', 'amnesty')} options={defaultStyleOptions} value={attributes.style} @@ -176,7 +176,7 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { /> )} <SelectControl - // translators: [admin] + /* translators: [admin] */ label={__('Type', 'amnesty')} options={defaultDisplayTypes} value={attributes.type} @@ -195,7 +195,7 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { )} {attributes.type === 'category' && ( <RangeControl - // translators: [admin] + /* translators: [admin] */ label={__('Number of posts to show:', 'amnesty')} min={1} max={maxQuantity} @@ -205,7 +205,7 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { )} {attributes.type === 'feed' && ( <RangeControl - // translators: [admin] + /* translators: [admin] */ label={__('Number of posts to show:', 'amnesty')} min={1} max={maxQuantity} @@ -215,7 +215,7 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { )} {attributes.type === 'taxonomy' && ( <RangeControl - // translators: [admin] + /* translators: [admin] */ label={__('Number of posts to show:', 'amnesty')} min={1} max={maxQuantity} @@ -225,7 +225,7 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { )} {attributes.type === 'category' && ( <ToggleControl - // translators: [admin] + /* translators: [admin] */ label={__('Use related categories where supported', 'amnesty')} checked={attributes.categoryRelated} onChange={this.createUpdateAttribute('categoryRelated')} @@ -234,9 +234,9 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { {attributes.type === 'select' && ( <button onClick={this.togglePreview}> {this.state.preview - ? // translators: [admin] + ? /* translators: [admin] */ __('Hide Preview', 'amnesty') - : // translators: [admin] + : /* translators: [admin] */ __('Show Preview', 'amnesty')} </button> )} @@ -273,13 +273,13 @@ const PostsWrapper = createHigherOrderComponent((BlockEdit) => { </label> )} <ToggleControl - // translators: [admin] + /* translators: [admin] */ label={__('Display Post Author', 'amnesty')} checked={attributes.displayAuthor} onChange={this.createUpdateAttribute('displayAuthor')} /> <ToggleControl - // translators: [admin] + /* translators: [admin] */ label={__('Display Post Date', 'amnesty')} checked={attributes.displayPostDate} onChange={this.createUpdateAttribute('displayPostDate')} diff --git a/private/src/scripts/editor/blocks/post-list/components/Appender.jsx b/private/src/blocks/_deprecated/post-list/components/Appender.jsx similarity index 100% rename from private/src/scripts/editor/blocks/post-list/components/Appender.jsx rename to private/src/blocks/_deprecated/post-list/components/Appender.jsx diff --git a/private/src/blocks/_deprecated/post-list/components/DisplayAuthor.jsx b/private/src/blocks/_deprecated/post-list/components/DisplayAuthor.jsx new file mode 100644 index 00000000..c5d14272 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/DisplayAuthor.jsx @@ -0,0 +1,268 @@ +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import * as api from './post-selector/api'; + +const { difference, isString } = lodash; +const { Component } = wp.element; +const { __ } = wp.i18n; + +class DisplayAuthor extends Component { + constructor(...args) { + super(...args); + this.state = { + results: [], + loading: false, + }; + } + + static normaliseAuthor = (author = '[]') => { + let normal = author; + + if (isString(normal)) { + normal = JSON.parse(normal); + } + + if (!Array.isArray(normal)) { + normal = [normal]; + } + + normal = normal.map((val) => { + if (isString(val)) { + return JSON.parse(val); + } + + return val; + }); + + return normal.filter(Boolean); + }; + + componentDidMount() { + if (this.props.authors) { + this.fetchPostsByAuthor(); + } + } + + componentDidUpdate(prevProps) { + if (!prevProps.author && !this.props.authors) { + return; + } + + const prev = DisplayAuthor.normaliseAuthor(prevProps.authors); + const next = DisplayAuthor.normaliseAuthor(this.props.authors); + + if (prev.length !== next.length) { + this.fetchPostsByAuthor(); + return; + } + + let propsAreEquivalent = true; + + next.forEach((a, i) => { + const b = prev[i]; + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + + if (difference(aKeys, bKeys).length > 0) { + propsAreEquivalent = false; + return; + } + + aKeys.forEach((k) => { + if (a[k] === b[k]) { + return; + } + + propsAreEquivalent = false; + }); + }); + + if (!propsAreEquivalent) { + this.fetchPostsByAuthor(); + } + } + + fetchPostsByAuthor() { + const { authors } = this.props; + + const defaultArgs = { + per_page: 10, + type: 'post', + }; + + const requestArguments = { + ...defaultArgs, + }; + + let value = DisplayAuthor.normaliseAuthor(authors); + + if (!value.length) { + this.setState({ + results: [], + category: [], + }); + return; + } + + this.setState({ + loading: true, + }); + + // We store category as string of an array of objects + // to retain the label for the select box. + value = value.map((v) => v.value).join(','); + + api + .getPostsFromAuthors(requestArguments, value) + .then((data, i, xhr) => { + // eslint-disable-line + const posts = Array.from(data).map((p) => { + if (!p.featured_media || p.featured_media < 1) { + return { + ...p, + featured_image: false, + }; + } + + return { + ...p, + // eslint-disable-next-line no-underscore-dangle + featured_image: p._embedded['wp:featuredmedia'][0].source_url || false, + }; + }); + + return { + xhr, + data: posts, + }; + }) + .then(({ data = [] }) => { + this.setState({ + results: DisplayAuthor.alterResults(data), + loading: false, + }); + }); + } + + static strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; + }; + + static alterResults = (response) => + response.map((resp) => { + // eslint-disable-next-line no-underscore-dangle + const tags = resp._embedded['wp:term'] + .reduce((prev, curr) => [...prev, ...curr], []) + .map((tag) => ({ + title: tag.name, + link: tag.link, + })); + + let featuredImage = false; + + if (resp.featured_media || resp.featured_media > 0) { + // eslint-disable-next-line no-underscore-dangle + featuredImage = resp._embedded['wp:featuredmedia'][0].source_url || false; + } + + let excerpt = DisplayAuthor.strip(resp.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + date: resp.datePosted, + authorName: resp.authorName, + }; + }); + + render() { + const { style, prefix, showAuthor, showPostDate } = this.props; + const { loading, results } = this.state; + // const category = this.normaliseCategory(this.props.category); + const { authors } = this.props; + const isList = style === 'list'; + const isGrid = style === 'grid'; + const hasResults = results.length > 0; + + if (loading) { + return ( + <div> + <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (!authors) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('Select an author.', 'amnesty')} + </p> + </div> + ); + } + + if (!hasResults) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('No Items found', 'amnesty')} + </p> + </div> + ); + } + + if (isList) { + return ( + <div> + <ul className="linkList linklist-container"> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (isGrid) { + return [1, 2, 3, 5, 6, 7].indexOf(this.props.amount) > -1 ? ( + <div> + <div className={`grid grid-${this.props.amount}`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ) : ( + <div> + <div className={`grid grid-many`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ); + } + + return <div></div>; + } +} + +export default DisplayAuthor; diff --git a/private/src/blocks/_deprecated/post-list/components/DisplayCategories.jsx b/private/src/blocks/_deprecated/post-list/components/DisplayCategories.jsx new file mode 100644 index 00000000..c14df0c8 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/DisplayCategories.jsx @@ -0,0 +1,278 @@ +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import PetitionItem from './display/PetitionItem.jsx'; + +const { difference, isString } = lodash; +const { Component } = wp.element; +const { __ } = wp.i18n; + +class DisplayCategories extends Component { + constructor(...args) { + super(...args); + this.state = { + results: [], + loading: false, + }; + } + + static normaliseCategory = (category = '[]') => { + let normal = category; + + if (isString(normal)) { + normal = JSON.parse(normal); + } + + if (!Array.isArray(normal)) { + normal = [normal]; + } + + normal = normal.map((val) => { + if (isString(val)) { + return JSON.parse(val); + } + + return val; + }); + + return normal.filter(Boolean); + }; + + componentDidMount() { + this.fetchPostsByCategory(); + } + + componentDidUpdate(prevProps) { + if (!prevProps.category && !this.props.category) { + return; + } + + const prev = DisplayCategories.normaliseCategory(prevProps.category); + const next = DisplayCategories.normaliseCategory(this.props.category); + + if (prev.length !== next.length) { + this.fetchPostsByCategory(); + return; + } + + let propsAreEquivalent = true; + + next.forEach((a, i) => { + const b = prev[i]; + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + + if (difference(aKeys, bKeys).length > 0) { + propsAreEquivalent = false; + return; + } + + aKeys.forEach((k) => { + if (a[k] === b[k]) { + return; + } + + propsAreEquivalent = false; + }); + }); + + if (!propsAreEquivalent) { + this.fetchPostsByCategory(); + } + } + + fetchPostsByCategory() { + const { category, overrideTypes } = this.props; + + let value = DisplayCategories.normaliseCategory(category); + + if (!value.length) { + this.setState({ + results: [], + category: [], + }); + return; + } + + this.setState({ + loading: true, + }); + + // We store category as string of an array of objects + // to retain the label for the select box. + value = value.map((v) => v.value).join(','); + + let restPath = `/wp/v2/posts?category=${value}&per_page=${this.props.amount}&_embed`; + + if (overrideTypes) { + const overrideBase = `${overrideTypes[Object.keys(overrideTypes)[0]].rest_base}`; + restPath = `/wp/v2/${overrideBase}?category=${value}&per_page=${this.props.amount}&_embed`; + } + + // /posts?filter[category_name]=MyCategory + wp.apiRequest({ + path: restPath, + }).then((results) => { + this.setState({ + results: DisplayCategories.alterResults(results), + loading: false, + }); + }); + } + + static strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; + }; + + static alterResults = (response) => + response.map((resp) => { + // eslint-disable-next-line no-underscore-dangle + let tags = []; + // eslint-disable-next-line no-underscore-dangle + if (resp._embedded['wp:term']) { + // eslint-disable-next-line no-underscore-dangle + tags = resp._embedded['wp:term'] + .reduce((prev, curr) => [...prev, ...curr], []) + .map((tag) => ({ + title: tag.name, + link: tag.link, + })); + } + + let featuredImage = false; + + if (resp.featured_media || resp.featured_media > 0) { + const { get } = lodash; + featuredImage = + get( + resp, + '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', + ) || get(resp, '_embedded["wp:featuredmedia"][0].source_url', false); + } + + let excerpt = DisplayCategories.strip(resp.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + date: resp.datePosted, + authorName: resp.authorName, + }; + }); + + render() { + const { style, prefix, showAuthor, showPostDate } = this.props; + const { loading, results } = this.state; + const category = DisplayCategories.normaliseCategory(this.props.category); + + const isList = style === 'list'; + const isGrid = style === 'grid'; + const isPetition = style === 'petition'; + const hasCategory = category.length > 0; + const hasResults = results.length > 0; + + if (loading) { + return ( + <div> + <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (!hasCategory) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('Select a category.', 'amnesty')} + </p> + </div> + ); + } + + if (!hasResults) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('No Items found', 'amnesty')} + </p> + </div> + ); + } + + if (isList) { + return ( + <div> + <ul className="linkList linklist-container"> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (isGrid) { + return [1, 2, 3, 5, 6, 7].indexOf(this.props.amount) > -1 ? ( + <div> + <div className={`grid grid-${this.props.amount}`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ) : ( + <div> + <div className={`grid grid-many`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ); + } + + if (isPetition) { + return [1, 2, 3, 5, 6, 7].indexOf(this.props.amount) > -1 ? ( + <div> + <div className={`grid grid-${this.props.amount} petition-grid`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <PetitionItem key={`${this.props.prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ) : ( + <div> + <div className={`grid grid-many petition-grid`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <PetitionItem key={`${this.props.prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ); + } + + return <div></div>; + } +} + +export default DisplayCategories; diff --git a/private/src/scripts/editor/blocks/post-list/components/DisplayCategoriesDeprecated.jsx b/private/src/blocks/_deprecated/post-list/components/DisplayCategoriesDeprecated.jsx similarity index 100% rename from private/src/scripts/editor/blocks/post-list/components/DisplayCategoriesDeprecated.jsx rename to private/src/blocks/_deprecated/post-list/components/DisplayCategoriesDeprecated.jsx diff --git a/private/src/blocks/_deprecated/post-list/components/DisplayCustom.jsx b/private/src/blocks/_deprecated/post-list/components/DisplayCustom.jsx new file mode 100644 index 00000000..4574921c --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/DisplayCustom.jsx @@ -0,0 +1,178 @@ +/* eslint-disable camelcase */ +import LinkList from './editable/LinkList.jsx'; +import GridItem from './editable/GridItem.jsx'; +import Appender from './Appender.jsx'; + +const { Component } = wp.element; + +class DisplayCustom extends Component { + static defaultObject = { + excerpt: '', + featured_image_id: '', + featured_image: '', + tag: '', + tagLink: '', + title: '', + titleLink: '', + date: null, + authorName: '', + }; + + // eslint-disable-next-line camelcase + createUpdateMediaAttribute = + (index) => + ({ featured_image_id, featured_image }) => { + if (this.props.custom[index]) { + return this.props.setAttributes({ + custom: [ + ...this.props.custom.map((item, i) => + index === i + ? { + ...item, + featured_image, + featured_image_id, + } + : item, + ), + ], + }); + } + + return this.props.setAttributes({ + custom: [ + ...this.props.custom, + { + ...DisplayCustom.defaultObject, + featured_image, + featured_image_id, + }, + ], + }); + }; + + /** + * Creates a higher order function that takes the current item index + * from there the returned function takes a parameter of key, + * this could be title or any other key from the object + * the final function takes a parameter of value, this changes + * the value of the desired key and in the desired item + * @param index + * @returns {function(*=): Function} + */ + createUpdateAttribute = (index) => (key) => (value) => { + // If the index already exists just update the value for that specific key + // This should always be the case however there was an occasion where + // the default object wasnt created so this is a safe guard + if (this.props.custom[index]) { + return this.props.setAttributes({ + custom: [ + ...this.props.custom.map((item, i) => + index === i + ? { + ...item, + [key]: value, + } + : item, + ), + ], + }); + } + + return this.props.setAttributes({ + custom: [ + ...this.props.custom, + { + ...DisplayCustom.defaultObject, + [key]: value, + }, + ], + }); + }; + + addItem = () => + this.props.setAttributes({ + custom: [...this.props.custom, { ...DisplayCustom.defaultObject }], + }); + + createRemoveItem = (index) => () => + this.props.setAttributes({ + custom: [...this.props.custom.filter((item, i) => i !== index)], + }); + + render() { + let { custom = [] } = this.props; + const { style, prefix } = this.props; + + if (style === 'petition') { + return null; + } + + if (!custom.length) { + custom = [{ ...DisplayCustom.defaultObject }]; + } + + let appender = null; + if (custom.length < 8) { + appender = <Appender onClick={this.addItem} />; + } + + if (style !== 'grid') { + return ( + <div> + <ul className="linkList"> + {custom.map((item, index) => ( + <LinkList + key={`${prefix}-${index}`} + {...item} + showAuthor={this.props.showAuthor} + showPostDate={this.props.showPostDate} + createUpdate={this.createUpdateAttribute(index)} + createRemove={this.createRemoveItem(index)} + /> + ))} + </ul> + {appender} + </div> + ); + } + + // style === 'grid' + if ([1, 2, 3, 5, 6, 7].indexOf(custom.length) > -1) { + return ( + <div> + <div className={`grid grid-${custom.length}`}> + {custom.map((item, index) => ( + <GridItem + key={`${prefix}-${index}`} + {...item} + createUpdate={this.createUpdateAttribute(index)} + createRemove={this.createRemoveItem(index)} + updateMedia={this.createUpdateMediaAttribute(index)} + /> + ))} + </div> + {appender} + </div> + ); + } + + return ( + <div> + <div className={`grid grid-many`}> + {custom.map((item, index) => ( + <GridItem + key={`${prefix}-${index}`} + {...item} + createUpdate={this.createUpdateAttribute(index)} + createRemove={this.createRemoveItem(index)} + updateMedia={this.createUpdateMediaAttribute(index)} + /> + ))} + </div> + {appender} + </div> + ); + } +} + +export default DisplayCustom; diff --git a/private/src/blocks/_deprecated/post-list/components/DisplayFeed.jsx b/private/src/blocks/_deprecated/post-list/components/DisplayFeed.jsx new file mode 100644 index 00000000..0ffccf92 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/DisplayFeed.jsx @@ -0,0 +1,202 @@ +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import PetitionItem from './display/PetitionItem.jsx'; + +const { get, isString } = lodash; +const { Component } = wp.element; +const { __ } = wp.i18n; + +class DisplayFeed extends Component { + constructor(...args) { + super(...args); + this.state = { + results: [], + loading: false, + }; + } + + static normaliseCategory = (category = '[]') => { + let normal = category; + + if (isString(normal)) { + normal = JSON.parse(normal); + } + + if (!Array.isArray(normal)) { + normal = [normal]; + } + + normal = normal.map((val) => { + if (isString(val)) { + return JSON.parse(val); + } + + return val; + }); + + return normal.filter(Boolean); + }; + + componentDidMount() { + this.fetchPostsByPostType(); + } + + fetchPostsByPostType() { + const { amount, overrideTypes } = this.props; + + const postTypes = []; + + Object.keys(overrideTypes).map((key) => { + postTypes.push(key); + return postTypes; + }); + + if (!postTypes.length) { + this.setState({ + results: [], + types: [], + }); + return; + } + + this.setState({ + loading: true, + }); + + const postString = postTypes.join(', '); + + wp.apiRequest({ + path: `/wp/v2/${postString}?_embed&per_page=${amount}`, + }).then((results) => { + this.setState({ + results: DisplayFeed.alterResults(results), + loading: false, + }); + }); + } + + static strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; + }; + + static alterResults = (response) => + response.map((resp) => { + const tags = []; + const sources = [ + '_links["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', + '_links["wp:featuredmedia"][0].source_url', + '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', + '_embedded["wp:featuredmedia"][0].source_url', + ]; + + let featuredImage = false; + + sources.forEach((source) => { + featuredImage = featuredImage || get(resp, source, false); + }); + + let excerpt = DisplayFeed.strip(resp.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + date: resp.datePosted, + authorName: resp.authorName, + }; + }); + + render() { + const { style, prefix, showAuthor, showPostDate } = this.props; + const { loading, results } = this.state; + + const isList = style === 'list'; + const isGrid = style === 'grid'; + const isPetition = style === 'petition'; + const hasResults = results.length > 0; + + if (loading) { + return ( + <div> + <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (!hasResults) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('No Items found', 'amnesty')} + </p> + </div> + ); + } + + if (isList) { + return ( + <div> + <ul className="linkList linklist-container"> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (isGrid) { + return [1, 2, 3, 5, 6, 7].indexOf(this.props.amount) > -1 ? ( + <div> + <div className={`grid grid-${this.props.amount}`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ) : ( + <div> + <div className={`grid grid-many`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ); + } + + if (isPetition) { + return ( + <div> + <div className={`grid grid-many petition-grid`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <PetitionItem key={`${this.props.prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ); + } + + return <div></div>; + } +} + +export default DisplayFeed; diff --git a/private/src/blocks/_deprecated/post-list/components/DisplaySelect.jsx b/private/src/blocks/_deprecated/post-list/components/DisplaySelect.jsx new file mode 100644 index 00000000..28d324d6 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/DisplaySelect.jsx @@ -0,0 +1,537 @@ +import SelectPreview from './SelectPreview.jsx'; +import PostSelect from './post-selector/PostSelector.jsx'; +import * as api from './post-selector/api'; + +const { Component } = wp.element; + +/** + * Returns a unique array of objects based on a desired key. + * @param {array} arr - array of objects. + * @param {string|int} key - key to filter objects by + */ +export const uniqueBy = (arr, key) => { + const keys = []; + return arr.filter((item) => { + if (keys.indexOf(item[key]) !== -1) { + return false; + } + + return keys.push(item[key]); + }); +}; + +/** + * Returns a unique array of objects based on the id property. + * @param {array} arr - array of objects to filter. + * @returns {*} + */ +export const uniqueById = (arr) => uniqueBy(arr, 'id'); + +/** + * Debounce a function by limiting how often it can run. + * @param {function} func - callback function + * @param {Integer} wait - Time in milliseconds how long it should wait. + * @returns {Function} + */ +export const debounce = (func, wait) => { + let timeout = null; + + return () => { + const context = this; + // eslint-disable-next-line + const args = arguments; + + const later = () => { + func.apply(context, args); + }; + + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; +}; + +/** + * PostSelector Component + */ +class DisplaySelect extends Component { + /** + * Constructor for PostSelector Component. + * Sets up state, and creates bindings for functions. + * @param array args - All arguments. + */ + constructor(...args) { + super(...args); + + this.state = { + filter: '', + filterLoading: false, + filterPosts: [], + initialLoading: false, + loading: false, + pages: {}, + pagesTotal: {}, + paging: false, + posts: [], + type: 'post', + types: [], + taxonomies: [], + taxonomy: '', + terms: [], + term: [], + }; + } + + /** + * When the component mounts it calls this function. + * Fetches posts types, selected posts then makes first call for posts + */ + componentDidMount() { + this.setState({ + loading: true, + initialLoading: true, + }); + + let defaultType; + + if (this.props.overrideTypes) { + Object.keys(this.props.overrideTypes).map((key, index) => { + if (index === 0) { + // this.setState({ type: this.props.overrideTypes[key].rest_base }); + defaultType = key; + } + return key; + }); + + this.setState( + { + types: this.props.overrideTypes, + type: defaultType !== null ? defaultType : 'post', + }, + () => { + this.retrieveSelectedPosts().then(() => { + this.setState({ + initialLoading: false, + }); + this.getPosts().then(() => { + this.setState({ loading: false }); + }); + }); + }, + ); + } else { + api.getPostTypes().then((data) => { + const types = data; + delete types.attachment; + delete types.wp_block; + delete types.sidebar; + + this.setState( + { + types, + }, + () => { + this.retrieveSelectedPosts().then(() => { + this.setState({ + initialLoading: false, + }); + this.getPosts().then(() => { + this.setState({ loading: false }); + }); + }); + }, + ); + }); + } + + // get taxonomies to filter by + api.getTaxonomies().then((items) => { + this.setState({ + taxonomies: items, + }); + }); + } + + /** + * GetPosts wrapper, builds the request argument based state and parameters passed/ + * @param {object} args - desired arguments (can be empty). + * @returns {Promise<T>} + */ + getPosts = (args = {}) => { + const pageKey = this.state.filter ? false : this.state.type; + const { get } = lodash; + const defaultArgs = { + per_page: 10, + type: this.state.type, + search: this.state.filter, + page: this.state.pages[pageKey] || 1, + show_hidden: true, + }; + + const requestArguments = { + ...defaultArgs, + ...args, + }; + + Object.keys(this.state.types).filter((key) => { + if (key === this.state.type) { + requestArguments.restBase = this.state.types[key].rest_base; + } + return this.state.types; + }); + + return api + .getPosts(requestArguments, this.state.taxonomy, this.state.term) + .then((data, i, xhr) => { + const posts = Array.from(data).map((p) => { + if (!p.featured_media || p.featured_media < 1) { + return { + ...p, + featured_image: false, + }; + } + + return { + ...p, + featured_image: + get( + p, + '_embedded["wp:featuredmedia"][0].media_details.sizes["logomark@2x"].source_url', + ) || get(p, '_embedded["wp:featuredmedia"][0].source_url', false), + }; + }); + + return { + xhr, + data: posts, + }; + }) + .then(({ data = [], xhr }) => { + if (requestArguments.search) { + this.setState({ + filterPosts: + requestArguments.page > 1 ? uniqueById([...this.state.filterPosts, ...data]) : data, + pages: { + ...this.state.pages, + filter: requestArguments.page, + }, + pagesTotal: { + ...this.state.pagesTotal, + filter: xhr.getResponseHeader('x-wp-totalpages'), + }, + }); + + return { data, xhr }; + } + + this.setState({ + // was posts: data but causes issue with pagination on the post list, + posts: uniqueById([...this.state.posts, ...data]), + pages: { + ...this.state.pages, + [pageKey]: requestArguments.page, + }, + pagesTotal: { + ...this.state.pagesTotal, + [pageKey]: xhr.getResponseHeader('x-wp-totalpages'), + }, + }); + + // return response to continue the chain + return { data, xhr }; + }); + }; + + /** + * Gets the selected posts by id from the `posts` state object and + * sorts them by their position in the selected array. + * + * @returns Array of objects. + */ + getSelectedPosts = () => { + const { selectedPosts } = this.props; + + const items = this.state.posts + .filter(({ id }) => selectedPosts.indexOf(id) !== -1) + .sort((a, b) => { + const aIndex = this.props.selectedPosts.indexOf(a.id); + const bIndex = this.props.selectedPosts.indexOf(b.id); + + if (aIndex > bIndex) { + return 1; + } + + if (aIndex < bIndex) { + return -1; + } + + return 0; + }); + + return items; + }; + + /** + * Makes the necessary api calls to fetch the selected posts and returns a promise. + * @returns {*} + */ + retrieveSelectedPosts = () => { + const selected = this.props.selectedPosts; + const { types } = this.state; + + if (!selected.length > 0) { + // return a fake promise that auto resolves. + // this possibly needs refactoring. + // eslint-disable-next-line no-promise-executor-return + return new Promise((resolve) => resolve()); + } + + return Promise.all( + Object.keys(types).map((type) => + this.getPosts({ + include: this.props.selectedPosts.join(','), + per_page: 100, + type, + }), + ), + ); + }; + + /** + * Adds desired post id to the selectedPosts List + * @param {Integer} post_id + */ + addPost = (postId) => { + if (this.state.filter) { + const post = this.state.filterPosts.filter((p) => p.id === postId); + const posts = uniqueById([...this.state.posts, ...post]); + + this.setState({ + posts, + }); + } + + this.updateSelectedPosts([...this.props.selectedPosts, postId]); + }; + + /** + * Removes desired post id to the selectedPosts List + * @param {Integer} postId + */ + removePost = (postId) => { + this.updateSelectedPosts([...this.props.selectedPosts].filter((id) => id !== postId)); + }; + + reorderPosts = (posts) => { + const items = Array.from(this.props.selectedPosts); + const [reorderedItem] = items.splice(posts.source.index, 1); + items.splice(posts.destination.index, 0, reorderedItem); + + this.updateSelectedPosts(items); + }; + + /** + * Update the selected posts attributes. + * @param posts + * @returns {*} + */ + updateSelectedPosts = (posts) => { + const uniq = [...new Set(posts)]; + + this.props.setAttributes({ + selectedPosts: [...uniq], + }); + }; + + /** + * Event handler for when the post type select box changes in value. + * @param string type - comes from the event object target. + */ + handlePostTypeChange = ({ target: { value: type = '' } = {} } = {}) => { + this.setState({ type, loading: true }, () => { + // fetch posts, then set loading = false + this.getPosts().then(() => this.setState({ loading: false })); + }); + }; + + /** + * Event handler for when the post type select box changes in value. + * @param string type - comes from the event object target. + */ + handleTaxonomyChange = ({ target: { value: taxonomy = '' } = {} } = {}) => { + const allTerms = api.getTerms(taxonomy); + + allTerms + .then((data) => { + this.setState({ terms: data }); + }) + .then(() => { + this.setState({ taxonomy, loading: true }, () => { + this.getPosts().then(() => this.setState({ loading: false })); + }); + }); + + // this.setState({ taxonomy, loading: true }, () => { + // this.getPosts().then(() => this.setState({ loading: false })); + // }); + }; + + handleTermChange = ({ target: { value: term = '' } = {} } = {}) => { + this.setState({ term, loading: true }, () => { + this.getPosts().then(() => this.setState({ loading: false })); + }); + }; + + /** + * Handles the search box input value + * @param string type - comes from the event object target. + */ + handleInputFilterChange = ({ target: { value: filter = '' } = {} } = {}) => + this.setState( + { + filter, + }, + () => { + if (!filter) { + // remove filtered posts + return this.setState({ filteredPosts: [], filtering: false }); + } + + return this.doPostFilter(); + }, + ); + + /** + * Actual api call for searching for query, this function is debounced in constructor. + */ + doPostFilter = () => { + const { filter = '' } = this.state; + + if (!filter) { + return; + } + + this.setState({ + filtering: true, + filterLoading: true, + }); + + this.getPosts().then(() => { + this.setState({ + filterLoading: false, + }); + }); + }; + + /** + * Handles the pagination of post types. + */ + doPagination = () => { + this.setState({ + paging: true, + }); + + const pageKey = this.state.filter ? 'filter' : this.state.type; + const page = parseInt(this.state.pages[pageKey], 10) + 1 || 2; + + this.getPosts({ page }).then(() => + this.setState({ + paging: false, + }), + ); + }; + + /** + * Strip html tag from the content + * @param {string} html - Current html content + * @returns {string} + */ + static strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; + }; + + getPreviewPosts() { + const selectedPosts = this.getSelectedPosts(); + + if (!selectedPosts) { + return []; + } + + let tags = []; + const results = selectedPosts.map((resp) => { + // eslint-disable-next-line no-underscore-dangle + if (resp._embedded) { + // eslint-disable-next-line no-underscore-dangle + tags = (resp._embedded['wp:term'] || []) + .reduce((prev, curr) => [...prev, ...curr], []) + .map((tag) => ({ + title: tag.name, + link: tag.link, + })); + } + + let featuredImage = false; + + if (resp.featured_media || resp.featured_media > 0) { + const { get } = lodash; + featuredImage = + get( + resp, + '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', + ) || get(resp, '_embedded["wp:featuredmedia"][0].source_url', false); + } + + let excerpt = DisplaySelect.strip(resp.excerpt.rendered); + + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : excerpt; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + authorName: resp.authorName, + date: resp.datePosted, + }; + }); + return results; + } + + /** + * Renders the PostSelector component. + */ + render() { + return ( + <div> + {this.props.preview && ( + <SelectPreview + posts={this.getPreviewPosts()} + loading={this.state.initialLoading} + style={this.props.style} + prefix={this.props.prefix} + showAuthor={this.props.showAuthor} + showPostDate={this.props.showPostDate} + /> + )} + {!this.props.preview && ( + <PostSelect + state={this.state} + handleInputFilterChange={this.handleInputFilterChange} + handlePostTypeChange={this.handlePostTypeChange} + getSelectedPosts={this.getSelectedPosts} + removePost={this.removePost} + addPost={this.addPost} + doPagination={this.doPagination} + handleTaxonomyChange={this.handleTaxonomyChange} + handleTermChange={this.handleTermChange} + reorderPosts={this.reorderPosts} + /> + )} + </div> + ); + } +} + +export default DisplaySelect; diff --git a/private/src/blocks/_deprecated/post-list/components/DisplayTaxonomies.jsx b/private/src/blocks/_deprecated/post-list/components/DisplayTaxonomies.jsx new file mode 100644 index 00000000..410461ef --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/DisplayTaxonomies.jsx @@ -0,0 +1,307 @@ +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import * as api from './post-selector/api'; + +const { difference, isString, isEqual } = lodash; +const { Component } = wp.element; +const { __ } = wp.i18n; + +class DisplayTaxonomies extends Component { + constructor(...args) { + super(...args); + this.state = { + results: [], + loading: false, + }; + } + + static normaliseCategory = (category = '[]') => { + let normal = category; + + if (isString(normal)) { + normal = JSON.parse(normal); + } + + if (!Array.isArray(normal)) { + normal = [normal]; + } + + normal = normal.map((val) => { + if (isString(val)) { + return JSON.parse(val); + } + + return val; + }); + + return normal.filter(Boolean); + }; + + componentDidMount() { + if (this.props.taxonomy) { + this.fetchPostsByTaxonomy(); + } + } + + componentDidUpdate(prevProps) { + if (!prevProps.taxonomy && !this.props.taxonomy) { + return; + } + + if (!prevProps.terms && !this.props.terms) { + return; + } + + const prevTaxonomy = prevProps.taxonomy; + const nextTaxonomy = this.props.taxonomy; + + if (!isEqual(prevTaxonomy, nextTaxonomy)) { + this.fetchPostsByTaxonomy(); + } + + const prev = prevProps.terms; + const next = this.props.terms; + + if (!next) { + this.fetchPostsByTaxonomy(); + return; + } + + if (!prev) { + this.fetchPostsByTaxonomy(); + return; + } + + if (prev.length !== next.length || next === null) { + this.fetchPostsByTaxonomy(); + return; + } + + let propsAreEquivalent = true; + + next.forEach((a, i) => { + const b = prev[i]; + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + + if (difference(aKeys, bKeys).length > 0) { + propsAreEquivalent = false; + return; + } + + aKeys.forEach((k) => { + if (a[k] === b[k]) { + return; + } + + propsAreEquivalent = false; + }); + }); + + if (!propsAreEquivalent) { + this.fetchPostsByTaxonomy(); + } + } + + fetchPostsByTaxonomy() { + const { taxonomy, terms } = this.props; + + const defaultArgs = { + per_page: 10, + type: 'post', + }; + + const requestArguments = { + ...defaultArgs, + }; + + api + .getPostsFromTerms(requestArguments, taxonomy, terms) + // eslint-disable-next-line default-param-last + .then((data = [], i, xhr) => { + const posts = data.map((p) => { + if (!p.featured_media || p.featured_media < 1) { + return { + ...p, + featured_image: false, + }; + } + + return { + ...p, + // eslint-disable-next-line no-underscore-dangle + featured_image: p._embedded['wp:featuredmedia'][0].source_url || false, + }; + }); + + return { + xhr, + data: posts, + }; + }) + .then(({ data = [] }) => { + this.setState({ + results: DisplayTaxonomies.alterResults(data), + loading: false, + }); + }) + .catch(() => { + this.setState({ + results: [], + loading: false, + }); + }); + } + + fetchPostsByCategory() { + const { category } = this.props; + + let value = DisplayTaxonomies.normaliseCategory(category); + + if (!value.length) { + this.setState({ + results: [], + category: [], + }); + return; + } + + this.setState({ + loading: true, + }); + + // We store category as string of an array of objects + // to retain the label for the select box. + value = value.map((v) => v.value).join(','); + + wp.apiRequest({ + path: `/wp/v2/posts/?categories=${value}&_embed`, + }).then((results) => + this.setState({ + results: DisplayTaxonomies.alterResults(results), + loading: false, + }), + ); + } + + static strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; + }; + + static alterResults = (response) => + response.map((resp) => { + // eslint-disable-next-line no-underscore-dangle + const tags = resp._embedded['wp:term'] + .reduce((prev, curr) => [...prev, ...curr], []) + .map((tag) => ({ + title: tag.name, + link: tag.link, + })); + + let featuredImage = false; + + if (resp.featured_media || resp.featured_media > 0) { + // eslint-disable-next-line no-underscore-dangle + featuredImage = resp._embedded['wp:featuredmedia'][0].source_url || false; + } + + let excerpt = DisplayTaxonomies.strip(resp.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + authorName: resp.authorName, + date: resp.datePosted, + }; + }); + + render() { + const { style, prefix, showAuthor, showPostDate } = this.props; + const { loading, results } = this.state; + const { taxonomy } = this.props; + const isList = style === 'list'; + const isGrid = style === 'grid'; + const hasResults = results.length > 0; + + if (loading) { + return ( + <div> + <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (!taxonomy) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('Select a taxonomy.', 'amnesty')} + </p> + </div> + ); + } + + if (!hasResults) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('No Items found', 'amnesty')} + </p> + </div> + ); + } + + if (isList) { + return ( + <div> + <ul className="linkList linklist-container"> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (isGrid) { + return [1, 2, 3, 5, 6, 7].indexOf(this.props.amount) > -1 ? ( + <div> + <div className={`grid grid-${this.props.amount}`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ) : ( + <div> + <div className={`grid grid-many`}> + {results + .filter((item, i) => i < this.props.amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ); + } + + return <div></div>; + } +} + +export default DisplayTaxonomies; diff --git a/private/src/blocks/_deprecated/post-list/components/SelectPreview.jsx b/private/src/blocks/_deprecated/post-list/components/SelectPreview.jsx new file mode 100644 index 00000000..8338d13b --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/SelectPreview.jsx @@ -0,0 +1,58 @@ +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import PetitionItem from './display/PetitionItem.jsx'; + +const { __ } = wp.i18n; + +const SelectPreview = ({ loading, posts = [], ...props }) => { + if (loading) { + /* translators: [admin] */ + return <p>{__('Loading…', 'amnesty')}</p>; + } + + if (!posts.length > 0) { + /* translators: [admin] */ + return <p>{__('No Posts.', 'amnesty')}</p>; + } + + if (props.style === 'grid') { + return [1, 2, 3, 5, 6, 7].indexOf(posts.length) > -1 ? ( + <div className={`grid grid-${posts.length}`}> + {posts.map((result) => ( + <GridItem key={`${props.prefix}-${result.id}`} {...result} /> + ))} + </div> + ) : ( + <div className={`grid grid-many`}> + {posts.map((result) => ( + <GridItem key={`${props.prefix}-${result.id}`} {...result} /> + ))} + </div> + ); + } + + if (props.style === 'petition') { + return ( + <div className={`grid grid-many petition-grid`}> + {posts.map((result) => ( + <PetitionItem key={`${props.prefix}-${result.id}`} {...result} /> + ))} + </div> + ); + } + + return ( + <ul className="linkList"> + {posts.map((result) => ( + <LinkList + key={`${props.prefix}-${result.id}`} + {...result} + showAuthor={props.showAuthor} + showPostDate={props.showPostDate} + /> + ))} + </ul> + ); +}; + +export default SelectPreview; diff --git a/private/src/scripts/editor/blocks/post-list/components/author-select.jsx b/private/src/blocks/_deprecated/post-list/components/author-select.jsx similarity index 95% rename from private/src/scripts/editor/blocks/post-list/components/author-select.jsx rename to private/src/blocks/_deprecated/post-list/components/author-select.jsx index de8b0941..a33ce881 100644 --- a/private/src/scripts/editor/blocks/post-list/components/author-select.jsx +++ b/private/src/blocks/_deprecated/post-list/components/author-select.jsx @@ -82,9 +82,9 @@ class AuthorSelect extends Component { isSearchable={true} placeholder={ this.state.loading - ? // translators: [admin] + ? /* translators: [admin] */ __('Loading', 'amnesty') - : // translators: [admin] + : /* translators: [admin] */ __('Select author', 'amnesty') } onInputChange={this.handleSearchInput} diff --git a/private/src/scripts/editor/blocks/post-list/components/category-select-deprecated.jsx b/private/src/blocks/_deprecated/post-list/components/category-select-deprecated.jsx similarity index 94% rename from private/src/scripts/editor/blocks/post-list/components/category-select-deprecated.jsx rename to private/src/blocks/_deprecated/post-list/components/category-select-deprecated.jsx index d1f018e4..9359a265 100644 --- a/private/src/scripts/editor/blocks/post-list/components/category-select-deprecated.jsx +++ b/private/src/blocks/_deprecated/post-list/components/category-select-deprecated.jsx @@ -62,9 +62,9 @@ class CategorySelect extends Component { isDisabled={this.state.loading} placeholder={ this.state.loading - ? // translators: [admin] + ? /* translators: [admin] */ __('Loading', 'amnesty') - : // translators: [admin] + : /* translators: [admin] */ __('Select a category', 'amnesty') } onChange={this.handleInputChange} diff --git a/private/src/scripts/editor/blocks/post-list/components/category-select.jsx b/private/src/blocks/_deprecated/post-list/components/category-select.jsx similarity index 95% rename from private/src/scripts/editor/blocks/post-list/components/category-select.jsx rename to private/src/blocks/_deprecated/post-list/components/category-select.jsx index 939d6584..8c82f248 100644 --- a/private/src/scripts/editor/blocks/post-list/components/category-select.jsx +++ b/private/src/blocks/_deprecated/post-list/components/category-select.jsx @@ -67,9 +67,9 @@ class CategorySelect extends Component { isDisabled={this.state.loading} placeholder={ this.state.loading - ? // translators: [admin] + ? /* translators: [admin] */ __('Loading', 'amnesty') - : // translators: [admin] + : /* translators: [admin] */ __('Select a category', 'amnesty') } onChange={this.handleInputChange} diff --git a/private/src/scripts/editor/blocks/post-list/components/display/GridItem.jsx b/private/src/blocks/_deprecated/post-list/components/display/GridItem.jsx similarity index 100% rename from private/src/scripts/editor/blocks/post-list/components/display/GridItem.jsx rename to private/src/blocks/_deprecated/post-list/components/display/GridItem.jsx diff --git a/private/src/scripts/editor/blocks/post-list/components/display/LinkList.jsx b/private/src/blocks/_deprecated/post-list/components/display/LinkList.jsx similarity index 100% rename from private/src/scripts/editor/blocks/post-list/components/display/LinkList.jsx rename to private/src/blocks/_deprecated/post-list/components/display/LinkList.jsx diff --git a/private/src/scripts/editor/blocks/post-list/components/display/PetitionItem.jsx b/private/src/blocks/_deprecated/post-list/components/display/PetitionItem.jsx similarity index 100% rename from private/src/scripts/editor/blocks/post-list/components/display/PetitionItem.jsx rename to private/src/blocks/_deprecated/post-list/components/display/PetitionItem.jsx diff --git a/private/src/blocks/_deprecated/post-list/components/editable/GridItem.jsx b/private/src/blocks/_deprecated/post-list/components/editable/GridItem.jsx new file mode 100644 index 00000000..d0d0fe66 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/editable/GridItem.jsx @@ -0,0 +1,64 @@ +const { RichText, URLInputButton, MediaUpload } = wp.blockEditor; +const { IconButton } = wp.components; +const { __ } = wp.i18n; +const { get } = lodash; + +const GridItem = (props) => ( + <article className="grid-item" style={{ backgroundImage: `url(${props.featured_image})` }}> + <div className="grid-itemContent"> + <span className="grid-itemMeta"> + <RichText + tagName="span" + onChange={props.createUpdate('tagText')} + value={props.tagText} + /* translators: [admin] */ + placeholder={__('(Insert Tag)', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton url={props.tagLink} onChange={props.createUpdate('tagLink')} /> + </span> + <h3 className="grid-itemTitle"> + <RichText + tagName="span" + onChange={props.createUpdate('title')} + value={props.title} + /* translators: [admin] */ + placeholder={__('(Insert Title)', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton url={props.titleLink} onChange={props.createUpdate('titleLink')} /> + </h3> + </div> + <div className="linkList-options"> + {props.featured_image_id && props.featured_image_id !== -1 && ( + <IconButton + icon="no-alt" + onClick={() => + props.updateMedia({ + featured_image_id: '', + featured_image: '', + }) + } + > + {/* translators: [admin] */ __('Remove Image', 'amnesty')} + </IconButton> + )} + <MediaUpload + onSelect={({ id, sizes, url }) => + props.updateMedia({ + featured_image_id: id, + featured_image: get(sizes, "['post-half@2x'].url", url), + }) + } + value={props.featured_image_id} + allowedTypes={['image']} + render={({ open }) => <IconButton icon="format-image" onClick={open} />} + /> + <IconButton onClick={props.createRemove} icon="trash" /> + </div> + </article> +); + +export default GridItem; diff --git a/private/src/blocks/_deprecated/post-list/components/editable/LinkList.jsx b/private/src/blocks/_deprecated/post-list/components/editable/LinkList.jsx new file mode 100644 index 00000000..77e1c955 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/editable/LinkList.jsx @@ -0,0 +1,107 @@ +const { RichText, URLInputButton } = wp.blockEditor; +const { Button, DatePicker } = wp.components; +const { useState } = wp.element; +const { __ } = wp.i18n; + +const LinkItem = (props) => { + const [datePickerIsVisible, showDatePicker] = useState(false); + const setDate = props.createUpdate('date'); + + const chooseDate = (value) => { + setDate(value); + showDatePicker(false); + }; + + return ( + <li> + <article className="linkList-item"> + <span className="linkList-itemMeta"> + <RichText + tagName="a" + onChange={props.createUpdate('tagText')} + value={props.tagText} + /* translators: [admin] */ + placeholder={__('Tag Name', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton + url={props.tagLink} + onChange={props.createUpdate('tagLink')} + isPressed={false} + /> + </span> + <h3 className="linkList-itemTitle"> + <RichText + tagName="a" + onChange={props.createUpdate('title')} + value={props.title} + /* translators: [admin] */ + placeholder={__('Insert Title', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton + url={props.titleLink} + onChange={props.createUpdate('titleLink')} + isPressed={false} + /> + </h3> + + <div className="postInfo-container"> + {props.showPostDate && ( + <div className="linkList-itemDate"> + {/* translators: [admin/front] */} + <span className="dateTerm">{__('Date:', 'amnesty')}</span> + {props.date && ( + <span className="dateDescription">{new Date(props.date).toLocaleDateString()}</span> + )} + <Button + icon="calendar-alt" + isPressed={false} + onClick={() => showDatePicker(!datePickerIsVisible)} + /> + <br /> + {/* translators: [admin] */} + <small className="linkList-itemDateData"> + <em>{__('Date may render differently on the site frontend', 'amnesty')}</em> + </small> + {datePickerIsVisible && ( + <div className="linkList-datePicker"> + <DatePicker + className="dateDescription" + currentDate={props.date} + onChange={chooseDate} + /> + </div> + )} + </div> + )} + {props.showAuthor && ( + <p className="linkList-itemAuthor"> + {/* translators: [admin/front] */} + <span className="authorTerm">{__('Author:', 'amnesty')}</span> + <RichText + tagName="span" + className="authorDescription" + value={props.authorName} + onChange={props.createUpdate('authorName')} + multiline={false} + allowedFormats={[]} + format="string" + /* translators: [admin] */ + placeholder={__('Author Name', 'amnesty')} + /> + </p> + )} + </div> + + <div className="linkList-options"> + <Button onClick={props.createRemove} icon="trash" /> + </div> + </article> + </li> + ); +}; + +export default LinkItem; diff --git a/private/src/blocks/_deprecated/post-list/components/post-selector/Post.jsx b/private/src/blocks/_deprecated/post-list/components/post-selector/Post.jsx new file mode 100755 index 00000000..107180f0 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/post-selector/Post.jsx @@ -0,0 +1,48 @@ +import { Draggable } from '@hello-pangea/dnd'; +/** + * Post Component. + * + * @param {string} postTitle - Current post title. + * @param {function} clickHandler - this is the handling function for the add/remove function + * @param {Integer} postId - Current post ID + * @param {string|boolean} featured_image - Posts featured image + * @param icon + * + * @returns {*} Post HTML. + */ +export const Post = ({ + title: { rendered: postTitle } = {}, + clickHandler, + id: postId, + featured_image: featuredImage = false, + icon, + index, +}) => { + const style = {}; + if (featuredImage) { + style.backgroundImage = `url("${featuredImage}")`; + } + + const postIdString = postId.toString(); + + return ( + <Draggable key={postId} draggableId={postIdString} index={index}> + {(provided) => ( + <article + ref={provided.innerRef} + {...provided.draggableProps} + {...provided.dragHandleProps} + className="post" + > + <figure className="post-figure" style={style}></figure> + <div className="post-body"> + <h3 className="post-title">{postTitle}</h3> + </div> + {icon && <button onClick={() => clickHandler(postId)}>{icon}</button>} + </article> + )} + </Draggable> + ); +}; + +export default Post; diff --git a/private/src/blocks/_deprecated/post-list/components/post-selector/PostList.jsx b/private/src/blocks/_deprecated/post-list/components/post-selector/PostList.jsx new file mode 100755 index 00000000..ef89d0b0 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/post-selector/PostList.jsx @@ -0,0 +1,71 @@ +import { DragDropContext, Droppable } from '@hello-pangea/dnd'; +import { Post } from './Post.jsx'; + +const { __ } = wp.i18n; + +/** + * PostList Component + * + * @param object props - Component props. + * + * @returns {*} + */ +export const PostList = (props) => { + const { filtered = false, loading = false, posts = [], action = () => {}, icon = null } = props; + + if (loading) { + /* translators: [admin] */ + return <p>{__('Loading Posts…', 'amnesty')}</p>; + } + + if (filtered && posts.length < 1) { + return ( + <div className="post-list"> + <p> + { + /* translators: [admin] */ __( + 'Your query yielded no results, please try again.', + 'amnesty', + ) + } + </p> + </div> + ); + } + + if (!posts || posts.length < 1) { + return <p>{/* translators: [admin] */ __('No Posts.', 'amnesty')}</p>; + } + + function handleOnDragEnd(result) { + props.reorderPosts(result); + } + + return ( + <div className="post-list"> + <DragDropContext onDragEnd={handleOnDragEnd}> + <Droppable droppableId="posts"> + {(provided) => ( + <div {...provided.droppableProps} ref={provided.innerRef}> + {posts.map((post, index) => ( + <Post key={post.id} {...post} index={index} clickHandler={action} icon={icon} /> + ))} + {provided.placeholder} + </div> + )} + </Droppable> + </DragDropContext> + {props.canPaginate ? ( + <button onClick={props.doPagination} disabled={props.paging}> + {props.paging + ? /* translators: [admin] */ + __('Loading…', 'amnesty') + : /* translators: [admin] */ + __('Load More', 'amnesty')} + </button> + ) : null} + </div> + ); +}; + +export default PostList; diff --git a/private/src/blocks/_deprecated/post-list/components/post-selector/PostSelector.jsx b/private/src/blocks/_deprecated/post-list/components/post-selector/PostSelector.jsx new file mode 100644 index 00000000..252743be --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/components/post-selector/PostSelector.jsx @@ -0,0 +1,135 @@ +import { PostList } from './PostList.jsx'; + +const { BlockIcon } = wp.blockEditor; +const { __ } = wp.i18n; + +const PostSelector = (props) => { + const isFiltered = props.state.filtering; + + const postList = + isFiltered && !props.state.filterLoading + ? props.state.filterPosts + : props.state.posts.filter((post) => post.type === props.state.type); + + const pageKey = props.state.filter ? 'filter' : props.state.type; + const canPaginate = (props.state.pages[pageKey] || 1) < props.state.pagesTotal[pageKey]; + + const addIcon = props.getSelectedPosts().length >= 100 ? null : <BlockIcon icon="plus" />; + const removeIcon = <BlockIcon icon="minus" />; + + return ( + <div className="wp-block-bigbite-postlist"> + <div className="post-selector"> + <div className="post-selectorHeader"> + <div className="searchbox"> + <label htmlFor="searchinput"> + <BlockIcon icon="search" /> + <input + id="searchinput" + type="search" + /* translators: [admin] */ + placeholder={__('Please enter your search query…', 'amnesty')} + value={props.state.filter} + onChange={props.handleInputFilterChange} + /> + </label> + </div> + <div className="filter"> + <label htmlFor="options"> + {/* translators: [admin] */ __('Post Type:', 'amnesty')}{' '} + </label> + <select name="options" id="options" onChange={props.handlePostTypeChange}> + {props.state.types.length < 1 ? ( + /* translators: [admin] */ + <option value="">{__('Loading…', 'amnesty')}</option> + ) : ( + Object.keys(props.state.types).map((key) => ( + <option key={key} value={key}> + {props.state.types[key].name} + </option> + )) + )} + </select> + <label htmlFor="options"> + {/* translators: [admin] */ __('Taxonomy:', 'amnesty')}{' '} + </label> + <select name="options" id="options" onChange={props.handleTaxonomyChange}> + {props.state.taxonomies.length < 1 ? ( + /* translators: [admin] */ + <option value="">{__('Loading…', 'amnesty')}</option> + ) : ( + Object.keys(props.state.taxonomies).map((key, index) => { + if (index === 0) { + return ( + <> + <option value=""> + {/* translators: [admin] */ __('Select Taxonomy', 'amnesty')} + </option> + <option key={key} value={props.state.taxonomies[key].rest_base}> + {props.state.taxonomies[key].name} + </option> + </> + ); + } + return ( + <option key={key} value={props.state.taxonomies[key].rest_base}> + {props.state.taxonomies[key].name} + </option> + ); + }) + )} + </select> + <label htmlFor="options">{/* translators: [admin] */ __('Terms:', 'amnesty')} </label> + <select name="options" id="options" onChange={props.handleTermChange}> + {props.state.terms.length < 1 ? ( + /* translators: [admin] */ + <option value="">{__('No taxonomy selected', 'amnesty')}</option> + ) : ( + Object.keys(props.state.terms).map((key, index) => { + if (index === 0) { + return ( + <> + <option value=""> + {/* translators: [admin] */ __('Select Term', 'amnesty')} + </option> + <option key={key} value={props.state.terms[key].id}> + {props.state.terms[key].name} + </option> + </> + ); + } + return ( + <option key={key} value={props.state.terms[key].id}> + {props.state.terms[key].name} + </option> + ); + }) + )} + </select> + </div> + </div> + <div className="post-selectorContainer"> + <PostList + posts={postList} + loading={props.state.initialLoading || props.state.loading || props.state.filterLoading} + filtered={isFiltered} + action={props.addPost} + paging={props.state.paging} + canPaginate={canPaginate} + doPagination={props.doPagination} + icon={addIcon} + /> + <PostList + posts={props.getSelectedPosts()} + loading={props.state.initialLoading} + action={props.removePost} + icon={removeIcon} + reorderPosts={props.reorderPosts} + /> + </div> + </div> + </div> + ); +}; + +export default PostSelector; diff --git a/private/src/scripts/editor/blocks/post-list/components/post-selector/api.js b/private/src/blocks/_deprecated/post-list/components/post-selector/api.js similarity index 100% rename from private/src/scripts/editor/blocks/post-list/components/post-selector/api.js rename to private/src/blocks/_deprecated/post-list/components/post-selector/api.js diff --git a/private/src/scripts/editor/blocks/post-list/components/taxonomy-select.jsx b/private/src/blocks/_deprecated/post-list/components/taxonomy-select.jsx similarity index 95% rename from private/src/scripts/editor/blocks/post-list/components/taxonomy-select.jsx rename to private/src/blocks/_deprecated/post-list/components/taxonomy-select.jsx index f4cb864c..b1bb9800 100644 --- a/private/src/scripts/editor/blocks/post-list/components/taxonomy-select.jsx +++ b/private/src/blocks/_deprecated/post-list/components/taxonomy-select.jsx @@ -71,9 +71,9 @@ class TaxonomySelect extends Component { isDisabled={this.state.loading} placeholder={ this.state.loading - ? // translators: [admin] + ? /* translators: [admin] */ __('Loading', 'amnesty') - : // translators: [admin] + : /* translators: [admin] */ __('Select a category', 'amnesty') } onChange={this.handleInputChange} diff --git a/private/src/scripts/editor/blocks/post-list/components/term-select.jsx b/private/src/blocks/_deprecated/post-list/components/term-select.jsx similarity index 92% rename from private/src/scripts/editor/blocks/post-list/components/term-select.jsx rename to private/src/blocks/_deprecated/post-list/components/term-select.jsx index c970e37d..6736e68c 100644 --- a/private/src/scripts/editor/blocks/post-list/components/term-select.jsx +++ b/private/src/blocks/_deprecated/post-list/components/term-select.jsx @@ -33,9 +33,9 @@ class TermSelect extends Component { isDisabled={this.state.loading} placeholder={ this.state.loading - ? // translators: [admin] + ? /* translators: [admin] */ __('Loading', 'amnesty') - : // translators: [admin] + : /* translators: [admin] */ __('Select terms', 'amnesty') } onChange={this.handleTermInputChange} diff --git a/private/src/blocks/_deprecated/post-list/index.jsx b/private/src/blocks/_deprecated/post-list/index.jsx new file mode 100644 index 00000000..cc0df793 --- /dev/null +++ b/private/src/blocks/_deprecated/post-list/index.jsx @@ -0,0 +1,99 @@ +import PostListEdit from './PostListEdit.jsx'; +import PostsWrapper from './PostsWrapper.jsx'; + +const { assign } = lodash; +const { registerBlockType } = wp.blocks; +const { __ } = wp.i18n; + +const postListConfig = {}; + +const PostsEditCompose = PostsWrapper(PostListEdit, postListConfig); + +const blockAttributes = { + type: { + type: 'string', + default: 'category', + }, + style: { + type: 'string', + default: 'list', + }, + category: { + type: 'string', + }, + categoryRelated: { + type: 'boolean', + }, + amount: { + type: 'int', + }, + custom: { + type: 'array', + }, + selectedPosts: { + type: 'array', + }, + taxonomyFilters: { + type: 'array', + }, + taxonomy: { + type: 'object', + }, + terms: { + type: 'array', + default: [], + }, + authors: { + type: 'string', + }, + displayAuthor: { + type: 'boolean', + default: false, + }, + displayPostDate: { + type: 'boolean', + default: false, + }, +}; + +registerBlockType('amnesty-core/block-list', { + /* translators: [admin] */ + title: __('Post List', 'amnesty'), + icon: 'admin-post', + category: 'amnesty-core', + keywords: [ + /* translators: [admin] */ + __('List', 'amnesty'), + /* translators: [admin] */ + __('post-list', 'amnesty'), + /* translators: [admin] */ + __('Posts', 'amnesty'), + ], + supports: { + multiple: true, + }, + attributes: blockAttributes, + + deprecated: [ + { + attributes: blockAttributes, + save: () => null, + migrate(attributes) { + if (!attributes.category) { + return attributes; + } + + let { category } = attributes; + + category = JSON.stringify([JSON.parse(category)]); + + return assign({}, attributes, { category }); + }, + }, + ], + + edit: PostsEditCompose, + + // Returns null due to the component being rendered server side + save: () => null, +}); diff --git a/private/src/blocks/_deprecated/row-column/block.json b/private/src/blocks/_deprecated/row-column/block.json new file mode 100644 index 00000000..4af78014 --- /dev/null +++ b/private/src/blocks/_deprecated/row-column/block.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-row-column", + "title": "Row Column", + "category": "amnesty-core", + "keywords": ["Columns", "Amnesty", "Row", "Content"], + "description": "Columns block", + "icon": "plus", + "textdomain": "amnesty", + "parent": ["amnesty-core/block-row"], + "editorScript": "file:./index.js", + "render": "file:./render.php", + "supports": { + "className": false, + "inserter": true + }, + "attributes": { + "size": { + "type": "string" + } + } +} diff --git a/private/src/blocks/_deprecated/row-column/edit.jsx b/private/src/blocks/_deprecated/row-column/edit.jsx new file mode 100644 index 00000000..5628be2f --- /dev/null +++ b/private/src/blocks/_deprecated/row-column/edit.jsx @@ -0,0 +1,11 @@ +import { InnerBlocks } from '@wordpress/block-editor'; + +export default function Edit() { + return ( + <> + <div className="rowColumn"> + <InnerBlocks templateLock={false} /> + </div> + </> + ); +} diff --git a/private/src/blocks/_deprecated/row-column/index.jsx b/private/src/blocks/_deprecated/row-column/index.jsx new file mode 100644 index 00000000..797ed1e6 --- /dev/null +++ b/private/src/blocks/_deprecated/row-column/index.jsx @@ -0,0 +1,12 @@ +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'rowColumnBlock' }), +}); diff --git a/private/src/blocks/_deprecated/row-column/render.php b/private/src/blocks/_deprecated/row-column/render.php new file mode 100644 index 00000000..742143f2 --- /dev/null +++ b/private/src/blocks/_deprecated/row-column/render.php @@ -0,0 +1,3 @@ +<div <?php echo wp_kses_data( get_block_wrapper_attributes( [ 'class' => 'rowColumn' ] ) ); ?>> + <?php echo wp_kses_post( $content ); ?> +</div> diff --git a/private/src/blocks/action/block.json b/private/src/blocks/action/block.json new file mode 100644 index 00000000..f21c7cb2 --- /dev/null +++ b/private/src/blocks/action/block.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/action-block", + "title": "Action", + "category": "amnesty-core", + "description": "Add an Action block", + "icon": "megaphone", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "viewStyle": "file:./style-view.css", + "viewScript": "file:./view.js", + "render": "file:./render.php", + "supports": { + "align": true, + "className": false + }, + "attributes": { + "style": { + "type": "string", + "default": "" + }, + "centred": { + "type": "boolean", + "default": false + }, + "label": { + "type": "string", + "default": "" + }, + "content": { + "type": "string", + "default": "" + }, + "imageID": { + "type": "integer", + "default": 0 + }, + "imageURL": { + "type": "string", + "default": "" + }, + "imageAlt": { + "type": "string", + "default": "" + }, + "link": { + "type": "string", + "default": "" + }, + "linkText": { + "type": "string", + "default": "" + }, + "largeImageURL": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/action/deprecated.jsx b/private/src/blocks/action/deprecated.jsx new file mode 100644 index 00000000..7b2bcf71 --- /dev/null +++ b/private/src/blocks/action/deprecated.jsx @@ -0,0 +1,220 @@ +import classnames from 'classnames'; + +import { assign, omit } from 'lodash'; +import { __ } from '@wordpress/i18n'; + +const blockAttributes = { + style: { + type: 'string', + }, + centred: { + type: 'boolean', + }, + label: { + type: 'string', + }, + content: { + type: 'string', + }, + imageID: { + type: 'integer', + }, + imageURL: { + type: 'string', + }, + imageAlt: { + type: 'string', + }, + link: { + type: 'string', + }, + buttonBackground: { + type: 'string', + }, +}; + +const v4 = { + supports: { + className: false, + align: true, + }, + attributes: assign({}, omit(blockAttributes, 'buttonBackground'), { + linkText: { + type: 'string', + }, + largeImageURL: { + type: 'string', + }, + }), + save({ attributes }) { + const { + style = 'standard', + centred = false, + content, + imageAlt, + imageURL, + label, + link, + linkText, + largeImageURL, + } = attributes; + + const blockClasses = classnames('actionBlock', { + 'actionBlock--wide': style === 'wide', + 'is-centred': centred, + }); + + const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); + + return ( + <figure className={blockClasses}> + <div className="actionBlock-figure"> + {style === 'wide' && ( + <img className="actionBlock-image" src={largeImageURL} alt={imageAlt} /> + )} + {style === 'standard' && ( + <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> + )} + <span className="actionBlock-label">{label}</span> + </div> + <figcaption className="actionBlock-content"> + <p>{content}</p> + <a className={buttonClasses} href={link}> + {linkText} + </a> + </figcaption> + </figure> + ); + }, +}; + +const v3 = { + supports: { + className: false, + }, + attributes: blockAttributes, + save({ attributes }) { + const { + style = 'standard', + centred = false, + content, + imageAlt, + imageURL, + label, + link, + linkText, + } = attributes; + + const blockClasses = classnames('actionBlock', { + 'actionBlock--wide': style === 'wide', + 'is-centred': centred, + }); + + const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); + + return ( + <figure className={blockClasses}> + <div className="actionBlock-figure"> + <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> + <span className="actionBlock-label">{label}</span> + </div> + <figcaption className="actionBlock-content"> + <p>{content}</p> + <a className={buttonClasses} href={link}> + {linkText} + </a> + </figcaption> + </figure> + ); + }, +}; + +const v2 = { + supports: { + className: false, + }, + attributes: blockAttributes, + save({ attributes }) { + const { + style = 'standard', + label, + content, + imageURL, + imageAlt, + link, + buttonBackground, + align, + } = attributes; + + const classes = classnames('actionBlock', { + 'actionBlock--wide': style === 'wide', + align, + }); + + return ( + <figure className={classes}> + <div className="actionBlock-figure"> + <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> + <span className="actionBlock-label">{label}</span> + </div> + <figcaption className="actionBlock-content"> + <p>{content}</p> + <a + className={classnames({ + 'tweetAction-button': true, + 'actionBlock-button': true, + [`actionBlock-button--${buttonBackground}`]: !!buttonBackground, + })} + href={link} + > + {/* translators: [admin] */ __('Act Now', 'amnesty')} + </a> + </figcaption> + </figure> + ); + }, +}; + +const v1 = { + supports: { + className: false, + }, + attributes: blockAttributes, + save({ attributes }) { + const { + style = 'standard', + centred = false, + label, + content, + imageURL, + imageAlt, + link, + } = attributes; + + const blockClasses = classnames('actionBlock', { + 'actionBlock--wide': style === 'wide', + 'is-centred': centred, + }); + + const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); + + return ( + <figure className={blockClasses}> + <div className="actionBlock-figure"> + <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> + <span className="actionBlock-label">{label}</span> + </div> + <figcaption className="actionBlock-content"> + <p>{content}</p> + <a className={buttonClasses} href={link}> + {/* translators: [admin] */ __('Act Now', 'amnesty')} + </a> + </figcaption> + </figure> + ); + }, +}; + +const deprecated = [v4, v3, v2, v1]; + +export default deprecated; diff --git a/private/src/blocks/action/edit.jsx b/private/src/blocks/action/edit.jsx new file mode 100644 index 00000000..c1024e10 --- /dev/null +++ b/private/src/blocks/action/edit.jsx @@ -0,0 +1,143 @@ +import classnames from 'classnames'; + +import { + InspectorControls, + MediaUpload, + PlainText, + URLInputButton, + useBlockProps, +} from '@wordpress/block-editor'; +import { IconButton, PanelBody, SelectControl } from '@wordpress/components'; +import { useEffect } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const setURL = (image) => { + if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'action-wide')) { + return image.url; + } + const standardIMG = 'action-wide'; + + return image.sizes[standardIMG].url; +}; + +const setLargeURL = (image) => { + if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'lwi-block-md@2x')) { + return image.url; + } + const largeIMG = 'lwi-block-md@2x'; + return image.sizes[largeIMG].url; +}; + +export default function Edit({ attributes, setAttributes }) { + const { + style = 'standard', + centred = false, + content, + imageAlt, + imageID, + imageURL, + label, + link, + linkText, + } = attributes; + + const getImageUri = () => { + if (!imageID) { + return; + } + + wp.apiRequest({ path: `wp/v2/media/${imageID}` }).then((data) => { + if (style === 'standard') { + setAttributes({ imageURL: data.media_details.sizes['action-wide'].source_url }); + } else if (style === 'wide') { + setAttributes({ imageURL: data.media_details.sizes['lwi-block-md@2x'].source_url }); + } + }); + }; + + useEffect(getImageUri, [imageID, style, setAttributes]); + + const classes = classnames('actionBlock', { + 'actionBlock--wide': style === 'wide', + 'is-centred': centred, + }); + + const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); + const blockProps = useBlockProps({ className: classes }); + + return ( + <> + <InspectorControls> + <PanelBody> + <SelectControl + /* translators: [admin] */ + label={__('Size', 'amnesty')} + value={style} + onChange={(newStyle) => setAttributes({ style: newStyle })} + options={[ + /* translators: [admin] */ + { value: 'standard', label: __('Standard', 'amnesty') }, + /* translators: [admin] */ + { value: 'wide', label: __('Wide', 'amnesty') }, + ]} + /> + </PanelBody> + </InspectorControls> + <figure {...blockProps}> + <div className="actionBlock-figure"> + <div className="linkList-options"> + {imageID ? ( + <IconButton + icon="no-alt" + /* translators: [admin] */ + label={__('Remove Image', 'amnesty')} + onClick={() => setAttributes({ imageID: 0, imageURL: '', imageAlt: '' })} + /> + ) : ( + <MediaUpload + allowedTypes={['image']} + value={imageID} + onSelect={(media) => + setAttributes({ + imageID: media.id, + imageURL: setURL(media), + largeImageURL: setLargeURL(media), + imageAlt: media.alt, + }) + } + render={({ open }) => <IconButton icon="format-image" onClick={open} />} + /> + )} + </div> + {imageURL && <img className="actionBlock-image" src={imageURL} alt={imageAlt} />} + <PlainText + className="actionBlock-label" + rows="1" + /* translators: [admin] */ + placeholder={__('(Label)', 'amnesty')} + value={label} + onChange={(newLabel) => setAttributes({ label: newLabel })} + /> + </div> + <figcaption className="actionBlock-content"> + <PlainText + /* translators: [admin] */ + placeholder={__('Content', 'amnesty')} + rows="3" + value={content} + onChange={(newContent) => setAttributes({ content: newContent })} + /> + <PlainText + className={buttonClasses} + /* translators: [admin] */ + placeholder={__('Button Text', 'amnesty')} + rows="1" + value={linkText} + onChange={(newLinkText) => setAttributes({ linkText: newLinkText })} + /> + <URLInputButton url={link} onChange={(newLink) => setAttributes({ link: newLink })} /> + </figcaption> + </figure> + </> + ); +} diff --git a/private/src/blocks/action/editor.scss b/private/src/blocks/action/editor.scss new file mode 100644 index 00000000..72308a3e --- /dev/null +++ b/private/src/blocks/action/editor.scss @@ -0,0 +1,97 @@ +@use './style.scss'; + +.actionBlock { + max-width: 350px !important; +} + +// aligment control classes +[data-type="amnesty-core/action-block"][data-align="left"] { + float: left; +} + +[data-type="amnesty-core/action-block"][data-align="right"] { + float: right; +} + +.actionBlock--wide { + max-width: 480px !important; +} + +.actionBlock .block-editor-plain-text { + border-radius: 0 !important; +} + +.actionBlock-image { + height: 100% !important; +} + +.actionBlock-label { + width: auto !important; + padding: 2px 8px !important; + color: var(--wp--preset--color--white) !important; + + &::-webkit-input-placeholder { + color: var(--wp--preset--color--white) !important; + } + + &::-moz-placeholder { + color: var(--wp--preset--color--white) !important; + } + + &:-ms-input-placeholder { + color: var(--wp--preset--color--white) !important; + } + + &:-moz-placeholder { + color: var(--wp--preset--color--white) !important; + } +} + +.actionBlock-content { + position: relative; +} + +.actionBlock-content .block-editor-plain-text:not(.btn) { + padding: 8px !important; + border: 1px dotted #000; + line-height: 1.4 !important; + background-color: transparent !important; + color: var(--wp--preset--color--black) !important; + + &::-webkit-input-placeholder { + color: var(--wp--preset--color--black) !important; + } + + &::-moz-placeholder { + color: var(--wp--preset--color--black) !important; + } + + &:-ms-input-placeholder { + color: var(--wp--preset--color--black) !important; + } + + &:-moz-placeholder { + color: var(--wp--preset--color--black) !important; + } +} + +.actionBlock-content .block-editor-plain-text.btn { + padding: 14px 24px !important; + font-family: var(--wp--preset--font-family--secondary); +} + +.actionBlock .editor-url-input__button { + position: absolute !important; + right: 16px !important; + top: calc(100% - 66px) !important; +} + +.actionBlock.actionBlock--wide .editor-url-input__button { + right: 66px !important; +} + +.actionBlock .editor-url-input__button-modal { + position: absolute; + left: -150%; + min-width: 250px; +} diff --git a/private/src/blocks/action/index.js b/private/src/blocks/action/index.js new file mode 100644 index 00000000..8db566eb --- /dev/null +++ b/private/src/blocks/action/index.js @@ -0,0 +1,14 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/action/render-standard.php b/private/src/blocks/action/render-standard.php new file mode 100644 index 00000000..bacca5fa --- /dev/null +++ b/private/src/blocks/action/render-standard.php @@ -0,0 +1,30 @@ +<?php + +$block_classes = classnames( + 'actionBlock', + [ + 'is-centred' => $attributes['centred'], + ] +); + +$block_attributes = get_block_wrapper_attributes( [ 'class' => $block_classes ] ); + +?> +<figure <?php echo wp_kses_data( $block_attributes ); ?>> + <div class="actionBlock-figure"> + <?php + + if ( 0 !== absint( $attributes['imageID'] ) ) { + echo wp_get_attachment_image( absint( $attributes['imageID'] ), 'action-standard', false, [ 'class' => 'actionBlock-image aiic-ignore' ] ); + } elseif ( '' !== $attributes['imageURL'] ) { + printf( '<img class="actionBlock-image aiic-ignore" src="%s" alt="%s">', esc_url( $attributes['imageURL'] ), esc_attr( $attributes['imageAlt'] ) ); + } + + ?> + <span class="actionBlock-label"><?php echo esc_html( $attributes['label'] ); ?></span> + </div> + <figcaption class="actionBlock-content"> + <p><?php echo esc_html( $attributes['content'] ); ?></p> + <a class="btn btn--fill btn--large" href=<?php echo esc_url( $attributes['link'] ); ?>><?php echo esc_html( $attributes['linkText'] ); ?></a> + </figcaption> +</figure> diff --git a/private/src/blocks/action/render-wide.php b/private/src/blocks/action/render-wide.php new file mode 100644 index 00000000..70810582 --- /dev/null +++ b/private/src/blocks/action/render-wide.php @@ -0,0 +1,35 @@ +<?php + +$block_classes = classnames( + 'actionBlock', + 'actionBlock--wide', + [ + 'is-centred' => $attributes['centred'], + ] +); + +$block_attributes = get_block_wrapper_attributes( [ 'class' => $block_classes ] ); + +?> +<figure <?php echo wp_kses_data( $block_attributes ); ?>> + <div class="actionBlock-figure"> + <?php + + if ( 0 !== absint( $attributes['imageID'] ) ) { + echo wp_get_attachment_image( absint( $attributes['imageID'] ), 'action-wide', false, [ 'class' => 'actionBlock-image aiic-ignore' ] ); + } else { + $image_url = $attributes['largeImageURL'] ?: $attributes['imageURL']; + + if ( $image_url ) { + printf( '<img class="actionBlock-image aiic-ignore" src="%s" alt="%s">', esc_url( $image_url ), esc_attr( $attributes['imageAlt'] ) ); + } + } + + ?> + <span class="actionBlock-label"><?php echo esc_html( $attributes['label'] ); ?></span> + </div> + <figcaption class="actionBlock-content"> + <p><?php echo esc_html( $attributes['content'] ); ?></p> + <a class="btn btn--fill btn--large" href=<?php echo esc_url( $attributes['link'] ); ?>><?php echo esc_html( $attributes['linkText'] ); ?></a> + </figcaption> +</figure> diff --git a/private/src/blocks/action/render.php b/private/src/blocks/action/render.php new file mode 100644 index 00000000..e0e24048 --- /dev/null +++ b/private/src/blocks/action/render.php @@ -0,0 +1,7 @@ +<?php + +if ( 'wide' === $attributes['style'] ) { + require realpath( __DIR__ . '/render-wide.php' ); +} else { + require realpath( __DIR__ . '/render-standard.php' ); +} diff --git a/private/src/blocks/action/style.scss b/private/src/blocks/action/style.scss new file mode 100644 index 00000000..85ce8c2d --- /dev/null +++ b/private/src/blocks/action/style.scss @@ -0,0 +1,83 @@ +.actionBlock { + margin: 0; + max-width: 350px; + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + background-color: var(--wp--preset--color--grey-lighter); +} + +.actionBlock.is-centred { + margin-right: auto; + margin-left: auto; +} + +.actionBlock--wide { + width: 480px; + max-width: 100%; +} + +.actionBlock-figure { + position: relative; + height: 230px; +} + +.actionBlock-figure a { + display: block; +} + +.actionBlock-figure img { + max-width: 100%; + min-width: 100%; + height: auto; +} + +.actionBlock-image { + display: flex; + width: 100%; + height: 100%; + justify-content: center; + overflow: hidden; + background-color: rgba(var(--wp--preset--color--black), .25); +} + +.actionBlock-image img { + object-fit: cover; + min-width: 100%; + min-height: 100%; +} + +.actionBlock-label { + position: absolute; + bottom: 0; + left: 16px; + padding: 8px; + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + font-size: 18px; + text-transform: uppercase; +} + +.actionBlock-content { + padding: 16px; + font-size: 24px; +} + +.actionBlock-content p { + margin-bottom: 0; + min-height: 80px; +} + +// these styles may need to be global +.page-template-page-petitions .actionBlock { + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: stretch; +} + +.page-template-page-petitions .actionBlock-content { + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: space-between; +} diff --git a/private/src/blocks/action/view.js b/private/src/blocks/action/view.js new file mode 100644 index 00000000..423b033c --- /dev/null +++ b/private/src/blocks/action/view.js @@ -0,0 +1 @@ +import './style.scss'; diff --git a/private/src/blocks/blockquote/block.json b/private/src/blocks/blockquote/block.json new file mode 100644 index 00000000..46657818 --- /dev/null +++ b/private/src/blocks/blockquote/block.json @@ -0,0 +1,48 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/quote", + "title": "Blockquote", + "category": "amnesty-core", + "description": "Add a blockquote block", + "icon": "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\" /><path d=\"M19 18h-6l2-4h-2V6h8v7l-2 5zm-2-2l2-3V8h-4v4h4l-2 4zm-8 2H3l2-4H3V6h8v7l-2 5zm-2-2l2-3V8H5v4h4l-2 4z\" /></svg>", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": false, + "inserter": false + }, + "attributes": { + "align": { + "type": "string", + "default": "" + }, + "size": { + "type": "string", + "default": "" + }, + "colour": { + "type": "string", + "default": "" + }, + "capitalise": { + "type": "boolean", + "default": false + }, + "lined": { + "type": "boolean", + "default": false + }, + "content": { + "type": "string", + "default": "" + }, + "citation": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/blockquote/deprecated.jsx b/private/src/blocks/blockquote/deprecated.jsx new file mode 100644 index 00000000..f0ce8d7e --- /dev/null +++ b/private/src/blocks/blockquote/deprecated.jsx @@ -0,0 +1,135 @@ +import classnames from 'classnames'; + +import { RichText } from '@wordpress/block-editor'; + +const v2 = { + supports: { + className: false, + }, + attributes: { + align: { + type: 'string', + }, + size: { + type: 'string', + }, + colour: { + type: 'string', + }, + capitalise: { + type: 'boolean', + }, + lined: { + type: 'boolean', + }, + content: { + type: 'string', + }, + citation: { + type: 'string', + }, + }, + + save({ attributes }) { + const { + align = '', + size = '', + colour = '', + capitalise = false, + lined = true, + content = '', + citation = '', + } = attributes; + + const classes = classnames('blockquote', { + [`align-${align}`]: !!align, + [`is-${size}`]: !!size, + [`is-${colour}`]: !!colour, + 'is-capitalised': capitalise, + 'is-lined': lined, + }); + + const quoteStyle = {}; + if (Object.prototype.hasOwnProperty.call(window, 'amnestyCoreI18n')) { + const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = + window.amnestyCoreI18n; + + quoteStyle.quotes = `"${openDoubleQuote}" "${closeDoubleQuote}" "${openSingleQuote}" "${closeSingleQuote}";`; + } + + return ( + <blockquote className={classes} style={quoteStyle}> + <RichText.Content tagName="p" value={content} /> + <RichText.Content tagName="cite" value={citation} /> + </blockquote> + ); + }, +}; + +const v1 = { + supports: { + className: false, + }, + attributes: { + align: { + type: 'string', + }, + size: { + type: 'string', + }, + colour: { + type: 'string', + }, + capitalise: { + type: 'boolean', + }, + lined: { + type: 'boolean', + }, + content: { + type: 'string', + }, + citation: { + type: 'string', + }, + }, + + save({ attributes }) { + const { + align = '', + size = '', + colour = '', + capitalise = false, + lined = true, + content = '', + citation = '', + } = attributes; + + const classes = classnames('blockquote', { + [`align-${align}`]: !!align, + [`is-${size}`]: !!size, + [`is-${colour}`]: !!colour, + 'is-capitalised': capitalise, + 'is-lined': lined, + }); + + const quoteStyle = {}; + if (Object.prototype.hasOwnProperty.call(window, 'amnestyCoreI18n')) { + const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = + window.amnestyCoreI18n; + + quoteStyle.quotes = `"${openDoubleQuote}" "${closeDoubleQuote}" "${openSingleQuote}" "${closeSingleQuote}";`; + } + + return ( + <blockquote className={classes} style={quoteStyle}> + <RichText.Content tagName="p" value={content} /> + {citation && <RichText.Content tagName="cite" value={citation} />} + </blockquote> + ); + }, +}; + +const deprecated = [v2, v1]; + +export default deprecated; diff --git a/private/src/blocks/blockquote/edit.jsx b/private/src/blocks/blockquote/edit.jsx new file mode 100644 index 00000000..914c87ea --- /dev/null +++ b/private/src/blocks/blockquote/edit.jsx @@ -0,0 +1,146 @@ +import classnames from 'classnames'; + +import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, SelectControl, ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +const isRightToLeft = document.documentElement.getAttribute('dir') === 'rtl'; +const hasI18n = Object.prototype.hasOwnProperty.call(window, 'amnestyCoreI18n'); + +const getDirections = () => { + const directionalOptions = [ + /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ + { value: 'start', label: __('Left', 'amnesty') }, + /* translators: [admin] text alignment */ + { value: '', label: __('Default', 'amnesty') }, + ]; + + if (!isRightToLeft) { + /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ + directionalOptions.push({ value: 'end', label: __('Right', 'amnesty') }); + } + + return directionalOptions; +}; + +const getQuoteStyles = () => { + if (!hasI18n) { + return ''; + } + + const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = + window.amnestyCoreI18n; + + return `.blockquote { + quotes: '${openDoubleQuote}' '${closeDoubleQuote}' "${openSingleQuote}" "${closeSingleQuote}"; + }`; +}; + +export default function Edit({ attributes, setAttributes }) { + const { + align = '', + size = '', + colour = '', + capitalise = false, + lined = true, + content = '', + citation = '', + } = attributes; + + const classes = classnames('blockquote', { + [`align-${align}`]: !!align, + [`is-${size}`]: !!size, + [`is-${colour}`]: !!colour, + 'is-capitalised': capitalise, + 'is-lined': lined, + }); + + const blockProps = useBlockProps({ + className: classes, + }); + + return ( + <> + <InspectorControls> + <PanelBody> + <SelectControl + /* translators: [admin] */ + label={__('Alignment', 'amnesty')} + value={align} + onChange={(newAlign) => setAttributes({ align: newAlign })} + options={getDirections()} + /> + <SelectControl + /* translators: [admin] */ + label={__('Size', 'amnesty')} + value={size} + onChange={(newSize) => setAttributes({ size: newSize })} + options={[ + /* translators: [admin] */ + { value: 'small', label: __('Small', 'amnesty') }, + /* translators: [admin] */ + { value: 'medium', label: __('Medium', 'amnesty') }, + /* translators: [admin] */ + { value: '', label: __('Large', 'amnesty') }, + ]} + /> + <SelectControl + /* translators: [admin] */ + label={__('Text Colour', 'amnesty')} + value={colour} + onChange={(newColour) => setAttributes({ colour: newColour })} + options={[ + /* translators: [admin] */ + { value: '', label: __('Black', 'amnesty') }, + /* translators: [admin] */ + { value: 'grey', label: __('Grey', 'amnesty') }, + /* translators: [admin] */ + { value: 'white', label: __('White', 'amnesty') }, + ]} + /> + {!isRightToLeft && ( + <ToggleControl + /* translators: [admin] */ + label={__('Capitalise', 'amnesty')} + /* translators: [admin] */ + help={__('Capitalise the content.', 'amnesty')} + checked={capitalise} + onChange={(newCaps) => setAttributes({ capitalise: newCaps })} + /> + )} + <ToggleControl + /* translators: [admin] */ + label={__('Line', 'amnesty')} + /* translators: [admin] */ + help={__('Toggle display of line embellishment.', 'amnesty')} + checked={lined} + onChange={(newLine) => setAttributes({ lined: newLine })} + /> + </PanelBody> + </InspectorControls> + <style>{getQuoteStyles()}</style> + <div {...blockProps}> + <div> + <RichText + tagName="p" + /* translators: [admin] */ + placeholder={__('(Insert Quote Text)', 'amnesty')} + value={content} + allowedFormats={[]} + onChange={(newContent) => setAttributes({ content: newContent })} + /> + </div> + <div> + <RichText + tagName="cite" + /* translators: [admin] */ + placeholder={__('(Insert Citation)', 'amnesty')} + value={citation} + allowedFormats={[]} + onChange={(newCitation) => setAttributes({ citation: newCitation })} + /> + </div> + </div> + </> + ); +} diff --git a/private/src/blocks/blockquote/editor.scss b/private/src/blocks/blockquote/editor.scss new file mode 100644 index 00000000..09487bf2 --- /dev/null +++ b/private/src/blocks/blockquote/editor.scss @@ -0,0 +1,37 @@ +.blockquote { + width: 100%; +} + +.blockquote p { + white-space: normal !important; +} + +.blockquote.align-start p { + line-height: 1.2 !important; +} + +.blockquote.is-medium p { + line-height: 1.2 !important; +} + +.blockquote cite.editor-rich-text__tinymce.mce-content-body[data-is-placeholder-visible="true"] { + border-bottom: none; +} + +.blockquote div p { + font-family: var(--wp--preset--font-family--secondary); + line-height: 2 !important; +} + +.blockquote div cite { + line-height: 40px !important; + padding-bottom: 24px; +} + +.blockquote.is-white.is-lined cite::after { + background-color: var(--wp--preset--color--white); +} + +.blockquote.is-grey.is-lined cite::after { + background-color: var(--wp--preset--color--grey-light); +} diff --git a/private/src/blocks/blockquote/index.js b/private/src/blocks/blockquote/index.js new file mode 100644 index 00000000..c6d1d708 --- /dev/null +++ b/private/src/blocks/blockquote/index.js @@ -0,0 +1,17 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; +import transforms from './transforms.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + transforms, + edit, + save: () => null, +}); diff --git a/private/src/blocks/blockquote/render.php b/private/src/blocks/blockquote/render.php new file mode 100644 index 00000000..e25acd4b --- /dev/null +++ b/private/src/blocks/blockquote/render.php @@ -0,0 +1,25 @@ +<?php + +$classes = classnames( + 'blockquote', + [ + "align-{$attributes['align']}" => (bool) $attributes['align'], + "is-{$attributes['size']}" => (bool) $attributes['size'], + "is-{$attributes['colour']}" => (bool) $attributes['colour'], + 'is-capitalised' => (bool) $attributes['capitalise'], + 'is-lined' => (bool) $attributes['lined'], + ] +); + +$block_attributes = get_block_wrapper_attributes( [ 'class' => $classes ] ); + +?> + +<blockquote <?php echo wp_kses_data( $block_attributes ); ?>> +<?php if ( $attributes['content'] ) : ?> + <?php echo wp_kses_post( wpautop( $attributes['content'] ) ); ?> +<?php endif; ?> +<?php if ( $attributes['citation'] ) : ?> + <cite><?php echo esc_html( wp_strip_all_tags( $attributes['citation'] ) ); ?></cite> +<?php endif; ?> +</blockquote> diff --git a/private/src/blocks/blockquote/style.scss b/private/src/blocks/blockquote/style.scss new file mode 100644 index 00000000..84a532ba --- /dev/null +++ b/private/src/blocks/blockquote/style.scss @@ -0,0 +1,296 @@ +.blockquote { + position: relative; + margin: 70px auto 24px; + font-family: var(--wp--preset--font-family--secondary); + text-align: center; + + @media all and (min-width: 760px) { + max-width: calc(var(--wp--preset--layout--contentSize) / 2); + } +} + +.blockquote::before { + content: open-quote; + position: absolute; + left: calc(50% - 16px); + font-family: var(--wp--preset--font-family--secondary) !important; + font-weight: bold; + font-size: 60px !important; + line-height: 1px; + + @media all and (min-width: 540px) { + font-size: 70px !important; + } + + @media all and (min-width: 940px) { + font-size: 80px !important; + } + + [lang*="fr"] & { + top: -20px; + left: 50%; + transform: translateX(-50%); + } + + [lang*="fa-IR"] & { + top: -40px; + } +} + +.blockquote::after { + content: close-quote; + position: absolute !important; + overflow: hidden !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; +} + +.blockquote.is-grey { + color: var(--wp--preset--color--grey-light); + border-color: var(--wp--preset--color--grey-light); +} + +.blockquote.is-white { + color: var(--wp--preset--color--white); + border-color: var(--wp--preset--color--white); +} + +.blockquote[class*="align-"] { + margin-top: 24px !important; +} + +.blockquote.align-start::before, +.blockquote.align-end::before { + display: none; +} + +.blockquote.align-start { + margin-left: 0; + text-align: left; + + .rtl & { + margin-right: 0; + margin-left: auto !important; + text-align: right; + } +} + +.blockquote.align-end { + margin-right: 0; + text-align: right; + + .rtl & { + margin-right: auto !important; + margin-left: 0; + text-align: left; + } +} + +.blockquote.align-end p { + line-height: 1.2 !important; +} + +.blockquote p { + position: relative; + margin-bottom: 20px; + font-weight: bold; + font-size: 24px !important; + line-height: 1.2 !important; + + &:last-of-type { + margin-bottom: 0; + } + + @media all and (min-width: 540px) { + font-size: 32px !important; + } + + @media all and (min-width: 940px) { + font-size: 36px !important; + } +} + +.blockquote.is-medium p { + font-size: 20px !important; + + @media all and (min-width: 540px) { + font-size: 28px !important; + } + + @media all and (min-width: 940px) { + font-size: 32px !important; + } +} + +.blockquote.is-small p { + font-size: 16px !important; + line-height: 1.2 !important; + + @media all and (min-width: 540px) { + font-size: 24px !important; + } + + @media all and (min-width: 940px) { + font-size: 28px !important; + } +} + +.blockquote[class*="align-"] p:first-of-type::before, +.blockquote[class*="align-"] p:last-of-type::after { + display: inline-block; + font-size: 24px; + + @media all and (min-width: 760px) { + font-size: 32px; + } +} + +.blockquote[class*="align-"] p:first-of-type::before { + content: open-quote; + + [lang*="fr"] & { + margin-right: .2em; + } +} + +.blockquote[class*="align-"] p:last-of-type::after { + content: close-quote; + + [lang*="fr"] & { + margin-left: .2em; + } +} + +.blockquote.align-start p:first-of-type::before { + text-indent: -7px; + + @media all and (min-width: 940px) { + text-indent: -15px; + } +} + +.rtl .blockquote.align-end p:first-of-type::before { + right: 0; +} + +.blockquote.align-end p:last-of-type::after { + position: absolute; +} + +.blockquote cite { + display: inline-block; + font-style: normal; + font-size: 18px !important; + font-weight: bold !important; + line-height: 40px !important; + padding-bottom: 24px; + + @media all and (min-width: 540px) { + font-size: 20px !important; + } + + @media all and (min-width: 940px) { + font-size: 24px !important; + } +} + +.blockquote.is-lined:not([class*="align"]) cite::after { + content: ""; + display: block; + margin: 8px auto 0; + max-width: 200px; + height: 6px; + background-color: var(--wp--preset--color--black); + + @media all and (min-width: 940px) { + height: 8px; + } +} + +.blockquote.is-medium cite { + font-size: 16px !important; + + @media all and (min-width: 540px) { + font-size: 20px !important; + } + + @media all and (min-width: 940px) { + font-size: 22px !important; + } +} + +.blockquote.is-small cite { + font-size: 14px !important; + line-height: 40px !important; + + @media all and (min-width: 540px) { + font-size: 18px !important; + } + + @media all and (min-width: 940px) { + font-size: 20px !important; + + &::after { + height: 6px; + } + } +} + +.blockquote.is-capitalised p { + text-transform: uppercase; +} + +.blockquote.align-start cite, +.blockquote.align-end cite { + border-bottom: none; + line-height: 40px !important; +} + +.ltr .blockquote.align-start.is-lined { + padding-left: 35px; + border-left: 8px solid; +} + +.rtl .blockquote.align-start.is-lined, +.ltr .blockquote.align-end.is-lined { + padding-right: 35px; + border-right: 8px solid; +} + +.page-template-templates .blockquote.align-start { + margin-left: auto; +} + +.page-template-templates .blockquote.align-end { + margin-right: auto; +} + +.rtl .blockquote.align-end.is-lined { + padding-left: 35px; + border-left: 8px solid; +} + +.blockquote[class*="align-"].is-small p:first-of-type::before, +.blockquote[class*="align-"].is-small p:last-of-type::after { + display: inline-block; + font-size: 16px; + + @media all and (min-width: 760px) { + font-size: 28px; + } +} + +.section > .container .blockquote { + margin-top: 70px; +} + +.blockquote.is-white.is-lined cite::after { + background-color: var(--wp--preset--color--white); +} + +.blockquote.is-grey.is-lined cite::after { + background-color: var(--wp--preset--color--grey-light); +} diff --git a/private/src/blocks/blockquote/transforms.jsx b/private/src/blocks/blockquote/transforms.jsx new file mode 100644 index 00000000..507dd0d4 --- /dev/null +++ b/private/src/blocks/blockquote/transforms.jsx @@ -0,0 +1,107 @@ +import { createBlock } from '@wordpress/blocks'; +import { getPhrasingContentSchema } from '@wordpress/dom'; + +const transforms = { + from: [ + { + type: 'block', + isMultiBlock: true, + blocks: ['core/heading'], + transform: (attributes) => + attributes.map(({ content }) => createBlock('amnesty-core/quote', { content })), + }, + { + type: 'block', + isMultiBlock: true, + blocks: ['core/paragraph'], + transform: (attributes) => + attributes.map(({ content }) => createBlock('amnesty-core/quote', { content })), + }, + { + type: 'block', + blocks: ['core/pullquote'], + transform: ({ value, citation }) => + createBlock('amnesty-core/quote', { + content: value, + citation, + }), + }, + { + type: 'pattern', + regExp: /^>\s/, + transform: ({ content }) => + createBlock('amnesty-core/quote', { + content: `<p>${content}</p>`, + }), + }, + { + type: 'raw', + selector: 'blockquote', + schema: { + blockquote: { + children: { + p: { + children: getPhrasingContentSchema(), + }, + }, + }, + }, + transform: (node) => { + const content = node.querySelector('p')?.innerHTML || ''; + const citation = node.querySelector('cite')?.innerHTML || ''; + return createBlock('amnesty-core/quote', { content, citation }); + }, + }, + ], + to: [ + { + type: 'block', + blocks: ['core/heading'], + transform: ({ content, citation, ...attrs }) => { + if (content === '<p></p>') { + return createBlock('core/heading', { + ...attrs, + content: citation, + }); + } + + return [content, citation].filter(Boolean).map((item) => + createBlock('core/heading', { + ...attrs, + content: item, + }), + ); + }, + }, + { + type: 'block', + blocks: ['core/paragraph'], + transform: ({ content, citation, ...attrs }) => { + if (content === '<p></p>') { + return createBlock('core/paragraph', { + ...attrs, + content: citation, + }); + } + + return [content, citation].filter(Boolean).map((item) => + createBlock('core/paragraph', { + ...attrs, + content: item, + }), + ); + }, + }, + { + type: 'block', + blocks: ['core/pullquote'], + transform: ({ content, citation }) => + createBlock('core/pullquote', { + value: content, + citation, + }), + }, + ], +}; + +export default transforms; diff --git a/private/src/blocks/call-to-action/block.json b/private/src/blocks/call-to-action/block.json new file mode 100644 index 00000000..3390ea9e --- /dev/null +++ b/private/src/blocks/call-to-action/block.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-call-to-action", + "title": "Call to Action", + "category": "amnesty-core", + "description": "", + "icon": "megaphone", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": false, + "multiple": true, + "inserter": false + }, + "attributes": { + "preheading": { + "type": "string", + "default": "" + }, + "title": { + "type": "string", + "default": "" + }, + "content": { + "type": "string", + "default": "" + }, + "background": { + "type": "string", + "default": "" + }, + "actionType": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/call-to-action/deprecated.jsx b/private/src/blocks/call-to-action/deprecated.jsx new file mode 100644 index 00000000..fe5f1582 --- /dev/null +++ b/private/src/blocks/call-to-action/deprecated.jsx @@ -0,0 +1,220 @@ +import classnames from 'classnames'; + +import { assign, isEmpty, omit } from 'lodash'; +import { InnerBlocks, RichText } from '@wordpress/block-editor'; +import { createBlock } from '@wordpress/blocks'; + +const blockAttributes = { + preheading: { + type: 'array', + }, + title: { + type: 'string', + }, + content: { + type: 'array', + }, + ctaLink: { + type: 'string', + }, + ctaText: { + type: 'array', + }, + background: { + type: 'string', + }, + style: { + type: 'string', + }, + actionType: { + type: 'string', + }, +}; + +const v4 = { + supports: { + className: false, + multiple: true, + }, + attributes: assign({}, blockAttributes, { + preheading: { + type: 'string', + }, + content: { + type: 'string', + }, + }), + save: ({ attributes }) => { + const { background = false, preheading, title, content } = attributes; + const divClasses = classnames('callToAction', { [`callToAction--${background}`]: background }); + + return ( + <div className={divClasses} role="note" aria-label={title}> + {!isEmpty(preheading) && ( + <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> + )} + {!isEmpty(title) && ( + <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> + )} + {!isEmpty(content) && ( + <RichText.Content tagName="p" className="callToAction-content" value={content} /> + )} + <div className="innerBlocksContainer"> + <InnerBlocks.Content /> + </div> + </div> + ); + }, +}; + +const v3 = { + supports: { + className: false, + multiple: true, + }, + attributes: assign({}, omit(blockAttributes, 'actionType'), { + preheading: { + type: 'string', + }, + content: { + type: 'string', + }, + ctaText: { + type: 'string', + }, + }), + save({ attributes }) { + const { background = false, preheading, title, content } = attributes; + const divClasses = classnames('callToAction', { + [`callToAction--${background}`]: background, + }); + + return ( + <div className={divClasses} role="note" aria-label={title}> + {!isEmpty(preheading) && ( + <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> + )} + {!isEmpty(title) && ( + <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> + )} + {!isEmpty(content) && ( + <RichText.Content tagName="p" className="callToAction-content" value={content} /> + )} + <InnerBlocks.Content /> + </div> + ); + }, +}; + +const v2 = { + supports: { + className: false, + multiple: true, + }, + attributes: assign({}, omit(blockAttributes, 'actionType'), { + preheading: { + type: 'string', + }, + content: { + type: 'string', + }, + ctaText: { + type: 'string', + }, + }), + migrate: (attributes) => [ + attributes, + [ + createBlock('amnesty-core/block-button', { + ctaText: attributes.ctaText, + style: attributes.style, + ctaLink: attributes.ctaLink, + }), + ], + ], + save: ({ attributes }) => { + const { + background = false, + style = false, + preheading, + title, + content, + ctaLink, + ctaText, + } = attributes; + + const divClasses = classnames('callToAction', { + [`callToAction--${background}`]: background, + }); + + const linkClasses = classnames('btn', { [`btn--${style}`]: style }); + + return ( + <div className={divClasses} role="note" aria-label={title}> + {!isEmpty(preheading) && ( + <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> + )} + {!isEmpty(title) && ( + <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> + )} + {!isEmpty(content) && ( + <RichText.Content tagName="p" className="callToAction-content" value={content} /> + )} + {!isEmpty(ctaLink) && !isEmpty(ctaText) && ( + <a href={ctaLink} className={linkClasses}> + <RichText.Content tagName="span" value={ctaText} /> + </a> + )} + </div> + ); + }, +}; + +const v1 = { + supports: { + className: false, + multiple: true, + }, + attributes: omit(blockAttributes, 'actionType'), + save: ({ attributes }) => { + const { + background = false, + style = false, + + preheading, + title, + content, + ctaLink, + ctaText, + } = attributes; + + const divClasses = classnames('callToAction', { + [`callToAction--${background}`]: background, + }); + + const linkClasses = classnames('btn', { [`btn--${style}`]: style }); + + return ( + <div className={divClasses} role="note" aria-label={title}> + {!isEmpty(preheading) && ( + <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> + )} + {!isEmpty(title) && ( + <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> + )} + {!isEmpty(content) && ( + <RichText.Content tagName="p" className="callToAction-content" value={content} /> + )} + {!isEmpty(ctaLink) && !isEmpty(ctaText) && ( + <a href={ctaLink} className={linkClasses}> + <RichText.Content tagName="span" value={ctaText} /> + </a> + )} + </div> + ); + }, +}; + +const deprecated = [v4, v3, v2, v1]; + +export default deprecated; diff --git a/private/src/blocks/call-to-action/edit.jsx b/private/src/blocks/call-to-action/edit.jsx new file mode 100644 index 00000000..0ca281f6 --- /dev/null +++ b/private/src/blocks/call-to-action/edit.jsx @@ -0,0 +1,94 @@ +import classnames from 'classnames'; + +import { InnerBlocks, InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, SelectControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { applyFilters } from '@wordpress/hooks'; + +const ALLOWED_BLOCKS = [ + 'core/buttons', + 'amnesty-core/block-button', + 'amnesty-core/block-download', + 'amnesty-core/iframe-button', +]; + +const getTemplate = (type) => { + if (type === 'download') { + return [['amnesty-core/block-download']]; + } + + return [['core/buttons']]; +}; + +export default function Edit({ attributes, setAttributes }) { + const allowedInnerBlocks = applyFilters('add-modal-to-allowed-blocks', ALLOWED_BLOCKS); + + const blockProps = useBlockProps({ + className: classnames('callToAction', { + [`callToAction--${attributes.background}`]: attributes.background, + }), + }); + + return ( + <> + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + <SelectControl + /* translators: [admin] */ + label={__('Background Style', 'amnesty')} + options={[ + { + /* translators: [admin] */ + label: __('Light', 'amnesty'), + value: '', + }, + { + /* translators: [admin] */ + label: __('Grey', 'amnesty'), + value: 'shade', + }, + ]} + value={attributes.background} + onChange={(background) => setAttributes({ background })} + /> + </PanelBody> + </InspectorControls> + <div {...blockProps}> + <RichText + tagName="h2" + className="callToAction-preHeading" + /* translators: [admin] */ + placeholder={__('(Pre-heading)', 'amnesty')} + allowedFormats={[]} + value={attributes.preheading} + onChange={(preheading) => setAttributes({ preheading })} + /> + <RichText + tagName="h1" + className="callToAction-heading" + /* translators: [admin] */ + placeholder={__('(Heading)', 'amnesty')} + allowedFormats={[]} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + /> + <RichText + tagName="p" + className="callToAction-content" + /* translators: [admin] */ + placeholder={__('(Content)', 'amnesty')} + value={attributes.content} + onChange={(content) => setAttributes({ content })} + /> + <div className="callToAction-buttonContainer"> + <InnerBlocks + templateInsertUpdatesSelection={false} + template={getTemplate(attributes.actionType)} + templateLock={false} + allowedBlocks={allowedInnerBlocks} + /> + </div> + </div> + </> + ); +} diff --git a/private/src/blocks/call-to-action/editor.scss b/private/src/blocks/call-to-action/editor.scss new file mode 100644 index 00000000..c05ffc8f --- /dev/null +++ b/private/src/blocks/call-to-action/editor.scss @@ -0,0 +1,55 @@ +.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/block-call-to-action"] { + max-width: 100%; +} + +.callToAction * { + font-family: var(--wp--preset--font-family--secondary); +} + +.callToAction .editor-rich-text__tinymce.mce-content-body { + line-height: 1.3; +} + +.callToAction-heading { + margin-bottom: 24px; +} + +.callToAction-content { + margin-bottom: 24px; +} + +.callToAction-buttonContainer { + position: relative; +} + +.callToAction-buttonContainer [data-type="amnesty-core/block-button"] { + display: flex; + justify-content: center; + align-items: center; +} + +.callToAction-buttonContainer .block-editor-url-input__button { + display: inline-flex; + margin-left: 10px; +} + +.callToAction-buttonContainer .block-editor-url-input__button-modal { + position: absolute; + top: 100%; + margin-top: 5px; +} + +.callToAction .editor-rich-text__tinymce.mce-content-body:not(:last-child) { + // Targets the input when the placeholder is visible. + left: 50%; + transform: translateX(-50%); +} + +.callToAction-buttonContainer .block-editor-block-list__layout { + display: inline-flex; + align-items: center; +} + +.callToAction-buttonContainer .block-editor-block-list__layout .wp-block-button { + margin: 0; +} diff --git a/private/src/blocks/call-to-action/index.jsx b/private/src/blocks/call-to-action/index.jsx new file mode 100644 index 00000000..5ab46532 --- /dev/null +++ b/private/src/blocks/call-to-action/index.jsx @@ -0,0 +1,19 @@ +import './style.scss'; +import './editor.scss'; + +import { assign } from 'lodash'; +import { registerBlockType } from '@wordpress/blocks'; +import { InnerBlocks } from '@wordpress/block-editor'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; +import transforms from './transforms.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + transforms, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'CallToActionBlockSave' }), +}); diff --git a/private/src/blocks/call-to-action/render.php b/private/src/blocks/call-to-action/render.php new file mode 100644 index 00000000..a57b42b8 --- /dev/null +++ b/private/src/blocks/call-to-action/render.php @@ -0,0 +1,30 @@ +<?php + +if ( false !== strpos( $content, 'class="callToAction' ) ) { + return $content; +} + +$pre_heading = $attributes['preheading']; +$heading = $attributes['title']; +$cta_content = $attributes['content']; + +// Set the classes +$classes = classnames( + 'callToAction', + [ + "callToAction--{$attributes['background']}" => (bool) $attributes['background'], + ] +); + +$block_attributes = get_block_wrapper_attributes( [ 'class' => $classes ] ); + +?> + +<div <?php echo wp_kses_data( $block_attributes ); ?> role="note" aria-label="<?php echo esc_attr( $heading ); ?>"> + <h2 class="callToAction-preHeading"><?php echo wp_kses_post( $pre_heading ); ?></h2> + <h1 class="callToAction-heading"><?php echo wp_kses_post( $heading ); ?></h1> + <p class="callToAction-content"><?php echo wp_kses_post( $cta_content ); ?></p> + <div className="innerBlocksContainer"> + <?php echo wp_kses_post( $content ); ?> + </div> +</div> diff --git a/private/src/blocks/call-to-action/style.scss b/private/src/blocks/call-to-action/style.scss new file mode 100644 index 00000000..9194993f --- /dev/null +++ b/private/src/blocks/call-to-action/style.scss @@ -0,0 +1,127 @@ +.callToAction { + margin-top: 40px; + padding: 20px; + text-align: center; + border-top: 7px solid var(--wp--preset--color--black); + border-bottom: 7px solid var(--wp--preset--color--black); + + @media all and (min-width: 760px) { + padding: 36px 32px; + } +} + +.callToAction * { + font-family: var(--wp--preset--font-family--secondary); +} + +.callToAction > *:empty { + display: none; +} + +.callToAction:first-child { + margin-top: 0; +} + +.callToAction-preHeading { + font-size: 21px; + text-align: center; + + @media all and (min-width: 760px) { + font-size: 31px; + margin-bottom: 20px; + } +} + +.callToAction-heading { + font-size: 30px; + margin-bottom: 20px; + text-transform: uppercase; + text-align: center; + + @media all and (min-width: 760px) { + font-size: 41px; + } +} + +.callToAction-content { + margin-right: auto; + margin-left: auto; + max-width: 800px; + line-height: 1.4; + text-align: center; +} + +.callToAction .innerBlocksContainer { + display: flex; + justify-content: center; + + @media all and (min-width: 465px) and (max-width: 940px) { + flex-direction: column; + align-items: inherit; + } +} + +.callToAction .innerBlocksContainer .btn { + margin-top: 0; + margin-left: 30px; + + &:first-of-type { + margin-left: 0; + } + + @media all and (min-width: 465px) and (max-width: 940px) { + margin-top: 30px; + margin-left: 0 !important; + } +} + +.callToAction .innerBlocksContainer .wp-block-button__link { + margin-left: 14px; + + @media all and (min-width: 465px) and (max-width: 940px) { + margin-top: 30px; + margin-left: 0 !important; + } +} + +.callToAction .innerBlocksContainer .wp-block-buttons .wp-block-button { + height: 100%; + + @media all and (min-width: 465px) and (max-width: 940px) { + margin-bottom: 0 !important; + } +} + +.callToAction .innerBlocksContainer .wp-block-buttons .wp-block-button .wp-block-button__link { + display: flex; + align-items: center; + height: 100%; +} + +.rtl .callToAction .innerBlocksContainer .wp-block-buttons { + margin-right: 24px; +} + +.callToAction--shade { + background-color: var(--wp--preset--color--grey-lighter); + border-color: var(--wp--preset--color--grey-lighter); +} + +.callToAction--small { + padding: 20px; +} + +.callToAction--small .callToAction-preHeading { + font-size: 21px; + margin-bottom: 20px; +} + +.callToAction--small .callToAction-heading { + font-size: 30px; + margin-bottom: 20px; +} + +.callToAction--small .callToAction-content { + font-size: 16px; + margin-bottom: 20px; +} diff --git a/private/src/blocks/call-to-action/transforms.jsx b/private/src/blocks/call-to-action/transforms.jsx new file mode 100644 index 00000000..e6263caa --- /dev/null +++ b/private/src/blocks/call-to-action/transforms.jsx @@ -0,0 +1,24 @@ +const { createBlock } = '@wordpress/blocks'; + +const transforms = { + from: [ + { + type: 'block', + isMultiBlock: true, + blocks: ['core/paragraph'], + transform: (attributes) => + attributes.map(({ content }) => + createBlock('amnesty-core/block-call-to-action', { content }), + ), + }, + { + type: 'block', + isMultiBlock: false, + blocks: ['core/heading'], + transform: ({ content }) => + createBlock('amnesty-core/block-call-to-action', { title: content }), + }, + ], +}; + +export default transforms; diff --git a/private/src/blocks/countdown-timer/block.json b/private/src/blocks/countdown-timer/block.json new file mode 100644 index 00000000..74d8f2c9 --- /dev/null +++ b/private/src/blocks/countdown-timer/block.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/countdown-timer", + "title": "Countdown timer", + "category": "amnesty-core", + "description": "Counts down to a specified date and time", + "keywords": ["Countdown", "Timer"], + "icon": "clock", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "file:./view.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "render": "file:./render.php", + "supports": { + }, + "attributes": { + "date": { + "type": "string", + "default": "" + }, + "timeRemaining": { + "type": "string", + "default": "" + }, + "expiredText": { + "type": "string", + "default": "" + }, + "isTimeSet": { + "type": "boolean", + "default": false + }, + "alignment": { + "type": "string", + "default": "none" + } + } +} diff --git a/private/src/scripts/editor/blocks/countdown-timer/deprecated.jsx b/private/src/blocks/countdown-timer/deprecated.jsx similarity index 100% rename from private/src/scripts/editor/blocks/countdown-timer/deprecated.jsx rename to private/src/blocks/countdown-timer/deprecated.jsx diff --git a/private/src/blocks/countdown-timer/edit.jsx b/private/src/blocks/countdown-timer/edit.jsx new file mode 100644 index 00000000..cd57c4d6 --- /dev/null +++ b/private/src/blocks/countdown-timer/edit.jsx @@ -0,0 +1,140 @@ +import { + AlignmentToolbar, + BlockControls, + InspectorControls, + useBlockProps, +} from '@wordpress/block-editor'; +import { DateTimePicker, TextControl, PanelBody } from '@wordpress/components'; +import { useEffect, useState } from '@wordpress/element'; +import { __, _n, _x, sprintf } from '@wordpress/i18n'; + +const MINUTE = 60; +const HOUR = 60 * MINUTE; +const DAY = 24 * HOUR; + +const getTimeRemaining = (date) => { + if (!date) { + return {}; + } + + const total = (Date.parse(date) - Date.now()) / 1000; + const seconds = Math.floor(total % 60); + const minutes = Math.floor((total / MINUTE) % 60); + const hours = Math.floor((total / HOUR) % 24); + const days = Math.floor(total / DAY); + + return { + total, + days, + hours, + minutes, + seconds, + }; +}; + +const pad = (value) => `0${value}`.slice(-2); + +const clockTemplate = (state, attributes) => { + if (!attributes.date) { + return <div className="countdownClock">00:00:00</div>; + } + + const { days = 0, hours = 0, minutes = 0, seconds = 0 } = state.date; + /* translators: [admin] */ + const dayPlural = _n('%d day', '%d days', days, 'amnesty'); + + if (days <= 0 && hours <= 0 && minutes <= 0 && seconds <= 0) { + return <div className="countdownClock">{attributes.expiredText}</div>; + } + + if (days >= 3) { + return <div className="countdownClock">{sprintf(dayPlural, days)}</div>; + } + + if (days >= 1) { + return ( + <div className="countdownClock"> + {sprintf( + /* translators: [admin] */ + _x('%1$s, %2$s:%3$s:%4$s', 'format for timer, i.e. "x days, H:m:s"', 'amnesty'), + sprintf(dayPlural, days), + pad(hours), + pad(minutes), + pad(seconds), + )} + </div> + ); + } + + return ( + <div className="countdownClock"> + {sprintf( + /* translators: [admin] */ + _x('%1$s:%2$s:%3$s', 'time format, i.e. "H:m:s"', 'amnesty'), + pad(hours), + pad(minutes), + pad(seconds), + )} + </div> + ); +}; + +export default function Edit({ attributes, setAttributes }) { + const [state, setState] = useState({ + date: getTimeRemaining(attributes.date), + alignment: '', + }); + + useEffect(() => { + const date = getTimeRemaining(attributes.date); + + if (date.days >= 3) { + return setState({ date }); + } + + const interval = setInterval(() => { + setState({ + date: getTimeRemaining(attributes.date), + }); + }, 1000); + return () => clearInterval(interval); + }, [attributes.date]); + + return ( + <> + <BlockControls> + <AlignmentToolbar + value={attributes.alignment} + onChange={(alignment) => setAttributes({ alignment })} + /> + </BlockControls> + <InspectorControls> + <PanelBody> + <div className="wp-block-amnesty-core-countdown-timer datetime-picker"> + <DateTimePicker + currentDate={attributes.date} + onChange={(date) => setAttributes({ date })} + is12Hour={true} + /> + </div> + <div style={{ marginTop: 20 }}> + <TextControl + /* translators: [admin] */ + label={__('Time Expired Text', 'amnesty')} + className="expiredTextBox" + value={attributes.expiredText} + onChange={(expiredText) => setAttributes({ expiredText })} + /* translators: [admin] */ + placeholder={__('enter text here', 'amnesty')} + /> + </div> + </PanelBody> + </InspectorControls> + <div {...useBlockProps({ className: 'countdownContainer' })}> + <div className="clockdiv" style={{ textAlign: attributes.alignment }}> + {clockTemplate(state, attributes)} + </div> + </div> + </> + ); +} diff --git a/private/src/blocks/countdown-timer/editor.scss b/private/src/blocks/countdown-timer/editor.scss new file mode 100644 index 00000000..c6aed25c --- /dev/null +++ b/private/src/blocks/countdown-timer/editor.scss @@ -0,0 +1,28 @@ +.clockdiv { + justify-content: center; +} + +.countdownClock { + font-size: 5.2em; + color: var(--wp--preset--color--black); + font-family: var(--wp--preset--font-family--secondary); + text-transform: uppercase; +} + +.countdownContainer { + border: 1px solid var(--wp--preset--color--black); + padding: 20px; +} + +.expiredTextBox { + font-weight: bold; +} + +.section--textWhite .countdownClock { + color: var(--wp--preset--color--white); +} + +.wp-block-amnesty-core-countdown-timer.datetime-picker .components-base-control:where(:not(:last-child)), +.wp-block-amnesty-core-countdown-timer.datetime-picker .components-radio-control:where(:not(:last-child)) { + margin-bottom: 0; +} diff --git a/private/src/blocks/countdown-timer/index.js b/private/src/blocks/countdown-timer/index.js new file mode 100644 index 00000000..8db566eb --- /dev/null +++ b/private/src/blocks/countdown-timer/index.js @@ -0,0 +1,14 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/countdown-timer/render.php b/private/src/blocks/countdown-timer/render.php new file mode 100644 index 00000000..e32afdf6 --- /dev/null +++ b/private/src/blocks/countdown-timer/render.php @@ -0,0 +1,3 @@ +<div class="clockdiv" style="text-align:<?php echo esc_attr( $attributes['alignment'] ); ?>"> + <div class="countdownClock" data-timestamp="<?php echo esc_attr( $attributes['date'] ); ?>" data-expiredText="<?php echo esc_attr( $attributes['expiredText'] ); ?>"></div> +</div> diff --git a/private/src/styles/blocks/countdown-timer/_main.scss b/private/src/blocks/countdown-timer/style.scss similarity index 100% rename from private/src/styles/blocks/countdown-timer/_main.scss rename to private/src/blocks/countdown-timer/style.scss diff --git a/private/src/blocks/countdown-timer/view.js b/private/src/blocks/countdown-timer/view.js new file mode 100644 index 00000000..05008920 --- /dev/null +++ b/private/src/blocks/countdown-timer/view.js @@ -0,0 +1,89 @@ +import './style.scss'; + +import { _n, _x, sprintf } from '@wordpress/i18n'; + +const MINUTE = 60; +const HOUR = 60 * MINUTE; +const DAY = 24 * HOUR; + +const getTimeRemaining = (date) => { + if (!date) { + return {}; + } + + const total = (Date.parse(date) - Date.now()) / 1000; + const seconds = Math.floor(total % 60); + const minutes = Math.floor((total / MINUTE) % 60); + const hours = Math.floor((total / HOUR) % 24); + const days = Math.floor(total / DAY); + + return { + total, + days, + hours, + minutes, + seconds, + }; +}; + +const pad = (value) => `0${value}`.slice(-2); + +const clockTemplate = (data, attributes) => { + if (!attributes.date) { + return '00:00:00'; + } + + const { days = 0, hours = 0, minutes = 0, seconds = 0 } = data; + /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b021-countdown-timer/ */ + const dayPlural = _n('%d day', '%d days', days, 'amnesty'); + + if (days <= 0 && hours <= 0 && minutes <= 0 && seconds <= 0) { + return attributes.expiredText; + } + + if (days >= 3) { + return sprintf(dayPlural, days); + } + + if (days >= 1) { + return sprintf( + /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b021-countdown-timer/ */ + _x( + '%1$s, %2$s:%3$s:%4$s', + 'time format(prefix translated separately) i.e. "x, H:i:s"', + 'amnesty', + ), + sprintf(dayPlural, days), + pad(hours), + pad(minutes), + pad(seconds), + ); + } + + return sprintf( + /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b021-countdown-timer/ */ + _x('%1$s:%2$s:%3$s', 'time format, H:i:s', 'amnesty'), + pad(hours), + pad(minutes), + pad(seconds), + ); +}; + +const renderClock = (endTime) => { + const { expiredtext, timestamp } = endTime.dataset; + const data = getTimeRemaining(timestamp); + + /* eslint-disable no-param-reassign */ + endTime.textContent = clockTemplate(data, { + expiredText: expiredtext, + date: timestamp, + }); +}; + +document.addEventListener('DOMContentLoaded', () => { + const endTimes = document.querySelectorAll('.countdownClock'); + + Array.from(endTimes).forEach((endTime) => { + setInterval(() => renderClock(endTime), 1000); + }); +}); diff --git a/private/src/blocks/download/block.json b/private/src/blocks/download/block.json new file mode 100644 index 00000000..88ae951c --- /dev/null +++ b/private/src/blocks/download/block.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-download", + "title": "Resource Download", + "category": "amnesty-core", + "description": "Add a button (+ dropdown selector) to download resource(s)", + "icon": "download", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "file:./view.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "render": "file:./render.php", + "supports": { + "className": true, + "multiple": true, + "align": ["left", "center", "right"] + }, + "styles": [ + { + "name": "dark", + "label": "Dark", + "isDefault": true + }, + { + "name": "light", + "label": "Light", + "isDefault": false + } + ], + "attributes": { + "files": { + "type": "array", + "default": [] + }, + "buttonText": { + "type": "string", + "default": "Download" + }, + "alignment": { + "type": "string", + "default": "none" + } + } +} diff --git a/private/src/blocks/download/deprecated.jsx b/private/src/blocks/download/deprecated.jsx new file mode 100644 index 00000000..a0e6a32f --- /dev/null +++ b/private/src/blocks/download/deprecated.jsx @@ -0,0 +1,53 @@ +import { select } from '@wordpress/data'; + +const v1 = { + supports: { + className: false, + multiple: false, + }, + attributes: { + fileId: { + type: 'integer', + source: 'meta', + meta: 'download_id', + }, + downloadButtonText: { + type: 'string', + source: 'meta', + meta: 'download_text', + }, + }, + isEligible: (attributes) => { + const meta = select('core/editor').getCurrentPostAttribute('meta'); + + if (!meta) { + return false; + } + + if (attributes.files && attributes.files.length) { + return false; + } + + const { download_id: fileId } = meta; + + return !!fileId; + }, + migrate: () => { + const meta = select('core/editor').getCurrentPostAttribute('meta'); + + if (!meta) { + return {}; + } + + const { download_id: fileId, download_text: downloadButtonText } = meta; + + return { + files: [fileId], + buttonText: downloadButtonText, + // style: 'dark', + }; + }, + save: () => null, +}; + +export default [v1]; diff --git a/private/src/blocks/download/edit.jsx b/private/src/blocks/download/edit.jsx new file mode 100644 index 00000000..3e06b832 --- /dev/null +++ b/private/src/blocks/download/edit.jsx @@ -0,0 +1,135 @@ +import { every, pick } from 'lodash'; +import { Button } from '@wordpress/components'; +import { dispatch } from '@wordpress/data'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const { MediaPlaceholder, MediaUploadCheck, RichText, useBlockProps } = wp.blockEditor; + +const MESSAGES = { + /* translators: [admin] */ + uploading: __('Uploading…', 'amnesty'), + /* translators: [admin] */ + uploadError: __('Uploading failed', 'amnesty'), + /* translators: [admin] */ + uploadSuccess: __('Uploading complete', 'amnesty'), +}; + +export default function Edit({ attributes, setAttributes }) { + const [preupload, setPreupload] = useState(0); + const [postupload, setPostupload] = useState(0); + const [locked, setLocked] = useState(false); + const [type, setType] = useState(false); + + const onBeforeUpload = (value) => { + if (!locked) { + setLocked(true); + dispatch('core/editor').lockPostSaving('fileUploadLock'); + dispatch('core/notices').createWarningNotice(MESSAGES.uploading, { + id: MESSAGES.uploading, + }); + } + + setPreupload(value.length); + }; + + const onUploadError = (message) => { + let errorMessage; + + dispatch('core/notices').removeNotice(MESSAGES.uploading); + + if (Array.isArray(message)) { + [, , errorMessage] = message; + } else { + errorMessage = message; + } + + dispatch('core/notices').createErrorNotice(errorMessage, { id: MESSAGES.uploadError }); + dispatch('core/editor').unlockPostSaving('fileUploadLock'); + }; + + const onFilesSelect = (media) => { + dispatch('core/notices').removeNotice(MESSAGES.uploadError); + + setAttributes({ files: media.map((m) => pick(m, ['id', 'title'])) }); + + setPostupload(media.length); + setType(every(media, 'type')); + // state.spinner: true? + + if (preupload === postupload && type === true) { + if (locked) { + setLocked(false); + dispatch('core/editor').unlockPostSaving('fileUploadLock'); + } + + setPreupload(0); + setType(false); + + dispatch('core/notices').removeNotice(MESSAGES.uploading); + dispatch('core/notices').createSuccessNotice(MESSAGES.uploadSuccess, { + id: MESSAGES.uploadSuccess, + }); + + setTimeout(() => dispatch('core/notices').removeNotice(MESSAGES.uploadSuccess), 3000); + } + }; + + const blockProps = useBlockProps({ + className: attributes.files.length > 1 ? 'has-multiple' : '', + }); + + return ( + <> + {!attributes.files.length && ( + <div {...blockProps} style={{ maxHeight: '135px', width: '100%' }}> + <MediaUploadCheck> + <MediaPlaceholder + icon="media-default" + multiple={true} + isAppender={true} + accept="*" + labels={{ + /* translators: [admin] */ + title: __('Select File(s)', 'amnesty'), + /* translators: [admin] */ + instructions: __('Upload media files or pick from your media library.', 'amnesty'), + }} + onFilesPreUpload={onBeforeUpload} + onError={onUploadError} + onSelect={onFilesSelect} + /> + </MediaUploadCheck> + </div> + )} + {attributes.files.length > 0 && ( + <div {...blockProps}> + {attributes.files.length > 1 && ( + <select> + <option key="label"> + {/* translators: [admin] */ __('Select a file to download', 'amnesty')} + </option> + {attributes.files.map((file) => ( + <option key={file.id}>{file.title}</option> + ))} + </select> + )} + <span className="btn btn--download"> + <RichText + format="string" + tagName="span" + allowedFormats={[]} + /* translators: [admin] */ + placeholder={__('Download', 'amnesty')} + value={attributes.buttonText} + onChange={(buttonText) => setAttributes({ buttonText })} + /> + </span> + <Button isDestructive variant="link" onClick={() => setAttributes({ files: [] })}> + {/* translators: [admin] */ __('Clear File(s)', 'amnesty')} + </Button> + </div> + )} + </> + ); +} diff --git a/private/src/blocks/download/editor.scss b/private/src/blocks/download/editor.scss new file mode 100644 index 00000000..040ec3c3 --- /dev/null +++ b/private/src/blocks/download/editor.scss @@ -0,0 +1,103 @@ +.element-select { + box-sizing: border-box; + position: relative; + display: inline-block; + margin-right: 10px; + width: 300px; + height: 56px; + background-color: var(--wp--preset--color--white); + + select { + padding: 10px; + width: 100% !important; + height: 100% !important; + border-radius: 0 !important; + border: 2px solid; + } +} + +.section--textWhite .element-select::after { + background-position: -271px -131px; +} + +.section--textWhite .element-select select { + color: var(--wp--preset--color--white); + border-color: var(--wp--preset--color--white); +} + +.wp-block-amnesty-core-block-download { + padding: 2px; + border: 1px dashed; + max-height: none !important; +} + +.wp-block-amnesty-core-block-download, +.wp-block-amnesty-core-block-download * { + box-sizing: border-box; +} + +.wp-core-ui .wp-block-amnesty-core-block-download select { + background: none; +} + +.wp-block-amnesty-core-block-download .components-form-file-upload { + width: 100%; +} + +.wp-block-amnesty-core-block-download .block-editor-media-placeholder.is-appender { + outline: none; +} + +.wp-block-amnesty-core-block-download.aligncenter { + display: flex; + justify-content: center; +} + +.wp-block-amnesty-core-block-download.alignleft { + display: flex; + justify-content: flex-start; +} + +.wp-block-amnesty-core-block-download.alignright { + display: flex; + justify-content: flex-end; +} + +.wp-block-amnesty-core-block-download.has-multiple { + align-items: stretch; +} + +.wp-block-amnesty-core-block-download.has-multiple select { + appearance: revert; + margin-right: 12px; + + .rtl & { + margin-right: 0; + margin-left: 12px; + } +} + +.wp-block-amnesty-core-block-download.is-style-light .btn--download { + background-color: var(--wp--preset--color--white); + border: 1px solid var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-block-download.is-style-dark .btn--download { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + border: 1px solid var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-block-download.is-style-light .btn--download:hover, +.wp-block-amnesty-core-block-download.is-style-light .btn--download:active, +.wp-block-amnesty-core-block-download.is-style-light .btn--download:focus { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); +} + +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:hover, +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:active, +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:focus { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} diff --git a/private/src/static/images/icon-download-arrow-dark.svg b/private/src/blocks/download/icon-download-arrow-dark.svg similarity index 100% rename from private/src/static/images/icon-download-arrow-dark.svg rename to private/src/blocks/download/icon-download-arrow-dark.svg diff --git a/private/src/static/images/icon-download-arrow.svg b/private/src/blocks/download/icon-download-arrow.svg similarity index 100% rename from private/src/static/images/icon-download-arrow.svg rename to private/src/blocks/download/icon-download-arrow.svg diff --git a/private/src/blocks/download/index.js b/private/src/blocks/download/index.js new file mode 100644 index 00000000..8db566eb --- /dev/null +++ b/private/src/blocks/download/index.js @@ -0,0 +1,14 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/download/render.php b/private/src/blocks/download/render.php new file mode 100644 index 00000000..4911914a --- /dev/null +++ b/private/src/blocks/download/render.php @@ -0,0 +1,76 @@ +<?php + +$wrapper_attributes = get_block_wrapper_attributes(); + +$attributes = apply_filters( 'amnesty_download_block_attributes', $attributes ); + +$files = $attributes['files']; +$text = $attributes['buttonText']; + +if ( count( $files ) < 2 ) : + if ( empty( $files[0]['id'] ) ) { + return; + } + + $url = $files[0]['link'] ?? amnesty_get_attachment_url( $files[0]['id'] ); + + if ( ! $url ) { + return; + } + + $name = explode( '/', $url ); + $name = array_pop( $name ); + + ?> + + <div <?php echo wp_kses_data( $wrapper_attributes ); ?>> + <a + class="btn btn--download" + href="<?php echo esc_url( $url ); ?>" + download="<?php echo esc_attr( $name ); ?>" + target="_blank" + role="button" + ><?php echo esc_html( $text ); ?></a> + </div> + + <?php + +endif; + +if ( count( $files ) >= 2 ) : + + $first_url = $files[0]['link'] ?? wp_get_attachment_url( $files[0]['id'] ); + $first_name = basename( $files[0]['link'] ?? wp_get_attachment_url( $files[0]['id'] ) ); + $options = []; + + foreach ( $files as $file ) { + $key = $file['link'] ?? wp_get_attachment_url( $file['id'] ); + + $options[ $key ] = $file['title']; + } + + ?> +<div <?php echo wp_kses_data( $wrapper_attributes ); ?>> + <?php + + amnesty_render_custom_select( + [ + 'label' => wp_trim_words( $files[0]['title'], 8 ), + 'is_control' => true, + 'options' => $options, + ], + 'post', + ); + + ?> + <a + class="btn btn--download" + href="<?php echo esc_url( $first_url ); ?>" + download="<?php echo esc_attr( $first_name ); ?>" + role="button" + ><?php echo esc_html( $text ); ?></a> +</div> + + <?php + +endif; diff --git a/private/src/blocks/download/style.scss b/private/src/blocks/download/style.scss new file mode 100644 index 00000000..bccfebde --- /dev/null +++ b/private/src/blocks/download/style.scss @@ -0,0 +1,128 @@ +.wp-block-amnesty-core-block-download { + display: flex; + flex-direction: column; + align-content: flex-start; + align-items: stretch; + gap: var(--wp--preset--spacing--half); + + @media all and (min-width: 540px) { + flex-direction: row; + } +} + +.wp-block-amnesty-core-block-download .checkboxGroup { + min-width: 200px; +} + +.wp-block-amnesty-core-block-download .checkboxGroup-button, +.wp-block-amnesty-core-block-download .checkboxGroup-list { + width: 100%; +} + +.wp-block-amnesty-core-block-download.alignleft { + float: none !important; + + @media all and (min-width: 540px) { + justify-content: flex-start; + } +} + +.wp-block-amnesty-core-block-download.aligncenter { + float: none !important; + + @media all and (min-width: 540px) { + justify-content: center; + display: flex; + } +} + +.wp-block-amnesty-core-block-download.alignright { + float: none !important; + + @media all and (min-width: 540px) { + justify-content: flex-end; + } +} + +.btn--download { + display: inline-flex; + align-items: baseline; + margin-top: 24px; + + .article-content & { + margin-top: 24px; + } +} + +.wp-block-amnesty-core-block-download .btn--download { + display: inline-flex; + + [dir="rtl"] & { + flex-direction: row-reverse; + } + + [dir="ltr"] & { + flex-direction: row; + } + + @media all and (min-width: 540px) { + margin-top: 0; + } +} + +.btn--download::before { + content: ""; + display: inline-block; + width: 20px; + height: 20px; + margin-right: 20px; + background-image: url("./icon-download-arrow-dark.svg"); + background-size: contain; + transform: translateY(2px); + + .rtl & { + margin-right: 0; + margin-left: 20px; + } +} + +.wp-block-amnesty-core-block-download.is-style-light .btn--download { + background-color: var(--wp--preset--color--white); + border: 1px solid var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-block-download.is-style-light .btn--download:hover, +.wp-block-amnesty-core-block-download.is-style-light .btn--download:active, +.wp-block-amnesty-core-block-download.is-style-light .btn--download:focus { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); +} + +.wp-block-amnesty-core-block-download.is-style-light .btn--download:hover::before, +.wp-block-amnesty-core-block-download.is-style-light .btn--download:active::before, +.wp-block-amnesty-core-block-download.is-style-light .btn--download:focus::before { + background-image: url("./icon-download-arrow.svg"); +} + +.wp-block-amnesty-core-block-download.is-style-dark .btn--download { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + border: 1px solid var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:hover, +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:active, +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:focus { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:hover::before, +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:active::before, +.wp-block-amnesty-core-block-download.is-style-dark .btn--download:focus::before { + background-image: url("./icon-download-arrow-dark.svg"); +} + +.wp-block-amnesty-core-block-download.is-style-dark .btn--download::before { + background-image: url("./icon-download-arrow.svg"); +} diff --git a/private/src/blocks/download/view.js b/private/src/blocks/download/view.js new file mode 100644 index 00000000..23e152ee --- /dev/null +++ b/private/src/blocks/download/view.js @@ -0,0 +1,35 @@ +import './style.scss'; + +const setupFormControl = (block) => { + const choices = block.querySelector('.checkboxGroup'); + const download = block.querySelector('.btn--download'); + + if (!choices || !download) { + return; + } + + choices.addEventListener('change', (event) => { + const { target } = event; + const { + dataset: { value }, + } = target; + + // make sure that the URI is for the current origin + const path = new URL(value).pathname; + const href = new URL(path, window.location.origin); + + download.setAttribute('href', href.toString()); + download.setAttribute('download', href.toString().split('/').pop()); + }); +}; + +document.addEventListener('DOMContentLoaded', () => { + const blocks = Array.from(document.querySelectorAll('.download-block')); + + if (!blocks.length) { + return; + } + + const multiple = blocks.filter(({ classList }) => classList.contains('is-multiple')); + multiple.forEach(setupFormControl); +}); diff --git a/private/src/blocks/embed-flourish/block.json b/private/src/blocks/embed-flourish/block.json new file mode 100644 index 00000000..6d5129d6 --- /dev/null +++ b/private/src/blocks/embed-flourish/block.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/embed-flourish", + "title": "Flourish Embed", + "category": "amnesty-core", + "description": "Embed a Flourish visualisation", + "keywords": ["Flourish", "Embed"], + "icon": "embed-photo", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "flourish-embed", + "render": "file:./render.php", + "attributes": { + "source": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/embed-flourish/edit.jsx b/private/src/blocks/embed-flourish/edit.jsx new file mode 100644 index 00000000..0ecf0ddc --- /dev/null +++ b/private/src/blocks/embed-flourish/edit.jsx @@ -0,0 +1,51 @@ +import { delay } from 'lodash'; +import { useBlockProps } from '@wordpress/block-editor'; +import { Button, TextControl } from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { httpsOnly } from '../../utils'; + +// load flourish embed script +const loadScript = () => { + if (document.getElementById('flourish-script')) { + return; + } + + const script = document.createElement('script'); + script.id = 'flourish-script'; + script.async = true; + document.body.appendChild(script); + script.src = 'https://public.flourish.studio/resources/embed.js'; +}; + +export default function Edit({ attributes, setAttributes }) { + const blockProps = useBlockProps(); + const [isPreviewing, preview] = useState(false); + + if (isPreviewing && attributes.source) { + delay(loadScript, 1000); + return ( + <div {...blockProps}> + <div style={{ minHeight: '20px', border: '1px dashed' }}> + <div className="flourish-embed" data-src={attributes.source}></div> + </div> + </div> + ); + } + + return ( + <div {...blockProps}> + <TextControl + value={httpsOnly(attributes.source)} + onChange={(source) => setAttributes({ source })} + /* translators: [admin] */ + label={__('The Flourish embed source (not the full URL).', 'amnesty')} + placeholder="e.g. visualisation/123456" + /> + <Button variant="primary" onClick={() => preview(!isPreviewing)}> + {/* translators: [admin] */ __('Preview Embed', 'amnesty')} + </Button> + </div> + ); +} diff --git a/private/src/blocks/embed-flourish/index.js b/private/src/blocks/embed-flourish/index.js new file mode 100644 index 00000000..a1823e39 --- /dev/null +++ b/private/src/blocks/embed-flourish/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/embed-flourish/render.php b/private/src/blocks/embed-flourish/render.php new file mode 100644 index 00000000..e41e35c9 --- /dev/null +++ b/private/src/blocks/embed-flourish/render.php @@ -0,0 +1,8 @@ +<?php + +if ( ! $attributes['source'] ) { + return; +} + +// phpcs:ignore WordPressVIPMinimum.Security.ProperEscapingFunction.hrefSrcEscUrl ?> +<div class="flourish-embed" data-src="<?php echo esc_attr( $attributes['source'] ); ?>"></div> diff --git a/private/src/blocks/embed-infogram/block.json b/private/src/blocks/embed-infogram/block.json new file mode 100644 index 00000000..d7e5abf8 --- /dev/null +++ b/private/src/blocks/embed-infogram/block.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/embed-infogram", + "title": "Infogram Embed", + "category": "amnesty-core", + "description": "Embed a resource from Infogram", + "keywords": ["Infogram", "Embed"], + "icon": "embed-photo", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "file:./view.js", + "render": "file:./render.php", + "supports": { + }, + "attributes": { + "identifier": { + "type": "string", + "default": "" + }, + "type": { + "type": "string", + "default": "interactive" + }, + "title": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/embed-infogram/edit.jsx b/private/src/blocks/embed-infogram/edit.jsx new file mode 100644 index 00000000..26734012 --- /dev/null +++ b/private/src/blocks/embed-infogram/edit.jsx @@ -0,0 +1,32 @@ +import { useBlockProps } from '@wordpress/block-editor'; +import { TextControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +export default function Edit({ attributes, setAttributes }) { + return ( + <div {...useBlockProps()}> + <TextControl + /* translators: [admin] */ + label={__('The embed code', 'amnesty')} + value={attributes.identifier} + onChange={(identifier) => setAttributes({ identifier })} + placeholder="e.g. 75e11a7d-a5bb-45b2-9764-b5fdbdfdf489" + /> + <TextControl + /* translators: [admin] */ + label={__('The embed type', 'amnesty')} + value={attributes.type} + onChange={(type) => setAttributes({ type })} + placeholder="e.g. 'interactive'" + /> + <TextControl + /* translators: [admin] */ + label={__('The embed title', 'amnesty')} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + /* translators: [admin] */ + placeholder={__('Ending the Death Penalty', 'amnesty')} + /> + </div> + ); +} diff --git a/private/src/blocks/embed-infogram/index.js b/private/src/blocks/embed-infogram/index.js new file mode 100644 index 00000000..a1823e39 --- /dev/null +++ b/private/src/blocks/embed-infogram/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/embed-infogram/render.php b/private/src/blocks/embed-infogram/render.php new file mode 100644 index 00000000..4af5bfab --- /dev/null +++ b/private/src/blocks/embed-infogram/render.php @@ -0,0 +1,13 @@ +<?php + +if ( ! isset( $attributes['identifier'] ) ) { + return; +} + +?> +<div + class="infogram-embed" + data-id="<?php echo esc_attr( $attributes['identifier'] ); ?>" + data-type="<?php echo esc_attr( $attributes['type'] ); ?>" + data-title="<?php echo esc_attr( $attributes['title'] ); ?>" +></div> diff --git a/private/src/static/scripts/infogram-loader.js b/private/src/blocks/embed-infogram/view.js similarity index 100% rename from private/src/static/scripts/infogram-loader.js rename to private/src/blocks/embed-infogram/view.js diff --git a/private/src/blocks/embed-sutori/block.json b/private/src/blocks/embed-sutori/block.json new file mode 100644 index 00000000..423bfa01 --- /dev/null +++ b/private/src/blocks/embed-sutori/block.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/embed-sutori", + "title": "Sutori Embed", + "category": "amnesty-core", + "description": "Embed a resource from Sutori", + "keywords": ["Sutori", "Embed"], + "icon": "embed-photo", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "attributes": { + "source": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/embed-sutori/edit.jsx b/private/src/blocks/embed-sutori/edit.jsx new file mode 100644 index 00000000..0efe1a77 --- /dev/null +++ b/private/src/blocks/embed-sutori/edit.jsx @@ -0,0 +1,43 @@ +import { useBlockProps } from '@wordpress/block-editor'; +import { Button, TextControl } from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { httpsOnly } from '../../utils'; + +const getIframeSrc = (rawValue, setAttributes) => { + const source = rawValue.replace(/^.*<iframe.*?src=(["'])([^\1]*?)\1.*$/, '$2'); + + if (source) { + setAttributes({ source: httpsOnly(source) }); + } +}; + +export default function Edit({ attributes, setAttributes }) { + const blockProps = useBlockProps(); + const [isPreviewing, preview] = useState(false); + + if (isPreviewing && httpsOnly(attributes.source)) { + return ( + <div {...blockProps} style={{ minHeight: '20px', border: '1px dashed' }}> + <div className="sutori-embed"> + <iframe src={httpsOnly(attributes.source)} height="600px" width="100%"></iframe> + </div> + </div> + ); + } + + return ( + <div {...blockProps}> + <TextControl + value={httpsOnly(attributes.source)} + onChange={(source) => getIframeSrc(source, setAttributes)} + /* translators: [admin] */ + placeholder={__('The Sutori embed code', 'amnesty')} + /> + <Button variant="primary" onClick={() => preview(!isPreviewing)}> + {/* translators: [admin] */ __('Preview Embed', 'amnesty')} + </Button> + </div> + ); +} diff --git a/private/src/blocks/embed-sutori/editor.scss b/private/src/blocks/embed-sutori/editor.scss new file mode 100644 index 00000000..98f55591 --- /dev/null +++ b/private/src/blocks/embed-sutori/editor.scss @@ -0,0 +1,3 @@ +.sutori-embed iframe { + display: block; +} diff --git a/private/src/blocks/embed-sutori/index.js b/private/src/blocks/embed-sutori/index.js new file mode 100644 index 00000000..c7e3dcd0 --- /dev/null +++ b/private/src/blocks/embed-sutori/index.js @@ -0,0 +1,13 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/embed-sutori/render.php b/private/src/blocks/embed-sutori/render.php new file mode 100644 index 00000000..a2ffeae2 --- /dev/null +++ b/private/src/blocks/embed-sutori/render.php @@ -0,0 +1,18 @@ +<?php + +if ( ! $attributes['source'] ) { + return; +} + +$classname = classnames( $attributes['className'], 'sutori-embed' ); + +?> + +<a class="sutori-toggle aligncenter" href="#" data-toggle="<?php echo esc_attr( sprintf( '.%s iframe', $classname ) ); ?>" data-toggle-with="is-open"> + <?php /* translators: [front] no context avalible */ echo esc_html_x( 'Click to show/hide timeline', 'Toggle visibility of Sutori Timeline', 'amnesty' ); ?> +</a> +<div class="<?php echo esc_attr( $classname ); ?>"> + <script src="https://assets.sutori.com/frontend-assets/assets/iframeResizer.js"></script> + <iframe src="<?php echo esc_url( $attributes['source'] ); ?>" width="100%" height="600" frameborder="0"></iframe> + <script src="https://assets.sutori.com/frontend-assets/assets/iframeResizer.executer.js"></script> +</div> diff --git a/private/src/blocks/embed-sutori/style.scss b/private/src/blocks/embed-sutori/style.scss new file mode 100644 index 00000000..a88bf2ae --- /dev/null +++ b/private/src/blocks/embed-sutori/style.scss @@ -0,0 +1,16 @@ +.sutori-toggle { + margin-top: 24px; + text-align: center; + font-family: var(--wp--preset--font-family--secondary); + font-size: 36px; + text-decoration: underline; + text-decoration-skip-ink: auto; +} + +.sutori-embed iframe { + display: none; +} + +.sutori-embed iframe.is-open { + display: block; +} diff --git a/private/src/blocks/embed-tickcounter/block.json b/private/src/blocks/embed-tickcounter/block.json new file mode 100644 index 00000000..2f3e9d85 --- /dev/null +++ b/private/src/blocks/embed-tickcounter/block.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/embed-tickcounter", + "title": "Tickcounter Embed", + "category": "amnesty-core", + "description": "Embed a resource from Tickcounter", + "keywords": ["Tickcounter", "Embed", "Counter", "Timer"], + "icon": "embed-photo", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "tickcounter-sdk", + "render": "file:./render.php", + "supports": { + "inserter": true, + "align": ["left", "center", "right"], + "className": true + }, + "attributes": { + "alignment": { + "type": "string", + "default": "center" + }, + "source": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/embed-tickcounter/edit.jsx b/private/src/blocks/embed-tickcounter/edit.jsx new file mode 100644 index 00000000..db4dcf0a --- /dev/null +++ b/private/src/blocks/embed-tickcounter/edit.jsx @@ -0,0 +1,34 @@ +import { useBlockProps } from '@wordpress/block-editor'; +import { Placeholder, TextControl } from '@wordpress/components'; +import { select } from '@wordpress/data'; +import { __, sprintf } from '@wordpress/i18n'; + +import { httpsOnly } from '../../utils'; + +const stripScript = (html) => html.replace(/<script>.+<\/script>/, ''); + +export default function Edit({ attributes, setAttributes }) { + return ( + <div {...useBlockProps()}> + <Placeholder + /* translators: [admin] */ + label={__('Tickcounter Embed', 'amnesty')} + instructions={sprintf( + /* translators: [admin] */ + __( + 'This embed cannot be previewed in the editor. Preview the %s itself to see the embed in action', + 'amnesty', + ), + select('core/editor').getCurrentPostType(), + )} + > + <TextControl + value={httpsOnly(attributes.source)} + onChange={(source) => setAttributes({ source: httpsOnly(stripScript(source)) })} + /* translators: [admin] */ + placeholder={__('The Tickcounter embed code', 'amnesty')} + /> + </Placeholder> + </div> + ); +} diff --git a/private/src/blocks/embed-tickcounter/index.js b/private/src/blocks/embed-tickcounter/index.js new file mode 100644 index 00000000..a1823e39 --- /dev/null +++ b/private/src/blocks/embed-tickcounter/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/embed-tickcounter/render.php b/private/src/blocks/embed-tickcounter/render.php new file mode 100644 index 00000000..39e54497 --- /dev/null +++ b/private/src/blocks/embed-tickcounter/render.php @@ -0,0 +1,34 @@ +<?php + +if ( ! function_exists( 'amnesty_allow_display_inline_style' ) ) { + /** + * Add "display" to the list of allowed CSS properties for inline styles + * + * @package Amnesty\Blocks + * + * @param array<int,string> $safe the existing list of allowed properties + * + * @return array<int,string> + */ + function amnesty_allow_display_inline_style( array $safe ): array { + return array_merge( $safe, [ 'display' ] ); + } +} + +if ( ! $attributes['source'] ) { + return; +} + +add_filter( 'safe_style_css', 'amnesty_allow_display_inline_style' ); + +$wrapper_attributes = get_block_wrapper_attributes(); + +?> + +<div <?php echo esc_attr( $wrapper_attributes ); ?>> + <?php echo wp_kses_post( $attributes['source'] ); ?> +</div> + +<?php + +remove_filter( 'safe_style_css', 'amnesty_allow_display_inline_style' ); diff --git a/private/src/blocks/fluid-iframe/block.json b/private/src/blocks/fluid-iframe/block.json new file mode 100644 index 00000000..75c7c4ab --- /dev/null +++ b/private/src/blocks/fluid-iframe/block.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/fluid-iframe", + "title": "Fluid Iframe", + "category": "amnesty-core", + "description": "Create an iframe that responds dynamically to the browser width", + "icon": "welcome-widgets-menus", + "keywords": ["iframe", "responsive", "fluid"], + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "viewScript": "file:./view.js", + "render": "file:./render.php", + "supports": { + "align": true + }, + "attributes": { + "title": { + "type": "string", + "default": "" + }, + "caption": { + "type": "string", + "default": "" + }, + "embedUrl": { + "type": "string", + "default": "" + }, + "height": { + "type": "number", + "default": 400 + }, + "minHeight": { + "type": "number", + "default": 350 + }, + "width": { + "type": "number", + "default": "100" + }, + "minWidth": { + "type": "number", + "default": "100" + } + } +} diff --git a/private/src/blocks/fluid-iframe/components/EmbedContainer.jsx b/private/src/blocks/fluid-iframe/components/EmbedContainer.jsx new file mode 100644 index 00000000..1852bdb0 --- /dev/null +++ b/private/src/blocks/fluid-iframe/components/EmbedContainer.jsx @@ -0,0 +1,41 @@ +import { RichText } from '@wordpress/block-editor'; +import { __ } from '@wordpress/i18n'; + +import { httpsOnly } from '../../../utils'; + +export default function EmbedContainer({ attributes, setAttributes }) { + const { isSelected, className, embedUrl, height, width } = attributes; + let { minHeight, minWidth } = attributes; + + if (!width && !height) { + minHeight = Math.max(minHeight, 350); + } + + if (!width) { + minWidth = '100%'; + } else { + minWidth = `${width}%`; + } + + return ( + <figure className={className}> + <div className="iframe-wrapper" style={{ minHeight }}> + <iframe src={httpsOnly(embedUrl)} style={{ height: `${minHeight}px`, width: minWidth }} /> + </div> + {attributes.caption || + (isSelected && ( + <div className="iframe-caption-wrapper"> + <RichText + tagName="figcaption" + /* translators: [admin] */ + placeholder={__('Write caption…', 'amnesty')} + value={attributes.caption} + onChange={(caption) => setAttributes({ caption })} + inlineToolbar + format="string" + /> + </div> + ))} + </figure> + ); +} diff --git a/private/src/blocks/fluid-iframe/components/FramePlaceholder.jsx b/private/src/blocks/fluid-iframe/components/FramePlaceholder.jsx new file mode 100644 index 00000000..50f7de46 --- /dev/null +++ b/private/src/blocks/fluid-iframe/components/FramePlaceholder.jsx @@ -0,0 +1,30 @@ +import { Button, Placeholder } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +/** + * Placeholder component + * + * @param {Object} props component props + * + * @returns {WP.Element} + */ +export default function FramePlaceholder({ label, className, onSubmit, inputRef }) { + return ( + <Placeholder label={label} className={className}> + <form onSubmit={onSubmit}> + <input + ref={inputRef} + type="url" + className="components-placeholder__input" + /* translators: [admin] */ + aria-label={__('Iframe URL', 'amnesty')} + /* translators: [admin] */ + placeholder={__('Enter URL to embed here…', 'amnesty')} + /> + <Button isLarge variant="primary" type="submit"> + {/* translators: [admin] */ __('Embed', 'amnesty')} + </Button> + </form> + </Placeholder> + ); +} diff --git a/private/src/blocks/fluid-iframe/edit.jsx b/private/src/blocks/fluid-iframe/edit.jsx new file mode 100644 index 00000000..31a1e1fb --- /dev/null +++ b/private/src/blocks/fluid-iframe/edit.jsx @@ -0,0 +1,117 @@ +import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; +import { Button, PanelBody, TextControl } from '@wordpress/components'; +import { createRef } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { httpsOnly } from '../../utils'; +import EmbedContainer from './components/EmbedContainer.jsx'; +import FramePlaceholder from './components/FramePlaceholder.jsx'; + +const BlockInspectorControls = ({ attributes, setAttributes, resetEmbed }) => { + let widthHelpText = ''; + if (!attributes.width && attributes.height) { + /* translators: [admin] */ + widthHelpText = __('Required when specifying a height', 'amnesty'); + } + + let heightHelpText = ''; + if (!attributes.height && attributes.width) { + /* translators: [admin] */ + heightHelpText = __('Required when specifying a width', 'amnesty'); + } + + let minHeightHelpText = ''; + if (!attributes.width && !attributes.height) { + /* translators: [admin] */ + minHeightHelpText = __('Required if not using width/height, optional otherwise', 'amnesty'); + } + + return ( + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + <TextControl + /* translators: [admin] */ + label={__('Width in percentage', 'amnesty')} + value={attributes.width} + type="number" + step={1} + help={widthHelpText} + onChange={(width) => setAttributes({ width })} + /> + <TextControl + /* translators: [admin] */ + label={__('Height in pixels', 'amnesty')} + value={attributes.height} + type="number" + step={10} + help={heightHelpText} + onChange={(height) => setAttributes({ height })} + /> + <TextControl + /* translators: [admin] */ + label={__('Minimum Height', 'amnesty')} + value={attributes.minHeight} + type="number" + step={10} + min={0} + max={1000} + help={minHeightHelpText} + onChange={(minHeight) => setAttributes({ minHeight })} + /> + <hr /> + <TextControl + /* translators: [admin] */ + label={__('Iframe Title', 'amnesty')} + /* translators: [admin] */ + help={__('Set the text alternative for the iframe', 'amnesty')} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + /> + <hr /> + {attributes.embedUrl && ( + <Button onClick={resetEmbed} variant="primary"> + {/* translators: [admin] */ __('Reset Embed Url', 'amnesty')} + </Button> + )} + </PanelBody> + </InspectorControls> + ); +}; + +export default function Edit(props) { + const { attributes, setAttributes } = props; + const blockProps = useBlockProps(); + const inputRef = createRef(); + + const onSubmit = (event) => { + event.preventDefault(); + setAttributes({ embedUrl: httpsOnly(inputRef.current.value) }); + }; + + const resetEmbed = (event) => { + event.preventDefault(); + setAttributes({ embedUrl: '' }); + }; + + const embedProps = { + ...props, + ...blockProps, + }; + + const frameProps = { + ...props, + ...blockProps, + inputRef, + onSubmit, + }; + + return ( + <> + <BlockInspectorControls {...props} resetEmbed={resetEmbed} /> + <div {...blockProps} style={{ padding: '1px' }}> + {attributes.embedUrl && <EmbedContainer {...embedProps} />} + {!attributes.embedUrl && <FramePlaceholder {...frameProps} />} + </div> + </> + ); +} diff --git a/private/src/blocks/fluid-iframe/editor.scss b/private/src/blocks/fluid-iframe/editor.scss new file mode 100644 index 00000000..98b1c6a0 --- /dev/null +++ b/private/src/blocks/fluid-iframe/editor.scss @@ -0,0 +1,3 @@ +.wp-block-amnesty-core-fluid-iframe .iframe-wrapper { + pointer-events: none; +} diff --git a/private/src/blocks/fluid-iframe/index.js b/private/src/blocks/fluid-iframe/index.js new file mode 100644 index 00000000..5b61ece8 --- /dev/null +++ b/private/src/blocks/fluid-iframe/index.js @@ -0,0 +1,12 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/fluid-iframe/render.php b/private/src/blocks/fluid-iframe/render.php new file mode 100644 index 00000000..95d63049 --- /dev/null +++ b/private/src/blocks/fluid-iframe/render.php @@ -0,0 +1,25 @@ +<?php + +$extra_attrs = []; + +if ( $attributes['width'] ) { + $extra_attrs['style'] = sprintf( 'max-width:%s%%', $attributes['width'] ); +} + +$wrapper_style = ''; +if ( $attributes['minHeight'] ) { + $wrapper_style .= sprintf( 'padding-top:%1$dpx;min-height:%1$dpx;', $attributes['minHeight'] ); +} + +?> +<figure <?php echo wp_kses_data( get_block_wrapper_attributes( $extra_attrs ) ); ?>> + <div class="iframe-wrapper" style="<?php echo esc_attr( $wrapper_style ); ?>"> + <iframe src="<?php echo esc_url( $attributes['embedUrl'] ); ?>" title="<?php echo esc_attr( $attributes['title'] ); ?>" frameborder="0"></iframe> + </div> + +<?php if ( $attributes['caption'] ) : ?> + <figcaption class="iframe-caption-wrapper"> + <p><?php echo esc_html( $attributes['caption'] ); ?></p> + </figcaption> +<?php endif; ?> +</figure> diff --git a/private/src/blocks/fluid-iframe/style.scss b/private/src/blocks/fluid-iframe/style.scss new file mode 100644 index 00000000..5eb1c1e1 --- /dev/null +++ b/private/src/blocks/fluid-iframe/style.scss @@ -0,0 +1,52 @@ +.wp-block-amnesty-core-fluid-iframe .iframe-wrapper { + position: relative; +} + +.wp-block-amnesty-core-fluid-iframe .iframe-wrapper iframe { + position: absolute; + top: 0; + width: 100%; + height: 100%; +} + +.wp-block-amnesty-core-fluid-iframe.alignleft { + margin-right: auto; +} + +.wp-block-amnesty-core-fluid-iframe.alignleft .iframe-wrapper { + display: flex; + justify-content: flex-start; +} + +.wp-block-amnesty-core-fluid-iframe.alignleft .iframe-caption-wrapper { + display: flex; + justify-content: flex-start; +} + +.wp-block-amnesty-core-fluid-iframe.alignright { + margin-left: auto; +} + +.wp-block-amnesty-core-fluid-iframe.alignright .iframe-wrapper { + display: flex; + justify-content: flex-end; +} + +.wp-block-amnesty-core-fluid-iframe.alignright .iframe-caption-wrapper { + display: flex; + justify-content: flex-end; +} + +.wp-block-amnesty-core-fluid-iframe.aligncenter { + margin: auto; +} + +.wp-block-amnesty-core-fluid-iframe.aligncenter .iframe-wrapper { + display: flex; + justify-content: center; +} + +.wp-block-amnesty-core-fluid-iframe.aligncenter .iframe-caption-wrapper { + display: flex; + justify-content: center; +} diff --git a/private/src/blocks/fluid-iframe/view.js b/private/src/blocks/fluid-iframe/view.js new file mode 100644 index 00000000..9e67f6cb --- /dev/null +++ b/private/src/blocks/fluid-iframe/view.js @@ -0,0 +1,19 @@ +import './style.scss'; + +const init = () => { + Array.from( + document.querySelectorAll('.wp-block-embed.is-type-video:not(.responsive-iframe)'), + ).forEach((embed) => { + if (embed.parentElement.classList.contains('wp-embed-responsive')) { + return; + } + + const wrapper = document.createElement('div'); + wrapper.classList.add('wp-embed-responsive'); + wrapper.appendChild(embed.cloneNode(true)); + + embed.replaceWith(wrapper); + }); +}; + +document.addEventListener('DOMContentLoaded', init); diff --git a/private/src/blocks/hero/_variants.scss b/private/src/blocks/hero/_variants.scss new file mode 100644 index 00000000..391793b8 --- /dev/null +++ b/private/src/blocks/hero/_variants.scss @@ -0,0 +1,62 @@ +.wp-block-amnesty-core-hero.has-innerBlocks { + display: grid; + grid-template-columns: 840px 1fr; +} + +.wp-block-amnesty-core-hero.has-innerBlocks .hero-content { + max-width: 460px; +} + +.wp-block-amnesty-core-hero.has-dark-background .hero-title span, +.wp-block-amnesty-core-hero.has-dark-background .hero-content, +.wp-block-amnesty-core-hero.has-dark-background .hero-cta { + color: var(--wp--preset--color--white); + background-color: var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-hero.has-light-background .hero-title span, +.wp-block-amnesty-core-hero.has-light-background .hero-content, +.wp-block-amnesty-core-hero.has-light-background .hero-cta { + color: var(--wp--preset--color--black); + background-color: var(--wp--preset--color--white); +} + +.wp-block-amnesty-core-hero.has-light-background .btn { + border: none; + color: var(--wp--preset--color--white); + background-color: var(--wp--preset--color--black); +} + +.wp-block-amnesty-core-hero.alignleft { + justify-content: start; +} + +.wp-block-amnesty-core-hero.aligncenter { + justify-content: center; +} + +.wp-block-amnesty-core-hero.alignright { + justify-content: end; +} + +.wp-block-amnesty-core-hero.alignleft .hero-contentWrapper, +.rtl .wp-block-amnesty-core-hero.alignright .hero-contentWrapper { + align-items: start; + text-align: start; +} + +.wp-block-amnesty-core-hero.alignright .hero-contentWrapper, +.rtl .wp-block-amnesty-core-hero.alignleft .hero-contentWrapper { + align-items: end; + text-align: end; +} + +.wp-block-amnesty-core-hero.aligncenter .hero-contentWrapper { + align-items: center; + text-align: center; +} + +.wp-block-amnesty-core-hero.aligncenter .hero-content { + margin-right: auto; + margin-left: auto; +} diff --git a/private/src/blocks/hero/block.json b/private/src/blocks/hero/block.json new file mode 100644 index 00000000..10305881 --- /dev/null +++ b/private/src/blocks/hero/block.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/hero", + "title": "Hero", + "category": "amnesty-core", + "description": "", + "keywords": ["Hero", "Header", "Banner"], + "icon": "format-image", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "align": true, + "className": true + }, + "attributes": { + "background": { + "type": "string", + "default": "dark" + }, + "content": { + "type": "string", + "default": "" + }, + "ctaLink": { + "type": "string", + "default": "" + }, + "ctaText": { + "type": "string", + "default": "" + }, + "featuredVideoId": { + "type": "number", + "default": 0 + }, + "hideImageCaption": { + "type": "boolean", + "default": true + }, + "hideImageCopyright": { + "type": "boolean", + "default": false + }, + "imageID": { + "type": "number", + "default": 0 + }, + "title": { + "type": "string", + "default": "" + }, + "type": { + "type": "string", + "default": "image" + } + } +} diff --git a/private/src/scripts/editor/blocks/hero/components/BlockImageSelector.jsx b/private/src/blocks/hero/components/BlockImageSelector.jsx similarity index 84% rename from private/src/scripts/editor/blocks/hero/components/BlockImageSelector.jsx rename to private/src/blocks/hero/components/BlockImageSelector.jsx index 9f4fc420..e5355256 100644 --- a/private/src/scripts/editor/blocks/hero/components/BlockImageSelector.jsx +++ b/private/src/blocks/hero/components/BlockImageSelector.jsx @@ -1,6 +1,7 @@ +import { IconButton } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + const { MediaUpload } = wp.blockEditor; -const { IconButton } = wp.components; -const { __ } = wp.i18n; /** * Render the override image component @@ -14,7 +15,7 @@ const BlockImageSelector = ({ imageId, setAttributes }) => { return ( <IconButton icon="no-alt" - // translators: [admin] + /* translators: [admin] */ label={__('Remove Image', 'amnesty')} onClick={() => setAttributes({ imageID: 0 })} /> diff --git a/private/src/blocks/hero/edit.jsx b/private/src/blocks/hero/edit.jsx new file mode 100644 index 00000000..1287ef23 --- /dev/null +++ b/private/src/blocks/hero/edit.jsx @@ -0,0 +1,192 @@ +import classnames from 'classnames'; +import { + InnerBlocks, + InspectorControls, + RichText, + URLInputButton, + useBlockProps, +} from '@wordpress/block-editor'; +import { PanelBody, SelectControl } from '@wordpress/components'; +import { useSelect } from '@wordpress/data'; +import { PostFeaturedImage } from '@wordpress/editor'; +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import BlockImageSelector from './components/BlockImageSelector.jsx'; +import MediaMetadata from '../../components/MediaMetadata.jsx'; +import MediaMetadataVisibilityControls from '../../components/MediaMetadataVisibilityControls.jsx'; +import PostFeaturedVideo from '../../components/PostFeaturedVideo.jsx'; +import { fetchMediaData } from '../../utils/index'; + +/** + * Retrieve the correct title for the media panel + * + * @param {String} type the media type + * + * @returns {String} + */ +const mediaPanelTitle = (type) => { + if (type === 'video') { + /* translators: [admin] */ + return __('Background Image', 'amnesty'); + } + + /* translators: [admin] */ + return __('Featured Image', 'amnesty'); +}; + +const useHasInnerBlocks = (parentClientId) => + useSelect((select) => { + const { innerBlocks } = select('core/block-editor').getBlock(parentClientId); + return innerBlocks.length; + }); + +export default function Edit({ attributes, className, clientId, setAttributes }) { + const [mediaData, setMediaData] = useState({}); + const videoRef = useRef(); + const hasInnerBlocks = useHasInnerBlocks(clientId); + const featuredImage = useSelect((select) => { + const { getEditedPostAttribute } = select('core/editor'); + return getEditedPostAttribute('featured_media'); + }); + + useEffect(() => { + if (attributes.type !== 'image') { + return; + } + + // block attribute takes precedence over the featured image + const id = attributes?.imageID || featuredImage; + + fetchMediaData(id, setMediaData, mediaData); + }, [featuredImage, attributes.imageID, attributes.type]); // eslint-disable-line react-hooks/exhaustive-deps + + useEffect(() => { + if (attributes.type !== 'video') { + return; + } + + fetchMediaData(attributes.featuredVideoId, setMediaData, mediaData).then(() => { + videoRef?.current?.load?.(); + }); + }, [attributes.featuredVideoId, attributes.type]); // eslint-disable-line react-hooks/exhaustive-deps + + const blockClasses = classnames(className, { + [`has-${attributes.background}-background`]: attributes.background, + 'has-innerBlocks': hasInnerBlocks, + 'has-video': !!attributes.featuredVideoId, + }); + + const blockInlineStyle = {}; + + if (attributes.type === 'image' && mediaData?.url) { + blockInlineStyle.backgroundImage = `url("${mediaData.url}")`; + } + + const showMediaCaption = mediaData?.caption && !attributes.hideImageCaption; + const showMediaCopyright = mediaData?.copyright && !attributes.hideImageCopyright; + + const BlockInspectorControls = ( + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')} initialOpen={true}> + <SelectControl + label={/* translators: [admin] */ __('Background Colour', 'amnesty')} + options={[ + { label: /* translators: [admin] */ __('Black', 'amnesty'), value: 'dark' }, + { label: /* translators: [admin] */ __('White', 'amnesty'), value: 'light' }, + ]} + value={attributes.background || 'dark'} + onChange={(background) => setAttributes({ background })} + /> + <SelectControl + label={/* translators: [admin] */ __('Background Type', 'amnesty')} + options={[ + { label: /* translators: [admin] */ __('Image', 'amnesty'), value: 'image' }, + { label: /* translators: [admin] */ __('Video', 'amnesty'), value: 'video' }, + ]} + value={attributes.type || 'image'} + onChange={(type) => setAttributes({ type })} + /> + <MediaMetadataVisibilityControls + type={attributes.type} + hideCaption={attributes.hideImageCaption} + hideCopyright={attributes.hideImageCopyright} + setAttributes={setAttributes} + /> + </PanelBody> + <PanelBody title={mediaPanelTitle(attributes.type)}> + <PostFeaturedImage /> + </PanelBody> + {attributes.type === 'video' && ( + <PanelBody title={/* translators: [admin] */ __('Featured Video', 'amnesty')}> + <PostFeaturedVideo + featuredVideoId={attributes.featuredVideoId} + onUpdate={(featuredVideoId) => setAttributes({ featuredVideoId })} + /> + </PanelBody> + )} + </InspectorControls> + ); + + return ( + <> + {BlockInspectorControls} + <section {...useBlockProps({ className: blockClasses })} style={blockInlineStyle}> + {attributes.type === 'image' && ( + <div className="linkList-options"> + <BlockImageSelector imageId={attributes.imageID} setAttributes={setAttributes} /> + </div> + )} + {attributes.type === 'video' && ( + <div className="hero-videoContainer"> + <video className="hero-video" ref={videoRef}> + <source src={mediaData.url} /> + </video> + </div> + )} + <div className="hero-contentWrapper"> + <h1 className="hero-title"> + <RichText + tagName="span" + placeholder={/* translators: [admin] */ __('Header Title', 'amnesty')} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + format="string" + /> + </h1> + <RichText + tagName="p" + className="hero-content" + placeholder={/* translators: [admin] */ __('Header Content', 'amnesty')} + value={attributes.content} + onChange={(content) => setAttributes({ content })} + format="string" + /> + <div className="hero-cta"> + <div className="btn btn--large"> + <RichText + tagName="span" + placeholder={/* translators: [admin] */ __('Call to action', 'amnesty')} + value={attributes.ctaText} + onChange={(ctaText) => setAttributes({ ctaText })} + format="string" + /> + <URLInputButton + url={attributes.ctaLink} + onChange={(ctaLink) => setAttributes({ ctaLink })} + /> + </div> + </div> + <div className="hero-innerBlocks"> + <InnerBlocks allowedBlocks={['amnesty-wc/donation']} orientation="horizontal" /> + </div> + </div> + <MediaMetadata + media={mediaData} + showMediaCaption={showMediaCaption} + showMediaCopyright={showMediaCopyright} + /> + </section> + </> + ); +} diff --git a/private/src/blocks/hero/editor.scss b/private/src/blocks/hero/editor.scss new file mode 100644 index 00000000..fcb00a7b --- /dev/null +++ b/private/src/blocks/hero/editor.scss @@ -0,0 +1,46 @@ +.wp-block-amnesty-core-hero, +.wp-block-amnesty-core-hero * { + box-sizing: border-box; +} + +.wp-block-amnesty-core-hero { + gap: 40px; +} + +.wp-block-amnesty-core-hero.alignleft { + justify-content: start; +} + +.wp-block-amnesty-core-hero.aligncenter { + justify-content: center; +} + +.wp-block-amnesty-core-hero.alignright { + justify-content: end; +} + +.wp-block-amnesty-core-hero .hero-contentWrapper { + display: flex; + flex-direction: column; + align-items: start; + max-width: 840px; +} + +.wp-block-amnesty-core-hero .hero-contentWrapper > * { + margin-block: 0 var(--wp--preset--spacing--quarter); +} + +.wp-block-amnesty-core-hero .btn { + display: flex; + align-items: center; + justify-content: space-between; +} + +.wp-block-amnesty-core-hero .btn .block-editor-url-input__button { + position: relative; + margin-inline-start: var(--wp--preset--spacing--half); +} + +.wp-block-amnesty-core-hero .block-editor-url-input__button-modal { + position: absolute; +} diff --git a/wp-content/themes/humanity-theme/includes/blocks/hero/helpers.php b/private/src/blocks/hero/helpers.php similarity index 100% rename from wp-content/themes/humanity-theme/includes/blocks/hero/helpers.php rename to private/src/blocks/hero/helpers.php diff --git a/private/src/blocks/hero/index.js b/private/src/blocks/hero/index.js new file mode 100644 index 00000000..5a786371 --- /dev/null +++ b/private/src/blocks/hero/index.js @@ -0,0 +1,15 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import './replaceHeaders'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/hero/render.php b/private/src/blocks/hero/render.php new file mode 100644 index 00000000..1bdd33bc --- /dev/null +++ b/private/src/blocks/hero/render.php @@ -0,0 +1,66 @@ +<?php + +use Amnesty\Get_Image_Data; + +// image attribute takes precedence over the featured image +$image_id = $attributes['imageID']; +if ( ! $image_id ) { + $image_id = get_post_thumbnail_id(); +} + +$image = new Get_Image_Data( (int) $image_id ); +$video = new Get_Image_Data( (int) $attributes['featuredVideoId'] ); + +$video_output = ''; +if ( $attributes['featuredVideoId'] && 'video' === $attributes['type'] ) { + $video_output .= sprintf( + '<div class="hero-videoContainer"> + <video class="hero-video" autoplay loop muted> + <source src="%s"> + </video> + </div>', + esc_url( wp_get_attachment_url( $attributes['featuredVideoId'] ) ), + ); +} + +$media_meta_output = $image->metadata( ! $attributes['hideImageCaption'], ! $attributes['hideImageCopyright'], 'image' ); +$media_meta_output .= $video->metadata( ! $attributes['hideImageCaption'], ! $attributes['hideImageCopyright'], 'video' ); + +$block_classes = [ + // phpcs:disable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned + 'aimc-ignore' => (bool) $image->credit(), + 'has-dark-background' => ! (bool) $attributes['background'], + 'has-innerBlocks' => (bool) trim( $content ), + 'has-video' => 'video' === $attributes['type'], + // phpcs:enable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned + 'has-' . $attributes['background'] . '-background' => (bool) $attributes['background'], +]; + +$block_classes = classnames( $attributes['className'] ?? '', $block_classes ); +$wrapper_attributes = get_block_wrapper_attributes( [ 'class' => $block_classes ] ); +$background_image = wp_get_attachment_image_url( $image_id, 'hero-md' ); + +?> +<section <?php echo wp_kses_data( $wrapper_attributes ); ?> style="aiic:ignore;background-image:url('<?php echo esc_url( $background_image ); ?>')"> + <?php echo wp_kses_post( $video_output ); ?> + <div class="hero-contentWrapper"> + <h1 class="hero-title"> + <span><?php echo esc_html( $attributes['title'] ); ?></span> + </h1> + <?php if ( $attributes['content'] ) : ?> + <p class="hero-content"><?php echo esc_html( $attributes['content'] ); ?></p> + <?php endif; ?> + <div class="hero-cta"> + <div class="btn btn--large"> + <span><?php echo esc_html( $attributes['ctaText'] ); ?></span> + <a href="<?php echo esc_url( $attributes['ctaLink'] ); ?>"></a> + </div> + </div> + </div> +<?php if ( $content ) : ?> + <div class="hero-innerBlocks"> + <?php echo wp_kses_post( $content ); ?> + </div> +<?php endif; ?> + <?php echo wp_kses_post( $media_meta_output ); ?> +</section> diff --git a/private/src/scripts/editor/blocks/hero/replaceHeaders.js b/private/src/blocks/hero/replaceHeaders.js similarity index 82% rename from private/src/scripts/editor/blocks/hero/replaceHeaders.js rename to private/src/blocks/hero/replaceHeaders.js index aa0d0ed4..105c9d74 100644 --- a/private/src/scripts/editor/blocks/hero/replaceHeaders.js +++ b/private/src/blocks/hero/replaceHeaders.js @@ -1,6 +1,5 @@ -const { omit } = lodash; -const { createBlock } = wp.blocks; -const { __, sprintf } = wp.i18n; +import { omit } from 'lodash'; +import { createBlock } from '@wordpress/blocks'; /** * Recursively search blocks on page for a specific block type @@ -77,12 +76,6 @@ const getOldHeroBlockAttributes = (isHeaderBlock) => { window.addEventListener('load', () => { const { getBlocks, getBlocksByClientId } = wp.data.select('core/block-editor'); const { replaceBlocks } = wp.data.dispatch('core/block-editor'); - const { createInfoNotice, removeNotice } = wp.data.dispatch('core/notices'); - const postType = wp.data.select('core/editor')?.getCurrentPostType(); - - if (!postType) { - return; - } // Get all blocks on a post const allBlocks = getBlocks(); @@ -114,17 +107,4 @@ window.addEventListener('load', () => { [createBlock('amnesty-core/hero', newAttributes, block.innerBlocks)], ); }); - - createInfoNotice( - sprintf( - // translators: [admin] %s: the post type - __('Blocks in this %s have been upgraded. Please preview the post before saving.', 'amnesty'), - postType, - ), - { - id: 'amnesty-core/hero/upgraded-notice', - }, - ); - - setTimeout(() => removeNotice('amnesty-core/hero/upgraded-notice'), 15000); }); diff --git a/private/src/blocks/hero/style.scss b/private/src/blocks/hero/style.scss new file mode 100644 index 00000000..42caedd3 --- /dev/null +++ b/private/src/blocks/hero/style.scss @@ -0,0 +1,134 @@ +@use "./variants"; + +.wp-site-blocks > .wp-block-amnesty-core-hero.alignleft, +.wp-site-blocks > .wp-block-amnesty-core-hero.alignright { + float: none; + margin: auto; +} + +.wp-block-amnesty-core-hero { + position: relative; + display: flex; + margin: auto; + padding-block: 80px; + padding-inline: 40px; + width: 100%; + max-width: var(--wp--preset--layout--contentSize); + min-height: 540px; + background-size: cover; + background-position: center center; + + @media all and (min-width: 760px) { + padding-block-start: 111px; + height: auto; + } +} + +.hero-contentWrapper { + display: flex; + flex-direction: column; + align-items: start; + max-width: 840px; +} + +.hero-contentWrapper > * { + margin-block-end: var(--wp--preset--spacing--half); +} + +.hero-content { + display: table; + padding: 10px 16px; + max-width: 460px; + font-size: var(--wp--preset--font-size--heading-6); + + @media all and (min-width: 465px) { + padding: 10px 20px; + max-width: 840px; + } +} + +.hero-title span { + margin: 0; + padding: 0 16px; + font-size: var(--wp--preset--font-size--heading-1); + line-height: 1.3 !important; + background-color: rgba(0, 0, 0, 0.45); + color: #fff; + max-width: 840px; + text-transform: uppercase; + box-decoration-break: clone; + + @media all and (min-width: 465px) { + padding: 0 20px; + } +} + +.hero-cta { + display: inline-block; + padding: 16px; + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + + @media all and (min-width: 465px) { + padding: 20px; + } +} + +.hero-innerBlocks { + display: flex; + justify-content: end; +} + +.hero-videoContainer, +.hero-video { + display: none; + + @media all and (min-width: 760px) { + display: block; + } +} + +.hero-videoContainer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; +} + +.hero-video { + position: absolute; + top: 50%; + left: 50%; + min-width: 100%; + min-height: 100%; + transform: translate(-50%, -50%); +} + +.wp-block-amnesty-core-hero .image-metadata.is-image { + display: flex; +} + +.wp-block-amnesty-core-hero .image-metadata.is-video { + display: none; +} + +.wp-block-amnesty-core-hero.has-video .image-metadata.is-image { + display: flex; + + @media all and (min-width: 760px) { + display: none; + } +} + +.wp-block-amnesty-core-hero.has-video .image-metadata.is-video { + display: none; + + @media all and (min-width: 760px) { + display: flex; + } +} + +.wp-block-amnesty-core-hero:has(+ main) { + margin-bottom: var(--wp--preset--spacing--single); +} diff --git a/private/src/blocks/iframe-button/block.json b/private/src/blocks/iframe-button/block.json new file mode 100644 index 00000000..4ac982ab --- /dev/null +++ b/private/src/blocks/iframe-button/block.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/iframe-button", + "title": "Iframe Button", + "category": "amnesty-core", + "description": "A button which, when clicked, will toggle visibility of an iframe", + "keywords": ["Iframe", "Button"], + "icon": "shortcode", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "viewScript": "file:./view.js", + "render": "file:./render.php", + "supports": { + "className": true, + "defaultStylePicker": false, + "align": ["left", "center", "right"] + }, + "attributes": { + "iframeUrl": { + "type": "string", + "default": "" + }, + "iframeHeight": { + "type": "number", + "default": 760 + }, + "buttonText": { + "type": "string", + "default": "" + }, + "title": { + "type": "string", + "default": "" + } + }, + "styles": [ + { + "name": "default", + "label": "Primary", + "isDefault": true + }, + { + "name": "dark", + "label": "Dark" + } + ] +} diff --git a/private/src/blocks/iframe-button/edit.jsx b/private/src/blocks/iframe-button/edit.jsx new file mode 100644 index 00000000..5b3faffa --- /dev/null +++ b/private/src/blocks/iframe-button/edit.jsx @@ -0,0 +1,90 @@ +import classnames from 'classnames'; +import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { Button, PanelBody, TextControl } from '@wordpress/components'; +import { createRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { httpsOnly } from '../../utils'; + +export default function Edit({ attributes, setAttributes }) { + const [previewing, setIsPreviewing] = useState(false); + const [embedUrl, setEmbedUrl] = useState(httpsOnly(attributes.iframeUrl)); + const inputRef = createRef(); + + const classes = classnames('iframeButton wp-block-button'); + const blockProps = useBlockProps({ className: classes }); + + const embed = () => { + setAttributes({ iframeUrl: httpsOnly(embedUrl) }); + setIsPreviewing(true); + }; + + return ( + <> + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + <TextControl + /* translators: [admin] */ + label={__('Iframe Height', 'amnesty')} + value={attributes.iframeHeight} + type="number" + step={50} + onChange={(iframeHeight) => setAttributes({ iframeHeight })} + /> + <TextControl + /* translators: [admin] */ + label={__('Iframe Title', 'amnesty')} + /* translators: [admin] */ + help={__('Set the text alternative for the iframe', 'amnesty')} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + /> + </PanelBody> + </InspectorControls> + <div {...blockProps}> + <div className={classes}> + <RichText + className="wp-block-button__link" + value={attributes.buttonText} + /* translators: [admin] */ + placeholder={__('Act Now', 'amnesty')} + identifier="text" + allowedFormats={[]} + withoutInteractiveFormatting={true} + onChange={(buttonText) => setAttributes({ buttonText })} + /> + </div> + <div className="iframeButton-inputWrapper"> + <input + ref={inputRef} + type="url" + className="components-placeholder__input" + /* translators: [admin] */ + aria-label={__('Iframe URL', 'amnesty')} + /* translators: [admin] */ + placeholder={__('Enter URL to embed here…', 'amnesty')} + value={embedUrl} + onChange={() => setEmbedUrl(inputRef.current.value)} + /> + <Button isLarge primary onClick={embed} className="button button-primary"> + {/* translators: [admin] */ __('Embed', 'amnesty')} + </Button> + <Button + isLarge + onClick={() => setIsPreviewing(!previewing)} + className="button button-primary" + > + {previewing + ? /* translators: [admin] */ __('Hide Preview', 'amnesty') + : /* translators: [admin] */ __('Preview', 'amnesty')} + </Button> + </div> + {previewing && httpsOnly(attributes.iframeUrl) && ( + <div className="iframeButton-iframeWrapper"> + <iframe src={httpsOnly(attributes.iframeUrl)} height={attributes.iframeHeight}></iframe> + </div> + )} + </div> + </> + ); +} diff --git a/private/src/styles/blocks/iframe-button/_editor.scss b/private/src/blocks/iframe-button/editor.scss similarity index 100% rename from private/src/styles/blocks/iframe-button/_editor.scss rename to private/src/blocks/iframe-button/editor.scss diff --git a/private/src/blocks/iframe-button/index.js b/private/src/blocks/iframe-button/index.js new file mode 100644 index 00000000..5b61ece8 --- /dev/null +++ b/private/src/blocks/iframe-button/index.js @@ -0,0 +1,12 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/iframe-button/render.php b/private/src/blocks/iframe-button/render.php new file mode 100644 index 00000000..d696dcab --- /dev/null +++ b/private/src/blocks/iframe-button/render.php @@ -0,0 +1,15 @@ +<?php + +if ( ! esc_url( $attributes['iframeUrl'] ) ) { + return; +} + +$wrapper_attributes = get_block_wrapper_attributes( [ 'class' => 'iframeButton-wrapper' ] ); + +?> +<div <?php echo wp_kses_data( $wrapper_attributes ); ?>> + <button class="iframeButton btn <?php echo esc_attr( $attributes['className'] ?? '' ); ?>"> + <?php echo esc_html( $attributes['buttonText'] ); ?> + </button> + <iframe frameborder="0" src="<?php echo esc_url( $attributes['iframeUrl'] ); ?>" title="<?php echo esc_attr( $attributes['title'] ); ?>" height="<?php echo esc_attr( $attributes['iframeHeight'] ); ?>"></iframe> +</div> diff --git a/private/src/blocks/iframe-button/style.scss b/private/src/blocks/iframe-button/style.scss new file mode 100644 index 00000000..8b3da4e9 --- /dev/null +++ b/private/src/blocks/iframe-button/style.scss @@ -0,0 +1,39 @@ +.iframeButton-wrapper { + display: flex !important; + flex-wrap: wrap; +} + +.iframeButton-wrapper.alignleft { + justify-content: flex-start; + float: unset !important; + margin-left: 0 !important; + margin-right: auto !important; +} + +.iframeButton-wrapper.aligncenter { + justify-content: center; + float: unset !important; + margin-left: auto !important; + margin-right: auto !important; +} + +.iframeButton-wrapper.alignright { + justify-content: flex-end; + float: unset !important; + margin-left: auto !important; + margin-right: 0 !important; +} + +.iframeButton-wrapper iframe { + display: none; + margin-top: 24px; + width: 100%; +} + +.iframeButton-wrapper.is-visible iframe { + display: block; +} + +.callToAction .iframeButton-wrapper { + width: 100%; +} diff --git a/private/src/blocks/iframe-button/view.js b/private/src/blocks/iframe-button/view.js new file mode 100644 index 00000000..d6d10887 --- /dev/null +++ b/private/src/blocks/iframe-button/view.js @@ -0,0 +1,13 @@ +import './style.scss'; + +const toggle = (event) => { + event.target.parentElement.classList.toggle('is-visible'); +}; + +const init = (button) => { + button.addEventListener('click', toggle); +}; + +document.addEventListener('DOMContentLoaded', () => { + Array.from(document.querySelectorAll('.iframeButton')).forEach(init); +}); diff --git a/private/src/blocks/iframe/block.json b/private/src/blocks/iframe/block.json new file mode 100644 index 00000000..86bceed4 --- /dev/null +++ b/private/src/blocks/iframe/block.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-responsive-iframe", + "title": "Responsive Iframe", + "category": "amnesty-core", + "description": "", + "keywords": ["Iframe", "Responsive", "Fluid"], + "icon": "welcome-widgets-menus", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "viewScript": "file:./view.js", + "render": "file:./render.php", + "supports": { + "align": ["left", "center", "right"] + }, + "attributes": { + "embedUrl": { + "type": "string", + "default": "" + }, + "height": { + "type": "string", + "default": "" + }, + "minHeight": { + "type": "string", + "default": "" + }, + "width": { + "type": "string", + "default": "" + }, + "caption": { + "type": "string", + "default": "" + }, + "title": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/iframe/edit.jsx b/private/src/blocks/iframe/edit.jsx new file mode 100644 index 00000000..976ab9ec --- /dev/null +++ b/private/src/blocks/iframe/edit.jsx @@ -0,0 +1,159 @@ +import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { Button, PanelBody, Placeholder, TextControl } from '@wordpress/components'; +import { useRef } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { httpsOnly } from '../../utils'; + +export default function Edit({ attributes, isSelected, setAttributes }) { + const inputRef = useRef(); + + const onSubmit = (event) => { + event.preventDefault(); + setAttributes({ embedUrl: httpsOnly(inputRef.current.value) }); + }; + + const doReset = (event) => { + event.preventDefault(); + setAttributes({ embedUrl: '' }); + }; + + const placeholder = () => { + /* translators: [admin] */ + const label = __('Iframe URL', 'amnesty'); + + return ( + <Placeholder label={label} className="wp-block-embed"> + <form onSubmit={onSubmit}> + <input + ref={inputRef} + type="url" + className="components-placeholder__input" + aria-label={label} + /* translators: [admin] */ + placeholder={__('Enter URL to embed here…', 'amnesty')} + /> + <Button isLarge type="submit" className="button button-primary"> + {/* translators: [admin] */ __('Embed', 'amnesty')} + </Button> + </form> + </Placeholder> + ); + }; + + const embedContainer = () => { + const width = parseInt(attributes.width, 10) || 0; + const height = parseInt(attributes.height, 10) || 0; + let minHeight = parseInt(attributes.minHeight, 10) || height; + let minWidth = parseInt(attributes.minWidth, 10) || width; + + if (!width && !height) { + minHeight = Math.max(minHeight, 350); + } + + if (!width) { + minWidth = `100%`; + } else { + minWidth = `${width}px`; + } + + return ( + <figure className="wp-block-embed"> + <div className="fluid-iframe" style={{ minHeight }}> + <iframe + src={httpsOnly(attributes.embedUrl)} + style={{ height: `${minHeight}px`, width: minWidth }} + /> + </div> + <div className="iframe-caption"> + {(attributes.caption || isSelected) && ( + <RichText + tagName="figcaption" + /* translators: [admin] */ + placeholder={__('Write caption…', 'amnesty')} + value={attributes.caption} + onChange={(caption) => setAttributes({ caption })} + inlineToolbar + format="string" + /> + )} + </div> + </figure> + ); + }; + + const controls = ( + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + <TextControl + /* translators: [admin] */ + label={__('Width', 'amnesty')} + value={attributes.width} + type="number" + step={10} + help={ + !attributes.width && attributes.height + ? /* translators: [admin] */ + __('Required when specifying a height', 'amnesty') + : '' + } + onChange={(width) => setAttributes({ width })} + /> + <TextControl + /* translators: [admin] */ + label={__('Height', 'amnesty')} + value={attributes.height} + type="number" + step={10} + help={ + !attributes.height && attributes.width + ? /* translators: [admin] */ + __('Required when specifying a width', 'amnesty') + : '' + } + onChange={(height) => setAttributes({ height })} + /> + <TextControl + /* translators: [admin] */ + label={__('Minimum Height', 'amnesty')} + value={attributes.minHeight} + type="number" + step={10} + min={0} + max={1000} + help={ + !attributes.height && !attributes.width + ? /* translators: [admin] */ + __('Required if not using width/height, optional otherwise', 'amnesty') + : '' + } + onChange={(minHeight) => setAttributes({ minHeight })} + /> + <hr /> + <TextControl + /* translators: [admin] */ + label={__('Iframe Title', 'amnesty')} + /* translators: [admin] */ + help={__('Set the text alternative for the iframe', 'amnesty')} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + /> + <hr /> + {attributes.embedUrl && ( + <Button onClick={doReset} primary className="button button-primary"> + {/* translators: [admin] */ __('Reset Embed Url', 'amnesty')} + </Button> + )} + </PanelBody> + </InspectorControls> + ); + + return ( + <> + {controls} + <div {...useBlockProps()} style={{ padding: '1px' }}> + {attributes.embedUrl ? embedContainer() : placeholder()} + </div> + </> + ); +} diff --git a/private/src/blocks/iframe/editor.scss b/private/src/blocks/iframe/editor.scss new file mode 100644 index 00000000..258c2d14 --- /dev/null +++ b/private/src/blocks/iframe/editor.scss @@ -0,0 +1,8 @@ +.wp-block[data-type="amnesty-core/block-responsive-iframe"] { + margin-top: 16px; + margin-bottom: 16px; + + .wp-block-embed { + margin: 12px; + } +} diff --git a/private/src/blocks/iframe/index.js b/private/src/blocks/iframe/index.js new file mode 100644 index 00000000..5b61ece8 --- /dev/null +++ b/private/src/blocks/iframe/index.js @@ -0,0 +1,12 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/iframe/render.php b/private/src/blocks/iframe/render.php new file mode 100644 index 00000000..251e1534 --- /dev/null +++ b/private/src/blocks/iframe/render.php @@ -0,0 +1,40 @@ +<?php + +if ( ! $attributes['embedUrl'] ) { + return; +} + +$width = $attributes['width']; +$height = $attributes['height']; +$min_height = $attributes['minHeight']; + +$style = ''; + +if ( $width && $height ) { + $ratio = $height / $width * 100; + $ratio = "{$ratio}%"; + $style .= sprintf( 'padding-top: %s;', $ratio ); +} + +if ( ! $width && ! $height && ! $min_height ) { + $min_height = 350; +} + +if ( $min_height ) { + $style .= sprintf( 'min-height: %dpx;', $min_height ); +} + +$wrapper_attributes = get_block_wrapper_attributes(); + +?> +<figure <?php echo wp_kses_data( $wrapper_attributes ); ?> style="<?php $width && esc_attr( sprintf( 'max-width:%spx', $width ) ); ?>"> + <div class="fluid-iframe" style="<?php echo esc_attr( $style ); ?>"> + <iframe src="<?php echo esc_url( $attributes['embedUrl'] ); ?>" title="<?php echo esc_attr( $attributes['title'] ); ?>" frameborder="0"></iframe> + </div> + +<?php if ( ! empty( $attributes['caption'] ) ) : ?> + <figcaption> + <p><?php echo esc_html( $attributes['caption'] ); ?></p> + </figcaption> +<?php endif; ?> +</figure> diff --git a/private/src/blocks/iframe/style.scss b/private/src/blocks/iframe/style.scss new file mode 100644 index 00000000..d7807985 --- /dev/null +++ b/private/src/blocks/iframe/style.scss @@ -0,0 +1,49 @@ +.fluid-videoContainer, +.fluid-iframe { + position: relative; +} + +.fluid-videoContainer { + padding-top: 56.25%; +} + +.fluid-videoContainer iframe, +.fluid-iframe iframe { + position: absolute; + top: 0; + width: 100%; + height: 100%; +} + +.wp-block-amnesty-core-block-responsive-iframe.alignleft, +.wp-block-amnesty-core-block-responsive-iframe.alignright, +.wp-block-amnesty-core-block-responsive-iframe.aligncenter { + float: unset !important; +} + +.wp-block-amnesty-core-block-responsive-iframe.alignleft { + margin-left: 0 !important; + margin-right: auto !important; +} + +.wp-block-amnesty-core-block-responsive-iframe.alignright { + margin-left: auto !important; + margin-right: 0 !important; +} + +.wp-block-amnesty-core-block-responsive-iframe.aligncenter { + margin-left: auto !important; + margin-right: auto !important; +} + +.wp-block-amnesty-core-block-responsive-iframe.alignleft figcaption { + text-align: left; +} + +.wp-block-amnesty-core-block-responsive-iframe.alignright figcaption { + text-align: right; +} + +.wp-block-amnesty-core-block-responsive-iframe.aligncenter figcaption { + text-align: center; +} diff --git a/private/src/blocks/iframe/view.js b/private/src/blocks/iframe/view.js new file mode 100644 index 00000000..90f3b503 --- /dev/null +++ b/private/src/blocks/iframe/view.js @@ -0,0 +1,17 @@ +import './style.scss'; + +document.addEventListener('DOMContentLoaded', () => { + Array.from( + document.querySelectorAll('.wp-block-embed.is-type-video:not(.responsive-iframe)'), + ).forEach((embed) => { + if (embed.parentElement.classList.contains('wp-embed-responsive')) { + return; + } + + const wrapper = document.createElement('div'); + wrapper.classList.add('wp-embed-responsive'); + wrapper.appendChild(embed.cloneNode(true)); + + embed.replaceWith(wrapper); + }); +}); diff --git a/private/src/blocks/key-fact/block.json b/private/src/blocks/key-fact/block.json new file mode 100644 index 00000000..f002fb30 --- /dev/null +++ b/private/src/blocks/key-fact/block.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/key-fact", + "parent": ["amnesty-core/key-facts"], + "title": "Key Fact", + "category": "amnesty-core", + "description": "Child block of the Key Facts block", + "icon": "", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": false, + "inserter": false + }, + "attributes": { + "title": { + "type": "string", + "default": "" + }, + "content": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/key-fact/deprecated.jsx b/private/src/blocks/key-fact/deprecated.jsx new file mode 100644 index 00000000..8f1c4872 --- /dev/null +++ b/private/src/blocks/key-fact/deprecated.jsx @@ -0,0 +1,20 @@ +const v1 = { + attributes: { + title: { + type: 'string', + }, + content: { + type: 'string', + }, + }, + save: ({ attributes }) => ( + <li className="factBlock-item"> + <h3 className="factBlock-itemTitle">{attributes.title}</h3> + <p className="factBlock-itemContent">{attributes.content}</p> + </li> + ), +}; + +const deprecated = [v1]; + +export default deprecated; diff --git a/private/src/blocks/key-fact/edit.jsx b/private/src/blocks/key-fact/edit.jsx new file mode 100644 index 00000000..b902c012 --- /dev/null +++ b/private/src/blocks/key-fact/edit.jsx @@ -0,0 +1,27 @@ +import { RichText } from '@wordpress/block-editor'; +import { __ } from '@wordpress/i18n'; + +export default function Edit({ attributes, setAttributes }) { + return ( + <div className="factBlock-item"> + <RichText + className="factBlock-itemTitle" + tagName="h3" + /* translators: [admin] */ + placeholder={__('(Insert Title)', 'amnesty')} + value={attributes.title} + allowedFormats={[]} + onChange={(title) => setAttributes({ title })} + /> + <RichText + className="factBlock-itemContent" + tagName="p" + /* translators: [admin] */ + placeholder={__('(Insert Content)', 'amnesty')} + value={attributes.content} + allowedFormats={[]} + onChange={(content) => setAttributes({ content })} + /> + </div> + ); +} diff --git a/private/src/blocks/key-fact/editor.scss b/private/src/blocks/key-fact/editor.scss new file mode 100644 index 00000000..3a11b70f --- /dev/null +++ b/private/src/blocks/key-fact/editor.scss @@ -0,0 +1,23 @@ +@use '../../utils/mixins/icon' as i; + +.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::before, +.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::after { + content: ""; + position: absolute; + display: block; + background-color: var(--wp--preset--color--grey-darker); +} + +.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::before { + @include i.icon(10px, 162px, 40px, 40px); + top: calc(100% + 5px); + left: calc(50% - 20px); + z-index: 1; +} + +.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::after { + bottom: -26px; // margin/2 + height/2 + left: 5%; + height: 2px; + width: 90%; +} diff --git a/private/src/blocks/key-fact/index.js b/private/src/blocks/key-fact/index.js new file mode 100644 index 00000000..bbabe72c --- /dev/null +++ b/private/src/blocks/key-fact/index.js @@ -0,0 +1,15 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/key-fact/render.php b/private/src/blocks/key-fact/render.php new file mode 100644 index 00000000..a45b7ddc --- /dev/null +++ b/private/src/blocks/key-fact/render.php @@ -0,0 +1,4 @@ +<li class="factBlock-item"> + <h3 class="factBlock-itemTitle"><?php echo wp_kses_post( $attributes['title'] ); ?></h3> + <p class="factBlock-itemContent"><?php echo wp_kses_post( $attributes['content'] ); ?></p> +</li> diff --git a/private/src/blocks/key-fact/style.scss b/private/src/blocks/key-fact/style.scss new file mode 100644 index 00000000..cdb6f32e --- /dev/null +++ b/private/src/blocks/key-fact/style.scss @@ -0,0 +1,37 @@ +@use '../../utils/mixins/icon' as i; + +.factBlock-itemTitle { + font-family: var(--wp--preset--font-family--secondary); + margin-bottom: 16px; +} + +.factBlock-item:last-of-type .factBlock-itemContent { + margin-bottom: 0; +} + +.factBlock-item:not(:last-of-type) { + position: relative; + margin-bottom: 60px; +} + +.factBlock-item:not(:last-of-type)::before, +.factBlock-item:not(:last-of-type)::after { + content: ""; + position: absolute; + display: block; + background-color: var(--wp--preset--color--grey-darker); +} + +.factBlock-item:not(:last-of-type)::before { + @include i.icon(10px, 162px, 40px, 40px); + top: calc(100% + 10px); + left: calc(50% - 20px); + z-index: 1; +} + +.factBlock-item:not(:last-of-type)::after { + bottom: -31px; // margin/2 + height/2 + left: 5%; + height: 2px; + width: 90%; +} diff --git a/private/src/blocks/key-facts/block.json b/private/src/blocks/key-facts/block.json new file mode 100644 index 00000000..ab16024a --- /dev/null +++ b/private/src/blocks/key-facts/block.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/key-facts", + "allowedBlocks": ["amnesty-core/key-fact"], + "title": "Key Facts", + "category": "amnesty-core", + "description": "Repeatable block for displaying statistics", + "icon": "lightbulb", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": false + }, + "attributes": { + "title": { + "type": "string", + "default": "" + }, + "quantity": { + "type": "number", + "default": 2 + }, + "background": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/key-facts/deprecated.jsx b/private/src/blocks/key-facts/deprecated.jsx new file mode 100644 index 00000000..568ea5c3 --- /dev/null +++ b/private/src/blocks/key-facts/deprecated.jsx @@ -0,0 +1,46 @@ +import classnames from 'classnames'; + +import { InnerBlocks } from '@wordpress/block-editor'; + +const v1 = { + supports: { + className: false, + inserter: false, + }, + attributes: { + title: { + type: 'string', + }, + quantity: { + type: 'number', + }, + background: { + type: 'string', + }, + }, + save({ attributes }) { + const { title = '', background = '' } = attributes; + + const classes = classnames('factBlock', { + 'has-background': !!background, + [`has-${background}-background-color`]: !!background, + }); + + const label = title.replace(' ', '-').toLowerCase(); + + return ( + <aside className={classes} aria-labelledby={label}> + <h2 id={label} className="factBlock-title" aria-hidden="true"> + {title} + </h2> + <ol> + <InnerBlocks.Content /> + </ol> + </aside> + ); + }, +}; + +const deprecated = [v1]; + +export default deprecated; diff --git a/private/src/blocks/key-facts/edit.jsx b/private/src/blocks/key-facts/edit.jsx new file mode 100644 index 00000000..a3d76454 --- /dev/null +++ b/private/src/blocks/key-facts/edit.jsx @@ -0,0 +1,64 @@ +import classnames from 'classnames'; +import memoize from 'memize'; +import { times } from 'lodash'; +import { InnerBlocks, InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, RangeControl, SelectControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +const ALLOWED_BLOCKS = ['amnesty-core/key-fact']; +const getLayoutTemplate = memoize((blocks) => times(blocks, () => ALLOWED_BLOCKS)); + +export default function Edit({ attributes, setAttributes }) { + // Ensure quantity has a fallback default + const quantity = attributes.quantity || 1; + + const classes = classnames('factBlock', { + 'has-background': !!attributes.background, + [`has-${attributes.background}-background-color`]: !!attributes.background, + }); + + const blockProps = useBlockProps({ + className: classes, + }); + + return ( + <> + <InspectorControls> + <PanelBody> + <RangeControl + /* translators: [admin] */ + label={__('Quantity', 'amnesty')} + value={quantity} + onChange={(newQuantity) => setAttributes({ quantity: newQuantity })} + min={1} + max={4} + /> + <SelectControl + /* translators: [admin] */ + label={__('Background Colour', 'amnesty')} + value={attributes.background} + onChange={(newBackground) => setAttributes({ background: newBackground })} + options={[ + /* translators: [admin] */ + { value: '', label: __('None', 'amnesty') }, + /* translators: [admin] */ + { value: 'very-light-gray', label: __('Grey', 'amnesty') }, + ]} + /> + </PanelBody> + </InspectorControls> + <div {...blockProps}> + <RichText + className="factBlock-title" + tagName="h2" + /* translators: [admin] */ + placeholder={__('(Insert Title)', 'amnesty')} + value={attributes.title} + allowedFormats={[]} + onChange={(newTitle) => setAttributes({ title: newTitle })} + /> + <InnerBlocks template={getLayoutTemplate(attributes.quantity)} templateLock="all" /> + </div> + </> + ); +} diff --git a/private/src/blocks/key-facts/editor.scss b/private/src/blocks/key-facts/editor.scss new file mode 100644 index 00000000..cf7414e6 --- /dev/null +++ b/private/src/blocks/key-facts/editor.scss @@ -0,0 +1,9 @@ +.factBlock { + margin-right: auto; + margin-left: auto; +} + +.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type) { + position: relative; + margin-bottom: 50px; +} diff --git a/private/src/blocks/key-facts/index.jsx b/private/src/blocks/key-facts/index.jsx new file mode 100644 index 00000000..c5700241 --- /dev/null +++ b/private/src/blocks/key-facts/index.jsx @@ -0,0 +1,17 @@ +import './style.scss'; +import './editor.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'KeyFactsBlockSave' }), +}); diff --git a/private/src/blocks/key-facts/render.php b/private/src/blocks/key-facts/render.php new file mode 100644 index 00000000..391f3e5e --- /dev/null +++ b/private/src/blocks/key-facts/render.php @@ -0,0 +1,21 @@ +<?php + +$classes = classnames( + 'factBlock', + [ + 'has-background' => (bool) $attributes['background'], + ], + [ + "has-{$attributes['background']}-background-color" => (bool) $attributes['background'], + ], +); + +$wrapper_attibutes = get_block_wrapper_attributes( [ 'class' => $classes ] ); + +$label = sanitize_title_with_dashes( $attributes['title'] ); + +?> +<aside <?php echo wp_kses_data( $wrapper_attibutes ); ?> aria-labelledby="<?php echo esc_attr( $label ); ?>"> + <h2 id="<?php echo esc_attr( $label ); ?>" class="factBlock-title" aria-hidden="true"><?php echo wp_kses_post( $attributes['title'] ); ?></h2> + <ol><?php echo wp_kses_post( $content ); ?></ol> +</aside> diff --git a/private/src/blocks/key-facts/style.scss b/private/src/blocks/key-facts/style.scss new file mode 100644 index 00000000..d8e08a22 --- /dev/null +++ b/private/src/blocks/key-facts/style.scss @@ -0,0 +1,15 @@ +.factBlock { + max-width: calc(var(--wp--preset--layout--contentSize) / 3); + padding: 24px; + text-align: center; +} + +.factBlock ol { + margin: 0; + list-style: none; +} + +.factBlock-title { + font-family: var(--wp--preset--font-family--secondary); + text-transform: uppercase; +} diff --git a/private/src/blocks/link-group/block.json b/private/src/blocks/link-group/block.json new file mode 100644 index 00000000..63a3e22d --- /dev/null +++ b/private/src/blocks/link-group/block.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/link-group", + "title": "Link Block", + "category": "amnesty-core", + "description": "A collection of links, used for things such as further reading suggestions.", + "keywords": ["Links", "Further Reading"], + "icon": "list-view", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": true, + "align": ["left", "center", "right"] + }, + "attributes": { + "title": { + "type": "string", + "default": "" + }, + "items": { + "type": "array", + "default": [] + } + } +} diff --git a/private/src/scripts/editor/blocks/link-group/deprecated.jsx b/private/src/blocks/link-group/deprecated.jsx similarity index 100% rename from private/src/scripts/editor/blocks/link-group/deprecated.jsx rename to private/src/blocks/link-group/deprecated.jsx diff --git a/private/src/blocks/link-group/edit.jsx b/private/src/blocks/link-group/edit.jsx new file mode 100644 index 00000000..ea2daf5a --- /dev/null +++ b/private/src/blocks/link-group/edit.jsx @@ -0,0 +1,147 @@ +import { isObject } from 'lodash'; +import { RichText, URLInputButton, useBlockProps } from '@wordpress/block-editor'; +import { Button, CheckboxControl } from '@wordpress/components'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/** + * Generate random string key for iterators + */ +const randId = () => + Math.random() + .toString(36) + .replace(/[^a-z]+/g, '') + .substr(2, 10); + +const newItem = (data = {}) => ({ + ...{ + key: randId(), + text: '', + link: '', + blank: false, + }, + ...data, +}); + +export default function Edit({ attributes, setAttributes }) { + const [links, setLinks] = useState({}); + const { items } = attributes; + + /** + * Add a link item to the collection + */ + const addItem = (data = {}) => setAttributes({ items: [...items, newItem(data)] }); + + /** + * Remote a link item from the collection + * + * @param {number} index the current item in the collection + */ + const removeItem = (index) => { + const newItems = [...attributes.items]; + newItems.splice(index, 1); + setAttributes({ items: newItems }); + }; + + /** + * Update a link item property + * + * @param {number} index the current item in the collection + * @param {string} prop the item prop to update + * @param {mixed} value the item prop value to update + */ + const updateItemProp = (index, prop, value) => { + if (!isObject(items[index])) { + items[index] = newItem(); + } + + if (prop !== 'text' || value.indexOf('\n') === -1) { + items[index][prop] = value; + setAttributes({ items: [...items] }); + return; + } + + const texts = value.split('\n'); + items[index][prop] = texts[0]; // eslint-disable-line + setAttributes({ items: [...items] }); + + texts.slice(1).forEach((text) => addItem({ text })); + }; + + /** + * Update a link item's link property + * + * @param {number} index the current item in the collection + * @param {string} value the item value to update + */ + const updateItemLink = (index, value) => { + setLinks({ ...links, [`link-${index}`]: value }); + }; + + const blockProps = useBlockProps(); + + useEffect(() => { + Object.keys(links).forEach((key) => { + if (!key.match(/^link-\d+$/)) { + return; + } + + const index = key.replace(/^link-(\d+)$/, '$1'); + updateItemProp(index, 'link', links[key]); + }); + }, [links]); // eslint-disable-line react-hooks/exhaustive-deps + + return ( + <> + <aside {...blockProps}> + <RichText + tagName="h2" + format="string" + /* translators: [admin] */ + placeholder={__('Further Reading', 'amnesty')} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + multiline={false} + withoutInteractiveFormatting={true} + /> + <ul> + {attributes.items.map((item, index) => ( + <li key={item.key}> + <RichText + tagName="span" + format="string" + /* translators: [admin] */ + placeholder={__('Type link', 'amnesty')} + value={item.text} + onChange={(text) => updateItemProp(index, 'text', text)} + onRemove={() => removeItem(index)} + multiline={false} + preserveWhiteSpace={true} + withoutInteractiveFormatting={true} + /> + <URLInputButton + url={links[`link-${index}`]} + onChange={(link) => updateItemLink(index, link)} + /> + <CheckboxControl + className="newtab" + /* translators: [admin] */ + label={__('Open in new tab', 'amnesty')} + onChange={(blank) => updateItemProp(index, 'blank', blank)} + checked={item.blank} + /> + </li> + ))} + <li> + <Button + label={/* translators: [admin] */ __('Add a link', 'amnesty')} + onClick={() => addItem()} + > + {/* translators: [admin] */ __('Add a link', 'amnesty')} + </Button> + </li> + </ul> + </aside> + </> + ); +} diff --git a/private/src/blocks/link-group/editor.scss b/private/src/blocks/link-group/editor.scss new file mode 100644 index 00000000..bdd2e13b --- /dev/null +++ b/private/src/blocks/link-group/editor.scss @@ -0,0 +1,82 @@ +.wp-block[data-type="amnesty-core/link-group"]::after { + content: ""; + display: table; + clear: both; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group h2 { + margin-top: 0; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group ul { + margin: 0; + padding: 0; + list-style: none; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group li { + position: relative; + justify-content: space-between; + align-items: stretch; + flex-wrap: wrap; + padding: var(--wp--preset--spacing--half); +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group li > span { + width: calc(100% - 40px); // 40px is url input button width + line-height: 40px; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group .block-editor-url-input__button { + position: absolute; + top: var(--wp--preset--spacing--half); + right: var(--wp--preset--spacing--half); + z-index: 1; + display: flex; + flex-direction: column; + align-items: flex-end; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group .block-editor-url-input .components-base-control__field { + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group .components-spinner { + width: 18px !important; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group .newtab { + width: 100%; + text-align: right; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group .newtab .components-base-control__field { + display: inline-flex; + flex-direction: row-reverse; + align-items: center; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group .newtab .components-checkbox-control__input-container { + margin-right: 0; + margin-left: var(--wp--preset--spacing--half); +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group.alignleft { + margin-right: auto !important; + margin-left: 0 !important; + float: none !important; + max-width: 480px; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group.alignright { + margin-left: auto !important; + margin-right: 0 !important; + float: none !important; + max-width: 480px; +} + +.editor-styles-wrapper .wp-block-amnesty-core-link-group.aligncenter { + margin-left: auto !important; + margin-right: auto !important; + max-width: 480px !important; +} diff --git a/private/src/blocks/link-group/index.js b/private/src/blocks/link-group/index.js new file mode 100644 index 00000000..bbabe72c --- /dev/null +++ b/private/src/blocks/link-group/index.js @@ -0,0 +1,15 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/link-group/render.php b/private/src/blocks/link-group/render.php new file mode 100644 index 00000000..e8989a0e --- /dev/null +++ b/private/src/blocks/link-group/render.php @@ -0,0 +1,29 @@ +<?php + +$wrapper_attributes = get_block_wrapper_attributes(); + +$icon = '<svg viewBox="0 0 32 32"><path d="M8 20c0 0 1.838-6 12-6v6l12-8-12-8v6c-8 0-12 4.99-12 10zM22 24h-18v-12h3.934c0.315-0.372 0.654-0.729 1.015-1.068 1.374-1.287 3.018-2.27 4.879-2.932h-13.827v20h26v-8.395l-4 2.667v1.728z" /></svg>'; +$items = array_values( array_filter( $attributes['items'], fn ( $item ) => $item['link'] || $item['text'] ) ); + +?> +<aside <?php echo wp_kses_data( $wrapper_attributes ); ?>> +<?php if ( $attributes['title'] ) : ?> + <h2><?php echo esc_html( $attributes['title'] ); ?></h2> +<?php endif; ?> +<ul class="hello-there"> +<?php foreach ( $items as $item ) : ?> + <?php if ( ! $item['blank'] ) : ?> + <li> + <a href="<?php echo esc_url( $item['link'] ); ?>"><?php echo esc_html( $item['text'] ); ?></a> + </li> + <?php else : ?> + <li> + <a class="is-external" href="<?php echo esc_url( $item['link'] ); ?>" rel="noopener noreferrer" target="_blank"> + <?php echo $icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> + <?php echo esc_html( $item['text'] ); ?> + </a> + </li> + <?php endif; ?> +<?php endforeach; ?> +</ul> +</aside> diff --git a/private/src/blocks/link-group/style.scss b/private/src/blocks/link-group/style.scss new file mode 100644 index 00000000..8020d1f4 --- /dev/null +++ b/private/src/blocks/link-group/style.scss @@ -0,0 +1,82 @@ +.wp-block-amnesty-core-link-group { + padding: 24px; + background-color: var(--wp--preset--color--grey-lighter); +} + +.wp-block-amnesty-core-link-group h2 { + margin-bottom: spacing(); + font-size: var(--wp--preset--font-size--heading-4); +} + +.wp-block-amnesty-core-link-group ul { + margin: 0; + padding: 0; + list-style: none; +} + +.wp-block-amnesty-core-link-group li { + display: flex; + background-color: var(--wp--preset--color--white); + word-break: break-word; +} + +.wp-block-amnesty-core-link-group li + li { + margin-top: var(--wp--preset--spacing--half); +} + +.wp-block-amnesty-core-link-group li a { + display: flex; + padding: var(--wp--preset--spacing--half); + width: 100%; + height: 100%; + transition: background .3s ease-in-out; + text-decoration: none; +} + +.wp-block-amnesty-core-link-group li a:hover, +.wp-block-amnesty-core-link-group li a:active, +.wp-block-amnesty-core-link-group li a:focus { + background-color: var(--wp--preset--color--grey-lighter); +} + +.wp-block-amnesty-core-link-group li a > svg { + margin-right: var(--wp--preset--spacing--half); + width: 20px; + + .rtl & { + margin-right: 0; + margin-left: var(--wp--preset--spacing--half); + } +} + +.wp-block-amnesty-core-link-group.alignleft { + margin-right: auto !important; + margin-left: 0 !important; + float: unset !important; + max-width: 480px; +} + +.wp-block-amnesty-core-link-group.alignright { + margin-left: auto !important; + margin-right: 0 !important; + float: unset !important; + max-width: 480px; +} + +.wp-block-amnesty-core-link-group.aligncenter { + margin-left: auto !important; + margin-right: auto !important; + max-width: 480px; +} + +.rtl .wp-block-amnesty-core-link-group.alignleft { + margin-right: 0 !important; + margin-left: auto !important; + float: unset !important; +} + +.rtl .wp-block-amnesty-core-link-group.alignright { + margin-left: 0 !important; + margin-right: auto !important; + float: unset !important; +} diff --git a/private/src/blocks/menu/block.json b/private/src/blocks/menu/block.json new file mode 100644 index 00000000..33d28b37 --- /dev/null +++ b/private/src/blocks/menu/block.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-menu", + "title": "Menu", + "category": "amnesty-core", + "description": "", + "keywords": ["Menu", "Navigation"], + "icon": "welcome-widgets-menus", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "attributes": { + "menuId": { + "type": "integer", + "default": 0 + }, + "color": { + "type": "string", + "default": "" + }, + "type": { + "type": "string", + "default": "standard-menu" + } + } +} diff --git a/private/src/blocks/menu/edit.jsx b/private/src/blocks/menu/edit.jsx new file mode 100644 index 00000000..b21d10d0 --- /dev/null +++ b/private/src/blocks/menu/edit.jsx @@ -0,0 +1,156 @@ +import classnames from 'classnames'; +import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, SelectControl } from '@wordpress/components'; +import { useEntityRecord, useEntityRecords } from '@wordpress/core-data'; +import { useSelect } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; + +const colours = [ + /* translators: [admin] */ + { label: __('White', 'amnesty'), value: '' }, + /* translators: [admin] */ + { label: __('Grey', 'amnesty'), value: 'dark' }, +]; + +const options = [ + /* translators: [admin] */ + { label: __('Standard Menu', 'amnesty'), value: 'standard-menu' }, + /* translators: [admin] */ + { label: __('In-page Menu', 'amnesty'), value: 'inpage-menu' }, +]; + +const StandardMenu = ({ loadingMenu, menu, items }) => { + if (!menu) { + /* translators: [admin] */ + return <p>{__('Select a menu in the sidebar', 'amnesty')}</p>; + } + + if (loadingMenu) { + /* translators: [admin] */ + return <p>{__('Loading Menu…', 'amnesty')}</p>; + } + + if (!items) { + /* translators: [admin] */ + return <p>{__('No menu items', 'amnesty')}</p>; + } + + return ( + <ul className="postlist-categories"> + {items?.map((item) => { + const itemClasses = classnames( + 'menu-item', + `menu-item-type-${item.type}`, + `menu-item-object-${item.object}`, + `menu-item-${item.id}`, + ); + + return ( + <li key={item.id} className={itemClasses}> + <a className="btn btn--white" href={item.url}> + {item.title.rendered} + </a> + </li> + ); + })} + </ul> + ); +}; + +const InPageMenu = ({ sectionAttributes }) => ( + <ul className="postlist-categories"> + {sectionAttributes.map((value, index) => ( + <li key={index}> + <a className="btn btn--white" href={`#${value.sectionId}`}> + {value.sectionName} + </a> + </li> + ))} + </ul> +); + +export default function Edit({ attributes, setAttributes }) { + const sectionAttributes = useSelect((select) => { + const allBlocks = select('core/block-editor').getBlocks(); + const sectionBlocksWithIds = allBlocks.filter((block) => block.attributes.sectionId); + return sectionBlocksWithIds.map((a) => a.attributes); + }); + + const { records: menuRecords, isResolving } = useEntityRecords('root', 'menu', { + per_page: -1, + context: 'view', + }); + + const menus = [ + { label: __('Select a menu…', 'amnesty'), value: '' }, + ...(menuRecords?.map((m) => ({ label: m.name, value: m.id })) || []), + ]; + + const { record: menu } = useEntityRecord('root', 'menu', attributes.menuId); + const { records: menuItems } = useEntityRecords('root', 'menuItem', { menus: attributes.menuId }); + + const containerClasses = classnames('postlist-categoriesContainer', { + [`section--${attributes.color}`]: !!attributes.color, + }); + + const Controls = () => ( + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + {isResolving && <p>{/* translators: [admin] */ __('Loading Menus…', 'amnesty')}</p>} + <SelectControl + /* translators: [admin] */ + label={__('Menu', 'amnesty')} + /* translators: [admin] */ + help={__('Which type of menu you would like to add to the page', 'amnesty')} + value={attributes.type} + options={options} + onChange={(type) => setAttributes({ type })} + /> + {attributes.type === 'standard-menu' && ( + <SelectControl + /* translators: [admin] */ + label={__('Menu', 'amnesty')} + options={menus} + disabled={isResolving} + value={attributes.menuId} + onChange={(menuId) => setAttributes({ menuId })} + /> + )} + <SelectControl + /* translators: [admin] */ + label={__('Background Colour', 'amnesty')} + options={colours} + value={attributes.color} + onChange={(color) => setAttributes({ color })} + /> + </PanelBody> + </InspectorControls> + ); + + const blockProps = useBlockProps({ + className: classnames(containerClasses, { + 'postlist-categoriesContainer': attributes.type === 'inpage-menu', + [`section--${attributes.color}`]: !!attributes.color, + }), + }); + + if (attributes.type === 'standard-menu') { + return ( + <div {...blockProps}> + <Controls /> + <StandardMenu loadingMenu={isResolving} menu={menu} items={menuItems} /> + </div> + ); + } + + if (attributes.type === 'inpage-menu') { + return ( + <div {...blockProps}> + <Controls /> + <InPageMenu attributes={attributes} sectionAttributes={sectionAttributes} /> + </div> + ); + } + + return <Controls />; +} diff --git a/private/src/blocks/menu/editor.scss b/private/src/blocks/menu/editor.scss new file mode 100644 index 00000000..5ab3c1d9 --- /dev/null +++ b/private/src/blocks/menu/editor.scss @@ -0,0 +1,22 @@ +[data-type="amnesty-core/block-menu"] { + max-width: 100% !important; + width: 100% !important; +} + +[data-type="amnesty-core/block-menu"] .postlist-categories { + align-items: flex-start; + box-sizing: border-box !important; + margin: 0 !important; + padding: var(--wp--preset--spacing--single) !important; + list-style: none !important; + + a { + display: inline-block; + text-decoration: none; + font-family: var(--wp--preset--font-family--secondary); + } + + ul { + display: none; + } +} diff --git a/private/src/blocks/menu/index.js b/private/src/blocks/menu/index.js new file mode 100644 index 00000000..c7e3dcd0 --- /dev/null +++ b/private/src/blocks/menu/index.js @@ -0,0 +1,13 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/menu/render-custom.php b/private/src/blocks/menu/render-custom.php new file mode 100644 index 00000000..639c2b6d --- /dev/null +++ b/private/src/blocks/menu/render-custom.php @@ -0,0 +1,15 @@ +<section class="postlist-categoriesContainer <?php empty( $atts['color'] ) || printf( 'section--%s', esc_attr( $atts['color'] ) ); ?>" data-slider> + <nav> + <ul class="postlist-categories<?php count( $atts['items'] ) > 4 && print ' use-flickity'; ?>" aria-label="<?php /* translators: [front] ARIA https://isaidotorgstg.wpengine.com/en/latest/ */ esc_attr_e( 'List of page sections', 'amnesty' ); ?>"> + <?php + + foreach ( $atts['items'] as $item ) { + printf( '<li><a class="btn btn--white" href="#%s">%s</a></li>', esc_attr( $item['id'] ), esc_html( $item['label'] ) ); + } + + ?> + </ul> + </nav> + <button data-slider-prev disabled><?php esc_html_e( 'Previous', 'amnesty' ); ?></button> + <button data-slider-next><?php esc_html_e( 'Next', 'amnesty' ); ?></button> +</section> diff --git a/private/src/blocks/menu/render-in-page.php b/private/src/blocks/menu/render-in-page.php new file mode 100644 index 00000000..a1828129 --- /dev/null +++ b/private/src/blocks/menu/render-in-page.php @@ -0,0 +1,39 @@ +<?php + +$blocks = parse_blocks( get_post_field( 'post_content' ) ); +$sections = array_filter( + $blocks, + // phpcs:ignore Universal.FunctionDeclarations.NoLongClosures.ExceedsRecommended + function ( $block ) { + if ( 'amnesty-core/block-section' !== $block['blockName'] ) { + return false; + } + + if ( empty( $block['attrs']['sectionId'] ) || empty( $block['attrs']['sectionName'] ) ) { + return false; + } + + return true; + } +); + +if ( empty( $sections ) ) { + return; +} + +?> +<section class="postlist-categoriesContainer <?php empty( $attributes['color'] ) || printf( 'section--%s', esc_attr( $attributes['color'] ) ); ?>" data-slider> + <nav> + <ul class="postlist-categories<?php count( $sections ) > 4 && print ' use-flickity'; ?>" aria-label="<?php /* translators: [front] ARIA https://isaidotorgstg.wpengine.com/en/latest/ */ esc_attr_e( 'List of page sections', 'amnesty' ); ?>"> + <?php + + foreach ( $sections as $section ) { + printf( '<li><a class="btn btn--white" href="#%s">%s</a></li>', esc_attr( $section['attrs']['sectionId'] ), esc_html( $section['attrs']['sectionName'] ) ); + } + + ?> + </ul> + </nav> + <button data-slider-prev disabled><?php esc_html_e( 'Previous', 'amnesty' ); ?></button> + <button data-slider-next><?php esc_html_e( 'Next', 'amnesty' ); ?></button> +</section> diff --git a/private/src/blocks/menu/render-wp-nav.php b/private/src/blocks/menu/render-wp-nav.php new file mode 100644 index 00000000..612b2aea --- /dev/null +++ b/private/src/blocks/menu/render-wp-nav.php @@ -0,0 +1,34 @@ +<?php + +$the_menu = wp_get_nav_menu_object( absint( $attributes['menuId'] ) ); + +?> +<section class="postlist-categoriesContainer <?php empty( $attributes['color'] ) || printf( 'section--%s', esc_attr( $attributes['color'] ) ); ?>" data-slider> + <nav> + <ul class="postlist-categories<?php $the_menu->count > 4 && print ' use-flickity'; ?>" aria-label="<?php /* translators: [front] ARIA https://www.amnesty.org/en/latest/ */ esc_attr_e( 'Category List', 'amnesty' ); ?>"> + <?php + + wp_nav_menu( + [ + 'menu' => $attributes['menuId'], + 'container' => false, + 'container_class' => 'menu-{menu slug}-container', + 'container_id' => '', + 'menu_class' => 'menu', + 'menu_id' => 'category_style_menu', + 'echo' => true, + 'before' => '', + 'after' => '', + 'link_before' => '', + 'link_after' => '', + 'items_wrap' => '%3$s', + 'depth' => 1, + ] + ); + + ?> + </ul> + </nav> + <button data-slider-prev disabled><?php esc_html_e( 'Previous', 'amnesty' ); ?></button> + <button data-slider-next><?php esc_html_e( 'Next', 'amnesty' ); ?></button> +</section> diff --git a/private/src/blocks/menu/render.php b/private/src/blocks/menu/render.php new file mode 100644 index 00000000..6d098132 --- /dev/null +++ b/private/src/blocks/menu/render.php @@ -0,0 +1,20 @@ +<?php + +if ( 'standard-menu' === $attributes['type'] ) { + if ( ! $attributes['menuId'] ) { + return; + } + + require __DIR__ . '/render-wp-nav.php'; + return; +} + +if ( 'inpage-menu' === $attributes['type'] ) { + require __DIR__ . '/render-in-page.php'; + return; +} + +if ( 'custom-menu' === $attributes['type'] && ! empty( $attributes['items'] ) ) { + require __DIR__ . '/render-custom.php'; + return; +} diff --git a/private/src/blocks/menu/style.scss b/private/src/blocks/menu/style.scss new file mode 100644 index 00000000..1b1f3475 --- /dev/null +++ b/private/src/blocks/menu/style.scss @@ -0,0 +1,185 @@ +@use '../../utils/functions/flexy' as f; +@use '../../utils/mixins/icon' as i; + +.postlist-categoriesContainer { + display: flex; + align-items: center; +} + +.postlist-categoriesContainer nav { + width: 100%; +} + +.postlist-categories { + display: flex; + flex: 1 1 100%; + padding: var(--wp--preset--spacing--single) !important; + margin-bottom: 0; + margin-left: 0; + max-width: 100%; + overflow-x: auto; + list-style: none; +} + +.postlist-categories::after { + content: "flickity"; + display: none; + + @media all and (min-width: 940px) { + content: ""; + } +} + +.postlist-categories.use-flickity::after { + content: "flickity"; + display: none; +} + +.postlist-categories.flickity-enabled { + display: block; + padding: 0; + + .flickity-viewport { + flex: 1; + } +} + +.postlist-categories:not(.flickity-enabled) li { + flex: 1 0 auto; + list-style: none; + + @media all and (min-width: 465px) { + @include f.flexy-grid(2, f.flexy-gutter()); + } + + @media all and (min-width: 540px) { + @include f.flexy-grid(3, f.flexy-gutter()); + } + + @media all and (min-width: 940px) { + @include f.flexy-grid(4, f.flexy-gutter()); + flex-grow: 1; + max-width: none; + } +} + +.postlist-categories.flickity-enabled li { + flex: 1 0 100%; + width: 100%; + + @media all and (min-width: 540px) { + @include f.flexy-grid(2, f.flexy-gutter()); + } + + @media all and (min-width: 940px) { + @include f.flexy-grid(3, f.flexy-gutter()); + flex-grow: 1; + max-width: none; + } +} + +.postlist-categories li + li { + margin-left: f.flexy-gutter(); + + .rtl & { + margin-right: f.flexy-gutter(); + margin-left: 0; + } +} + +.postlist-categories a { + display: flex; + align-items: center; + justify-content: center; + padding: 11px 16px; + width: 100%; + height: 100%; + color: var(--wp--preset--color--black); + border: 1px solid var(--wp--preset--color--grey-light); + text-decoration: none !important; + + &:hover, + &:active, + &:focus { + border-color: var(--wp--preset--color--grey-light); + } +} + +// IE11 hack for flex fail + +/* stylelint-disable-next-line selector-type-no-unknown */ +_:-ms-fullscreen, +:root .postlist-categories a { + white-space: normal; +} + +.postlist-categories .is-current a { + color: var(--wp--preset--color--white); + background-color: var(--wp--preset--color--black); + border-color: var(--wp--preset--color--black); +} + +[data-slider-next], +[data-slider-prev] { + display: none; + background-color: transparent; + border: 2px solid transparent; + transition: background-color .3s ease-in-out, opacity .3s ease-in-out; + cursor: pointer; + + &:hover { + background-color: var(--wp--preset--color--grey-lighter); + } + + &:focus, + &:active { + border: 2px solid var(--wp--preset--color--orange-base); + } +} + +[data-slider-next]:focus-within, +[data-slider-prev]:focus-within { + border: 2px solid var(--wp--preset--color--orange-base); +} + +[data-slider-next][disabled], +[data-slider-prev][disabled] { + opacity: .4; + cursor: not-allowed; +} + +.flickity-enabled [data-slider-prev] { + order: -1; +} + +.flickity-enabled [data-slider-next], +.flickity-enabled [data-slider-prev] { + display: flex; + align-items: center; + justify-content: center; + width: 44px; + height: 44px; + text-indent: -1000px; + overflow: hidden; + padding: 0; +} + +[data-slider-prev]::after { + @include i.icon_scale(234px, 240px, 16px, 16px, 2); + content: ""; + display: block; + + .rtl & { + background-position: -220px -530px; + } +} + +[data-slider-next]::after { + @include i.icon_scale(110px, 265px, 16px, 16px, 2); + content: ""; + display: block; + + .rtl & { + background-position: -468px -480px; + } +} diff --git a/private/src/blocks/petition-list/block.json b/private/src/blocks/petition-list/block.json new file mode 100644 index 00000000..9ed59bbd --- /dev/null +++ b/private/src/blocks/petition-list/block.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/petition-list", + "title": "Petition List", + "category": "amnesty-core", + "keywords": ["List", "Petition"], + "description": "Display a list of petitions", + "icon": "admin-post", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./style-index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "multiple": true + }, + "attributes": { + "type": { + "type": "string", + "default": "feed", + "enum": ["feed", "select"] + }, + "amount": { + "type": "integer", + "default": 24 + }, + "selectedPosts": { + "type": "array", + "default": [] + }, + "displayAuthor": { + "type": "boolean", + "default": false + }, + "displayPostDate": { + "type": "boolean", + "default": false + } + } +} diff --git a/private/src/blocks/petition-list/edit.jsx b/private/src/blocks/petition-list/edit.jsx new file mode 100644 index 00000000..1466b5c9 --- /dev/null +++ b/private/src/blocks/petition-list/edit.jsx @@ -0,0 +1,80 @@ +import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, RangeControl, SelectControl, ToggleControl } from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import metadata from './block.json'; +import DisplayFeed from '../post-list/components/DisplayFeed.jsx'; +import DisplaySelect from '../post-list/components/DisplaySelect.jsx'; + +export default function Edit({ attributes, setAttributes }) { + const [preview, setPreview] = useState(attributes.selectedPosts.length > 0); + const togglePreview = () => setPreview((prev) => !prev); + const keyPrefix = Math.random().toString(36).substring(7); + // Petition post name may be different to its original codename. + const petitionsSlug = window.aiPostTypeCodenames.petition; + + return ( + <> + <InspectorControls> + <PanelBody title={__('Petition Settings', 'amnesty')}> + {attributes.type === 'select' && ( + <button onClick={togglePreview}> + {preview ? __('Hide Preview', 'amnesty') : __('Show Preview', 'amnesty')} + </button> + )} + <SelectControl + label={__('Type', 'amnesty')} + options={metadata.attributes.type.enum.map((v) => ({ + value: v, + label: v.charAt(0).toUpperCase() + v.slice(1), + }))} + value={attributes.type} + onChange={(type) => setAttributes({ type })} + /> + <RangeControl + label={__('Number of posts to show:', 'amnesty')} + min={1} + max={100} + value={attributes.amount || 3} + onChange={(amount) => setAttributes({ amount })} + /> + <ToggleControl + label={__('Display Post Author', 'amnesty')} + checked={attributes.displayAuthor} + onChange={(displayAuthor) => setAttributes({ displayAuthor })} + /> + <ToggleControl + label={__('Display Post Date', 'amnesty')} + checked={attributes.displayPostDate} + onChange={(displayPostDate) => setAttributes({ displayPostDate })} + /> + </PanelBody> + </InspectorControls> + <div {...useBlockProps()}> + {attributes.type === 'feed' && ( + <DisplayFeed + amount={attributes.amount || 3} + overrideTypes={{ [petitionsSlug]: true }} + style="petition" + prefix={keyPrefix} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + /> + )} + {attributes.type === 'select' && ( + <DisplaySelect + setAttributes={setAttributes} + selectedPosts={attributes.selectedPosts || []} + defaultPostType={petitionsSlug} + preview={preview} + style="petition" + prefix={keyPrefix} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + /> + )} + </div> + </> + ); +} diff --git a/private/src/blocks/petition-list/helpers.php b/private/src/blocks/petition-list/helpers.php new file mode 100644 index 00000000..7ccca296 --- /dev/null +++ b/private/src/blocks/petition-list/helpers.php @@ -0,0 +1,231 @@ +<?php + +declare( strict_types = 1 ); + +if ( ! function_exists( 'amnesty_petition_list_process_content' ) ) { + /** + * Process the current attributes by calling the specific function dependant on block type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current block attributes. + * + * @return array|bool + */ + function amnesty_petition_list_process_content( $attributes ) { + if ( empty( $attributes['type'] ) ) { + return amnesty_list_process_category( $attributes ); + } + + switch ( $attributes['type'] ) { + case 'custom': + return amnesty_list_process_custom( $attributes ); + case 'category': + return amnesty_list_process_category( $attributes ); + case 'select': + return amnesty_petition_list_process_select( $attributes ); + case 'feed': + return amnesty_petition_list_process_feed( $attributes ); + case 'template': + if ( empty( $attributes['query'] ) ) { + return ''; + } + return amnesty_petition_list_process_query( $attributes['query'], false ); + default: + return amnesty_list_process_category( $attributes ); + } + } +} + +if ( ! function_exists( 'amnesty_render_petition_item' ) ) { + /** + * Render the current block item as a grid item. + * + * @package Amnesty\Blocks + * + * @param array $data - Item data. + * + * @return void + */ + function amnesty_render_petition_item( $data ) { + $title = isset( $data['title'] ) ? $data['title'] : ''; + + /* translators: [front] https://isaidotorgstg.wpengine.com/en/latest/petition/nigeria-end-impunity-for-police-brutality-end-sars/ */ + $button_text = __( 'Act Now', 'amnesty' ); + if ( ! empty( $data['has_signed'] ) ) { + /* translators: [front] https://isaidotorgstg.wpengine.com/en/latest/petition/nigeria-end-impunity-for-police-brutality-end-sars/ used by sections, when a form rather than an Iframe is used */ + $button_text = _x( 'Signed!', 'User has signed this petition.', 'amnesty' ); + } + + $feature = wp_get_attachment_image_url( absint( $data['featured_image'] ?? 0 ), 'post-half@2x' ); + + ?> + <article class="grid-item petition-item" aria-label="Article: <?php echo esc_attr( format_for_aria_label( $title ) ); ?>" tabindex="0"> + <figure> + <img class="petition-itemImage aiic-ignore" src="<?php echo esc_url( $feature ); ?>" alt=""> + <?php if ( ! empty( $data['tag'] ) ) : ?> + <span class="petition-itemImageCaption"> + <?php + if ( ! empty( $data['tag_link'] ) ) { + printf( '<a href="%s" tabindex="0">%s</a>', esc_url( $data['tag_link'] ), esc_html( $data['tag'] ) ); + } else { + echo esc_attr( $data['tag'] ); + } + ?> + </span> + <?php endif; ?> + </figure> + + <div class="petition-item-content"> + <div class="petition-itemExcerpt"> + <?php + if ( ! empty( $data['excerpt'] ) ) { + echo esc_attr( $data['excerpt'] ); + } + ?> + </div> + <?php if ( $title ) : ?> + <h3 class="petition-itemTitle"> + <?php + if ( ! empty( $data['link'] ) ) { + printf( '<a href="%s" tabindex="0">%s</a>', esc_url( $data['link'] ), esc_html( $title ) ); + } else { + printf( '<span>%s</span>', esc_html( $title ) ); + } + ?> + </h3> + <?php endif; ?> + <a class="btn petition-itemCta" href="<?php echo esc_url( $data['link'] ); ?>"><?php echo esc_html( $button_text ); ?></a> + </div> + </article> + + <?php + } +} + +if ( ! function_exists( 'amnesty_petition_list_process_query' ) ) { + /** + * Processes each post/page to return the the correct data format for our render function. + * + * @package Amnesty\Blocks + * + * @param WP_Query $query Current WP_Query. + * @param object|false $term a term to use, if supplied + * + * @return array + */ + function amnesty_petition_list_process_query( $query, $term = false ) { + $posts = []; + + if ( ! $query->have_posts() ) { + return $posts; + } + + // phpcs:ignore WordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___COOKIE + $user_signed_petitions = sanitize_text_field( $_COOKIE['amnesty_petitions'] ?? '' ); + if ( $user_signed_petitions ) { + $user_signed_petitions = array_map( 'absint', explode( ',', $user_signed_petitions ) ); + } + + while ( $query->have_posts() ) { + $query->the_post(); + + $item = [ + 'id' => get_the_ID(), + 'title' => get_the_title(), + 'link' => get_the_permalink(), + 'tag' => false, + 'tag_link' => false, + 'featured_image' => get_post_meta( get_the_ID(), '_thumbnail_id', true ), + 'excerpt' => get_the_excerpt(), + 'has_signed' => in_array( get_the_ID(), (array) $user_signed_petitions, true ), + ]; + + $term = amnesty_get_a_post_term( get_the_ID(), 'topic' ); + + if ( is_a( $term, 'WP_Term' ) ) { + $item['tag'] = $term->name; + $item['tag_link'] = amnesty_term_link( $term ); + } + + $posts[] = $item; + } + + wp_reset_postdata(); + + return $posts; + } +} + +if ( ! function_exists( 'amnesty_petition_list_process_feed' ) ) { + /** + * Process the attributes for the current block for the object selection type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current Block attributes. + * + * @return array|bool + */ + function amnesty_petition_list_process_feed( $attributes ) { + if ( empty( $attributes ) ) { + return false; + } + + $post_types = [ get_option( 'aip_petition_slug' ) ?: 'petition' ]; + + $amount = 3; // the default + if ( isset( $attributes['amount'] ) ) { + $amount = absint( $attributes['amount'] ); + } + + $query = new WP_Query( + [ + 'post_type' => $post_types, + 'no_found_rows' => true, + 'posts_per_page' => $amount, + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query + 'tax_query' => [ + [ + 'taxonomy' => 'visibility', + 'field' => 'slug', + 'terms' => 'hidden', + 'include_children' => false, + 'operator' => 'NOT IN', + ], + ], + ] + ); + + return amnesty_petition_list_process_query( $query ); + } +} + +if ( ! function_exists( 'amnesty_petition_list_process_select' ) ) { + /** + * Process the attributes for the current block for the object selection type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current Block attributes. + * + * @return array|bool + */ + function amnesty_petition_list_process_select( $attributes ) { + if ( empty( $attributes ) || ! isset( $attributes['selectedPosts'] ) || ! $attributes['selectedPosts'] ) { + return false; + } + + $post_types = [ get_option( 'aip_petition_slug' ) ?: 'petition' ]; + + $query = new WP_Query( + [ + 'post__in' => $attributes['selectedPosts'], + 'post_type' => $post_types, + 'no_found_rows' => true, + ] + ); + + return amnesty_petition_list_process_query( $query ); + } +} diff --git a/private/src/blocks/petition-list/index.js b/private/src/blocks/petition-list/index.js new file mode 100644 index 00000000..f17e6a9c --- /dev/null +++ b/private/src/blocks/petition-list/index.js @@ -0,0 +1,12 @@ +import './style.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/petition-list/localise-editor-script.php b/private/src/blocks/petition-list/localise-editor-script.php new file mode 100644 index 00000000..83d964a9 --- /dev/null +++ b/private/src/blocks/petition-list/localise-editor-script.php @@ -0,0 +1,10 @@ +<?php + +return [ + 'aiPostTypeCodenames' => array_flip( + array_map( + fn ( WP_Post_Type $type ): string => $type?->codename ?? $type->name, + get_post_types( output: 'objects' ), + ), + ), +]; diff --git a/private/src/blocks/petition-list/render.php b/private/src/blocks/petition-list/render.php new file mode 100644 index 00000000..611ff460 --- /dev/null +++ b/private/src/blocks/petition-list/render.php @@ -0,0 +1,37 @@ +<?php + +if ( is_admin() ) { + return ''; +} + +if ( doing_filter( 'get_the_excerpt' ) ) { + return false; +} + +$data = amnesty_petition_list_process_content( $attributes ); + +if ( ! $data ) { + return ''; +} + +$grid_classes = $attributes['grid_class'] ?? 'grid grid-many'; + +?> + +<?php if ( isset( $attributes['style'] ) && 'grid' === $attributes['style'] ) : ?> + <div class="grid grid-<?php echo esc_attr( count( $data ) ); ?>"> + <?php array_map( 'amnesty_render_grid_item', $data ); ?> + </div> +<?php endif; ?> + +<?php if ( isset( $attributes['style'] ) && 'petition' === $attributes['style'] ) : ?> + <div class="<?php echo esc_attr( $grid_classes ); ?>"> + <?php array_map( 'amnesty_render_petition_item', $data ); ?> + </div> +<?php endif; ?> + +<ul class="linkList"> + <pre> + <?php var_dump( [ $attributes, $data ] ); ?> + </pre> +</ul> diff --git a/private/src/blocks/petition-list/style.scss b/private/src/blocks/petition-list/style.scss new file mode 100644 index 00000000..02bc02dc --- /dev/null +++ b/private/src/blocks/petition-list/style.scss @@ -0,0 +1,107 @@ +.grid .petition-item { + padding: 0; +} + +.petition-item { + background: var(--wp--preset--color--grey-lighter); + display: flex; + justify-content: flex-start; + flex-direction: column; +} + +.petition-item, +.petition-item * { + box-sizing: border-box; +} + +.petition-item .petition-itemImage { + display: flex; + width: 100%; + height: 300px; + object-fit: cover; +} + +.petition-item figure { + position: relative; + margin: 0; + padding: 0; + width: 100%; +} + +.petition-item .petition-itemImageCaption { + position: absolute; + bottom: 0; + left: 5px; + background: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + padding: 4px 8px; + text-transform: uppercase; + font-family: var(--wp--preset--font-family--secondary); + + a { + color: var(--wp--preset--color--white); + text-transform: uppercase; + font-family: var(--wp--preset--font-family--secondary); + } +} + +.petition-item .petition-item-content { + width: 100%; + padding: 14px; + display: flex; + height: 100%; + flex-direction: column; +} + +.petition-item .petition-itemTitle { + margin-top: 0; + font-family: var(--wp--preset--font-family--secondary); + color: var(--wp--preset--color--black); + flex-grow: 1; +} + +.petition-item .petition-itemTitle a { + font-family: var(--wp--preset--font-family--secondary); + color: var(--wp--preset--color--black); + font-weight: bold; + font-size: var(--wp--preset--font-size--heading-4); +} + +.petition-item .petition-itemTitle > * { + // stylelint-disable-next-line value-no-vendor-prefix -- this is necessary + display: -webkit-box; + line-clamp: 3; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +} + +.petition-item .petition-itemExcerpt { + text-transform: uppercase; + font-family: var(--wp--preset--font-family--secondary); + line-height: 1.8; +} + +.petition-item .petition-itemCta { + display: block; + text-transform: uppercase; + width: 100%; +} + +.petition-layout { + display: flex; + flex-wrap: wrap; +} + +.petition-layout .petition-item { + max-width: 330px; + margin-right: 24px; + margin-top: 24px; + padding: 0; +} + +.petition-itemImage img { + width: 100%; + object-fit: cover; +} diff --git a/private/src/blocks/pop-in/block.json b/private/src/blocks/pop-in/block.json new file mode 100644 index 00000000..9335d216 --- /dev/null +++ b/private/src/blocks/pop-in/block.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", + "apiVersion": 3, + "name": "amnesty-core/pop-in", + "title": "Pop-in", + "description": "For presenting dismissible content at the top of the site", + "textdomain": "amnesty", + "category": "amnesty-core", + "icon": "editor-table", + "keywords": ["Pop-in"], + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "viewScript": "file:./view.js", + "render": "file:./render.php", + "supports": { + "align": false, + "multiple": false + } +} diff --git a/private/src/blocks/pop-in/edit.jsx b/private/src/blocks/pop-in/edit.jsx new file mode 100644 index 00000000..5de7cb6c --- /dev/null +++ b/private/src/blocks/pop-in/edit.jsx @@ -0,0 +1,13 @@ +import { useBlockProps, InnerBlocks } from '@wordpress/block-editor'; + +export default function Edit() { + return ( + <aside {...useBlockProps({ className: 'pop-in u-textCenter' })} id="pop-in"> + <div className="section section--small"> + <div className="container container--small"> + <InnerBlocks /> + </div> + </div> + </aside> + ); +} diff --git a/private/src/styles/components/pop-in/_editor.scss b/private/src/blocks/pop-in/editor.scss similarity index 100% rename from private/src/styles/components/pop-in/_editor.scss rename to private/src/blocks/pop-in/editor.scss diff --git a/private/src/blocks/pop-in/index.jsx b/private/src/blocks/pop-in/index.jsx new file mode 100644 index 00000000..8815ca95 --- /dev/null +++ b/private/src/blocks/pop-in/index.jsx @@ -0,0 +1,14 @@ +import './editor.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'PopInBlockSave' }), +}); diff --git a/private/src/blocks/pop-in/render.php b/private/src/blocks/pop-in/render.php new file mode 100644 index 00000000..b9a160c3 --- /dev/null +++ b/private/src/blocks/pop-in/render.php @@ -0,0 +1,8 @@ +<aside id="pop-in" class="u-textCenter pop-in is-closed"> + <button id="pop-in-close" class="pop-in-close">X</button> + <div class="section section--small"> + <div class="container container--small"> + <?php echo wp_kses_post( $content ); ?> + </div> + </div> +</aside> diff --git a/private/src/styles/components/pop-in/_main.scss b/private/src/blocks/pop-in/style.scss similarity index 100% rename from private/src/styles/components/pop-in/_main.scss rename to private/src/blocks/pop-in/style.scss diff --git a/private/src/blocks/pop-in/view.js b/private/src/blocks/pop-in/view.js new file mode 100644 index 00000000..8e6cc6b4 --- /dev/null +++ b/private/src/blocks/pop-in/view.js @@ -0,0 +1,49 @@ +import './style.scss'; + +import Cookies from 'js-cookie'; + +import { delay } from 'lodash'; + +let globalData; + +const hidePopIn = (element) => { + const parent = element.parentElement; + parent.parentElement.removeChild(parent); +}; + +const showPopIn = (element) => { + element.parentElement.setAttribute('aria-hidden', 'false'); + element.parentElement.classList.remove('is-closed'); +}; + +const closePopIn = (event) => { + event.preventDefault(); + + hidePopIn(event.target); + + Cookies.set('amnesty_pop_in_dismissed', '1', { + domain: globalData.domain, + expires: parseInt(globalData.pop_in_timeout, 10) || 30, + sameSite: 'strict', + secure: true, + }); +}; + +document.addEventListener('DOMContentLoaded', () => { + const close = document.getElementById('pop-in-close'); + if (!close) { + return; + } + + globalData = window.amnesty_data; + + if (Cookies.get('amnesty_pop_in_dismissed') === '1') { + hidePopIn(close); + return; + } + + delay(showPopIn, 100, close); + + close.addEventListener('click', closePopIn); + close.addEventListener('touchend', closePopIn); +}); diff --git a/private/src/styles/blocks/postlist/_categories-editor.scss b/private/src/blocks/post-list/_categories-editor.scss similarity index 76% rename from private/src/styles/blocks/postlist/_categories-editor.scss rename to private/src/blocks/post-list/_categories-editor.scss index 2946ad4a..484a5c81 100644 --- a/private/src/styles/blocks/postlist/_categories-editor.scss +++ b/private/src/blocks/post-list/_categories-editor.scss @@ -7,7 +7,7 @@ align-items: flex-start; box-sizing: border-box !important; margin: 0 !important; - padding: 20px !important; + padding: var(--wp--preset--spacing--single) !important; list-style: none !important; a { @@ -20,3 +20,7 @@ display: none; } } + +p.linklist-container { + padding: var(--wp--preset--spacing--single); +} diff --git a/private/src/blocks/post-list/_categories.scss b/private/src/blocks/post-list/_categories.scss new file mode 100644 index 00000000..c31d855e --- /dev/null +++ b/private/src/blocks/post-list/_categories.scss @@ -0,0 +1,181 @@ +@use '../../utils/functions/flexy' as f; +@use '../../utils/mixins/icon' as i; + +.postlist-categoriesContainer { + display: flex; + align-items: center; +} + +.postlist-categoriesContainer nav { + width: 100%; +} + +.postlist-categories { + display: flex; + flex: 1 1 100%; + padding: var(--wp--preset--spacing--single) !important; + margin-bottom: 0; + margin-left: 0; + max-width: 100%; + overflow-x: auto; + list-style: none; +} + +.postlist-categories::after { + content: 'flickity'; + display: none; + + @media all and (min-width: 940px) { + content: ''; + } +} + +.postlist-categories.use-flickity::after { + content: 'flickity'; + display: none; +} + +.postlist-categories.flickity-enabled { + display: block; + padding: 0; + + .flickity-viewport { + flex: 1; + } +} + +.postlist-categories:not(.flickity-enabled) li { + flex: 1 0 auto; + list-style: none; + + @media all and (min-width: 465px) { + @include f.flexy-grid(2, f.flexy-gutter()); + } + + @media all and (min-width: 540px) { + @include f.flexy-grid(3, f.flexy-gutter()); + } + + @media all and (min-width: 940px) { + @include f.flexy-grid(4, f.flexy-gutter()); + flex-grow: 1; + max-width: none; + } +} + +.postlist-categories.flickity-enabled li { + flex: 1 0 100%; + width: 100%; + + @media all and (min-width: 540px) { + @include f.flexy-grid(2, f.flexy-gutter()); + } + + @media all and (min-width: 940px) { + @include f.flexy-grid(3, f.flexy-gutter()); + flex-grow: 1; + max-width: none; + } +} + +.postlist-categories li + li { + margin-left: f.flexy-gutter(); + + .rtl & { + margin-right: f.flexy-gutter(); + margin-left: 0; + } +} + +.postlist-categories a { + display: flex; + align-items: center; + justify-content: center; + padding: 11px 16px; + width: 100%; + height: 100%; + color: var(--wp--preset--color--black); + border: 1px solid var(--wp--preset--color--grey-light); + text-decoration: none !important; + + &:hover, + &:active, + &:focus { + border-color: var(--wp--preset--color--grey-light); + } +} + +:root .postlist-categories a { + white-space: normal; +} + +.postlist-categories .is-current a { + color: var(--wp--preset--color--white); + background-color: var(--wp--preset--color--black); + border-color: var(--wp--preset--color--black); +} + +[data-slider-next], +[data-slider-prev] { + display: none; + background-color: transparent; + border: 2px solid transparent; + transition: background-color .3s ease-in-out, opacity .3s ease-in-out; + cursor: pointer; + + &:hover { + background-color: var(--wp--preset--color--grey-lighter); + } + + &:focus, + &:active { + border: 2px solid var(--wp--preset--color--orange-base); + } +} + +[data-slider-next]:focus-within, +[data-slider-prev]:focus-within { + border: 2px solid var(--wp--preset--color--orange-base); +} + +[data-slider-next][disabled], +[data-slider-prev][disabled] { + opacity: .4; + cursor: not-allowed; +} + +.flickity-enabled [data-slider-prev] { + order: -1; +} + +.flickity-enabled [data-slider-next], +.flickity-enabled [data-slider-prev] { + display: flex; + align-items: center; + justify-content: center; + width: 44px; + height: 44px; + text-indent: -1000px; + overflow: hidden; + padding: 0; +} + +[data-slider-prev]::after { + @include i.icon_scale(234px, 240px, 16px, 16px, 2); + content: ''; + display: block; + + .rtl & { + background-position: -220px -530px; + } +} + +[data-slider-next]::after { + @include i.icon_scale(110px, 265px, 16px, 16px, 2); + content: ''; + display: block; + + .rtl & { + background-position: -468px -480px; + } +} diff --git a/private/src/blocks/post-list/_header.scss b/private/src/blocks/post-list/_header.scss new file mode 100644 index 00000000..7e56d539 --- /dev/null +++ b/private/src/blocks/post-list/_header.scss @@ -0,0 +1,67 @@ +.postlist-header { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + margin-bottom: 20px; +} + +.postlist-headerTitle { + margin-bottom: 0; + width: 100%; + float: none; + font-size: var(--wp--preset--font-size--heading-4); + line-height: 1.2; + + @media all and (min-width: 570px) { + width: auto; + float: left; + } +} + +.postlist-header label { + margin-top: 12px; + margin-bottom: 8px; + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--x-small); + font-weight: bold; + text-align: left; + letter-spacing: .3px; + + @media all and (min-width: 570px) { + margin-right: 16px; + margin-bottom: 0; + margin-top: 0; + text-align: right; + + .rtl & { + margin-right: 0; + margin-left: 16px; + } + } +} + +.postlist-sort { + display: flex; + align-items: center; + flex-wrap: wrap; + margin-right: 0; + width: 100%; + float: none; + + @media all and (min-width: 570px) { + width: auto; + float: right; + } +} + +.postlist-sort .element-select { + margin-right: 0; + margin-left: 0; + width: 100%; + + @media all and (min-width: 570px) { + margin-right: 0; + width: auto; + } +} diff --git a/private/src/styles/blocks/postlist/_pagination.scss b/private/src/blocks/post-list/_pagination.scss similarity index 79% rename from private/src/styles/blocks/postlist/_pagination.scss rename to private/src/blocks/post-list/_pagination.scss index 39354343..795f05fe 100644 --- a/private/src/styles/blocks/postlist/_pagination.scss +++ b/private/src/blocks/post-list/_pagination.scss @@ -1,3 +1,6 @@ +@use '../../utils/mixins/icon' as i; +@use '../../utils/mixins/states' as s; + .post-paginationContainer { display: flex; align-items: center; @@ -11,18 +14,18 @@ line-height: 1.25; text-transform: uppercase; - @include mq(large) { + @media all and (min-width: 1110px) { width: 75%; } - @include mq(x-large) { + @media all and (min-width: 1200px) { width: 50%; } } .author .post-paginationContainer, .search .post-paginationContainer { - @include mq(x-large) { + @media all and (min-width: 1200px) { width: 75%; } } @@ -31,7 +34,7 @@ order: 2; margin-top: 24px; - @include mq(small) { + @media all and (min-width: 760px) { order: 0; margin-top: 0; } @@ -53,19 +56,14 @@ } .post-paginationLink .icon { + @include i.icon(234px, 240px, 16px, 16px); display: inline-block; margin-right: 16px; - width: 16px; - height: 16px; - background-image: url("../images/sprite.svg"), none; - background-repeat: no-repeat; - background-size: 313px 300px; - background-position: -234px -240px; .rtl & { + @include i.icon-position(110px, 265px); margin-left: 16px; margin-right: 0; - background-position: -110px -265px; } } @@ -88,7 +86,7 @@ } .post-paginationLink a { - @include state-background(var(--wp--preset--color--grey-lighter)); + @include s.state-background(var(--wp--preset--color--grey-lighter)); } .post-paginationLink button[disabled] { @@ -106,14 +104,14 @@ } .post-paginationNext .icon { - background-position: -110px -265px; + @include i.icon-position(110px, 265px); margin-left: 16px; margin-right: 0; .rtl & { + @include i.icon-position(234px, 240px); margin-left: 0; margin-right: 16px; - background-position: -234px -240px; } } @@ -126,7 +124,7 @@ ul.page-numbers { list-style: none; color: var(--wp--preset--color--black); - @include mq(small) { + @media all and (min-width: 760px) { display: flex; flex-basis: auto; } @@ -141,7 +139,7 @@ ul.page-numbers .page-numbers { } ul.page-numbers a.page-numbers { - @include state-background(var(--wp--preset--color--grey-lighter)); + @include s.state-background(var(--wp--preset--color--grey-lighter)); } ul.page-numbers li + li { diff --git a/private/src/styles/blocks/postlist/_post-search.scss b/private/src/blocks/post-list/_post-search.scss similarity index 100% rename from private/src/styles/blocks/postlist/_post-search.scss rename to private/src/blocks/post-list/_post-search.scss diff --git a/private/src/blocks/post-list/_post.scss b/private/src/blocks/post-list/_post.scss new file mode 100644 index 00000000..89a60563 --- /dev/null +++ b/private/src/blocks/post-list/_post.scss @@ -0,0 +1,197 @@ +@use '../../utils/functions/flexy' as f; +@use '../../utils/mixins/states' as s; + +.post { + position: relative; + width: 100%; + + @media all and (min-width: 840px) { + min-height: 460px; + } +} + +@media all and (min-width: 840px) { + .tax-location .post+.post { + margin-left: f.flexy-gutter(); + } +} + +@media all and (max-width: 840px) { + .tax-location .post+.post { + margin-top: f.flexy-gutter(); + } +} + +.post-header { + max-width: 100%; +} + +.post-content { + width: 100%; + padding: 12px; +} + +.post-content .post-content { + padding: 0; +} + +.post-category { + @include s.state-background(var(--wp--preset--color--grey-darker)); + display: inline-block; + padding: 4px 8px; + color: var(--wp--preset--color--white); + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + font-size: 18px; + text-transform: uppercase; + background-color: var(--wp--preset--color--black); +} + +.post-meta { + display: block; + padding: 8px 8px 0; + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + font-size: 14px; + color: var(--wp--preset--color--grey-dark); + background-color: var(--wp--preset--color--white); +} + +.post-title { + padding: 0 8px; + margin-bottom: 0; + font-size: 28px; +} + +.post-title a { + color: var(--wp--preset--color--black); +} + +.post-title span { + background-color: var(--wp--preset--color--white); + box-shadow: -8px 0 0 0 var(--wp--preset--color--white), 8px 0 0 0 var(--wp--preset--color--white); + box-decoration-break: clone; + line-height: 1.2; +} + +.postImage--full { + position: relative; + display: flex; + background-size: cover; + background-position: center; +} + +.postImage--full .post-content { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: flex-start; +} + +.postImage--none, +.postImage--small { + display: flex; + flex-direction: column; +} + +.postImage--none .post-content, +.postImage--small .post-content { + position: relative; + background-color: var(--wp--preset--color--white); + flex: 1 1 auto; +} + +.postImage--small .post-category a { + position: absolute; + bottom: 100%; + left: 12px; + + .rtl & { + right: 12px; + left: unset; + } +} + +.postImage--none .post-title, +.postImage--small .post-title { + margin-top: 12px; + padding: 0; +} + +.postImage--none .post-meta, +.postImage--small .post-meta { + padding: 0; +} + +.postImage--none .post-meta { + margin-top: 12px; +} + +.postImage--none .post-content { + display: flex; + flex-direction: column; + align-items: flex-start; +} + +.postImage--none .post-content::after { + content: ""; + display: block; + height: 8px; + width: 75%; + margin-top: 12px; + background-color: var(--wp--preset--color--black); + + @media all and (min-width: 540px) { + margin-top: auto; + } +} + +.post-figure img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} + +.post-content a { + position: relative; + z-index: 1; +} + +.post .post-figure img { + backface-visibility: hidden; + transition: opacity .3s ease-in-out; +} + +.post-figure { + position: relative; + background-color: var(--wp--preset--color--grey-darkest); + overflow: hidden; + max-height: 200px; + height: 100%; +} + +.post:hover, +.post:focus { + .post-figure img { + opacity: .6; + } +} + +.post:focus-within { + .post-figure img { + opacity: .6; + } +} + +:lang(fa-IR) .post-category a { + display: none; +} + +.page-template-searchpage .post { + min-height: auto; +} + +.search-results .post { + min-height: auto; +} diff --git a/private/src/blocks/post-list/block.json b/private/src/blocks/post-list/block.json new file mode 100644 index 00000000..15cae8c0 --- /dev/null +++ b/private/src/blocks/post-list/block.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-list", + "title": "Post List", + "category": "amnesty-core", + "keywords": ["List", "Posts"], + "description": "Insert a list of posts by taxonomy term, manual selection, or custom content", + "icon": "admin-post", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": ["file:./style-index.css", "file:./index.css"], + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "multiple": true + }, + "attributes": { + "type": { + "type": "string", + "default": "category" + }, + "style": { + "type": "string", + "default": "list" + }, + "category": { + "type": "string", + "default": "" + }, + "categoryRelated": { + "type": "boolean", + "default": false + }, + "amount": { + "type": "number", + "default": 3 + }, + "custom": { + "type": "array", + "default": [] + }, + "selectedPosts": { + "type": "array", + "default": [] + }, + "postType": { + "type": "string", + "default": "post" + }, + "taxonomyFilters": { + "type": "array", + "default": [] + }, + "taxonomy": { + "type": "object", + "default": {} + }, + "terms": { + "type": "array", + "default": [] + }, + "authors": { + "type": "string", + "default": "" + }, + "displayAuthor": { + "type": "boolean", + "default": false + }, + "displayPostDate": { + "type": "boolean", + "default": false + } + } +} diff --git a/private/src/blocks/post-list/components/Appender.jsx b/private/src/blocks/post-list/components/Appender.jsx new file mode 100644 index 00000000..c4010edb --- /dev/null +++ b/private/src/blocks/post-list/components/Appender.jsx @@ -0,0 +1,11 @@ +import { BlockIcon } from '@wordpress/block-editor'; +import { __ } from '@wordpress/i18n'; + +const Appender = ({ onClick }) => ( + <button className="add-more-button" onClick={onClick}> + <BlockIcon icon="plus-alt" /> + <span>{/* translators: [admin] */ __('Add another item', 'amnesty')}</span> + </button> +); + +export default Appender; diff --git a/private/src/blocks/post-list/components/DisplayAuthor.jsx b/private/src/blocks/post-list/components/DisplayAuthor.jsx new file mode 100644 index 00000000..ed997dcc --- /dev/null +++ b/private/src/blocks/post-list/components/DisplayAuthor.jsx @@ -0,0 +1,173 @@ +import classnames from 'classnames'; +import { isString, keyBy } from 'lodash'; +import { useEntityRecords } from '@wordpress/core-data'; +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { addQueryArgs } from '@wordpress/url'; + +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; + +const normaliseAuthor = (author = '[]') => { + let normal = author; + + if (isString(normal)) { + try { + normal = JSON.parse(normal); + } catch (error) { + // eslint-disable-next-line no-console + console.debug(error); + // eslint-disable-next-line no-console + console.debug(normal); + } + } + + if (!Array.isArray(normal)) { + normal = [normal]; + } + + normal = normal.map((val) => { + if (isString(val)) { + try { + return JSON.parse(normal); + } catch (error) { + return false; + } + } + + return val; + }); + + return normal.filter(Boolean); +}; + +const addTermData = (results, termRecords) => + results.map((result) => ({ + ...result, + topics: result.topics.map((topic) => termRecords[topic]), + })); + +const fetchPostsByAuthor = ({ authors, records, setLoading, setResults, signal }) => { + const normalisedAuthors = normaliseAuthor(authors) + .map((v) => v.value) + .join(','); + + if (!normalisedAuthors) { + setResults([]); + return; + } + + const requestArgs = { + author: authors, + context: 'edit', + per_page: 10, + type: 'post', + _fields: [ + 'id', + 'title.raw', + 'link', + 'topic', + 'excerpt.rendered', + 'featured_media', + 'datePosted', + 'author', + 'authorName', + ], + }; + + setLoading(true); + + const path = addQueryArgs('/wp/v2/posts', requestArgs); + wp.apiFetch({ path, signal }) + .then((results) => addTermData(results, keyBy(records, 'id'))) + .then(setResults) + .finally(() => setLoading(false)); +}; + +const DisplayAuthor = ({ amount, authors, prefix, showAuthor, showPostDate, style }) => { + const { abort, signal } = new AbortController(); + const { records } = useEntityRecords('taxonomy', 'topic', { per_page: -1 }); + const [loading, setLoading] = useState(false); + const [results, setResults] = useState([]); + const mounted = useRef(); + + useEffect(() => { + if (!mounted?.current) { + mounted.current = true; + fetchPostsByAuthor({ authors, records, setLoading, setResults, signal }); + } + + return abort; + }, [abort, authors, records, signal]); + + useEffect(() => { + fetchPostsByAuthor({ authors, records, setLoading, setResults, signal }); + return abort; + }, [abort, authors, records, signal]); + + if (loading) { + return ( + <div> + <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (!authors) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('Select an author.', 'amnesty')} + </p> + </div> + ); + } + + if (!results.length) { + return ( + <div> + <p className="linklist-container"> + {/* translators: [admin] */ __('No Items found', 'amnesty')} + </p> + </div> + ); + } + + if (style === 'list') { + return ( + <div> + <ul className="linkList linklist-container"> + {results.slice(0, amount).map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (style !== 'grid') { + return null; + } + + const classes = classnames('grid', { + [`grid-${amount}`]: amount < 8, + 'grid-many': amount >= 8, + }); + + return ( + <div> + <div className={classes}> + {results.slice(0, amount).map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + </div> + ); +}; + +export default DisplayAuthor; diff --git a/private/src/blocks/post-list/components/DisplayCategories.jsx b/private/src/blocks/post-list/components/DisplayCategories.jsx new file mode 100644 index 00000000..e90f46b6 --- /dev/null +++ b/private/src/blocks/post-list/components/DisplayCategories.jsx @@ -0,0 +1,197 @@ +import { get, isString } from 'lodash'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import PetitionItem from './display/PetitionItem.jsx'; + +// Strips HTML from a string +const strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; +}; + +// Alters the API response to the desired structure +const alterResults = (response) => + response.map((resp) => { + let tags = []; + // eslint-disable-next-line no-underscore-dangle + if (resp._embedded['wp:term']) { + // eslint-disable-next-line no-underscore-dangle + tags = resp._embedded['wp:term'] + .reduce((prev, curr) => [...prev, ...curr], []) + .map((tag) => ({ + title: tag.name, + link: tag.link, + })); + } + + let featuredImage = false; + if (resp.featured_media || resp.featured_media > 0) { + featuredImage = + get( + resp, + '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', + ) || get(resp, '_embedded["wp:featuredmedia"][0].source_url', false); + } + + let excerpt = strip(resp.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + date: resp.datePosted, + authorName: resp.authorName, + }; + }); + +const DisplayCategories = ({ + category, + overrideTypes, + amount, + style, + prefix, + showAuthor, + showPostDate, +}) => { + // State to manage results and loading status + const [results, setResults] = useState([]); + const [loading, setLoading] = useState(false); + + // Normalizes the category input + const normaliseCategory = (cat = '[]') => { + let normal = cat; + + if (isString(normal)) { + try { + normal = JSON.parse(normal); + } catch (error) { + // eslint-disable-next-line no-console + console.debug(error); + // eslint-disable-next-line no-console + console.debug(normal); + } + } + + if (!Array.isArray(normal)) { + normal = [normal]; + } + + normal = normal.map((val) => { + if (isString(val)) { + try { + return JSON.parse(normal); + } catch (error) { + return false; + } + } + + return val; + }); + + return normal.filter(Boolean); + }; + + const fetchPostsByCategory = () => { + let value = normaliseCategory(category); + + if (!value.length) { + setResults([]); + return; + } + + setLoading(true); + + value = value.map((v) => v.value).join(','); + let restPath = `/wp/v2/posts?category=${value}&per_page=${amount}&_embed`; + + if (overrideTypes) { + const overrideBase = `${overrideTypes[Object.keys(overrideTypes)[0]].rest_base}`; + restPath = `/wp/v2/${overrideBase}?category=${value}&per_page=${amount}&_embed`; + } + + wp.apiRequest({ path: restPath }).then((res) => { + setResults(alterResults(res)); + setLoading(false); + }); + }; + + // Fetch posts by category when component mounts or category changes + useEffect(fetchPostsByCategory, [amount, category, overrideTypes]); + + // Normalized category for rendering + const normalizedCategory = normaliseCategory(category); + const hasCategory = normalizedCategory.length > 0; + const hasResults = results.length > 0; + + // Rendering loading, no category, and no results states + if (loading) { + return ( + <div> + <p>{__('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (!hasCategory) { + return ( + <div> + <p className="linklist-container">{__('Select a category.', 'amnesty')}</p> + </div> + ); + } + + if (!hasResults) { + return ( + <div> + <p className="linklist-container">{__('No Items found', 'amnesty')}</p> + </div> + ); + } + + // Render based on the selected style + if (style === 'list') { + return ( + <div> + <ul className="linkList linklist-container"> + {results.slice(0, amount).map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (style === 'grid' || style === 'petition') { + return ( + <div + className={`grid ${[1, 2, 3, 5, 6, 7].includes(amount) ? `grid-${amount}` : 'grid-many'}`} + > + {results + .slice(0, amount) + .map((result) => + style === 'grid' ? ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ) : ( + <PetitionItem key={`${prefix}-${result.id}`} {...result} /> + ), + )} + </div> + ); + } + + return <div></div>; +}; + +export default DisplayCategories; diff --git a/private/src/blocks/post-list/components/DisplayCustom.jsx b/private/src/blocks/post-list/components/DisplayCustom.jsx new file mode 100644 index 00000000..de1bdaa3 --- /dev/null +++ b/private/src/blocks/post-list/components/DisplayCustom.jsx @@ -0,0 +1,123 @@ +/* eslint-disable camelcase */ +import LinkList from './editable/LinkList.jsx'; +import GridItem from './editable/GridItem.jsx'; +import Appender from './Appender.jsx'; + +const DisplayCustom = ({ custom = [], setAttributes, style, prefix, showAuthor, showPostDate }) => { + // Default object structure for each custom item + const defaultObject = { + excerpt: '', + featured_image_id: '', + featured_image: '', + tag: '', + tagLink: '', + title: '', + titleLink: '', + date: null, + authorName: '', + }; + + // Function to update media attributes for a specific item + const createUpdateMediaAttribute = + (index) => + ({ featured_image_id, featured_image }) => { + if (custom[index]) { + // Update existing item + setAttributes({ + custom: custom.map((item, i) => + index === i ? { ...item, featured_image, featured_image_id } : item, + ), + }); + } else { + // Add new item with default values + setAttributes({ + custom: [...custom, { ...defaultObject, featured_image, featured_image_id }], + }); + } + }; + + // Function to create an updater for a specific key in a specific item + const createUpdateAttribute = (index) => (key) => (value) => { + if (custom[index]) { + // Update existing item + setAttributes({ + custom: custom.map((item, i) => (index === i ? { ...item, [key]: value } : item)), + }); + } else { + // Add new item with default values + setAttributes({ + custom: [...custom, { ...defaultObject, [key]: value }], + }); + } + }; + + // Function to add a new item + const addItem = () => { + setAttributes({ + custom: [...custom, { ...defaultObject }], + }); + }; + + // Function to remove an item at a specific index + const createRemoveItem = (index) => () => { + setAttributes({ + custom: custom.filter((_, i) => i !== index), + }); + }; + + // If style is 'petition', return null + if (style === 'petition') { + return null; + } + + // Ensure there's at least one item in custom + const itemsToRender = custom.length ? custom : [{ ...defaultObject }]; + + // Conditionally render the Appender if there are less than 8 items + const appender = itemsToRender.length < 8 ? <Appender onClick={addItem} /> : null; + + // Render based on the selected style + if (style !== 'grid') { + return ( + <div> + <ul className="linkList"> + {itemsToRender.map((item, index) => ( + <LinkList + key={`${prefix}-${index}`} + {...item} + showAuthor={showAuthor} + showPostDate={showPostDate} + createUpdate={createUpdateAttribute(index)} + createRemove={createRemoveItem(index)} + /> + ))} + </ul> + {appender} + </div> + ); + } + + // For grid style, check the number of items and render accordingly + const gridClass = [1, 2, 3, 5, 6, 7].includes(itemsToRender.length) + ? `grid-${itemsToRender.length}` + : 'grid-many'; + + return ( + <div> + <div className={`grid ${gridClass}`}> + {itemsToRender.map((item, index) => ( + <GridItem + key={`${prefix}-${index}`} + {...item} + createUpdate={createUpdateAttribute(index)} + createRemove={createRemoveItem(index)} + updateMedia={createUpdateMediaAttribute(index)} + /> + ))} + </div> + {appender} + </div> + ); +}; + +export default DisplayCustom; diff --git a/private/src/blocks/post-list/components/DisplayFeed.jsx b/private/src/blocks/post-list/components/DisplayFeed.jsx new file mode 100644 index 00000000..58b5affd --- /dev/null +++ b/private/src/blocks/post-list/components/DisplayFeed.jsx @@ -0,0 +1,150 @@ +import { get } from 'lodash'; +import { useState, useEffect } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import PetitionItem from './display/PetitionItem.jsx'; + +// Strip HTML from a string +const strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; +}; + +// Alter results to extract relevant fields +const alterResults = (response) => + response.map((resp) => { + const tags = []; + const sources = [ + '_links["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', + '_links["wp:featuredmedia"][0].source_url', + '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', + '_embedded["wp:featuredmedia"][0].source_url', + ]; + + let featuredImage = false; + + sources.forEach((source) => { + featuredImage = featuredImage || get(resp, source, false); + }); + + let excerpt = strip(resp.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : excerpt; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + date: resp.datePosted, + authorName: resp.authorName, + }; + }); + +/** + * DisplayFeed Functional Component + * This component fetches and displays posts based on specified post types. + */ +const DisplayFeed = ({ overrideTypes, style, prefix, showAuthor, showPostDate, amount }) => { + // State variables for managing results and loading status + const [results, setResults] = useState([]); + const [loading, setLoading] = useState(false); + + // Fetch posts based on post types defined in props + const fetchPostsByPostType = () => { + const postTypes = Object.keys(overrideTypes); + + // Handle case where no post types are available + if (!postTypes.length) { + setResults([]); + return; + } + + setLoading(true); // Set loading state + + const postString = postTypes.join(', '); + + wp.apiRequest({ + path: `/wp/v2/${postString}?_embed`, + }).then((res) => { + setResults(alterResults(res)); // Alter results and update state + setLoading(false); // Reset loading state + }); + }; + + // Fetch posts when component mounts + useEffect(fetchPostsByPostType, [overrideTypes]); + + // Render the component based on loading state and results + if (loading) { + return ( + <div> + <p>{__('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (results.length === 0) { + return ( + <div> + <p className="linklist-container">{__('No Items found', 'amnesty')}</p> + </div> + ); + } + + const isList = style === 'list'; + const isGrid = style === 'grid'; + const isPetition = style === 'petition'; + + // Render based on style type + if (isList) { + return ( + <div> + <ul className="linkList linklist-container"> + {results + .filter((_, i) => i < amount) + .map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (isGrid) { + const className = `grid ${[1, 2, 3, 5, 6, 7].includes(amount) ? `grid-${amount}` : 'grid-many'}`; + return ( + <div className={className}> + {results + .filter((_, i) => i < amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + ); + } + + if (isPetition) { + return ( + <div className="grid grid-many petition-grid"> + {results + .filter((_, i) => i < amount) + .map((result) => ( + <PetitionItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + ); + } + + return <div></div>; +}; + +export default DisplayFeed; diff --git a/private/src/blocks/post-list/components/DisplaySelect.jsx b/private/src/blocks/post-list/components/DisplaySelect.jsx new file mode 100644 index 00000000..8c82e58d --- /dev/null +++ b/private/src/blocks/post-list/components/DisplaySelect.jsx @@ -0,0 +1,242 @@ +import { getEntityRecords, getMedia, useEntityRecords } from '@wordpress/core-data'; +import { useEffect, useState } from '@wordpress/element'; + +import SelectPreview from './SelectPreview.jsx'; +import PostSelect from './post-selector/PostSelector.jsx'; + +/** + * Returns a unique array of objects based on a desired key. + * @param {array} arr - array of objects. + * @param {string|int} key - key to filter objects by + */ +export const uniqueBy = (arr, key) => { + const keys = []; + return arr.filter((item) => { + if (keys.indexOf(item[key]) !== -1) { + return false; + } + keys.push(item[key]); + return true; + }); +}; + +/** + * Returns a unique array of objects based on the id property. + * @param {array} arr - array of objects to filter. + * @returns {*} + */ +export const uniqueById = (arr) => uniqueBy(arr, 'id'); + +/** + * Decode HTML entities (excluding HTML tags) + * + * @param {string} string the string to decode + * + * @return {string} + */ +function decodeEntities(string) { + const txt = document.createElement('textarea'); + txt.innerHTML = string; + return txt.value; +} + +// strip HTML from a string +function strip(html) { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; +} + +/** + * PostSelector Component + */ +const DisplaySelect = ({ + preview, + selectedPosts, + defaultPostType, + setAttributes, + style, + prefix, + showAuthor, + showPostDate, +}) => { + const { records: allPostTypes, isResolving: allPostTypesResolving } = useEntityRecords( + 'root', + 'postType', + { per_page: -1 }, + ); + + const [postTypes, setPostTypes] = useState([]); + useEffect(() => { + if (allPostTypesResolving) { + setPostTypes([]); + return; + } + + setPostTypes(allPostTypes?.filter((type) => !!type.viewable)); + }, [allPostTypes, allPostTypesResolving]); + + const { records: taxonomies, isResolving: taxonomiesResolving } = useEntityRecords( + 'root', + 'taxonomy', + { per_page: -1 }, + ); + + const [taxonomyFilter, setTaxonomyFilter] = useState(null); + + const { records: terms, isResolving: termsResolving } = useEntityRecords( + 'taxonomy', + taxonomyFilter, + { per_page: -1 }, + ); + + const [termFilter, setTermFilter] = useState(null); + const [pageNumber, setPageNumber] = useState(1); + const [postType, setPostType] = useState(defaultPostType); + const [searchTerm, setSearchTerm] = useState(''); + + const { records: availablePosts, isResolving: availablePostsResolving } = useEntityRecords( + 'postType', + postType, + { + search: searchTerm, + per_page: 10, + page: pageNumber, + [taxonomyFilter]: termFilter, + }, + ); + + const { records: currentPosts, isResolving: postsResolving } = useEntityRecords( + 'postType', + postType, + { + include: selectedPosts, + }, + ); + + const isLoading = + allPostTypesResolving || taxonomiesResolving || termsResolving || postsResolving; + + const updateSelectedPosts = (posts) => { + const uniq = [...new Set(posts)]; + setAttributes({ selectedPosts: uniq }); + }; + + const addPost = (postId) => { + updateSelectedPosts([...selectedPosts, postId]); + }; + + const removePost = (postId) => { + updateSelectedPosts(selectedPosts.filter((id) => id !== postId)); + }; + + const reorderPosts = (posts) => { + const items = Array.from(selectedPosts); + const [reorderedItem] = items.splice(posts.source.index, 1); + items.splice(posts.destination.index, 0, reorderedItem); + + updateSelectedPosts(items); + }; + + /** + * Gets the selected posts by id from the `posts` state object and + * sorts them by their position in the selected array. + * + * @returns Array of objects. + */ + const getSelectedPosts = () => { + if (postsResolving || !currentPosts) { + return []; + } + + const items = currentPosts + .filter(({ id }) => selectedPosts.indexOf(id) !== -1) + .sort((a, b) => { + const aIndex = selectedPosts.indexOf(a.id); + const bIndex = selectedPosts.indexOf(b.id); + return Math.sign(aIndex - bIndex); + }); + + return items; + }; + + const getPreviewPosts = async () => { + const selectedPostsData = getSelectedPosts(); + if (!selectedPostsData) return []; + + return selectedPostsData.map(async (item) => { + const topics = await getEntityRecords('taxonomy', taxonomyFilter, item[taxonomyFilter]); + const tags = topics.map((topic) => ({ + title: topic.name, + link: topic.link, + })); + + const image = await getMedia(item.featured_media); + const imageUrl = image?.media_details?.sizes?.thumbnail?.source_url; + + let excerpt = strip(item.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : excerpt; + + return { + id: item.id, + title: decodeEntities(item.title.rendered), + link: item.link, + tag: tags.shift(), + excerpt, + featured_image: imageUrl, + authorName: item.authorName, + date: item.datePosted, + }; + }); + }; + + if (preview) { + return ( + <div> + <SelectPreview + posts={getPreviewPosts()} + loading={isLoading} + style={style} + prefix={prefix} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + </div> + ); + } + + const state = { + filter: searchTerm, + filterLoading: availablePostsResolving, + filterPosts: availablePosts, + filtering: !!searchTerm || !!termFilter, + initialLoading: isLoading, + loading: isLoading, + pages: pageNumber, + pagesTotal: null, + paging: pageNumber > 1, + posts: availablePosts || [], + taxonomies, + terms, + type: postType, + types: postTypes, + }; + + return ( + <div> + <PostSelect + state={state} + handleInputFilterChange={setSearchTerm} + handlePostTypeChange={setPostType} + getSelectedPosts={getSelectedPosts} + removePost={removePost} + addPost={addPost} + doPagination={() => setPageNumber(pageNumber + 1)} + handleTaxonomyChange={setTaxonomyFilter} + handleTermChange={setTermFilter} + reorderPosts={reorderPosts} + /> + </div> + ); +}; + +export default DisplaySelect; diff --git a/private/src/blocks/post-list/components/DisplayTaxonomies.jsx b/private/src/blocks/post-list/components/DisplayTaxonomies.jsx new file mode 100644 index 00000000..8056a18c --- /dev/null +++ b/private/src/blocks/post-list/components/DisplayTaxonomies.jsx @@ -0,0 +1,154 @@ +import { useState, useEffect } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import * as api from './post-selector/api'; + +// Strip HTML from a string +const strip = (html) => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; +}; + +// Alter results to extract relevant fields +const alterResults = (response) => + response.map((resp) => { + // eslint-disable-next-line no-underscore-dangle + const tags = resp._embedded['wp:term'] + .reduce((prev, curr) => [...prev, ...curr], []) + .map((tag) => ({ title: tag.name, link: tag.link })); + + const featuredImage = resp.featured_media + ? resp._embedded['wp:featuredmedia'][0].source_url || false // eslint-disable-line no-underscore-dangle + : false; + + let excerpt = strip(resp.excerpt.rendered); + excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : excerpt; + + return { + id: resp.id, + title: resp.title.rendered, + link: resp.link, + tag: tags.shift(), + excerpt, + featured_image: featuredImage, + authorName: resp.authorName, + date: resp.datePosted, + }; + }); + +/** + * DisplayTaxonomies Functional Component + * This component fetches and displays posts based on taxonomy and terms. + */ +const DisplayTaxonomies = ({ + taxonomy, + terms, + style, + prefix, + showAuthor, + showPostDate, + amount, +}) => { + // State variables for managing results and loading status + const [results, setResults] = useState([]); + const [loading, setLoading] = useState(false); + + // Fetch posts based on taxonomy + const fetchPostsByTaxonomy = () => { + const defaultArgs = { per_page: 10, type: 'post' }; + const requestArguments = { ...defaultArgs }; + + if (!taxonomy) { + return; + } + + api + .getPostsFromTerms(requestArguments, taxonomy, terms) + .then((data = []) => { + const posts = data.map((p) => ({ + ...p, + featured_image: p.featured_media + ? p._embedded['wp:featuredmedia'][0].source_url || false // eslint-disable-line no-underscore-dangle + : false, + })); + setResults(alterResults(posts)); + setLoading(false); + }) + .catch(() => { + setResults([]); + setLoading(false); + }); + + setLoading(true); + }; + + // Fetch posts when component mounts or when taxonomy/terms change + useEffect(fetchPostsByTaxonomy, [taxonomy, terms, fetchPostsByTaxonomy]); // Dependencies on taxonomy and terms + + // Render the component based on loading state and results + if (loading) { + return ( + <div> + <p>{__('Loading…', 'amnesty')}</p> + </div> + ); + } + + if (!taxonomy) { + return ( + <div> + <p className="linklist-container">{__('Select a taxonomy.', 'amnesty')}</p> + </div> + ); + } + + if (results.length === 0) { + return ( + <div> + <p className="linklist-container">{__('No Items found', 'amnesty')}</p> + </div> + ); + } + + const isList = style === 'list'; + const isGrid = style === 'grid'; + + if (isList) { + return ( + <div> + <ul className="linkList linklist-container"> + {results + .filter((item, i) => i < amount) + .map((result) => ( + <LinkList + key={`${prefix}-${result.id}`} + {...result} + showAuthor={showAuthor} + showPostDate={showPostDate} + /> + ))} + </ul> + </div> + ); + } + + if (isGrid) { + return ( + <div + className={`grid ${[1, 2, 3, 5, 6, 7].includes(amount) ? `grid-${amount}` : 'grid-many'}`} + > + {results + .filter((item, i) => i < amount) + .map((result) => ( + <GridItem key={`${prefix}-${result.id}`} {...result} /> + ))} + </div> + ); + } + + return <div></div>; +}; + +export default DisplayTaxonomies; diff --git a/private/src/blocks/post-list/components/SelectPreview.jsx b/private/src/blocks/post-list/components/SelectPreview.jsx new file mode 100644 index 00000000..fba8a0f9 --- /dev/null +++ b/private/src/blocks/post-list/components/SelectPreview.jsx @@ -0,0 +1,58 @@ +import { __ } from '@wordpress/i18n'; + +import LinkList from './display/LinkList.jsx'; +import GridItem from './display/GridItem.jsx'; +import PetitionItem from './display/PetitionItem.jsx'; + +const SelectPreview = ({ loading, posts = [], ...props }) => { + if (loading) { + /* translators: [admin] */ + return <p>{__('Loading…', 'amnesty')}</p>; + } + + if (!posts.length > 0) { + /* translators: [admin] */ + return <p>{__('No Posts.', 'amnesty')}</p>; + } + + if (props.style === 'grid') { + return posts.length % 4 === 0 ? ( + <div className="grid grid-many"> + {posts.map((result) => ( + <GridItem key={`${props.prefix}-${result.id}`} {...result} /> + ))} + </div> + ) : ( + <div className={`grid grid-${posts.length}`}> + {posts.map((result) => ( + <GridItem key={`${props.prefix}-${result.id}`} {...result} /> + ))} + </div> + ); + } + + if (props.style === 'petition') { + return ( + <div className="grid grid-many petition-grid"> + {posts.map((result) => ( + <PetitionItem key={`${props.prefix}-${result.id}`} {...result} /> + ))} + </div> + ); + } + + return ( + <ul className="linkList"> + {posts.map((result) => ( + <LinkList + key={`${props.prefix}-${result.id}`} + {...result} + showAuthor={props.showAuthor} + showPostDate={props.showPostDate} + /> + ))} + </ul> + ); +}; + +export default SelectPreview; diff --git a/private/src/blocks/post-list/components/display/GridItem.jsx b/private/src/blocks/post-list/components/display/GridItem.jsx new file mode 100644 index 00000000..78878885 --- /dev/null +++ b/private/src/blocks/post-list/components/display/GridItem.jsx @@ -0,0 +1,16 @@ +const GridItem = (props) => ( + <article className="grid-item" style={{ backgroundImage: `url(${props.featured_image})` }}> + <div className="grid-itemContent"> + {props.tag && ( + <span className="grid-itemMeta"> + <a>{props.tag.title}</a> + </span> + )} + <h3 className="grid-itemTitle"> + <a>{props.title}</a> + </h3> + </div> + </article> +); + +export default GridItem; diff --git a/private/src/blocks/post-list/components/display/LinkList.jsx b/private/src/blocks/post-list/components/display/LinkList.jsx new file mode 100644 index 00000000..f71171a2 --- /dev/null +++ b/private/src/blocks/post-list/components/display/LinkList.jsx @@ -0,0 +1,30 @@ +const LinkItem = (props) => ( + <li> + <article className="linkList-item"> + {props.tag && ( + <span className="linkList-itemMeta"> + <a href="#">{props.tag.title}</a> + </span> + )} + <h3 className="linkList-itemTitle"> + <a>{props.title}</a> + </h3> + <div className="postInfo-container"> + {props.showPostDate && ( + <p className="linkList-itemDate"> + <span className="dateTerm">Date: </span> + <span className="dateDescription">{props.date}</span> + </p> + )} + {props.showAuthor && ( + <p className="linkList-itemAuthor"> + <span className="authorTerm">Author: </span> + <span className="authorDescription">{props.authorName}</span> + </p> + )} + </div> + </article> + </li> +); + +export default LinkItem; diff --git a/private/src/blocks/post-list/components/display/PetitionItem.jsx b/private/src/blocks/post-list/components/display/PetitionItem.jsx new file mode 100644 index 00000000..0cde4b03 --- /dev/null +++ b/private/src/blocks/post-list/components/display/PetitionItem.jsx @@ -0,0 +1,27 @@ +import { __ } from '@wordpress/i18n'; + +const PetitionItem = (props) => ( + <article className="grid-item petition-item"> + <figure> + {props.featured_image && <img className="petition-itemImage" src={props.featured_image} />} + {props.tag && ( + <span className="petition-itemImageCaption"> + <a>{props.tag.title}</a> + </span> + )} + </figure> + <div className="petition-item-content"> + {props.excerpt && ( + <div className="petition-itemExcerpt" dangerouslySetInnerHTML={{ __html: props.excerpt }} /> + )} + <h3 className="petition-itemTitle"> + <a>{props.title}</a> + </h3> + <button className="btn petition-itemCta"> + {/* translators: [admin] */ __('Act Now', 'amnesty')} + </button> + </div> + </article> +); + +export default PetitionItem; diff --git a/private/src/blocks/post-list/components/editable/GridItem.jsx b/private/src/blocks/post-list/components/editable/GridItem.jsx new file mode 100644 index 00000000..8ecb3b87 --- /dev/null +++ b/private/src/blocks/post-list/components/editable/GridItem.jsx @@ -0,0 +1,64 @@ +import { get } from 'lodash'; +import { RichText, URLInputButton, MediaUpload } from '@wordpress/block-editor'; +import { IconButton } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +const GridItem = (props) => ( + <article className="grid-item" style={{ backgroundImage: `url(${props.featured_image})` }}> + <div className="grid-itemContent"> + <span className="grid-itemMeta"> + <RichText + tagName="span" + onChange={props.createUpdate('tagText')} + value={props.tagText} + /* translators: [admin] */ + placeholder={__('(Insert Tag)', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton url={props.tagLink} onChange={props.createUpdate('tagLink')} /> + </span> + <h3 className="grid-itemTitle"> + <RichText + tagName="span" + onChange={props.createUpdate('title')} + value={props.title} + /* translators: [admin] */ + placeholder={__('(Insert Title)', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton url={props.titleLink} onChange={props.createUpdate('titleLink')} /> + </h3> + </div> + <div className="linkList-options"> + {props.featured_image_id && props.featured_image_id !== -1 && ( + <IconButton + icon="no-alt" + onClick={() => + props.updateMedia({ + featured_image_id: '', + featured_image: '', + }) + } + > + {/* translators: [admin] */ __('Remove Image', 'amnesty')} + </IconButton> + )} + <MediaUpload + onSelect={({ id, sizes, url }) => + props.updateMedia({ + featured_image_id: id, + featured_image: get(sizes, "['post-half@2x'].url", url), + }) + } + value={props.featured_image_id} + allowedTypes={['image']} + render={({ open }) => <IconButton icon="format-image" onClick={open} />} + /> + <IconButton onClick={props.createRemove} icon="trash" /> + </div> + </article> +); + +export default GridItem; diff --git a/private/src/blocks/post-list/components/editable/LinkList.jsx b/private/src/blocks/post-list/components/editable/LinkList.jsx new file mode 100644 index 00000000..caaab96a --- /dev/null +++ b/private/src/blocks/post-list/components/editable/LinkList.jsx @@ -0,0 +1,107 @@ +import { RichText, URLInputButton } from '@wordpress/block-editor'; +import { Button, DatePicker } from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const LinkItem = (props) => { + const [datePickerIsVisible, showDatePicker] = useState(false); + const setDate = props.createUpdate('date'); + + const chooseDate = (value) => { + setDate(value); + showDatePicker(false); + }; + + return ( + <li> + <article className="linkList-item"> + <span className="linkList-itemMeta"> + <RichText + tagName="a" + onChange={props.createUpdate('tagText')} + value={props.tagText} + /* translators: [admin] */ + placeholder={__('Tag Name', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton + url={props.tagLink} + onChange={props.createUpdate('tagLink')} + isPressed={false} + /> + </span> + <h3 className="linkList-itemTitle"> + <RichText + tagName="a" + onChange={props.createUpdate('title')} + value={props.title} + /* translators: [admin] */ + placeholder={__('Insert Title', 'amnesty')} + allowedFormats={[]} + format="string" + /> + <URLInputButton + url={props.titleLink} + onChange={props.createUpdate('titleLink')} + isPressed={false} + /> + </h3> + + <div className="postInfo-container"> + {props.showPostDate && ( + <div className="linkList-itemDate"> + {/* translators: [admin/front] */} + <span className="dateTerm">{__('Date:', 'amnesty')}</span> + {props.date && ( + <span className="dateDescription">{new Date(props.date).toLocaleDateString()}</span> + )} + <Button + icon="calendar-alt" + isPressed={false} + onClick={() => showDatePicker(!datePickerIsVisible)} + /> + <br /> + {/* translators: [admin] */} + <small className="linkList-itemDateData"> + <em>{__('Date may render differently on the site frontend', 'amnesty')}</em> + </small> + {datePickerIsVisible && ( + <div className="linkList-datePicker"> + <DatePicker + className="dateDescription" + currentDate={props.date} + onChange={chooseDate} + /> + </div> + )} + </div> + )} + {props.showAuthor && ( + <p className="linkList-itemAuthor"> + {/* translators: [admin/front] */} + <span className="authorTerm">{__('Author:', 'amnesty')}</span> + <RichText + tagName="span" + className="authorDescription" + value={props.authorName} + onChange={props.createUpdate('authorName')} + multiline={false} + allowedFormats={[]} + format="string" + /* translators: [admin] */ + placeholder={__('Author Name', 'amnesty')} + /> + </p> + )} + </div> + + <div className="linkList-options"> + <Button onClick={props.createRemove} icon="trash" /> + </div> + </article> + </li> + ); +}; + +export default LinkItem; diff --git a/private/src/blocks/post-list/components/post-selector/Post.jsx b/private/src/blocks/post-list/components/post-selector/Post.jsx new file mode 100755 index 00000000..107180f0 --- /dev/null +++ b/private/src/blocks/post-list/components/post-selector/Post.jsx @@ -0,0 +1,48 @@ +import { Draggable } from '@hello-pangea/dnd'; +/** + * Post Component. + * + * @param {string} postTitle - Current post title. + * @param {function} clickHandler - this is the handling function for the add/remove function + * @param {Integer} postId - Current post ID + * @param {string|boolean} featured_image - Posts featured image + * @param icon + * + * @returns {*} Post HTML. + */ +export const Post = ({ + title: { rendered: postTitle } = {}, + clickHandler, + id: postId, + featured_image: featuredImage = false, + icon, + index, +}) => { + const style = {}; + if (featuredImage) { + style.backgroundImage = `url("${featuredImage}")`; + } + + const postIdString = postId.toString(); + + return ( + <Draggable key={postId} draggableId={postIdString} index={index}> + {(provided) => ( + <article + ref={provided.innerRef} + {...provided.draggableProps} + {...provided.dragHandleProps} + className="post" + > + <figure className="post-figure" style={style}></figure> + <div className="post-body"> + <h3 className="post-title">{postTitle}</h3> + </div> + {icon && <button onClick={() => clickHandler(postId)}>{icon}</button>} + </article> + )} + </Draggable> + ); +}; + +export default Post; diff --git a/private/src/blocks/post-list/components/post-selector/PostList.jsx b/private/src/blocks/post-list/components/post-selector/PostList.jsx new file mode 100755 index 00000000..006ff5dc --- /dev/null +++ b/private/src/blocks/post-list/components/post-selector/PostList.jsx @@ -0,0 +1,71 @@ +import { DragDropContext, Droppable } from '@hello-pangea/dnd'; +import { __ } from '@wordpress/i18n'; + +import { Post } from './Post.jsx'; + +/** + * PostList Component + * + * @param object props - Component props. + * + * @returns {*} + */ +export const PostList = (props) => { + const { filtered = false, loading = false, posts = [], action = () => {}, icon = null } = props; + + if (loading) { + /* translators: [admin] */ + return <p>{__('Loading Posts…', 'amnesty')}</p>; + } + + if (filtered && posts.length < 1) { + return ( + <div className="post-list"> + <p> + { + /* translators: [admin] */ __( + 'Your query yielded no results, please try again.', + 'amnesty', + ) + } + </p> + </div> + ); + } + + if (!posts || posts.length < 1) { + return <p>{/* translators: [admin] */ __('No Posts.', 'amnesty')}</p>; + } + + function handleOnDragEnd(result) { + props.reorderPosts(result); + } + + return ( + <div className="post-list"> + <DragDropContext onDragEnd={handleOnDragEnd}> + <Droppable droppableId="posts"> + {(provided) => ( + <div {...provided.droppableProps} ref={provided.innerRef}> + {posts.map((post, index) => ( + <Post key={post.id} {...post} index={index} clickHandler={action} icon={icon} /> + ))} + {provided.placeholder} + </div> + )} + </Droppable> + </DragDropContext> + {props.canPaginate ? ( + <button onClick={props.doPagination} disabled={props.paging}> + {props.paging + ? /* translators: [admin] */ + __('Loading…', 'amnesty') + : /* translators: [admin] */ + __('Load More', 'amnesty')} + </button> + ) : null} + </div> + ); +}; + +export default PostList; diff --git a/private/src/blocks/post-list/components/post-selector/PostSelector.jsx b/private/src/blocks/post-list/components/post-selector/PostSelector.jsx new file mode 100644 index 00000000..17b4bc0b --- /dev/null +++ b/private/src/blocks/post-list/components/post-selector/PostSelector.jsx @@ -0,0 +1,179 @@ +import { BlockIcon } from '@wordpress/block-editor'; +import { __ } from '@wordpress/i18n'; + +import { PostList } from './PostList.jsx'; +import { randId } from '../../../../utils'; + +function SearchBox({ value, onChange }) { + return ( + <div className="searchbox"> + <label htmlFor="searchinput"> + <BlockIcon icon="search" /> + <input + id="searchinput" + type="search" + /* translators: [admin] */ + placeholder={__('Please enter your search query…', 'amnesty')} + value={value || ''} + onChange={onChange} + /> + </label> + </div> + ); +} + +function PostTypeOptions({ options, selected, onChange }) { + const id = `${randId()}-post-selector-post-type`; + + const label = ( + <label htmlFor={id}>{/* translators: [admin] */ __('Post Type:', 'amnesty')}&nbsp;</label> + ); + console.log({ selected }); + if (!options?.length) { + return ( + <> + <select id={id} name={id} onChange={onChange}> + {/* translators: [admin] */} + <option value="">{__('Loading…', 'amnesty')}</option> + </select> + </> + ); + } + + return ( + <> + {label} + <select id={id} name={id} onChange={onChange} value={selected}> + {Object.keys(options).map((key) => ( + <option key={key} value={key}> + {options[key].name} + </option> + ))} + </select> + </> + ); +} + +function TaxonomyOptions({ options, onChange }) { + const id = `${randId()}-post-selector-taxonomy`; + + const label = ( + <label htmlFor={id}>{/* translators: [admin] */ __('Taxonomy:', 'amnesty')}&nbsp;</label> + ); + + if (!options?.length) { + return ( + <> + {label} + <select id={id} name={id} onChange={onChange}> + {/* translators: [admin] */} + <option value="">{__('Loading…', 'amnesty')}</option> + </select> + </> + ); + } + + return ( + <> + {label} + <select id={id} name={id} onChange={onChange}> + <option value="">{/* translators: [admin] */ __('Select Taxonomy', 'amnesty')}</option> + {Object.keys(options).map((key) => ( + <option key={key} value={options[key].rest_base}> + {options[key].name} + </option> + ))} + </select> + </> + ); +} + +function TermOptions({ options, onChange }) { + const id = `${randId()}-post-selector-terms`; + + const label = ( + <label htmlFor={id}>{/* translators: [admin] */ __('Terms:', 'amnesty')}&nbsp;</label> + ); + + if (!options?.length) { + return ( + <> + {label} + <select id={id} name={id} onChange={onChange}> + {/* translators: [admin] */} + <option value="">{__('No taxonomy selected', 'amnesty')}</option> + </select> + </> + ); + } + + return ( + <> + <select id={id} name={id} onChange={onChange}> + <option value="">{/* translators: [admin] */ __('Select Term', 'amnesty')}</option> + {Object.keys(options).map((key) => ( + <option key={key} value={options[key].id}> + {options[key].name} + </option> + ))} + </select> + </> + ); +} + +const PostSelector = (props) => { + const isFiltered = props.state.filtering; + + const postList = + isFiltered && !props.state.filterLoading + ? props.state.filterPosts + : props.state.posts.filter((post) => post.type === props.state.type); + + const canPaginate = (props.state.pages || 1) < props.state.pagesTotal; + + const addIcon = props.getSelectedPosts().length >= 100 ? null : <BlockIcon icon="plus" />; + const removeIcon = <BlockIcon icon="minus" />; + + return ( + <div className="wp-block-bigbite-postlist"> + <div className="post-selector"> + <div className="post-selectorHeader"> + <SearchBox value={props.state.filter} onChange={props.handleInputFilterChange} /> + <div className="filter"> + <PostTypeOptions + selected={props.state.type} + options={props.state.types} + onChange={props.handlePostTypeChange} + /> + <TaxonomyOptions + options={props.state.taxonomies} + onChange={props.handleTaxonomyChange} + /> + <TermOptions options={props.state.terms} onChange={props.handleTermChange} /> + </div> + </div> + <div className="post-selectorContainer"> + <PostList + posts={postList} + loading={props.state.initialLoading || props.state.loading || props.state.filterLoading} + filtered={isFiltered} + action={props.addPost} + paging={props.state.paging} + canPaginate={canPaginate} + doPagination={props.doPagination} + icon={addIcon} + /> + <PostList + posts={props.getSelectedPosts()} + loading={props.state.initialLoading} + action={props.removePost} + icon={removeIcon} + reorderPosts={props.reorderPosts} + /> + </div> + </div> + </div> + ); +}; + +export default PostSelector; diff --git a/private/src/blocks/post-list/components/post-selector/api.js b/private/src/blocks/post-list/components/post-selector/api.js new file mode 100644 index 00000000..1a7c1ade --- /dev/null +++ b/private/src/blocks/post-list/components/post-selector/api.js @@ -0,0 +1,93 @@ +import { __ } from '@wordpress/i18n'; + +/** + * Makes a get request to the PostTypes endpoint. + * + * @returns {Promise<any>} + */ +export const getPostTypes = () => wp.apiRequest({ path: '/wp/v2/types' }); + +/** + * Fetch taxonomies for the current post type + * + * @returns {Promise<any>} + */ +export const getTaxonomies = () => { + const type = wp.data.select('core/editor').getEditedPostAttribute('type'); + return wp.apiRequest({ path: `/wp/v2/taxonomies/?type=${type}` }).then((taxes) => taxes); +}; + +/** + * Fetch taxonomy terms + * + * @param {String} slug the taxonomy slug + * @returns {Promise<any>} + */ +export const getTerms = (slug) => + wp.apiRequest({ + path: wp.url.addQueryArgs(`/wp/v2/${slug}`, { + per_page: slug === 'category' ? 100 : 250, + }), + }); + +/** + * Makes a get request to the desired post type and builds the query string based on an object. + * + * @param {string|boolean} restBase - rest base for the query. + * @param {object} args + * @returns {Promise<any>} + */ +export const getPosts = ({ restBase = false, ...args }, taxonomy, term) => { + const queryString = Object.keys(args) + .map((arg) => `${arg}=${args[arg]}`) + .join('&'); + + return wp.apiRequest({ + path: `/wp/v2/${restBase}?${taxonomy}=${term}&${queryString}&_embed`, + }); +}; + +/** + * Makes a get request to the desired post type and builds the query string based on an object. + * + * @param {string|boolean} restBase - rest base for the query. + * @param {object} args + * @returns {Promise<any>} + */ +export const getPostsFromTerms = ({ ...args }, taxonomy, terms) => { + if (!terms.length) { + return new Promise((resolve, reject) => { + reject(__('No terms selected', 'amnesty')); + }); + } + + let allTermsString = ''; + if (terms) { + allTermsString = terms.map((arg) => `${arg.value}`).join('+'); + } + + const queryString = Object.keys(args) + .map((arg) => `${arg}=${args[arg]}`) + .join('&'); + + return wp.apiRequest({ + path: `/wp/v2/posts?${taxonomy.value}=${allTermsString}&${queryString}&_embed`, + }); +}; + +/** + * Makes a get request to the desired post type and builds the query string based on an object. + * + * @param {string|boolean} restBase - rest base for the query. + * @param {object} args + * @returns {Promise<any>} + */ +export const getPostsFromAuthors = ({ ...args }, authors) => { + const queryString = Object.keys(args) + .map((arg) => `${arg}=${args[arg]}`) + .join('&'); + + return wp.apiRequest({ + path: `/wp/v2/posts?author=${authors}&${queryString}&_embed`, + }); +}; diff --git a/private/src/blocks/post-list/components/selectors/AuthorSelector.jsx b/private/src/blocks/post-list/components/selectors/AuthorSelector.jsx new file mode 100644 index 00000000..53f85ff2 --- /dev/null +++ b/private/src/blocks/post-list/components/selectors/AuthorSelector.jsx @@ -0,0 +1,28 @@ +import { InspectorControls } from '@wordpress/block-editor'; +import { createHigherOrderComponent } from '@wordpress/compose'; +import { __ } from '@wordpress/i18n'; + +import createSelector from './createSelector.jsx'; + +const AuthorSelectorComponent = createSelector({ + /* translators: [admin] */ + label: __('Select author', 'amnesty'), + route: '/wp/v2/users', +}); + +const AuthorSelector = createHigherOrderComponent((OriginalComponent) => { + const WrappedAuthorSelectorComponent = (props) => ( + <InspectorControls> + <label> + {/* translators: [admin] */ __('Author:', 'amnesty')} + <br /> + <OriginalComponent {...props} /> + <br /> + </label> + </InspectorControls> + ); + + return WrappedAuthorSelectorComponent; +}, 'withInspectorControls'); + +export default AuthorSelector(AuthorSelectorComponent); diff --git a/private/src/blocks/post-list/components/selectors/CategorySelector.jsx b/private/src/blocks/post-list/components/selectors/CategorySelector.jsx new file mode 100644 index 00000000..b3f15d6f --- /dev/null +++ b/private/src/blocks/post-list/components/selectors/CategorySelector.jsx @@ -0,0 +1,53 @@ +import { InspectorControls } from '@wordpress/block-editor'; +import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components'; +import { createHigherOrderComponent } from '@wordpress/compose'; +import { __ } from '@wordpress/i18n'; + +import createSelector from './createSelector.jsx'; +import { createRange } from '../../../../utils/index'; + +const range = createRange(1, 100); + +const CategorySelectorComponent = createSelector({ + /* translators: [admin] */ + label: __('Select a category', 'amnesty'), + route: '/amnesty/v1/categories', + filterCallback: (results) => + results.map((result) => ({ + label: result.parent ? `- ${result.name}` : result.name, + value: result.term_id, + })), +}); + +const CategorySelector = createHigherOrderComponent((OriginalComponent) => { + const WrappedCategorySelectorComponent = (props) => ( + <InspectorControls> + <PanelBody> + <label> + {/* translators: [admin] */ __('Category:', 'amnesty')} + <br /> + <OriginalComponent {...props} /> + <br /> + </label> + <RangeControl + /* translators: [admin] */ + label={__('Number of posts to show:', 'amnesty')} + min={1} + max={8} + value={props.attributes.amount || 3} + onChange={(amount) => props.setAttributes({ amount: range(amount) })} + /> + <ToggleControl + /* translators: [admin] */ + label={__('Use related categories where supported', 'amnesty')} + checked={props.attributes.categoryRelated} + onChange={(categoryRelated) => props.setAttributes({ categoryRelated })} + /> + </PanelBody> + </InspectorControls> + ); + + return WrappedCategorySelectorComponent; +}, 'withInspectorControls'); + +export default CategorySelector(CategorySelectorComponent); diff --git a/private/src/blocks/post-list/components/selectors/TaxonomySelector.jsx b/private/src/blocks/post-list/components/selectors/TaxonomySelector.jsx new file mode 100644 index 00000000..dea4cbf7 --- /dev/null +++ b/private/src/blocks/post-list/components/selectors/TaxonomySelector.jsx @@ -0,0 +1,42 @@ +import { createHigherOrderComponent } from '@wordpress/compose'; +import { __ } from '@wordpress/i18n'; + +import createSelector from './createSelector.jsx'; + +const TaxonomySelectorComponent = createSelector({ + /* translators: [admin] */ + label: __('Select a category', 'amnesty'), + route: '/amnesty/v1/categories', + filterCallback: (results) => { + const options = []; + + Object.keys(results).map((key) => { + let label = results[key].name; + + if (results[key].parent) { + label = `- ${results.name}`; + } + + options.push({ label, value: results[key].rest_base }); + + return results[key]; + }); + + return options; + }, +}); + +const TaxonomySelector = createHigherOrderComponent((OriginalComponent) => { + const WrappedTaxonomySelectorComponent = (props) => ( + <label> + {/* translators: [admin] */ __('Taxonomy:', 'amnesty')} + <br /> + <OriginalComponent {...props} /> + <br /> + </label> + ); + + return WrappedTaxonomySelectorComponent; +}, 'withWrappingMarkup'); + +export default TaxonomySelector(TaxonomySelectorComponent); diff --git a/private/src/blocks/post-list/components/selectors/TermSelector.jsx b/private/src/blocks/post-list/components/selectors/TermSelector.jsx new file mode 100644 index 00000000..89437c70 --- /dev/null +++ b/private/src/blocks/post-list/components/selectors/TermSelector.jsx @@ -0,0 +1,26 @@ +import { createHigherOrderComponent } from '@wordpress/compose'; +import { __ } from '@wordpress/i18n'; + +import createSelector from './createSelector.jsx'; + +const TermSelectorComponent = createSelector({ + /* translators: [admin] */ + label: __('Select terms', 'amnesty'), + route: '/amnesty/v1/categories', +}); + +const TermSelector = createHigherOrderComponent((OriginalComponent) => { + const WrappedTermSelectorComponent = (props) => ( + <label> + <div className="term-selector"> + {/* translators: [admin] */ __('Terms:', 'amnesty')} + <br /> + <OriginalComponent {...props} /> + </div> + </label> + ); + + return WrappedTermSelectorComponent; +}, 'withWrappingMarkup'); + +export default TermSelector(TermSelectorComponent); diff --git a/private/src/blocks/post-list/components/selectors/createSelector.jsx b/private/src/blocks/post-list/components/selectors/createSelector.jsx new file mode 100644 index 00000000..0219db5a --- /dev/null +++ b/private/src/blocks/post-list/components/selectors/createSelector.jsx @@ -0,0 +1,93 @@ +import Select from 'react-select'; + +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const defaultSearchFilterCallback = (results) => + results.map((result) => ({ + label: result.parent ? `- ${result.name}` : result.name, + value: result.id, + })); + +const setupSearch = + (callback, filterCallback = null, route = '') => + (search = null) => { + let path = route; + + if (search) { + path += `?search=${encodeURIComponent(search)}`; + } + + const filter = filterCallback ?? defaultSearchFilterCallback; + + return wp.apiRequest({ path }).then(filter).then(callback); + }; + +const createSelector = ({ filterCallback = null, label, route }) => { + const Selector = ({ onChange, value: data }) => { + const [loading, setLoading] = useState(true); + const [options, setOptions] = useState([]); + const performSearch = setupSearch(setOptions, filterCallback, route); + const mounted = useRef(); + + useEffect(() => { + if (!mounted?.current) { + mounted.current = true; + performSearch().then(() => setLoading(false)); + } + }, [performSearch]); + + const handleSearchInput = (value) => { + if (value?.length >= 3) { + setLoading(true); + performSearch(value).then(setLoading(false)); + } + }; + + const handleInputChange = (value) => { + if (!value) { + return onChange(value); + } + + if (!Array.isArray(value)) { + return onChange(JSON.stringify([value])); + } + + return onChange(JSON.stringify(value)); + }; + + /* translators: [admin] */ + const placeholder = loading ? __('Loading', 'amnesty') : label; + + let value = data; + + try { + value = JSON.parse(data); + } catch (error) { + // eslint-disable-next-line no-console + console.debug(error); + // eslint-disable-next-line no-console + console.debug(data); + } + + return ( + <Select + options={options} + styles={{ menu: (base) => ({ ...base, position: 'relative' }) }} + isMulti={true} + isLoading={loading} + isDisabled={loading} + isSearchable={true} + placeholder={placeholder} + onInputChange={handleSearchInput} + onChange={handleInputChange} + isClearable={true} + value={value} + /> + ); + }; + + return Selector; +}; + +export default createSelector; diff --git a/private/src/blocks/post-list/edit.jsx b/private/src/blocks/post-list/edit.jsx new file mode 100644 index 00000000..c62cf46c --- /dev/null +++ b/private/src/blocks/post-list/edit.jsx @@ -0,0 +1,312 @@ +import { has } from 'lodash'; +import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, RangeControl, SelectControl, ToggleControl } from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import DisplayAuthor from './components/DisplayAuthor.jsx'; +import DisplayCategories from './components/DisplayCategories.jsx'; +import DisplayCustom from './components/DisplayCustom.jsx'; +import DisplayFeed from './components/DisplayFeed.jsx'; +import DisplaySelect from './components/DisplaySelect.jsx'; +import DisplayTaxonomies from './components/DisplayTaxonomies.jsx'; +import * as api from './components/post-selector/api'; + +import AuthorSelector from './components/selectors/AuthorSelector.jsx'; +import CategorySelector from './components/selectors/CategorySelector.jsx'; +import TaxonomySelector from './components/selectors/TaxonomySelector.jsx'; +import TermSelector from './components/selectors/TermSelector.jsx'; + +import { createRange, randId } from '../../utils/index'; + +const getTaxonomyTerms = (value, callback) => { + if (!value) { + callback([]); + return; + } + + api + .getTerms(value) + .then((data) => data.map((termItem) => ({ label: termItem.name, value: termItem.id }))) + .then(callback); +}; + +let defaultStyleOptions = [ + /* translators: [admin] */ + { label: __('Link List', 'amnesty'), value: 'list' }, + /* translators: [admin] */ + { label: __('Grid', 'amnesty'), value: 'grid' }, +]; + +let defaultDisplayTypes = [ + /* translators: [admin] */ + { label: __('Category', 'amnesty'), value: 'category' }, + /* translators: [admin] */ + { label: __('Object Selection', 'amnesty'), value: 'select' }, + /* translators: [admin] */ + { label: __('Custom', 'amnesty'), value: 'custom' }, + /* translators: [admin] */ + { label: __('Taxonomy', 'amnesty'), value: 'taxonomy' }, + /* translators: [admin] */ + { label: __('Author', 'amnesty'), value: 'author' }, +]; + +const range = createRange(1, 100); + +const keyPrefix = randId(); +const setupOptions = ({ attributes, setAttributes }) => { + if (has(attributes, 'extraStyleOptions')) { + defaultStyleOptions = attributes.extraStyleOptions; + setAttributes({ style: defaultStyleOptions[0].value }); + } + + if (has(attributes, 'displayTypes')) { + defaultDisplayTypes = attributes.displayTypes; + + if (defaultDisplayTypes[0].value === attributes.type) { + setAttributes({ type: defaultDisplayTypes[0].value }); + } else { + setAttributes({ type: defaultDisplayTypes[1].value }); + } + } +}; + +const Categories = ({ attributes, setAttributes }) => { + if (attributes.type !== 'category') { + return null; + } + + return ( + <> + <CategorySelector + value={attributes.category} + onChange={(category) => setAttributes({ category })} + attributes={attributes} + setAttributes={setAttributes} + /> + <div> + <DisplayCategories + amount={attributes.amount || 3} + category={attributes.category} + style={attributes.style} + prefix={keyPrefix} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + overrideTypes={attributes?.postTypes} + /> + </div> + </> + ); +}; + +const Custom = ({ attributes, setAttributes }) => { + if (attributes.type !== 'custom') { + return null; + } + + return ( + <InspectorControls> + <DisplayCustom + setAttributes={setAttributes} + custom={attributes.custom || []} + style={attributes.style} + prefix={keyPrefix} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + /> + </InspectorControls> + ); +}; + +const Select = ({ attributes, setAttributes }) => { + const [preview, setPreview] = useState(false); + + if (attributes.type !== 'select') { + return null; + } + + return ( + <> + <InspectorControls> + <button onClick={() => setPreview(!preview)}> + {preview + ? /* translators: [admin] */ + __('Hide Preview', 'amnesty') + : /* translators: [admin] */ + __('Show Preview', 'amnesty')} + </button> + </InspectorControls> + <div> + <DisplaySelect + setAttributes={setAttributes} + selectedPosts={attributes.selectedPosts || []} + defaultPostType={attributes.postType || 'post'} + preview={preview} + style={attributes.style} + prefix={keyPrefix} + overrideTypes={[]} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + /> + </div> + </> + ); +}; + +const Taxonomy = ({ attributes, setAttributes }) => { + const [allTerms, setAllTerms] = useState(); + + if (attributes.type !== 'taxonomy') { + return null; + } + + const addTaxonomyFilter = (taxonomy) => { + setAttributes({ taxonomy }); + getTaxonomyTerms(taxonomy.value, (terms) => { + setAllTerms(terms); + setAttributes({ terms }); + }); + }; + + return ( + <> + <InspectorControls> + <div> + <TaxonomySelector onChange={addTaxonomyFilter} value={attributes.taxonomy} /> + <TermSelector + options={allTerms} + value={attributes.terms} + onChange={(terms) => setAttributes({ terms })} + /> + </div> + <RangeControl + /* translators: [admin] */ + label={__('Number of posts to show:', 'amnesty')} + min={1} + max={8} + value={attributes.amount || 3} + onChange={(amount) => setAttributes({ amount })} + /> + </InspectorControls> + <div> + <DisplayTaxonomies + setAttributes={setAttributes} + style={attributes.style} + prefix={keyPrefix} + taxonomy={attributes.taxonomy} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + terms={attributes.terms} + amount={attributes.amount || 3} + /> + </div> + </> + ); +}; + +const Author = ({ attributes, setAttributes }) => { + if (attributes.type !== 'author') { + return null; + } + + return ( + <> + <AuthorSelector + value={attributes.authors} + onChange={(authors) => setAttributes({ authors })} + /> + <div> + <DisplayAuthor + setAttributes={setAttributes} + style={attributes.style} + prefix={keyPrefix} + authors={attributes.authors} + amount={10} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + /> + </div> + </> + ); +}; + +const Feed = ({ attributes, setAttributes }) => { + if (attributes.type !== 'feed') { + return null; + } + + return ( + <> + <InspectorControls> + <RangeControl + /* translators: [admin] */ + label={__('Number of posts to show:', 'amnesty')} + min={1} + max={8} + value={attributes.amount || 3} + onChange={(amount) => setAttributes({ amount: range(amount) })} + /> + </InspectorControls> + <div> + <DisplayFeed + amount={attributes.amount || 3} + category={attributes.category} + overrideTypes={attributes?.postTypes} + style={attributes.style} + prefix={keyPrefix} + showAuthor={attributes.displayAuthor} + showPostDate={attributes.displayPostDate} + /> + </div> + </> + ); +}; + +export default function Edit(props) { + setupOptions(props); + + return ( + <> + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + {defaultStyleOptions.length > 0 && ( + <SelectControl + /* translators: [admin] */ + label={__('Style', 'amnesty')} + options={defaultStyleOptions} + value={props.attributes.style} + onChange={(style) => props.setAttributes({ style })} + /> + )} + <SelectControl + /* translators: [admin] */ + label={__('Type', 'amnesty')} + options={defaultDisplayTypes} + value={props.attributes.type} + onChange={(type) => props.setAttributes({ type })} + /> + <ToggleControl + /* translators: [admin] */ + label={__('Display Post Author', 'amnesty')} + checked={props.attributes.displayAuthor} + onChange={(displayAuthor) => props.setAttributes({ displayAuthor })} + /> + <ToggleControl + /* translators: [admin] */ + label={__('Display Post Date', 'amnesty')} + checked={props.attributes.displayPostDate} + onChange={(displayPostDate) => props.setAttributes({ displayPostDate })} + /> + </PanelBody> + </InspectorControls> + <div {...useBlockProps()}> + <Categories {...props} /> + <Custom {...props} /> + <Select {...props} /> + <Taxonomy {...props} /> + <Author {...props} /> + <Feed {...props} /> + </div> + </> + ); +} diff --git a/private/src/blocks/post-list/editor.scss b/private/src/blocks/post-list/editor.scss new file mode 100644 index 00000000..40a1eedd --- /dev/null +++ b/private/src/blocks/post-list/editor.scss @@ -0,0 +1,2 @@ +@use './categories'; +@use './categories-editor'; diff --git a/private/src/blocks/post-list/helpers.php b/private/src/blocks/post-list/helpers.php new file mode 100644 index 00000000..343eb67f --- /dev/null +++ b/private/src/blocks/post-list/helpers.php @@ -0,0 +1,409 @@ +<?php + +declare( strict_types = 1 ); + +if ( ! function_exists( 'amnesty_list_process_query' ) ) { + /** + * Processes each post/page to return the correct data format for our render function. + * + * @package Amnesty\Blocks + * + * @param WP_Query $query Current WP_Query. + * @param mixed $term a term to use, if supplied + * @param bool $show_author whether to render author + * @param bool $show_post_date whether to render post date + * + * @return array|bool + */ + function amnesty_list_process_query( WP_Query $query, mixed $term = false, bool $show_author = false, bool $show_post_date = false ): array|bool { + if ( ! $query->have_posts() ) { + return false; + } + + $posts = []; + + while ( $query->have_posts() ) { + $query->the_post(); + + $item = [ + 'id' => get_the_ID(), + 'showAuthor' => $show_author, + 'showPostDate' => $show_post_date, + 'author' => get_the_author(), + 'date' => get_the_date(), + 'title' => get_the_title(), + 'link' => get_the_permalink(), + 'tag' => false, + 'tag_link' => false, + 'featured_image' => amnesty_featured_image( get_the_ID(), 'post-half@2x' ), + 'featured_image_id' => get_post_thumbnail_id( get_the_ID() ), + 'excerpt' => get_the_excerpt(), + ]; + + if ( ! $term ) { + $term = amnesty_get_prominent_term( get_the_ID() ); + } + + // check the post has one of the terms from the category list, if it does render the first one as a label + if ( has_category( $term, get_the_ID() ) ) { + $terms = get_the_category( get_the_ID() ); + $item['tag'] = $terms[0]->name; + $item['tag_link'] = amnesty_term_link( $terms[0] ); + } + + $posts[] = $item; + } + + wp_reset_postdata(); + + return $posts; + } +} + +if ( ! function_exists( 'amnesty_list_process_category' ) ) { + /** + * Process the attributes for the current block for the category type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current Block attributes. + * + * @return array|bool + */ + function amnesty_list_process_category( array $attributes ): array|bool { + if ( empty( $attributes ) || ! isset( $attributes['category'] ) || ! $attributes['category'] ) { + return false; + } + + if ( empty( $attributes ) || ! isset( $attributes['amount'] ) || ! $attributes['amount'] ) { + $amount = 3; + } + + $category = json_decode( $attributes['category'] ); + + $category__in = []; + if ( is_object( $category ) ) { + // deprecated variant + $category__in = [ $category->value ]; + } elseif ( is_array( $category ) ) { + $category__in = array_map( + function ( $c ) { + return $c->value; + }, + $category + ); + } + + if ( empty( $category__in ) ) { + return []; + } + + $post_categories = false; + + if ( ! empty( $attributes['categoryRelated'] ) && is_singular( 'post' ) ) { + $post_categories = array_map( + function ( $term ) { + return $term->term_id; + }, + wp_get_post_terms( get_queried_object_id(), 'category' ) + ); + } + + $category_override = false; + + if ( $post_categories ) { + $category__in = $post_categories; + } else { + $category_override = $category__in; + } + + $amount = $amount ?? $attributes['amount']; + + $show_author = $attributes['displayAuthor']; + $show_post_date = $attributes['displayPostDate']; + $override_post_type = $attributes['postTypes'] ?? (object) [ + 'name' => 'post', + ]; + + $query = new WP_Query( + [ + 'category__in' => $category__in, + // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in + 'post__not_in' => [ get_the_ID() ], + 'posts_per_page' => $amount, + 'no_found_rows' => true, + 'post_type' => $override_post_type->name, + ] + ); + + return amnesty_list_process_query( $query, $category_override, $show_author, $show_post_date ); + } +} + +if ( ! function_exists( 'amnesty_list_process_author' ) ) { + /** + * Process the attributes for the current block for the category type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current Block attributes. + * + * @return array|bool + */ + function amnesty_list_process_author( array $attributes ): array|bool { + if ( empty( $attributes ) || ! isset( $attributes['authors'] ) || ! $attributes['authors'] ) { + return false; + } + + if ( empty( $attributes ) || ! isset( $attributes['amount'] ) || ! $attributes['amount'] ) { + $amount = 3; + } + + $authors = json_decode( $attributes['authors'] ); + + $author__in = []; + if ( is_object( $authors ) ) { + // deprecated variant + $author__in = [ $authors->value ]; + } elseif ( is_array( $authors ) ) { + $author__in = array_map( + function ( $c ) { + return $c->value; + }, + $authors + ); + } + + if ( empty( $author__in ) ) { + return []; + } + + $amount = $amount ?? $attributes['amount']; + + $query = new WP_Query( + [ + 'author__in' => $author__in, + // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in + 'post__not_in' => [ get_the_ID() ], + 'posts_per_page' => $amount, + 'no_found_rows' => true, + 'ignore_sticky_posts' => true, + ] + ); + + return amnesty_list_process_query( $query, false ); + } +} + +if ( ! function_exists( 'amnesty_list_process_custom' ) ) { + /** + * Process the attributes for the current block for the custom type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current Block attributes. + * + * @return array|bool + */ + function amnesty_list_process_custom( array $attributes ): array|bool { + if ( empty( $attributes ) || ! isset( $attributes['custom'] ) || ! $attributes['custom'] ) { + return false; + } + + $show_author = $attributes['displayAuthor'] ?? false; + $show_date = $attributes['displayPostDate'] ?? false; + + return array_map( + fn ( array $data ): array => amnesty_list_process_custom_item_data( $data, $show_author, $show_date ), + $attributes['custom'] + ); + } +} + +if ( ! function_exists( 'amnesty_list_process_custom_item_data' ) ) { + /** + * Process a custom item's attributes + * + * @package Amnesty\Blocks + * + * @param array<string,mixed> $data the item data + * @param bool $show_author whether to render author info + * @param bool $show_date whether to render specified date + * + * @return array<string,mixed> + */ + function amnesty_list_process_custom_item_data( array $data, bool $show_author, bool $show_date ): array { + $image = wp_get_attachment_image_url( $data['featured_image_id'] ?? 0, 'post-half@2x' ); + $date = amnesty_locale_date( strtotime( $data['date'] ?? '' ) ); + + return [ + 'title' => $data['title'] ?? false, + 'link' => $data['titleLink'] ?? false, + 'tag' => $data['tagText'] ?? false, + 'tag_link' => $data['tagLink'] ?? false, + 'featured_image' => $image, + 'featured_image_id' => $data['featured_image_id'] ?? 0, + 'excerpt' => $data['excerpt'] ?? false, + 'showPostDate' => $show_date, + 'date' => $date, + 'showAuthor' => $show_author, + 'author' => $data['authorName'] ?? '', + ]; + } +} + +if ( ! function_exists( 'amnesty_list_process_select' ) ) { + /** + * Process the attributes for the current block for the object selection type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current Block attributes. + * + * @return array|bool + */ + function amnesty_list_process_select( array $attributes ): array|bool { + if ( empty( $attributes ) || ! isset( $attributes['selectedPosts'] ) || ! $attributes['selectedPosts'] ) { + return false; + } + + $post_types = get_post_types( + [ + 'public' => true, + ] + ); + + $show_author = $attributes['displayAuthor']; + $show_post_date = $attributes['displayPostDate']; + + $query = new WP_Query( + [ + 'post__in' => $attributes['selectedPosts'], + 'post_type' => $post_types, + 'no_found_rows' => true, + 'orderby' => 'post__in', + 'ignore_sticky_posts' => true, + ] + ); + + return amnesty_list_process_query( $query, false, $show_author, $show_post_date ); + } +} + +if ( ! function_exists( 'amnesty_list_process_taxonomy' ) ) { + /** + * Process the attributes for the current block for the category type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current Block attributes. + * + * @return array|bool + */ + function amnesty_list_process_taxonomy( array $attributes ): array|bool { + if ( empty( $attributes ) || ! isset( $attributes['taxonomy'] ) || ! $attributes['taxonomy'] ) { + return false; + } + + if ( empty( $attributes ) || ! isset( $attributes['amount'] ) || ! $attributes['amount'] ) { + $amount = 3; + } + + if ( empty( $attributes['terms'] ) ) { + return false; + } + + $taxonomy = amnesty_get_taxonomy_slug_from_rest_base( $attributes['taxonomy']['value'] ); + $terms = array_column( $attributes['terms'], 'value' ); + $amount = $amount ?? $attributes['amount']; + $show_author = $attributes['displayAuthor']; + $show_post_date = $attributes['displayPostDate']; + + $query = new WP_Query( + [ + 'post_type' => 'post', + // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in + 'post__not_in' => [ get_the_ID() ], + 'posts_per_page' => $amount, + 'no_found_rows' => true, + 'tax_query' => [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query + [ + 'taxonomy' => $taxonomy, + 'terms' => $terms, + 'field' => 'term_id', + ], + ], + ] + ); + + return amnesty_list_process_query( $query, false, $show_author, $show_post_date ); + } +} + +if ( ! function_exists( 'amnesty_list_process_content' ) ) { + /** + * Process the current attributes by calling the specific function dependent on block type. + * + * @package Amnesty\Blocks + * + * @param array $attributes - Current block attributes. + * + * @return array|bool + */ + function amnesty_list_process_content( array $attributes ): array|bool { + if ( empty( $attributes['type'] ) ) { + return amnesty_list_process_category( $attributes ); + } + + return match ( $attributes['type'] ) { + 'custom' => amnesty_list_process_custom( $attributes ), + 'select' => amnesty_list_process_select( $attributes ), + 'taxonomy' => amnesty_list_process_taxonomy( $attributes ), + 'author' => amnesty_list_process_author( $attributes ), + default => amnesty_list_process_category( $attributes ), + }; + } +} + +if ( ! function_exists( 'amnesty_render_list_item' ) ) { + /** + * Render the current block item as a list item. + * + * @package Amnesty\Blocks + * + * @param array $data - Item data. + * + * @return void + */ + function amnesty_render_list_item( array $data ): void { + $title = $data['title'] ?? ''; + $author = $data['author'] ?? ''; + $post_date = $data['date'] ?? ''; + $show_author = $data['showAuthor'] ?? ''; + $show_post_date = $data['showPostDate'] ?? ''; + $post_updated = isset( $data['id'] ) ? get_post_meta( $data['id'], 'amnesty_updated', true ) : ''; + + if ( $show_post_date && $post_updated ) { + $post_updated = wp_date( get_option( 'date_format' ), strtotime( $post_updated ), new DateTimeZone( 'UTC' ) ); + } + + require realpath( __DIR__ . '/views/render-list-item.php' ); + } +} + +if ( ! function_exists( 'amnesty_render_grid_item' ) ) { + /** + * Render the current block item as a grid item. + * + * @package Amnesty\Blocks + * + * @param array $data - Item data. + * + * @return void + */ + function amnesty_render_grid_item( array $data ): void { + $title = $data['title'] ?? ''; + + require realpath( __DIR__ . '/views/render-grid-item.php' ); + } +} diff --git a/private/src/blocks/post-list/index.js b/private/src/blocks/post-list/index.js new file mode 100644 index 00000000..c7e3dcd0 --- /dev/null +++ b/private/src/blocks/post-list/index.js @@ -0,0 +1,13 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/post-list/render.php b/private/src/blocks/post-list/render.php new file mode 100644 index 00000000..d433cdeb --- /dev/null +++ b/private/src/blocks/post-list/render.php @@ -0,0 +1,36 @@ +<?php + +// Prevent a bug in the admin panel where the editor +// shows a different post if the list item is selected +// using one of the selection methods. +if ( is_admin() ) { + return; +} + +if ( doing_filter( 'get_the_excerpt' ) ) { + return; +} + +$data = amnesty_list_process_content( $attributes ); + +if ( ! $data ) { + return; +} + +if ( ! isset( $attributes['style'] ) || 'grid' !== $attributes['style'] ) { + print '<ul class="linkList">'; + array_map( 'amnesty_render_list_item', $data ); + print '</ul>'; + return; +} + +if ( 0 !== count( $data ) % 4 ) { + printf( '<div class="grid grid-%s post-list">', esc_attr( count( $data ) ) ); + array_map( 'amnesty_render_grid_item', $data ); + print '</div>'; + return; +} + +printf( '<div class="grid grid-many">' ); +array_map( 'amnesty_render_grid_item', $data ); +print '</div>'; diff --git a/private/src/blocks/post-list/style.scss b/private/src/blocks/post-list/style.scss new file mode 100644 index 00000000..ae8c55e1 --- /dev/null +++ b/private/src/blocks/post-list/style.scss @@ -0,0 +1,13 @@ +@use './categories'; +@use './header'; +@use './pagination'; +@use './post'; +@use './post-search'; + +.postlist { + display: flex; + + @media all and (max-width: 840px) { + flex-wrap: wrap; + } +} diff --git a/private/src/blocks/post-list/views/render-grid-item-meta.php b/private/src/blocks/post-list/views/render-grid-item-meta.php new file mode 100644 index 00000000..d031127b --- /dev/null +++ b/private/src/blocks/post-list/views/render-grid-item-meta.php @@ -0,0 +1,17 @@ +<?php + +$has_data = isset( $data['tag'], $data['tag_link'] ) && (bool) $data['tag']; + +if ( ! $has_data ) { + return; +} + +$output = esc_html( $data['tag'] ); + +if ( (bool) $data['tag_link'] && (bool) $data['tag_link'] ) { + $output = sprintf( '<a href="%s" tabindex="0">%s</a>', esc_url( $data['tag_link'] ), esc_html( $data['tag'] ) ); +} + +?> + +<span class="grid-itemMeta"><?php echo wp_kses_post( $output ); ?></span> diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item-title.php b/private/src/blocks/post-list/views/render-grid-item-title.php similarity index 100% rename from wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item-title.php rename to private/src/blocks/post-list/views/render-grid-item-title.php diff --git a/private/src/blocks/post-list/views/render-grid-item.php b/private/src/blocks/post-list/views/render-grid-item.php new file mode 100644 index 00000000..9319dbc1 --- /dev/null +++ b/private/src/blocks/post-list/views/render-grid-item.php @@ -0,0 +1,22 @@ +<?php + +$has_credit = false; + +if ( $data['featured_image_id'] ?? false ) { + $has_credit = (bool) amnesty_get_image_credit( $data['featured_image_id'] ); +} + +// translators: [front] %s: the title of the article +$aria_label = sprintf( __( 'Article: %s', 'amnesty' ), format_for_aria_label( $title ) ); + +spaceless(); +?> +<article class="grid-item <?php echo esc_attr( $has_credit ? 'aimc-ignore' : '' ); ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>" style="aiic:ignore;background-image: url('<?php echo esc_url( $data['featured_image'] ); ?>')" tabindex="0"> + <div class="grid-content"> + <?php require realpath( __DIR__ . '/render-grid-item-meta.php' ); ?> + <?php require realpath( __DIR__ . '/render-grid-item-title.php' ); ?> + </div> +</article> +<?php + +endspaceless(); diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-author.php b/private/src/blocks/post-list/views/render-list-item-author.php similarity index 100% rename from wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-author.php rename to private/src/blocks/post-list/views/render-list-item-author.php diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-date.php b/private/src/blocks/post-list/views/render-list-item-date.php similarity index 100% rename from wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-date.php rename to private/src/blocks/post-list/views/render-list-item-date.php diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-meta.php b/private/src/blocks/post-list/views/render-list-item-meta.php similarity index 100% rename from wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-meta.php rename to private/src/blocks/post-list/views/render-list-item-meta.php diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-title.php b/private/src/blocks/post-list/views/render-list-item-title.php similarity index 100% rename from wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item-title.php rename to private/src/blocks/post-list/views/render-list-item-title.php diff --git a/private/src/blocks/post-list/views/render-list-item.php b/private/src/blocks/post-list/views/render-list-item.php new file mode 100644 index 00000000..b4d21878 --- /dev/null +++ b/private/src/blocks/post-list/views/render-list-item.php @@ -0,0 +1,34 @@ +<?php + +$has_credit = false; + +if ( $data['featured_image_id'] ?? false ) { + $has_credit = (bool) amnesty_get_image_credit( $data['featured_image_id'] ); +} + +// translators: [front] %s: the title of the article +$aria_label = sprintf( __( 'Article: %s', 'amnesty' ), format_for_aria_label( get_the_title() ) ); + +$background_image = ''; + +if ( $data['featured_image'] ) { + $background_image = sprintf( 'background-image: url("%s");', esc_url( $data['featured_image'] ) ); +} + +?> +<li> + <article class="linkList-item <?php echo esc_attr( $has_credit ? 'aimc-ignore' : '' ); ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>" style="aiic:ignore; <?php echo esc_attr( $background_image ); ?>" tabindex="0"> + <?php require realpath( __DIR__ . '/render-list-item-meta.php' ); ?> + <?php require realpath( __DIR__ . '/render-list-item-title.php' ); ?> + + <div class="postInfo-container"> + <?php require realpath( __DIR__ . '/render-list-item-date.php' ); ?> + + <?php if ( $show_post_date && $show_author ) : ?> + <span class="linkList-authorDivider"></span> + <?php endif; ?> + + <?php require realpath( __DIR__ . '/render-list-item-author.php' ); ?> + </div> + </article> +</li> diff --git a/private/src/blocks/post-meta/block.json b/private/src/blocks/post-meta/block.json new file mode 100644 index 00000000..7503b1de --- /dev/null +++ b/private/src/blocks/post-meta/block.json @@ -0,0 +1,83 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/post-meta", + "title": "Meta", + "category": "theme", + "description": "Display post meta for an entry such as a post or page.", + "textdomain": "amnesty", + "ancestor": ["core/query"], + "editorScript": "file:./index.js", + "render": "file:./render.php", + "attributes": { + "textAlign": { + "type": "string" + }, + "format": { + "type": "string" + }, + "isLink": { + "type": "boolean", + "default": false + }, + "displayType": { + "type": "string" + }, + "metaKey": { + "type": "string" + }, + "isSingle": { + "type": "boolean", + "default": true + } + }, + "usesContext": ["postId", "postType"], + "example": { + "viewportWidth": 350 + }, + "supports": { + "inserter": true, + "html": false, + "color": { + "gradients": true, + "link": true, + "__experimentalDefaultControls": { + "background": true, + "text": true, + "link": true + } + }, + "spacing": { + "margin": true, + "padding": true + }, + "typography": { + "fontSize": true, + "lineHeight": true, + "__experimentalFontFamily": true, + "__experimentalFontWeight": true, + "__experimentalFontStyle": true, + "__experimentalTextTransform": true, + "__experimentalTextDecoration": true, + "__experimentalLetterSpacing": true, + "__experimentalDefaultControls": { + "fontSize": true + } + }, + "interactivity": { + "clientNavigation": true + }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true, + "__experimentalDefaultControls": { + "radius": true, + "color": true, + "width": true, + "style": true + } + } + } +} diff --git a/private/src/blocks/post-meta/edit.jsx b/private/src/blocks/post-meta/edit.jsx new file mode 100644 index 00000000..196d98cc --- /dev/null +++ b/private/src/blocks/post-meta/edit.jsx @@ -0,0 +1,113 @@ +/* eslint-disable @wordpress/i18n-text-domain -- we specify the default text domain so that we know usage of it is intentional */ +import classnames from 'classnames'; + +import { + AlignmentControl, + BlockControls, + InspectorControls, + useBlockProps, +} from '@wordpress/block-editor'; +import { PanelBody, SelectControl, ToggleControl } from '@wordpress/components'; +import { useEntityProp, store as coreStore } from '@wordpress/core-data'; +import { useSelect } from '@wordpress/data'; +import { useMemo } from '@wordpress/element'; +import { applyFilters } from '@wordpress/hooks'; +import { __, sprintf } from '@wordpress/i18n'; + +/** + * Format meta keys for selection + * + * @param {Object} rawMeta the meta for a post + * + * @returns {Array<Object>} + */ +function formatMetaKeys(rawMeta) { + const formatted = []; + + Object.keys(rawMeta).forEach((key) => { + const label = key + .replace(/[_-]/g, ' ') + .trim() + .split(' ') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + + formatted.push({ label, value: key }); + }); + + return formatted.sort((a, b) => a.label.charCodeAt(0) - b.label.charCodeAt(0)); +} + +export default function Edit({ attributes, context, setAttributes }) { + const { isLink, isSingle } = attributes; + const { postId, postType: postTypeSlug } = context; + + const blockProps = useBlockProps({ + className: classnames({ [`has-text-align-${attributes.textAlign}`]: attributes.textAlign }), + }); + + const [meta] = useEntityProp('postType', postTypeSlug, 'meta', postId); + const metaKeys = useMemo(() => formatMetaKeys(meta), [meta]); + const postType = useSelect( + (select) => (postTypeSlug ? select(coreStore).getPostType(postTypeSlug) : null), + [postTypeSlug], + ); + + let metaValue = `<${__('Select a meta key', 'amnesty')}>`; + if (attributes.metaKey && Object.hasOwnProperty.call(meta, attributes.metaKey)) { + metaValue = Array.isArray(meta[attributes.metaKey]) + ? meta[attributes.metaKey].join(', ') + : meta[attributes.metaKey]; + } + + metaValue = applyFilters( + 'amnesty-core/post-meta/meta-value', + metaValue, + postId, + postTypeSlug, + attributes.metaKey, + ); + + return ( + <> + <BlockControls group="block"> + <AlignmentControl + value={attributes.textAlign} + onChange={(textAlign) => setAttributes({ textAlign })} + /> + </BlockControls> + + <InspectorControls> + <PanelBody title={__('Settings', 'default')}> + <SelectControl + label={__('Choose a meta key', 'amnesty')} + value={attributes.metaKey} + options={[{ label: __('None', 'default'), value: '' }, ...metaKeys]} + onChange={(metaKey) => setAttributes({ metaKey })} + /> + <ToggleControl + label={__('Does this meta key have a single value?', 'amnesty')} + checked={isSingle} + onChange={() => setAttributes({ isSingle: !isSingle })} + /> + <ToggleControl + __nextHasNoMarginBottom + label={ + postType?.labels.singular_name + ? sprintf( + /* translators: %s: Name of the post type e.g: "post". */ + __('Link to %s', 'default'), + postType.labels.singular_name.toLowerCase(), + ) + : __('Link to post', 'default') + } + onChange={() => setAttributes({ isLink: !isLink })} + checked={isLink} + /> + </PanelBody> + </InspectorControls> + + <div {...blockProps}>{metaValue}</div> + </> + ); +} diff --git a/private/src/blocks/post-meta/index.js b/private/src/blocks/post-meta/index.js new file mode 100644 index 00000000..735c9405 --- /dev/null +++ b/private/src/blocks/post-meta/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata.name, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/post-meta/render.php b/private/src/blocks/post-meta/render.php new file mode 100644 index 00000000..43674055 --- /dev/null +++ b/private/src/blocks/post-meta/render.php @@ -0,0 +1,48 @@ +<?php + +if ( ! isset( $block->context['postId'], $attributes['metaKey'] ) ) { + return ''; +} + +$classes = []; + +if ( isset( $attributes['textAlign'] ) ) { + $classes[] = 'has-text-align-' . $attributes['textAlign']; +} + +if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; +} + +$wrapper_attributes = get_block_wrapper_attributes( [ 'class' => implode( ' ', $classes ) ] ); + +$meta_value = get_post_meta( $block->context['postId'], $attributes['metaKey'], $attributes['isSingle'] ?? true ); +$metadata = []; + +if ( $attributes['isSingle'] ?? true ) { + $meta_value = [ $meta_value ]; +} + +$meta_value = apply_filters( + 'amnesty_core_post_meta_meta_value', + $meta_value, + $block->context['postId'], + $block->context['postType'], + $attributes['metaKey'], +); + +if ( $attributes['isLink'] ?? false ) { + foreach ( $meta_value as $row ) { + $metadata[] = sprintf( '<a href="%1s">%2s</a>', get_the_permalink( $block->context['postId'] ), $row ); + } +} else { + $metadata = $meta_value; +} + +$metadata = implode( ', ', $metadata ); + +?> + +<div <?php echo wp_kses_data( $wrapper_attributes ); ?>> + <?php echo wp_kses_post( $metadata ); ?> +</div> diff --git a/private/src/blocks/query-count/block.json b/private/src/blocks/query-count/block.json new file mode 100644 index 00000000..f121eba1 --- /dev/null +++ b/private/src/blocks/query-count/block.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", + "apiVersion": 3, + "name": "amnesty-core/query-count", + "title": "Query Count", + "description": "Display the query results count", + "ancestor": ["core/query"], + "textdomain": "amnesty", + "category": "theme", + "icon": "info", + "usesContext": ["queryId", "query"], + "supports": { + "inserter": false + }, + "editorScript": "file:./index.js" +} diff --git a/private/src/blocks/query-count/index.js b/private/src/blocks/query-count/index.js new file mode 100644 index 00000000..79b933ff --- /dev/null +++ b/private/src/blocks/query-count/index.js @@ -0,0 +1,9 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit: () => null, + save: () => null, +}); diff --git a/private/src/blocks/query-count/render.php b/private/src/blocks/query-count/render.php new file mode 100644 index 00000000..6f74ac87 --- /dev/null +++ b/private/src/blocks/query-count/render.php @@ -0,0 +1,20 @@ +<?php + +global $wp_query; + +$found_posts = absint( $wp_query->found_posts ); +$formatted = number_format_i18n( $found_posts ); + +/* translators: Singular/Plural number of posts. */ +$results = sprintf( _n( '%s result', '%s results', $found_posts, 'amnesty' ), $formatted ); + +if ( is_search() && get_search_query() ) { + /* translators: 1: number of results for search query, 2: don't translate (dynamic search term) */ + $results = sprintf( _n( "%1\$s result for '%2\$s'", "%1\$s results for '%2\$s'", $found_posts, 'amnesty' ), $formatted, get_search_query() ); +} + +$results = apply_filters( 'amnesty_search_results_title', $results, $found_posts, get_search_query() ); + +?> + +<h2 class="wp-block-amnesty-core-query-count postlist-headerTitle"><?php echo esc_html( $results ); ?></h2> diff --git a/private/src/blocks/raw-code/block.json b/private/src/blocks/raw-code/block.json new file mode 100644 index 00000000..3998d599 --- /dev/null +++ b/private/src/blocks/raw-code/block.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/code", + "title": "Raw Code", + "category": "amnesty-core", + "description": "Insert raw HTML. Please use carefully", + "icon": "", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "supports": { + "className": false, + "html": false + }, + "attributes": { + "content": { + "type": "string", + "source": "html" + } + } +} diff --git a/private/src/blocks/raw-code/edit.jsx b/private/src/blocks/raw-code/edit.jsx new file mode 100644 index 00000000..6b3a5104 --- /dev/null +++ b/private/src/blocks/raw-code/edit.jsx @@ -0,0 +1,82 @@ +import { PlainText, BlockControls, transformStyles, useBlockProps } from '@wordpress/block-editor'; +import { ToolbarButton, Disabled, SandBox, ToolbarGroup } from '@wordpress/components'; +import { useSelect } from '@wordpress/data'; +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +// Default styles used to unset some of the styles +// that might be inherited from the editor style. +const defaultStyles = ` + html,body,:root { + margin: 0 !important; + padding: 0 !important; + overflow: visible !important; + min-height: auto !important; + } +`; + +export default function Edit({ attributes, isSelected, setAttributes }) { + const editorStyles = useSelect((select) => { + const { getSettings } = select('core/block-editor'); + return getSettings().styles; + }); + + const [isPreviewing, setIsPreviewing] = useState(false); + const [styles, setStyles] = useState([]); + + const mounted = useRef(); + useEffect(() => { + if (!mounted?.current) { + mounted.current = true; + setStyles([...defaultStyles, ...transformStyles(editorStyles)]); + } + }, [editorStyles]); + + return ( + <div {...useBlockProps({ className: 'wp-block-html' })}> + <BlockControls> + <ToolbarGroup> + <ToolbarButton + className="components-tab-button" + isPressed={!isPreviewing} + onClick={() => setIsPreviewing(false)} + > + <span>{/* translators: [admin] */ __('HTML', 'amnesty')}</span> + </ToolbarButton> + <ToolbarButton + className="components-tab-button" + isPressed={isPreviewing} + onClick={() => setIsPreviewing(true)} + > + <span>{/* translators: [admin] */ __('Preview', 'amnesty')}</span> + </ToolbarButton> + </ToolbarGroup> + </BlockControls> + <Disabled.Consumer> + {() => + isPreviewing ? ( + <> + <SandBox html={attributes.content} styles={styles} /> + {/* + An overlay is added when the block is not selected in order to register click events. + Some browsers do not bubble up the clicks from the sandboxed iframe, which makes it + difficult to reselect the block. + */} + {!isSelected && <div className="block-library-html__preview-overlay"></div>} + </> + ) : ( + <PlainText + style={{ fontFamily: 'monospace' }} + value={attributes.content} + onChange={(content) => setAttributes({ content })} + /* translators: [admin] */ + placeholder={__('Write HTML…', 'amnesty')} + /* translators: [admin] */ + aria-label={__('HTML', 'amnesty')} + /> + ) + } + </Disabled.Consumer> + </div> + ); +} diff --git a/private/src/blocks/raw-code/editor.scss b/private/src/blocks/raw-code/editor.scss new file mode 100644 index 00000000..f990aaec --- /dev/null +++ b/private/src/blocks/raw-code/editor.scss @@ -0,0 +1,3 @@ +.wp-block-amnesty-core-code iframe { + height: auto; +} diff --git a/private/src/blocks/raw-code/index.jsx b/private/src/blocks/raw-code/index.jsx new file mode 100644 index 00000000..94310dfe --- /dev/null +++ b/private/src/blocks/raw-code/index.jsx @@ -0,0 +1,13 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; +import { RawHTML } from '@wordpress/element'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: ({ attributes }) => <RawHTML>{attributes.content}</RawHTML>, +}); diff --git a/private/src/blocks/regions/block.json b/private/src/blocks/regions/block.json new file mode 100644 index 00000000..9eddac67 --- /dev/null +++ b/private/src/blocks/regions/block.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/regions", + "title": "Terms List", + "category": "amnesty-core", + "description": "", + "keywords": ["Terms"], + "icon": "", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "className": true, + "align": ["left", "center", "right"] + }, + "attributes": { + "title": { + "type": "string", + "default": "" + }, + "taxonomy": { + "type": "string", + "default": "category" + }, + "background": { + "type": "string", + "default": "" + }, + "alignment": { + "type": "string", + "default": "" + }, + "depth": { + "type": "number", + "default": 1 + }, + "regionsOnly": { + "type": "boolean", + "default": false + } + } +} diff --git a/private/src/blocks/regions/components/List.jsx b/private/src/blocks/regions/components/List.jsx new file mode 100644 index 00000000..322d8fb9 --- /dev/null +++ b/private/src/blocks/regions/components/List.jsx @@ -0,0 +1,15 @@ +export default function List({ terms = [], depth = 0, maxDepth }) { + return ( + <ul className={depth === 0 ? 'listItems' : 'children'}> + {terms && + Array.from(terms).map((term) => ( + <li key={term.id} className={term.children ? 'has-children' : null}> + <span>{term.name}</span> + {depth < maxDepth && ( + <List terms={term.children} depth={depth + 1} maxDepth={maxDepth} /> + )} + </li> + ))} + </ul> + ); +} diff --git a/private/src/blocks/regions/edit.jsx b/private/src/blocks/regions/edit.jsx new file mode 100644 index 00000000..41e46642 --- /dev/null +++ b/private/src/blocks/regions/edit.jsx @@ -0,0 +1,167 @@ +import classnames from 'classnames'; + +import { each, filter, head, isEmpty, map } from 'lodash'; +import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, RangeControl, SelectControl, ToggleControl } from '@wordpress/components'; +import { useEntityRecords } from '@wordpress/core-data'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import List from './components/List.jsx'; + +const clone = (thing) => JSON.parse(JSON.stringify(thing)); + +const unflatten = (list, parent = { id: 0 }, tree = []) => { + const children = filter(list, (item) => item.parent === parent.id); + + if (!isEmpty(children)) { + if (parent.id === 0) { + // eslint-disable-next-line no-param-reassign + tree = children; + } else { + // eslint-disable-next-line no-param-reassign + parent.children = children; + } + + each(children, (item) => unflatten(list, item)); + } + + return tree; +}; + +const filterTermsForRegionsOnly = (termsLoading, terms, regionsOnly) => { + if (termsLoading || !Array.isArray(terms)) { + return null; + } + + const cloned = clone(terms); + + if (!regionsOnly) { + return unflatten(cloned); + } + + const filtered = cloned.filter((term) => ['region', 'subregion'].indexOf(term.type) !== -1); + + return unflatten(filtered); +}; + +function getCurrentTaxonomy(taxonomies, taxonomy) { + const filteredTaxonomies = filter(taxonomies, (t) => t.amnesty); + return head(filter(filteredTaxonomies, (t) => t.slug === taxonomy)); +} + +function getTaxonomyOptions(taxonomies) { + const filteredTaxonomies = filter(taxonomies, (t) => t.amnesty); + return map(filteredTaxonomies, (tax) => ({ + label: tax.name, + value: tax.slug, + })); +} + +export default function Edit({ attributes, className, setAttributes }) { + const { records: taxonomies, isResolving: taxonomiesLoading } = useEntityRecords( + 'root', + 'taxonomy', + ); + const { records: terms, isResolving: termsLoading } = useEntityRecords( + 'taxonomy', + attributes.taxonomy, + { per_page: -1 }, + ); + + const [current, setCurrent] = useState(); + const [options, setOptions] = useState(); + const [theTerms, setTheTerms] = useState(); + + // transform taxonomy entities + useEffect(() => { + if (!taxonomiesLoading) { + setCurrent(getCurrentTaxonomy(taxonomies, attributes.taxonomy)); + setOptions(getTaxonomyOptions(taxonomies)); + } + }, [taxonomies, taxonomiesLoading, attributes.taxonomy]); + + // minimise depth if the currently-selected taxonomy is not hierarchical + useEffect(() => { + if (!taxonomiesLoading && current && !current?.hierarchical && attributes.depth !== 0) { + setAttributes({ depth: 0 }); + } + }, [attributes.depth, current, setAttributes, taxonomiesLoading]); + + // disable regions-only if the currently-selected taxonomy is not hierarchical + useEffect(() => { + if (!taxonomiesLoading && current && !current?.hierarchical && attributes.regionsOnly) { + setAttributes({ regionsOnly: false }); + } + }, [attributes.regionsOnly, current, setAttributes, taxonomiesLoading]); + + // manage available terms + useEffect(() => { + if (!taxonomiesLoading && !termsLoading && Array.isArray(terms)) { + setTheTerms(filterTermsForRegionsOnly(termsLoading, terms, attributes.regionsOnly)); + } + }, [attributes.regionsOnly, taxonomiesLoading, termsLoading, terms]); + + const classes = classnames(className, { + [`has-${attributes.background}-background-color`]: !!attributes.background, + }); + + return ( + <> + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Display Options', 'amnesty')}> + <SelectControl + /* translators: [admin] */ + label={__('Background Colour', 'amnesty')} + options={[ + /* translators: [admin] */ + { label: __('White', 'amnesty'), value: '' }, + /* translators: [admin] */ + { label: __('Grey', 'amnesty'), value: 'very-light-gray' }, + ]} + value={attributes.background} + onChange={(background) => setAttributes({ background })} + /> + <SelectControl + /* translators: [admin] */ + label={__('Choose taxonomy to display', 'amnesty')} + options={options} + value={attributes.taxonomy} + onChange={(taxonomy) => setAttributes({ taxonomy })} + /> + {current?.hierarchical && ( + <> + <RangeControl + /* translators: [admin] */ + label={__('Max depth', 'amnesty')} + min={0} + max={3} + value={attributes.depth} + onChange={(depth) => setAttributes({ depth })} + /> + <ToggleControl + /* translators: [admin] */ + label={__('Show only Regions/Subregions', 'amnesty')} + checked={attributes.regionsOnly} + onChange={(regionsOnly) => setAttributes({ regionsOnly })} + /> + </> + )} + </PanelBody> + </InspectorControls> + <aside {...useBlockProps({ className: classes })}> + <RichText + tagName="h2" + format="string" + className={attributes.alignment ? `is-${attributes.alignment}-aligned` : null} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + /* translators: [admin] */ + placeholder={__('Explore by Region', 'amnesty')} + withoutInteractiveFormatting={true} + /> + <List terms={theTerms} depth={0} maxDepth={attributes.depth} /> + </aside> + </> + ); +} diff --git a/private/src/styles/blocks/regions/_editor.scss b/private/src/blocks/regions/editor.scss similarity index 100% rename from private/src/styles/blocks/regions/_editor.scss rename to private/src/blocks/regions/editor.scss diff --git a/private/src/blocks/regions/index.js b/private/src/blocks/regions/index.js new file mode 100644 index 00000000..c7e3dcd0 --- /dev/null +++ b/private/src/blocks/regions/index.js @@ -0,0 +1,13 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/regions/render.php b/private/src/blocks/regions/render.php new file mode 100644 index 00000000..d07cca90 --- /dev/null +++ b/private/src/blocks/regions/render.php @@ -0,0 +1,67 @@ +<?php + +if ( ! taxonomy_exists( $attributes['taxonomy'] ) ) { + return; +} + +if ( ! function_exists( 'add_child_terms_identifier_to_category_list' ) ) { + /** + * Add a class name to terms with children + * + * @param array<int,string> $classes the current tern's class list + * @param WP_Term $term the current term object + * @param int $depth the current iterator depth + * @param array<string,mixed> $attributes the current term's attributes + */ + function add_child_terms_identifier_to_category_list( array $classes, WP_Term $term, int $depth, array $attributes = [] ): array { + if ( isset( $attributes['has_children'] ) && $attributes['has_children'] ) { + $classes[] = 'has-children'; + } + + return $classes; + } +} + +$query_args = [ + 'depth' => absint( $attributes['depth'] ) + 1, + 'hide_empty' => false, + 'taxonomy' => $attributes['taxonomy'], + 'title_li' => false, + 'show_option_none' => false, + 'use_desc_for_title' => false, +]; + +if ( $attributes['regionsOnly'] ) { + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + $query_args['meta_query'] = [ + [ + 'key' => 'type', + 'value' => [ 'region', 'subregion' ], + 'compare' => 'IN', + ], + ]; +} + +$title_id = sanitize_title_with_dashes( $attributes['title'] ); +$title_classes = classnames( [ "is-{$attributes['alignment']}-aligned" => (bool) $attributes['alignment'] ] ); +$wrap_classes = classnames( + [ + "has-{$attributes['background']}-background-color" => (bool) $attributes['background'], + ] +); + +$wrapper_attributes = get_block_wrapper_attributes( [ 'class' => $wrap_classes ] ); + +?> +<aside <?php echo wp_kses_data( $wrapper_attributes ); ?> aria-labelledby="<?php echo esc_attr( $title_id ); ?>"> + <h2 id="<?php echo esc_attr( $title_id ); ?>" class="<?php echo esc_attr( $title_classes ); ?>"><?php echo esc_html( $attributes['title'] ); ?></h2> + <ul class="listItems" aria-label="<?php /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b026-regions-list-block/ */ esc_attr_e( 'Hierarchical list of terms', 'amnesty' ); ?>"> + <?php + + add_filter( 'category_css_class', 'add_child_terms_identifier_to_category_list', 10, 4 ); + wp_list_categories( $query_args ); + remove_filter( 'category_css_class', 'add_child_terms_identifier_to_category_list', 10, 4 ); + + ?> + </ul> +</aside> diff --git a/private/src/blocks/regions/style.scss b/private/src/blocks/regions/style.scss new file mode 100644 index 00000000..eaac9c29 --- /dev/null +++ b/private/src/blocks/regions/style.scss @@ -0,0 +1,131 @@ +.wp-block-amnesty-core-regions { + padding: 24px; +} + +.wp-block-amnesty-core-regions h2 { + text-transform: uppercase; +} + +.wp-block-amnesty-core-regions ul, +.wp-block-amnesty-core-regions ul ul { + margin: 0 !important; + padding: 0 !important; + list-style: none; +} + +.wp-block-amnesty-core-regions .listItems { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.wp-block-amnesty-core-regions .listItems > li { + margin-top: spacing(); + flex: 1 1 100%; + + @media all and (min-width: 540px) { + flex-basis: 50%; + max-width: 50%; + } + + @media all and (min-width: 940px) { + flex-basis: 33%; + max-width: 33%; + } + + @media all and (min-width: 1200px) { + flex-basis: 25%; + max-width: 25%; + } + + @media all and (min-width: 1400px) { + flex-basis: auto; + } +} + +.wp-block-amnesty-core-regions .listItems li a { + font-weight: normal; + text-decoration: none; + text-decoration-skip-ink: auto; + + &:hover, + &:active, + &:focus { + text-decoration: underline; + } +} + +.wp-block-amnesty-core-regions .listItems > li > a { + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; +} + +.wp-block-amnesty-core-regions .has-children { + margin-bottom: 24px; +} + +.wp-block-amnesty-core-regions .children { + margin-top: spacing(); +} + +.wp-block-amnesty-core-regions .has-children .has-children li::before { + content: "- "; +} + +.wp-block-amnesty-core-regions .has-children .has-children .children { + margin-top: 0; +} + +.wp-block-amnesty-core-regions.alignleft h2 { + text-align: left; + + .rtl & { + text-align: right; + } +} + +.wp-block-amnesty-core-regions.alignleft .children li { + padding-right: 12px !important; + text-align: left; + + .rtl & { + text-align: right; + padding-left: 12px !important; + padding-right: 0 !important; + } +} + +.wp-block-amnesty-core-regions.aligncenter, +.wp-block-amnesty-core-regions.aligncenter h2, +.wp-block-amnesty-core-regions.aligncenter .listItems li, +.wp-block-amnesty-core-regions.aligncenter .children li + { + text-align: center; +} + +.wp-block-amnesty-core-regions.alignright h2 { + text-align: right; + + .rtl & { + text-align: left; + } +} + +.wp-block-amnesty-core-regions.alignright .listItems li { + text-align: right; + + .rtl & { + text-align: left; + } +} + +.wp-block-amnesty-core-regions.alignright .children li { + padding-left: 12px !important; + text-align: right; + + .rtl & { + text-align: left; + padding-left: 0 !important; + padding-right: 12px !important; + } +} diff --git a/private/src/blocks/related-content/block.json b/private/src/blocks/related-content/block.json new file mode 100644 index 00000000..0d7ce884 --- /dev/null +++ b/private/src/blocks/related-content/block.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/related-content", + "title": "Related Content", + "category": "amnesty-core", + "description": "Add a grid of posts that are related to the current post", + "icon": "", + "textdomain": "amnesty", + "usesContext": ["postId", "postType"], + "editorScript": "file:./index.js", + "render": "file:./render.php" +} diff --git a/private/src/blocks/related-content/components/GridItem.jsx b/private/src/blocks/related-content/components/GridItem.jsx new file mode 100644 index 00000000..ac8cf7b5 --- /dev/null +++ b/private/src/blocks/related-content/components/GridItem.jsx @@ -0,0 +1,36 @@ +import { getFeaturedImage } from '../utils'; + +/** + * Render an item within the block + * + * @param {Object} param0 the props passed in + * + * @returns {wp.element.Component} + */ +export default function GridItem({ item, onClick }) { + const image = getFeaturedImage(item, 'post-half@2x'); + const style = {}; + + if (image) { + style.backgroundImage = `url('${image}')`; + } + + return ( + <article id={`${item.type}-id-${item.id}`} className="grid-item" style={style}> + {item.tagText && item.tagLink && ( + <span className="grid-itemMeta"> + <a href={item.tagLink} rel="noopener noreferer" onClick={onClick}> + {item.tagText} + </a> + </span> + )} + {item.title && ( + <h3 className="grid-itemTitle"> + <a href={item.titleLink || '#'} rel="noopener noreferer" onClick={onClick}> + {item.title} + </a> + </h3> + )} + </article> + ); +} diff --git a/private/src/blocks/related-content/components/Icon.js b/private/src/blocks/related-content/components/Icon.js new file mode 100644 index 00000000..fc04db8b --- /dev/null +++ b/private/src/blocks/related-content/components/Icon.js @@ -0,0 +1,10 @@ +/** + * Pin icon + */ +const PinIcon = ( + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path d="m21.5 9.1-6.6-6.6-4.2 5.6c-1.2-.1-2.4.1-3.6.7-.1 0-.1.1-.2.1-.5.3-.9.6-1.2.9l3.7 3.7-5.7 5.7v1.1h1.1l5.7-5.7 3.7 3.7c.4-.4.7-.8.9-1.2.1-.1.1-.2.2-.3.6-1.1.8-2.4.6-3.6l5.6-4.1zm-7.3 3.5.1.9c.1.9 0 1.8-.4 2.6l-6-6c.8-.4 1.7-.5 2.6-.4l.9.1L15 4.9 19.1 9l-4.9 3.6z" /> + </svg> +); + +export default PinIcon; diff --git a/private/src/blocks/related-content/components/Loading.jsx b/private/src/blocks/related-content/components/Loading.jsx new file mode 100644 index 00000000..ae2f23a0 --- /dev/null +++ b/private/src/blocks/related-content/components/Loading.jsx @@ -0,0 +1,17 @@ +import { Placeholder, Spinner } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +/** + * Render a loading area + * + * @returns {React.Component} + */ +export default function Loading({ icon }) { + return ( + <div> + <Placeholder icon={icon} label={__('Related Content', 'amnesty')}> + <Spinner /> + </Placeholder> + </div> + ); +} diff --git a/private/src/blocks/related-content/components/NoPosts.jsx b/private/src/blocks/related-content/components/NoPosts.jsx new file mode 100644 index 00000000..11b3cb0f --- /dev/null +++ b/private/src/blocks/related-content/components/NoPosts.jsx @@ -0,0 +1,17 @@ +import { Placeholder } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +/** + * Render a no-posts-found error area + * + * @returns {React.component} + */ +export default function NoPosts({ icon }) { + return ( + <div> + <Placeholder icon={icon} label={__('Related Content', 'amnesty')}> + {__('No posts found.')} + </Placeholder> + </div> + ); +} diff --git a/private/src/blocks/related-content/edit.jsx b/private/src/blocks/related-content/edit.jsx new file mode 100644 index 00000000..3b1c67aa --- /dev/null +++ b/private/src/blocks/related-content/edit.jsx @@ -0,0 +1,67 @@ +import { useBlockProps } from '@wordpress/block-editor'; +import { useInstanceId } from '@wordpress/compose'; +import { useEntityRecord } from '@wordpress/core-data'; +import { useDispatch } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; + +import PinIcon from './components/Icon'; +import GridItem from './components/GridItem.jsx'; +import Loading from './components/Loading.jsx'; +import NoPosts from './components/NoPosts.jsx'; + +const useRedirectionPreventionNotices = (instanceId) => { + const { createWarningNotice, removeNotice } = useDispatch('core/notices'); + + let noticeId; + + return (event) => { + event.preventDefault(); + + // remove previous, if any + removeNotice(instanceId); + + noticeId = `block-library/amnesty-core/related-content/redirection-prevented/${instanceId}`; + + createWarningNotice(__('Links are disabled in the editor.'), { + id: noticeId, + type: 'snackbar', + }); + }; +}; + +export default function Edit({ context }) { + const instanceId = useInstanceId(Edit); + const showRedirectionPreventedNotice = useRedirectionPreventionNotices(instanceId); + + const { postId, postType } = context; + const { editedRecord: post } = useEntityRecord('postType', postType, postId); + const { relatedContent: related } = post; + + const blockProps = useBlockProps(); + + if (!Array.isArray(related)) { + return ( + <div {...blockProps}> + <Loading icon={PinIcon} /> + </div> + ); + } + + if (!related.length) { + return ( + <div {...blockProps}> + <NoPosts icon={PinIcon} /> + </div> + ); + } + + return ( + <div {...blockProps}> + <div className="grid grid-5"> + {related.map((item) => ( + <GridItem key={item.id} item={item} onClick={showRedirectionPreventedNotice} /> + ))} + </div> + </div> + ); +} diff --git a/private/src/blocks/related-content/index.js b/private/src/blocks/related-content/index.js new file mode 100644 index 00000000..a1823e39 --- /dev/null +++ b/private/src/blocks/related-content/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/related-content/render.php b/private/src/blocks/related-content/render.php new file mode 100644 index 00000000..db7c26f9 --- /dev/null +++ b/private/src/blocks/related-content/render.php @@ -0,0 +1,13 @@ +<?php + +if ( ! class_exists( '\Amnesty\Related_Content' ) ) { + return ''; +} + +if ( ! get_the_ID() ) { + return ''; +} + +$related_content = new \Amnesty\Related_Content( false ); + +echo wp_kses_post( $related_content->get_rendered() ); diff --git a/private/src/blocks/related-content/utils.js b/private/src/blocks/related-content/utils.js new file mode 100644 index 00000000..d0ab84f3 --- /dev/null +++ b/private/src/blocks/related-content/utils.js @@ -0,0 +1,57 @@ +import { __ } from '@wordpress/i18n'; + +/** + * Retrieve featured image info from a post object + * + * @param {Object} post the post object + * @param {String} size the image size + * + * @returns {(String|null)} the image URI, or null + */ +export const getFeaturedImage = (item, size) => { + const image = item?.featuredImage; + return image?.sizes?.[size]?.url ?? image?.url; +}; + +/** + * Retrieve the first location term that has the type "default" + * + * @param {Object} terms the post's terms + * + * @returns {(Object|null)} the found term, or null + */ +export const getCountryTerm = (terms) => { + let country = null; + + terms.forEach((term) => { + if (term.type !== 'default') { + return; + } + + if (country) { + return; + } + + country = term; + }); + + if (!country) { + return country; + } + + // mock a post response so that {getProminentTerm()} can find it + return { + ...country, + _embedded: { + 'wp:term': [ + [ + { + /* translators: [admin] */ + name: __('Country', 'amnesty'), + link: '#', + }, + ], + ], + }, + }; +}; diff --git a/private/src/blocks/search-input/block.json b/private/src/blocks/search-input/block.json new file mode 100644 index 00000000..b7791c87 --- /dev/null +++ b/private/src/blocks/search-input/block.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/search-input", + "title": "Search Input", + "description": "For presenting the search input without a form", + "textdomain": "amnesty", + "supports": { + "align": false, + "inserter": false, + "multiple": false + }, + "editorScript": "file:./index.js", + "render": "file:./render.php" +} diff --git a/private/src/blocks/search-input/edit.jsx b/private/src/blocks/search-input/edit.jsx new file mode 100644 index 00000000..19e7eee6 --- /dev/null +++ b/private/src/blocks/search-input/edit.jsx @@ -0,0 +1,26 @@ +import { __ } from '@wordpress/i18n'; + +import { randId } from '../../utils'; + +export default function Edit() { + const searchId = randId(); + + return ( + <p> + <label htmlFor={`search-${searchId}`} className="u-hiddenVisually"> + {/* translators: [front] screen reader text for search field */} + {__('Search input', 'amnesty')} + </label> + {/* translators: [front] placeholder text for search field */} + <input + id={`search-${searchId}`} + className="has-autofocus" + type="text" + name="s" + role="searchbox" + placeholder={__('What are you looking for?', 'amnesty')} + value="" + /> + </p> + ); +} diff --git a/private/src/blocks/search-input/index.js b/private/src/blocks/search-input/index.js new file mode 100644 index 00000000..a1823e39 --- /dev/null +++ b/private/src/blocks/search-input/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/search-input/render.php b/private/src/blocks/search-input/render.php new file mode 100644 index 00000000..eb8bb51d --- /dev/null +++ b/private/src/blocks/search-input/render.php @@ -0,0 +1,5 @@ +<?php $search_id = bin2hex( random_bytes( 2 ) ); ?> +<p> + <label for="search-<?php echo esc_attr( $search_id ); ?>" class="u-hiddenVisually"><?php echo esc_html( /* translators: [front] screen reader text for search field */ __( 'Search input', 'amnesty' ) ); ?></label> + <input id="search-<?php echo esc_attr( $search_id ); ?>" class="has-autofocus" type="text" name="s" role="searchbox" placeholder="<?php /* translators: [front] */ esc_attr_e( 'What are you looking for?', 'amnesty' ); ?>" value="<?php echo esc_attr( get_query_var( 's' ) ); ?>"> +</p> diff --git a/private/src/blocks/search-title/block.json b/private/src/blocks/search-title/block.json new file mode 100644 index 00000000..414d284d --- /dev/null +++ b/private/src/blocks/search-title/block.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/search-title", + "title": "Search Title", + "category": "amnesty-core", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "render": "file:./render.php", + "supports": { + "className": false, + "inserter": false + }, + "usesContext": ["query"] +} diff --git a/private/src/blocks/search-title/edit.jsx b/private/src/blocks/search-title/edit.jsx new file mode 100644 index 00000000..bad6280c --- /dev/null +++ b/private/src/blocks/search-title/edit.jsx @@ -0,0 +1,5 @@ +export default function Edit({ context }) { + // eslint-disable-next-line no-console + console.log({ context }); + return null; +} diff --git a/private/src/blocks/search-title/index.js b/private/src/blocks/search-title/index.js new file mode 100644 index 00000000..735c9405 --- /dev/null +++ b/private/src/blocks/search-title/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata.name, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/search-title/render.php b/private/src/blocks/search-title/render.php new file mode 100644 index 00000000..08a015a0 --- /dev/null +++ b/private/src/blocks/search-title/render.php @@ -0,0 +1,28 @@ +<?php + +if ( ! isset( $block->context['query'] ) ) { + return; +} + +$query = new WP_Query( $block->context['query'] ); + +$found_posts = absint( $query->found_posts ); +$found_posts_fmt = number_format_i18n( $found_posts ); +$current_sort = amnesty_get_query_var( 'sort' ); +$available_sorts = amnesty_valid_sort_parameters(); + +/* translators: Singular/Plural number of posts. */ +$results = sprintf( _n( '%s result', '%s results', $found_posts, 'amnesty' ), $found_posts_fmt ); + +if ( is_search() && get_search_query() ) { + /* translators: 1: number of results for search query, 2: don't translate (dynamic search term) */ + $results = sprintf( _n( "%1\$s result for '%2\$s'", "%1\$s results for '%2\$s'", $found_posts, 'amnesty' ), $found_posts_fmt, get_search_query() ); +} + +$results = apply_filters( 'amnesty_search_results_title', $results, $found_posts, get_search_query() ); + +?> + +<h2 class="postlist-headerTitle"> + <?php echo esc_html( $results ); ?> +</h2> diff --git a/private/src/blocks/section/block.json b/private/src/blocks/section/block.json new file mode 100644 index 00000000..54f31fef --- /dev/null +++ b/private/src/blocks/section/block.json @@ -0,0 +1,62 @@ +{ + "$schema": "http://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-section", + "title": "Section", + "category": "amnesty-core", + "keywords": ["section"], + "description": "A section of content", + "icon": "", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "attributes": { + "background": { + "type": "string" + }, + "sectionId": { + "type": "string" + }, + "sectionName": { + "type": "string" + }, + "backgroundImage": { + "type": "string", + "default": "" + }, + "backgroundImageHeight": { + "type": "number", + "default": 0 + }, + "backgroundImageOrigin": { + "type": "string", + "default": "" + }, + "enableBackgroundGradient": { + "type": "boolean", + "default": false + }, + "minHeight": { + "type": "number", + "default": 0 + }, + "textColour": { + "type": "string", + "default": "black" + }, + "backgroundImageId": { + "type": "number", + "default": 0 + }, + "hideImageCaption": { + "type": "boolean", + "default": true + }, + "hideImageCopyright": { + "type": "boolean", + "default": false + } + } +} diff --git a/private/src/blocks/section/deprecated.jsx b/private/src/blocks/section/deprecated.jsx new file mode 100644 index 00000000..dee30a8f --- /dev/null +++ b/private/src/blocks/section/deprecated.jsx @@ -0,0 +1,162 @@ +import classnames from 'classnames'; +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; + +const v3 = { + attributes: { + background: { + type: 'string', + }, + padding: { + type: 'string', + }, + sectionId: { + type: 'string', + }, + sectionName: { + type: 'string', + }, + backgroundImage: { + type: 'string', + default: '', + }, + backgroundImageHeight: { + type: 'number', + default: 0, + }, + backgroundImageOrigin: { + type: 'string', + default: '', + }, + enableBackgroundGradient: { + type: 'boolean', + default: false, + }, + minHeight: { + type: 'number', + default: 0, + }, + textColour: { + type: 'string', + default: 'black', + }, + backgroundImageId: { + type: 'number', + default: 0, + }, + hideImageCaption: { + type: 'boolean', + default: true, + }, + hideImageCopyright: { + type: 'boolean', + default: false, + }, + }, +}; +const v2 = { + attributes: { + background: { + type: 'string', + }, + padding: { + type: 'string', + }, + sectionId: { + type: 'string', + }, + sectionName: { + type: 'string', + }, + backgroundImage: { + type: 'string', + default: '', + }, + backgroundImageHeight: { + type: 'number', + default: 0, + }, + backgroundImageOrigin: { + type: 'string', + default: '', + }, + enableBackgroundGradient: { + type: 'boolean', + default: false, + }, + minHeight: { + type: 'number', + default: 0, + }, + textColour: { + type: 'string', + default: 'black', + }, + }, + save: assign( + ({ attributes }) => { + const { minHeight, backgroundImage, backgroundImageHeight } = attributes; + const styles = (h) => { + if (!backgroundImage) { + return {}; + } + if (h > 0) { + return { + 'background-image': `url(${backgroundImage})`, + minHeight: `${minHeight}vw`, + maxHeight: `${backgroundImageHeight}px`, + }; + } + return { + 'background-image': `url(${backgroundImage})`, + height: 'auto', + }; + }; + const classes = classnames('section', { + 'section--tinted': attributes.background === 'grey', + [`section--${attributes.padding}`]: !!attributes.padding, + 'section--textWhite': attributes.textColour === 'white', + 'section--has-bg-image': backgroundImage, + 'section--has-bg-gradient': !!attributes.enableBackgroundGradient, + [`section--bgOrigin-${attributes.backgroundImageOrigin}`]: + !!attributes.backgroundImageOrigin, + }); + return ( + <section className={classes} style={styles(minHeight)}> + <div id={attributes.sectionId} className="container"> + <InnerBlocks.Content /> + </div> + </section> + ); + }, + { displayName: 'SectionBlockSave' }, + ), +}; +const v1 = { + attributes: { + background: { + type: 'string', + }, + padding: { + type: 'string', + }, + }, + save: assign( + ({ attributes }) => ( + <section + className={classnames({ + section: true, + 'section--tinted': attributes.background === 'grey', + [`section--${attributes.padding}`]: !!attributes.padding, + })} + > + <div className="container"> + <InnerBlocks.Content /> + </div> + </section> + ), + { displayName: 'SectionBlockSave' }, + ), +}; +const deprecated = [v3, v2, v1]; +export default deprecated; diff --git a/private/src/blocks/section/edit.jsx b/private/src/blocks/section/edit.jsx new file mode 100644 index 00000000..280a104c --- /dev/null +++ b/private/src/blocks/section/edit.jsx @@ -0,0 +1,172 @@ +import classNames from 'classnames'; + +import { InspectorControls, InnerBlocks, useBlockProps } from '@wordpress/block-editor'; +import { + PanelBody, + RangeControl, + SelectControl, + TextControl, + ToggleControl, +} from '@wordpress/components'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import BackgroundImageOriginControl from '../../components/BackgroundImageOriginControl.jsx'; +import BackgroundImageSelectorControl from '../../components/BackgroundImageSelectorControl.jsx'; +import MediaMetadata from '../../components/MediaMetadata.jsx'; +import MediaMetadataVisibilityControls from '../../components/MediaMetadataVisibilityControls.jsx'; +import { fetchMediaData } from '../../utils/index'; + +const Controls = ({ attributes, setAttributes }) => { + const handleSave = (sectionName) => { + const sectionId = sectionName.replace(/\s/g, '').toLowerCase(); + setAttributes({ sectionId, sectionName }); + }; + + const selectImage = (value) => { + setAttributes({ + backgroundImageId: value.id, + backgroundImage: value.sizes.full.url, + backgroundImageHeight: value.sizes.full.height, + }); + }; + + const removeImage = () => { + setAttributes({ + backgroundImageId: 0, + backgroundImage: '', + backgroundImageHeight: 0, + minHeight: 0, + }); + }; + + return ( + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + <TextControl + label={__('Section Name', 'amnesty')} + value={attributes.sectionName} + onChange={(value) => handleSave(value)} // Corrected onChange handler + /> + <SelectControl + label={__('Text Colour', 'amnesty')} + options={[ + { label: __('Black', 'amnesty'), value: 'black' }, + { label: __('White', 'amnesty'), value: 'white' }, + ]} + value={attributes.textColour} + onChange={(textColour) => setAttributes({ textColour })} + /> + </PanelBody> + <PanelBody title={/* translators: [admin] */ __('Background Options', 'amnesty')}> + <BackgroundImageSelectorControl + imageId={attributes.backgroundImageId} + onRemove={removeImage} + onSelect={selectImage} + /> + <RangeControl + label={__('Min image height as viewport percentage', 'amnesty')} + onChange={(value) => setAttributes({ minHeight: !value ? 0 : value })} + value={attributes.minHeight} + min={0} + max={100} + allowReset + /> + <ToggleControl + label={__('Toggle Background Overlay', 'amnesty')} + checked={attributes.enableBackgroundGradient} + onChange={(enableBackgroundGradient) => setAttributes({ enableBackgroundGradient })} + /> + <MediaMetadataVisibilityControls + hideCaption={attributes.hideImageCaption} + hideCopyright={attributes.hideImageCopyright} + setAttributes={setAttributes} + /> + <BackgroundImageOriginControl + origin={attributes.backgroundImageOrigin} + setOrigin={(backgroundImageOrigin) => setAttributes({ backgroundImageOrigin })} + /> + <SelectControl + label={__('Background Colour', 'amnesty')} + options={[ + { label: __('White', 'amnesty'), value: '' }, + { label: __('Grey', 'amnesty'), value: 'grey' }, + ]} + value={attributes.background} + onChange={(background) => setAttributes({ background })} + /> + </PanelBody> + </InspectorControls> + ); +}; + +const getClassName = (attributes) => + classNames( + 'section', + { + 'section--tinted': attributes.background === 'grey', + [`section--${attributes.padding}`]: !!attributes.padding, + 'section--textWhite': attributes.textColour === 'white', + 'section--has-bg-image': attributes.backgroundImage, + 'section--has-bg-overlay': !!attributes.enableBackgroundGradient, + }, + `section--bgOrigin-${attributes.backgroundImageOrigin}`, + ); + +const makeBlockStylesBuilder = (attributes) => (h) => { + if (!attributes.backgroundImage) { + return {}; + } + + if (h > 0) { + return { + backgroundImage: `url(${attributes.backgroundImage})`, + minHeight: `${attributes.minHeight}vw`, + maxHeight: `${attributes.backgroundImageHeight}px`, + }; + } + + return { + backgroundImage: `url(${attributes.backgroundImage})`, + height: 'auto', + }; +}; + +export default function Edit({ attributes, setAttributes }) { + const [imageData, setImageData] = useState(null); + + useEffect(() => { + if (attributes.backgroundImageId) { + fetchMediaData(attributes.backgroundImageId, setImageData); + } + }, [attributes.backgroundImageId]); + + const shouldShowImageCaption = + imageData?.caption && + !attributes.hideImageCaption && + imageData?.caption !== imageData?.description; + + const shouldShowImageCredit = imageData?.description && !attributes.hideImageCopyright; + + const sectionClasses = getClassName(attributes); + const buildStyles = makeBlockStylesBuilder(attributes); + + return ( + <> + <Controls attributes={attributes} setAttributes={setAttributes} /> + <section + {...useBlockProps({ className: sectionClasses })} + style={buildStyles(attributes.minHeight)} + > + <div id={attributes.sectionId} className="container"> + <InnerBlocks templateLock={false} /> + </div> + <MediaMetadata + media={imageData} + showMediaCaption={shouldShowImageCaption} + showMediaCopyright={shouldShowImageCredit} + /> + </section> + </> + ); +} diff --git a/private/src/blocks/section/editor.scss b/private/src/blocks/section/editor.scss new file mode 100644 index 00000000..e99b065a --- /dev/null +++ b/private/src/blocks/section/editor.scss @@ -0,0 +1,8 @@ +.editor-styles-wrapper .section:not(.section--tinted) { + padding-right: 0; + padding-left: 0; +} + +.section--has-bg-overlay::before { + z-index: 0 !important; +} diff --git a/private/src/blocks/section/index.jsx b/private/src/blocks/section/index.jsx new file mode 100644 index 00000000..f958bcbc --- /dev/null +++ b/private/src/blocks/section/index.jsx @@ -0,0 +1,17 @@ +import './editor.scss'; +import './style.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata, { + ...metadata, + deprecated, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'SectionBlockSave' }), +}); diff --git a/private/src/blocks/section/render.php b/private/src/blocks/section/render.php new file mode 100644 index 00000000..ea079eaa --- /dev/null +++ b/private/src/blocks/section/render.php @@ -0,0 +1,91 @@ +<?php + +declare(strict_types=1); + +namespace Amnesty\Blocks; + +use Amnesty\Get_Image_Data; + +// Generate a unique ID for the block +$container_id = substr( md5( uniqid( (string) wp_rand(), true ) ), 0, 8 ); +$section_id = $attributes['sectionId'] ?? ''; + +// Get image data +$image = new Get_Image_Data( absint( $attributes['backgroundImageId'] ) ); + +// Prepare background image and inline style +$background_image = $attributes['backgroundImage']; + +$bg_style = ''; +if ( $background_image || $image->id() ) { + if ( $image->id() ) { + $small_bg_image = wp_get_attachment_image_url( $image->id(), 'hero-sm' ); + $medium_bg_image = wp_get_attachment_image_url( $image->id(), 'hero-md' ); + $large_bg_image = wp_get_attachment_image_url( $image->id(), 'hero-lg' ); + + // Prepare background image as inline style for the section tag + $bg_style = sprintf( + 'background-image: url("%1$s");' . + '@media screen and (min-width:770px) {background-image: url("%2$s");}' . + '@media screen and (min-width:1444px) {background-image: url("%3$s");}', + esc_url( $small_bg_image ), + esc_url( $medium_bg_image ), + esc_url( $large_bg_image ), + ); + } elseif ( $background_image ) { + // Directly use the provided background image + $bg_style = sprintf( 'background-image: url("%s");', esc_url( $background_image ) ); + } +} + +// Prepare section attributes and classes +$origin = $attributes['backgroundImageOrigin']; +$classes = classnames( + 'section', + [ + 'section--tinted' => 'grey' === ( $attributes['background'] ?? '' ), + 'section--textWhite' => 'white' === $attributes['textColour'], + 'section--has-bg-image' => (bool) $background_image, + 'section--has-bg-overlay' => (bool) $attributes['enableBackgroundGradient'], + sprintf( 'section--bgOrigin-%s', $origin ) => (bool) $origin, + ] +); + +// Prepare section height attributes (if applicable) +$css_attr = ''; +if ( $background_image ) { + if ( 0 === absint( $attributes['minHeight'] ) ) { + $css_attr .= 'height:auto;'; + } + if ( absint( $attributes['minHeight'] ) > 0 ) { + $css_attr .= sprintf( + 'min-height:%svw;max-height:%spx;', + absint( $attributes['minHeight'] ), + absint( $attributes['backgroundImageHeight'] ), + ); + } +} + +// Handle image caption visibility +$hide_caption = true === amnesty_validate_boolish( $attributes['hideImageCaption'] ); +$hide_credit = true === amnesty_validate_boolish( $attributes['hideImageCopyright'] ); +$image_caption = ''; +if ( $image->id() && ! ( $hide_caption && $hide_credit ) ) { + $image_caption = wp_kses_post( $image->metadata( ! $hide_caption, ! $hide_credit ) ); +} + +$wrapper_attributes = get_block_wrapper_attributes( [ 'class' => $classes ] ); + +?> + +<section id="<?php echo esc_attr( $section_id ); ?>" <?php echo wp_kses_data( $wrapper_attributes ); ?> style="<?php echo esc_attr( $css_attr . $bg_style ); ?>"> + <div id="<?php echo esc_attr( $container_id ); ?>" class="container"> + <?php echo wp_kses_post( $content ); ?> + </div> + + <?php if ( $image_caption ) : ?> + <div class="image-caption"> + <?php echo wp_kses_post( $image_caption ); ?> + </div> + <?php endif; ?> +</section> diff --git a/private/src/blocks/section/style.scss b/private/src/blocks/section/style.scss new file mode 100644 index 00000000..737f8d4b --- /dev/null +++ b/private/src/blocks/section/style.scss @@ -0,0 +1,131 @@ +.section { + padding: 25px; + color: var(--wp--preset--color--black); + + &::before, + &::after { + content: ""; + display: table; + clear: both; + } +} + +.section.is-fullWidth--mobile, +.section.is-fullWidth--mobile .container { + @media all and (max-width: 760px) { + padding: 0; + width: 100%; + } +} + +.section--tinted { + background-color: var(--wp--preset--color--grey-lighter); + width: 100%; + max-width: 1468px; + margin: 0 auto; +} + +.section--dark { + background-color: var(--wp--preset--color--grey-lighter); +} + +.section--has-bg-image { + display: flex; + align-items: center; + background-size: cover; + justify-content: center; + position: relative; +} + +.ie .section--has-bg-image .container { + margin: 0; +} + +.section--bgOrigin-center { + background-position: center; +} + +.section--bgOrigin-bottom { + background-position: bottom; +} + +.section--bgOrigin-top { + background-position: top; +} + +.section--bgOrigin-left { + background-position: left; +} + +.section--bgOrigin-right { + background-position: right; +} + +.section--textWhite { + color: var(--wp--preset--color--white); + + h1, + h2, + h3, + h4, + h5, + h6 { + color: var(--wp--preset--color--white); + } +} + +.section--textWhite .wp-block-button__link { + color: var(--wp--preset--color--white); +} + +.section--topSpacing { + margin-top: 20px; +} + +.section--bottomSpacing { + margin-bottom: 20px; +} + +.section .container > *, +.article-content > * { + margin-bottom: 0; +} + +.section .container > *:not(style) + *, +.article-content > * + * { + margin-top: 24px; +} + +.section--no-padding { + padding: 0; +} + +[data-type="amnesty-core/block-row"], +[data-type="amnesty-core/block-section"] { + width: 100% !important; + max-width: none !important; +} + +.section--textWhite a { + color: var(--wp--preset--color--white); +} + +.section--has-bg-overlay > * { + z-index: 2; +} + +.section--has-bg-overlay { + position: relative; +} + +.section--has-bg-overlay::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; + display: block; + background: rgba(0, 0, 0, .5); +} diff --git a/private/src/blocks/sidebar/block.json b/private/src/blocks/sidebar/block.json new file mode 100644 index 00000000..52e14875 --- /dev/null +++ b/private/src/blocks/sidebar/block.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", + "apiVersion": 3, + "name": "amnesty-core/sidebar", + "title": "Sidebar", + "description": "For presenting a sidebar on a post type", + "textdomain": "amnesty", + "category": "amnesty-core", + "icon": "editor-table", + "supports": { + "align": false, + "inserter": false, + "multiple": false + }, + "editorScript": "file:./index.js", + "style": "file:./style.css", + "render": "file:./render.php" +} diff --git a/private/src/blocks/sidebar/edit.jsx b/private/src/blocks/sidebar/edit.jsx new file mode 100644 index 00000000..bf4f3d4c --- /dev/null +++ b/private/src/blocks/sidebar/edit.jsx @@ -0,0 +1,46 @@ +import { useBlockProps } from '@wordpress/block-editor'; +import { useEntityRecord } from '@wordpress/core-data'; +import { useSelect } from '@wordpress/data'; +import { store as editorStore } from '@wordpress/editor'; +import { RawHTML } from '@wordpress/element'; + +const { defaultSidebars } = window.aiSidebar; + +export default function Edit() { + const postMeta = useSelect((select) => { + const meta = select(editorStore).getEditedPostAttribute('meta'); + const type = select(editorStore).getEditedPostAttribute('type'); + + /* eslint-disable-next-line no-underscore-dangle */ + const sidebarId = parseInt(meta?._sidebar_id, 10) || (defaultSidebars?.[type]?.[0] ?? 0); + + return { + /* eslint-disable no-underscore-dangle */ + contentMaximised: meta?._maximize_post_content, + sidebarDisabled: meta?._disable_sidebar, + /* eslint-enable no-underscore-dangle */ + sidebarId, + }; + }, []); + + const currentSidebar = useEntityRecord('postType', 'sidebar', postMeta.sidebarId); + const sidebarContent = currentSidebar?.isResolving ? '' : currentSidebar?.record?.content?.raw; + + const blockProps = useBlockProps(); + + if (postMeta.contentMaximised) { + return null; + } + + // an empty sidebar node is required when the sidebar is disabled, + // but the content is not set to maximised, for legacy reasons. + if (postMeta.sidebarDisabled || !sidebarContent) { + return <div {...blockProps}></div>; + } + + return ( + <div {...blockProps}> + <RawHTML>{sidebarContent}</RawHTML> + </div> + ); +} diff --git a/private/src/blocks/sidebar/index.js b/private/src/blocks/sidebar/index.js new file mode 100644 index 00000000..c0749fca --- /dev/null +++ b/private/src/blocks/sidebar/index.js @@ -0,0 +1,10 @@ +import './style.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; + +registerBlockType('amnesty-core/sidebar', { + edit, + save: () => null, +}); diff --git a/private/src/blocks/sidebar/localisation.php b/private/src/blocks/sidebar/localisation.php new file mode 100644 index 00000000..befd942c --- /dev/null +++ b/private/src/blocks/sidebar/localisation.php @@ -0,0 +1,26 @@ +<?php + +declare( strict_types = 1 ); + +if ( ! function_exists( 'amnesty_localise_sidebar' ) ) { + /** + * Add script localisation for the sidebar block + * + * @return void + */ + function amnesty_localise_sidebar(): void { + wp_localize_script( + 'amnesty-core-sidebar-editor-script', + 'aiSidebar', + [ + 'defaultSidebars' => [ + 'post' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar' ) ), + 'page' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar_page' ) ), + 'wp_template' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar' ) ), // for the site editor + ], + ], + ); + } +} + +add_action( 'enqueue_block_assets', 'amnesty_localise_sidebar' ); diff --git a/private/src/blocks/sidebar/render.php b/private/src/blocks/sidebar/render.php new file mode 100644 index 00000000..e4cd63c1 --- /dev/null +++ b/private/src/blocks/sidebar/render.php @@ -0,0 +1,42 @@ +<?php + +declare( strict_types = 1 ); + +// the templates handle the output +if ( 'the_content' === current_filter() ) { + return; +} + +$content_maximised = amnesty_validate_boolish( + get_post_meta( get_the_ID(), '_maximise_post_content', true ), + false, +); + +if ( $content_maximised ) { + return; +} + +$sidebar_disabled = amnesty_validate_boolish( + get_post_meta( get_the_ID(), '_disable_sidebar', true ), + false, +); + +if ( $sidebar_disabled ) { + if ( is_page() ) { + return; + } + + // empty element is intentional + echo '<aside class="wp-block-group article-sidebar"></aside>'; + return; +} + +if ( ! amnesty_is_sidebar_available() ) { + return; +} + +$sidebar = get_post( amnesty_get_sidebar_id() ); + +?> + +<aside class="wp-block-group article-sidebar"><?php echo wp_kses_post( apply_filters( 'the_content', $sidebar->post_content ?? '' ) ); ?></aside> diff --git a/private/src/blocks/sidebar/style.scss b/private/src/blocks/sidebar/style.scss new file mode 100644 index 00000000..c0e5403b --- /dev/null +++ b/private/src/blocks/sidebar/style.scss @@ -0,0 +1,79 @@ +.article-sidebar { + display: flex; + align-items: center; + flex-direction: column; + flex: 0 0 100%; + width: 100%; + max-width: 100%; + + @media all and (min-width: 1110px) { + align-items: flex-start; + flex: 1 1 392px; + width: 392px; + max-width: 392px; + margin: 0 0 0 16px; + } +} + +.article-sidebar:empty { + margin-top: 0; + margin-bottom: 0; +} + +.article-sidebar > * { + margin-bottom: 0; + width: 100%; +} + +.article-sidebar > * + * { + margin-top: 24px; +} + +.article-sidebar .section { + margin: 0 auto; + max-width: 100%; + padding: 24px; +} + +.article-sidebar .linkList-item { + min-height: 0; +} + +.article-sidebar .linksWithIcons-group.is-vertical { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +.article-sidebar .customCard { + height: auto; +} + +.single-petition .article-sidebar { + align-items: stretch; + justify-content: stretch; +} + +@media all and (min-width: 540px) { + .article-sidebar .grid-item { + flex: 1 1 100%; + max-width: none; + min-width: 49%; + } +} + +@media all and (min-width: 840px) { + .single-petition .article-sidebar { + margin-left: 0; + } +} + +@media all and (min-width: 1110px) { + .article-sidebar .linkList li { + width: 100%; + } + + .single-petition .article-sidebar { + margin-top: 0 !important; + } +} diff --git a/private/src/blocks/slide/block.json b/private/src/blocks/slide/block.json new file mode 100644 index 00000000..cf6232e0 --- /dev/null +++ b/private/src/blocks/slide/block.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/slide", + "parent": ["amnesty-core/slide"], + "title": "Slide", + "category": "amnesty-core", + "keywords": ["slider", "carousel"], + "description": "A slide within a slider", + "icon": "", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "render": "file:./render.php", + "supports": { + "align": true, + "inserter": false + }, + "attributes": { + "background": { + "type": "string", + "default": "" + }, + "callToActionLink": { + "type": "string", + "default": "" + }, + "callToActionText": { + "type": "string", + "default": "" + }, + "content": { + "type": "string", + "default": "" + }, + "heading": { + "type": "string", + "default": "" + }, + "hideContent": { + "type": "boolean", + "default": false + }, + "id": { + "type": "string", + "default": "" + }, + "imageId": { + "type": "integer" + }, + "subheading": { + "type": "string", + "default": "" + }, + "timelineContent": { + "type": "string", + "default": "" + }, + "title": { + "type": "string", + "default": "" + } + }, + "usesContext": ["amnesty-core/slider/hasContent"] + +} diff --git a/private/src/blocks/slide/edit.jsx b/private/src/blocks/slide/edit.jsx new file mode 100644 index 00000000..656a70c3 --- /dev/null +++ b/private/src/blocks/slide/edit.jsx @@ -0,0 +1,178 @@ +import classnames from 'classnames'; +import { + InspectorControls, + RichText, + URLInputButton, + useBlockProps, +} from '@wordpress/block-editor'; +import { + PanelBody, + SelectControl, + TextareaControl, + TextControl, + ToggleControl, +} from '@wordpress/components'; +import { useSelect } from '@wordpress/data'; +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import PostMediaSelector from '../../components/PostMediaSelector.jsx'; +import { fetchMediaUrl, randId } from '../../utils'; + +const backgroundOptions = [ + { label: __('Opaque', 'amnesty'), value: '' }, + { label: __('Translucent', 'amnesty'), value: 'opaque' }, + { label: __('Transparent', 'amnesty'), value: 'transparent' }, +]; + +export default function Edit({ attributes, className, clientId, context, setAttributes }) { + const [mediaUrl, setMediaUrl] = useState(''); + const mounted = useRef(); + + const { getSelectedSlide, getSlider } = useSelect((select) => select('amnesty/blocks')); + const selectedSlide = getSelectedSlide(getSlider(clientId)); + // eslint-disable-next-line no-console + console.log({ selectedSlide, clientId }); // @TODO: this doesn't work + + useEffect(() => { + if (!mounted.current) { + mounted.current = true; + if (!attributes.id) { + setAttributes({ id: randId() }); + } + } + }, [attributes.id, setAttributes]); + + useEffect(() => { + fetchMediaUrl(attributes.imageId, setMediaUrl); + }, [attributes.imageId]); + + const controls = () => ( + <InspectorControls> + <PanelBody title={__('Options', 'amnesty')}> + <TextControl + label={__('Slide Title', 'amnesty')} + onChange={(title) => setAttributes({ title })} + value={attributes.title} + /> + <TextareaControl + label={__('Slide Timeline Text', 'amnesty')} + onChange={(timelineContent) => setAttributes({ timelineContent })} + value={attributes.timelineContent} + /> + <label style={{ display: 'block', marginBottom: '5px' }}> + {__('Slide Background', 'amnesty')} + </label> + <PostMediaSelector + mediaId={attributes.imageId} + onUpdate={(imageId) => setAttributes({ imageId })} + /> + <hr /> + <SelectControl + label={__('Background Style', 'amnesty')} + value={attributes.background} + options={backgroundOptions} + onChange={(background) => setAttributes({ background })} + /> + <ToggleControl + label={__('Hide Content', 'amnesty')} + checked={attributes.hideContent} + onChange={(hideContent) => setAttributes({ hideContent })} + help={ + <span> + {__( + 'By enabling this you will hide the content on *THIS* slide. To disable content on all slides go to the "Options" and toggle the "Has Content" field.', + 'amnesty', + )} + </span> + } + /> + </PanelBody> + </InspectorControls> + ); + + const classes = classnames(className, 'slide', { + [`has-${attributes.background}-background`]: !!attributes.background, + }); + + const blockProps = useBlockProps({ + className: classes, + }); + + const style = {}; + if (mediaUrl) { + style.backgroundImage = `url("${mediaUrl}")`; + } + + return ( + <> + {controls()} + <div {...blockProps} style={style}> + {attributes.timelineContent && ( + <div className="slide-timelineContent"> + <div className="slide-timelineContent-inner"> + <RichText + tagname="span" + placeholder={__('TimeLine Content', 'amnesty')} + value={attributes.timelineContent} + onChange={(timelineContent) => setAttributes({ timelineContent })} + allowedFormats={[]} + format="string" + aria-label={__('Timeline content field', 'amnesty')} + /> + </div> + </div> + )} + {!attributes.hideContent && context?.['amnesty-core/slider/hasContent'] && ( + <div className="slide-contentContainer"> + <h1 className="slide-title"> + <RichText + tagname="span" + placeholder={__('Heading', 'amnesty')} + value={attributes.heading} + onChange={(heading) => setAttributes({ heading })} + allowedFormats={[]} + format="string" + /> + </h1> + <h2 className="slide-subtitle"> + <RichText + tagname="span" + placeholder={__('Sub-Heading', 'amnesty')} + value={attributes.subheading} + onChange={(subheading) => setAttributes({ subheading })} + allowedFormats={[]} + format="string" + /> + </h2> + <div className="slide-content"> + <RichText + tagname="p" + placeholder={__('Content', 'amnesty')} + value={attributes.content} + onChange={(content) => setAttributes({ content })} + allowedFormats={[]} + /> + </div> + <div className="slide-callToAction"> + <div className="btn"> + <RichText + tagname="span" + placeholder={__('Button Text', 'amnesty')} + value={attributes.callToActionText} + onChange={(callToActionText) => setAttributes({ callToActionText })} + allowedFormats={[]} + format="string" + /> + </div> + <URLInputButton + url={attributes.callToActionLink} + onChange={(callToActionLink) => setAttributes({ callToActionLink })} + /> + </div> + </div> + )} + </div> + </> + ); +} diff --git a/private/src/blocks/slide/editor.scss b/private/src/blocks/slide/editor.scss new file mode 100644 index 00000000..17296ddd --- /dev/null +++ b/private/src/blocks/slide/editor.scss @@ -0,0 +1,22 @@ +.wp-block-amnesty-core-slide { + box-sizing: border-box; +} + +.wp-block-amnesty-core-slide .editor-url-input__button { + position: relative; + margin-left: 16px; +} + +.wp-block-amnesty-core-slide .editor-url-input__button-modal { + position: absolute; + left: 0; + width: 340px; +} + +.slide-callToAction .block-editor-url-input__button .components-toolbar__control { + background-color: var(--wp--preset--color--grey-base); +} + +.slide-callToAction .btn span { + color: var(--wp--preset--color--black); +} diff --git a/private/src/blocks/slide/index.js b/private/src/blocks/slide/index.js new file mode 100644 index 00000000..c7e3dcd0 --- /dev/null +++ b/private/src/blocks/slide/index.js @@ -0,0 +1,13 @@ +import './style.scss'; +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/slide/render.php b/private/src/blocks/slide/render.php new file mode 100644 index 00000000..9e16f6f5 --- /dev/null +++ b/private/src/blocks/slide/render.php @@ -0,0 +1,68 @@ +<?php + +$alignment = $attributes['alignment'] ?? 'left'; +$background_image = $attributes['imageId'] ?? ''; +$content_background = $attributes['background'] ?? ''; +$cta_link = $attributes['callToActionLink'] ?? ''; +$cta_text = $attributes['callToActionText'] ?? ''; +$content = $attributes['content'] ?? ''; +$hide_content = $attributes['hideContent'] ?? false; +$html_id = $attributes['id'] ?? ''; +$subtitle = $attributes['subheading'] ?? ''; +$timeline_content = $attributes['timelineContent'] ?? ''; +$slide_title = $attributes['title'] ?? ''; + +$has_content = $block->context['amnesty-core/slider/hasContent']; + +$slide_classes = classnames( + 'slide', + [ + "is-{$alignment}-aligned" => $alignment, + "has-{$content_background}-background" => $content_background, + ] +); + +$background_image_url = wp_get_attachment_image_url( $background_image, 'full' ); + +$slide_style = ''; + +// Build style background image if background image is set +if ( $background_image_url ) { + $slide_style = "background-image: url({$background_image_url});"; +} + +$wrapper_attributes = get_block_wrapper_attributes( [ 'class' => $slide_classes ] ); + +?> + +<div id="slide-<?php echo esc_attr( $html_id ); ?>" <?php echo wp_kses_data( $wrapper_attributes ); ?> style="<?php echo esc_attr( $slide_style ); ?>" tabindex="0"> +<?php if ( $timeline_content ) : ?> + <div class="slide-timelineContent"> + <div class="slide-timelineContent-inner"><?php echo wp_kses_post( $timeline_content ); ?></div> + </div> +<?php endif; ?> + +<?php if ( ! $hide_content ) : ?> + <?php if ( $has_content ) : ?> + <div class="slide-contentWrapper" tabindex="0"> + <div class="slide-contentContainer"> + <?php if ( $slide_title ) : ?> + <h1 class="slide-title"><?php echo wp_kses_post( $slide_title ); ?></h1> + <?php endif; ?> + + <?php if ( $subtitle ) : ?> + <h2 class="slide-subtitle"><?php echo wp_kses_post( $subtitle ); ?></h2> + <?php endif; ?> + + <div class="slide-content"> + <?php if ( $content ) : ?> + <div><?php echo wp_kses_post( $content ); ?></div> + <?php endif; ?> + + <a class="btn" href="<?php echo esc_url( $cta_link ); ?>"><?php echo wp_kses_post( $cta_text ); ?></a> + </div> + </div> + </div> + <?php endif; ?> +<?php endif; ?> +</div> diff --git a/private/src/blocks/slide/style.scss b/private/src/blocks/slide/style.scss new file mode 100644 index 00000000..d1d4f54b --- /dev/null +++ b/private/src/blocks/slide/style.scss @@ -0,0 +1,251 @@ +@use "../../utils/mixins/icon"; + +.slide { + display: flex; + width: 100%; + min-height: 500px; + background-color: var(--wp--preset--color--grey-base); + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + + @media all and (min-width: 760px) { + min-height: 670px; + padding: 40px 65px; + } + + .rtl & { + justify-content: flex-end; + } +} + +.slide.is-center-aligned { + @media all and (min-width: 760px) { + justify-content: center; + text-align: center; + + .slide-contentContainer { + margin-right: auto; + margin-left: auto; + } + + h1.slide-title, + h2.slide-subtitle, + .slide-content { + text-align: center; + } + + .slide-callToAction { + justify-content: center; + } + } +} + +.slide.is-right-aligned { + @media all and (min-width: 760px) { + justify-content: flex-end; + + .rtl & { + justify-content: flex-start; + } + + .slide-contentContainer { + margin-left: auto; + + .rtl & { + margin-right: auto; + margin-left: 0; + } + } + + .slide-callToAction { + justify-content: flex-end; + + .rtl & { + justify-content: flex-start; + } + } + } +} + +.slides-container { + position: relative; +} + +.slide-contentContainer { + position: relative; + display: flex; + flex-direction: column; + align-self: flex-start; + min-width: 100%; + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + padding: 16px; + + @media all and (min-width: 760px) { + max-width: 500px; + min-width: 250px; + } + + & > * { + margin-bottom: 0; + } + + & > * + * { + margin-top: 12px; + } + + h1, h2 { + font-family: var(--wp--preset--font-family--secondary); + } + + p, .slide-content { + font-family: var(--wp--preset--font-family--primary); + } + + h1, h2, p, span, .slide-content { + color: var(--wp--preset--color--white); + } +} + +.slide.has-opaque-background .slide-contentContainer { + background: linear-gradient(to bottom, color-mix(in srgb, var(--wp--preset--color--black) 50%, transparent) 90%, transparent 100%); +} + +.slide.has-transparent-background .slide-contentContainer { + background: transparent; +} + +.slide-callToAction { + display: flex; + align-items: center; +} + +.slide-contentWrapper { + width: 100%; + max-height: 500px; + + @media all and (min-width: 760px) { + max-height: 670px; + } +} + +.slide-contentWrapper.is-open { + background-color: color-mix(in srgb, var(--wp--preset--color--black) 40%, transparent); + overflow-y: scroll; + + @media all and (min-width: 760px) { + background-color: transparent; + } + + &::before { + content: attr(data-tooltip); + position: absolute; + right: 0; + bottom: 0; + left: 0; + display: block; + padding-bottom: 20px; + color: var(--wp--preset--color--white); + text-align: center; + + @media all and (min-width: 760px) { + display: none; + } + } +} + +.slide-contentWrapper.is-open .slide-contentContainer { + z-index: 2; + background: var(--wp--preset--color--black); +} + +.slide-contentWrapper.is-open .slide-content { + height: auto; +} + +.slide-contentWrapper.is-open .slider-toggleContent::before { + transform: translate(-50%, -50%) rotate(180deg); +} + +.slide-content { + position: relative; + height: 45px; + overflow: hidden; + padding-right: 50px; + + .rtl & { + padding-right: 0; + padding-left: 50px; + } + + @media all and (min-width: 760px) { + height: auto; + padding-right: 0; + + .rtl & { + padding-left: 0; + } + } +} + +h1.slide-title { + font-size: var(--wp--preset--font-size--heading-2); + text-transform: uppercase; + color: var(--wp--preset--color--white) !important; + + .rtl & { + text-align: right; + } +} + +h2.slide-subtitle { + font-size: var(--wp--preset--font-size--heading-3); + color: var(--wp--preset--color--white) !important; + + .rtl & { + text-align: right; + } +} + +.slide-content .btn { + margin-top: 6px; + + @media all and (min-width: 760px) { + margin-top: 24px; + } +} + +.slide-content p { + font-size: var(--wp--preset--font-size--regular); + + &:last-child { + margin-bottom: 0; + } +} + +.slide-timelineContent { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + background: rgba(255, 255, 255, .7); + color: var(--wp--preset--color--black); + padding: 20px; + text-align: center; +} + +.is-style-dark .slide-timelineContent { + background: rgba(0, 0, 0, .3); + color: var(--wp--preset--color--white); +} + +.is-style-light .slide-timelineContent { + background: rgba(255, 255, 255, .7); + color: var(--wp--preset--color--black); +} + +.slide-timelineContent .slide-timelineContent-inner { + max-width: 1000px; + margin: 0 auto; +} diff --git a/private/src/blocks/slider/block.json b/private/src/blocks/slider/block.json new file mode 100644 index 00000000..c0324819 --- /dev/null +++ b/private/src/blocks/slider/block.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/block-slider", + "title": "Slider", + "category": "amnesty-core", + "keywords": ["Slider", "Carousel", "Scroller"], + "description": "", + "icon": "welcome-widgets-menus", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "file:./view.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "render": "file:./render.php", + "attributes": { + "sliderId": { + "type": "string", + "default": "" + }, + "hasArrows": { + "type": "boolean", + "default": true + }, + "showTabs": { + "type": "boolean", + "default": true + }, + "hasContent": { + "type": "boolean", + "default": true + }, + "quantity": { + "type": "number", + "default": 1 + }, + "style": { + "type": "string", + "default": "dark" + }, + "title": { + "type": "string", + "default": "" + } + }, + "providesContext": { + "amnesty-core/slider/hasContent": "hasContent" + }, + "styles": [ + { + "name": "dark", + "label": "dark", + "isDefault": true + }, + { + "name": "light", + "label": "Light", + "isDefault": false + } + ] +} diff --git a/private/src/blocks/slider/edit.jsx b/private/src/blocks/slider/edit.jsx new file mode 100644 index 00000000..383f7171 --- /dev/null +++ b/private/src/blocks/slider/edit.jsx @@ -0,0 +1,167 @@ +import classnames from 'classnames'; +import memoize from 'memize'; +import { times } from 'lodash'; +import { createBlock } from '@wordpress/blocks'; +import { InnerBlocks, InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, TextControl, ToggleControl } from '@wordpress/components'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { randId } from '../../utils'; + +const ALLOWED_BLOCKS = ['amnesty-core/slide']; +const getLayoutTemplate = memoize((blocks) => times(blocks, () => ALLOWED_BLOCKS)); + +const Controls = ({ attributes, setAttributes }) => ( + <InspectorControls> + <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> + <ToggleControl + /* translators: [admin] */ + label={__('Show Arrows', 'amnesty')} + checked={attributes.hasArrows} + onChange={(hasArrows) => setAttributes({ hasArrows })} + /> + + <ToggleControl + /* translators: [admin] */ + label={__('Has Content', 'amnesty')} + checked={attributes.hasContent} + onChange={(hasContent) => setAttributes({ hasContent })} + help={ + <span> + { + /* translators: [admin] */ __( + 'By disabling this you will hide the content in *ALL* slides. To disable this on only one slide, select the desired slide and toggle the "Hide Content" field in the "Options" panel.', + 'amnesty', + ) + } + </span> + } + /> + <ToggleControl + /* translators: [admin] */ + label={__('Show Tabs', 'amnesty')} + checked={attributes.showTabs} + onChange={(showTabs) => setAttributes({ showTabs })} + help={ + <span> + { + /* translators: [admin] */ __( + 'Hide the tabs on the front end. They will still show in the panel to allow you to navigate through each slide.', + 'amnesty', + ) + } + </span> + } + /> + </PanelBody> + <PanelBody title={/* translators: [admin] */ __('Timeline Options', 'amnesty')}> + <TextControl + /* translators: [admin] */ + label={__('Slider Title', 'amnesty')} + onChange={(title) => setAttributes({ title })} + value={attributes.title} + /> + </PanelBody> + </InspectorControls> +); + +export default function Edit({ attributes, className, clientId, setAttributes }) { + const slides = useSelect( + (select) => select('core/block-editor').getBlock(clientId).innerBlocks, + [clientId], // Make sure to update when the block's innerBlocks change + ); + + const { setSlides, setSelectedSlide } = useDispatch('amnesty/blocks'); + const [selectedSlideIndex, setSelectedSlideIndex] = useState(0); + + setSlides( + clientId, + slides.map((s) => s.clientId), + ); + setSelectedSlide(clientId, slides[selectedSlideIndex]?.clientId); + + useEffect(() => { + if (!attributes.sliderId) { + setAttributes({ sliderId: randId() }); + } + }, [attributes.sliderId, setAttributes]); + + const nextSlide = () => setSelectedSlideIndex(selectedSlideIndex + 1); + const prevSlide = () => setSelectedSlideIndex(selectedSlideIndex - 1); + + const addSlide = () => { + // Use setAttributes to modify the innerBlocks + const updatedSlides = [...slides, createBlock('amnesty-core/slide')]; + setAttributes({ innerBlocks: updatedSlides }); + setAttributes({ quantity: updatedSlides.length }); + + nextSlide(); + }; + + const classes = classnames(className, 'slider', { + [`timeline-${attributes.style}`]: !!attributes.style, + }); + + return ( + <> + <Controls attributes={attributes} setAttributes={setAttributes} /> + <div {...useBlockProps({ className: classes })}> + {!!attributes.title && ( + <div className="slider-title"> + <RichText + tagname="span" + /* translators: [admin] */ + placeholder={__('Slider Title', 'amnesty')} + onChange={(title) => setAttributes({ title })} + value={attributes.title} + allowedFormats={[]} + format="string" + /> + </div> + )} + <div className="slides-container"> + {attributes.hasArrows && ( + <> + <button className="slides-arrow slides-arrow--next" onClick={nextSlide}> + {/* translators: [admin] */ __('Next', 'amnesty')} + </button> + <button className="slides-arrow slides-arrow--previous" onClick={prevSlide}> + {/* translators: [admin] */ __('Previous', 'amnesty')} + </button> + </> + )} + <div className="slides"> + <InnerBlocks + template={getLayoutTemplate(attributes.quantity || 5)} // Fallback to 5 if quantity is undefined + templateLock="all" + /> + </div> + </div> + <nav className="slider-nav"> + {slides.map((slide, index) => { + // Use clientId or slide.title for unique keys + const key = slide.attributes.title || slide.clientId; + + return ( + <button + key={key} + className={classnames('slider-navButton', { + 'is-active': selectedSlideIndex === index, + })} + onClick={() => setSelectedSlideIndex(index)} // Corrected to set selected slide + > + {/* translators: [admin] */} + {slide.attributes.title || __('No Title', 'amnesty')} + </button> + ); + })} + <button className="slider-navButton" onClick={addSlide}> + {/* translators: [admin] */ __('Add Slide', 'amnesty')} + </button> + </nav> + </div> + </> + ); +} diff --git a/private/src/blocks/slider/editor.scss b/private/src/blocks/slider/editor.scss new file mode 100644 index 00000000..568ef15c --- /dev/null +++ b/private/src/blocks/slider/editor.scss @@ -0,0 +1,9 @@ +.wp-block-amnesty-core-block-slider { + max-width: 100% !important; + width: 100% !important; +} + +.wp-block-amnesty-core-block-slider .block-editor-block-list__layout { + display: flex; + overflow: hidden; +} diff --git a/private/src/blocks/slider/index.js b/private/src/blocks/slider/index.js new file mode 100644 index 00000000..e1e6b9e1 --- /dev/null +++ b/private/src/blocks/slider/index.js @@ -0,0 +1,16 @@ +import './editor.scss'; + +import { assign } from 'lodash'; +import { InnerBlocks } from '@wordpress/block-editor'; +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +import '../../store'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: assign(() => <InnerBlocks.Content />, { displayName: 'SliderBlockSave' }), +}); diff --git a/private/src/blocks/slider/render.php b/private/src/blocks/slider/render.php new file mode 100644 index 00000000..828d1604 --- /dev/null +++ b/private/src/blocks/slider/render.php @@ -0,0 +1,79 @@ +<?php + +$slider_id = $attributes['sliderId'] ?? ''; +$quantity = $attributes['quantity'] ?? 1; +$has_arrows = $attributes['hasArrows'] ?? true; +$show_tabs = $attributes['showTabs'] ?? true; +$has_content = $attributes['hasContent'] ?? false; +$style = $attributes['style'] ?? 'dark'; +$slider_title = $attributes['title'] ?? ''; + +$slider_classes = classnames( + 'slider', + [ + 'has-arrows' => $has_arrows, + 'show-tabs' => $show_tabs, + 'has-content' => $has_content, + "style-{$style}" => $style, + ] +); + +$wrapper_attributes = get_block_wrapper_attributes( [ 'class' => $slider_classes ] ); + +$blocks = parse_blocks( get_post_field( 'post_content' ) ); + +$slide_blocks = ''; + +foreach ( $blocks as $block ) { + if ( 'amnesty-core/block-slider' === $block['blockName'] ) { + $slide_blocks = $block['innerBlocks']; + } +} + +$slide_titles = []; + +foreach ( $slide_blocks as $slide ) { + if ( isset( $slide['attrs']['title'] ) ) { + $slide_titles[] = $slide['attrs']['title']; + } +} + +$buttons = ''; + +foreach ( $slide_titles as $index => $slide_title ) { + $buttons .= '<button class="slider-navButton">' . esc_html( $slide_title ) . '</button>'; +} + +// If there are fewer buttons than the $quantity, create additional buttons (blank or default) +for ( $i = count( $slide_titles ); $i < $quantity; $i++ ) { + // Optionally, you could make this button blank or set a default aria-label if needed + $buttons .= '<button class="slider-navButton"></button>'; +} + +?> + +<div id="slider-<?php echo esc_attr( $slider_id ); ?>" <?php echo wp_kses_data( $wrapper_attributes ); ?>> +<?php if ( $slider_title ) : ?> + <h2 class="slider-title"><?php echo wp_kses_post( $slider_title ); ?></h2> +<?php endif; ?> + + <div class="slides-container"> + <div class="slides"> + <?php echo wp_kses_post( $content ); ?> + </div> + <?php if ( $has_arrows ) : ?> + <button class="slides-arrow slides-arrow--previous" aria-label="<?php esc_attr_e( 'Previous slide', 'amnesty' ); ?>"> + <span class="icon icon-arrow-left"></span> + </button> + <button class="slides-arrow slides-arrow--next" aria-label="<?php esc_attr_e( 'Next slide', 'amnesty' ); ?>"> + <span class="icon icon-arrow-right"></span> + </button> + <?php endif; ?> + <?php if ( $show_tabs ) : ?> + <div class="slider-navContainer"> + <div class="slider-nav"> + <?php echo wp_kses_post( $buttons ); ?> + </div> + </div> + <?php endif; ?> + </div> diff --git a/private/src/blocks/slider/style.scss b/private/src/blocks/slider/style.scss new file mode 100644 index 00000000..3a0f430d --- /dev/null +++ b/private/src/blocks/slider/style.scss @@ -0,0 +1,260 @@ +@use '../../utils/mixins/icon' as i; + +.wp-block-amnesty-core-block-slider { + max-width: 100% !important; + width: 100% !important; +} + +.slider-nav { + display: flex; +} + +.slider-navButton { + position: relative; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + min-height: 56px; + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--black); + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--small); + text-transform: uppercase; + flex: 1 1 auto; + font-weight: bold; + border: none; +} + +.slider-navButton.is-nav-selected { + background-color: var(--wp--preset--color--white); + transform: translateY(-4px); +} + +.slider-navButton.is-nav-selected::after { + content: ""; + position: absolute; + top: calc(100% - 4px); + left: 0; + display: block; + width: 100%; + height: 4px; + background-color: var(--wp--preset--color--black); +} + + +.slider { + position: relative; + max-width: 1468px; + margin: 0 auto; + width: 100%; + + .flickity-enabled { + display: flex; + } + + .flickity-viewport { + order: 2; + width: 100%; + height: auto !important; + } + + .flickity-slider { + position: relative !important; + display: flex; + left: auto !important; + + .rtl & { + right: auto !important; + } + } + + .slide { + flex: 1 0 100%; + flex-direction: row; + left: auto !important; + position: relative !important; + transform: none !important; + + .rtl & { + flex-direction: row-reverse; + right: auto !important; + } + } + + .slider-nav { + width: 100%; + } + + .has-arrows .slider-nav { + max-width: calc(100% - 88px); + } + + .slider-navButton { + width: 100%; + flex: 1 0 auto; + flex-direction: row; + left: auto !important; + position: relative !important; + transform: none !important; + + .rtl & { + flex-direction: row-reverse; + right: auto !important; + } + + @media all and (min-width: 760px) { + width: auto; + } + } +} + +.slider-navContainer { + display: flex; + + [data-slider-next] { + order: 3; + + .rtl & { + order: 1; + } + } + + [data-slider-prev] { + order: 1; + + .rtl & { + order: 3; + } + } + + .slider-nav { + order: 2; + } + + [data-slider-next], + [data-slider-prev] { + display: none; + height: auto; + } + + &.has-arrows > [data-slider-next], + &.has-arrows > [data-slider-prev] { + display: flex; + } +} + +.slider-toggleContent { + position: absolute; + right: 0; + top: 0; + display: block; + height: 34px; + width: 34px; + border: 1px solid var(--wp--preset--color--white); + background-color: transparent; + text-indent: -1000vw; + + .rtl & { + left: 0; + right: auto; + } + + &::before { + @include i.icon_scale(271px, 131px, 16px, 16px, 1.7); + position: absolute; + top: 50%; + left: 50%; + content: ""; + display: block; + transform: translate(-50%, -50%); + } + + @media all and (min-width: 760px) { + display: none; + } +} + +.slider-title { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + background: var(--wp--preset--color--white); + padding: 20px; + z-index: 1; + font-family: var(--wp--preset--font-family--secondary); + text-transform: uppercase; + font-size: var(--wp--preset--font-size--regular); + + @media all and (min-width: 760px) { + font-size: var(--wp--preset--font-size--large); + } +} + +.slider.timeline-light .image-metadata { + background-color: transparent; + color: var(--wp--preset--color--black); +} + +.slider.timeline-dark .image-metadata { + background-color: transparent; + color: var(--wp--preset--color--white); +} + +.slides-arrow { + position: absolute; + top: 50%; + left: 0; + background-color: var(--wp--preset--color--white); + width: 50px; + height: 50px; + overflow: hidden; + text-indent: -1000vw; + border: none; + transform: translateY(-50%); + z-index: 10; + cursor: pointer; +} + +.slides-arrow::after { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.slides-arrow--next { + right: 0; + left: initial; + + .rtl & { + right: initial; + left: 0; + } +} + +.rtl .slides-arrow--previous { + right: 0; + left: initial; +} + +.slides-arrow--next::after { + @include i.icon_scale(110px, 265px, 16px, 16px, 2); + content: ""; + display: block; + + .rtl & { + @include i.icon_scale(234px, 240px, 16px, 16px, 2); + } +} + +.slides-arrow--previous::after { + @include i.icon_scale(234px, 240px, 16px, 16px, 2); + content: ""; + display: block; + + .rtl & { + @include i.icon_scale(110px, 265px, 16px, 16px, 2); + } +} diff --git a/private/src/blocks/slider/view.js b/private/src/blocks/slider/view.js new file mode 100644 index 00000000..024007e7 --- /dev/null +++ b/private/src/blocks/slider/view.js @@ -0,0 +1,182 @@ +import './style.scss'; + +import Flickity from 'flickity'; +import 'flickity-as-nav-for'; + +import { debounce } from 'lodash'; + +const createArrowButton = (modifier) => { + const button = document.createElement('button'); + button.setAttribute(`data-slider-${modifier}`, 1); + return button; +}; + +const handleSlideArrowNavigationEvents = (slider, prevArrow, nextArrow) => { + // Grab first slide child + const firstSlide = slider.querySelector('.slides-container .flickity-slider .slide:first-child'); + // Grab last slide child + const lastSlide = slider.querySelector('.slides-container .flickity-slider .slide:last-child'); + + const handleClicks = () => { + // Hide previous arrow if on the last image in the slider + if (firstSlide.classList.contains('is-selected')) { + // eslint-disable-next-line no-param-reassign + prevArrow.style.display = 'none'; + } else { + // eslint-disable-next-line no-param-reassign + prevArrow.style.display = 'block'; + } + + // Hide next arrow if on the last image in the slider + if (lastSlide.classList.contains('is-selected')) { + // eslint-disable-next-line no-param-reassign + nextArrow.style.display = 'none'; + } else { + // eslint-disable-next-line no-param-reassign + nextArrow.style.display = 'block'; + } + }; + + nextArrow?.addEventListener('click', handleClicks); + prevArrow?.addEventListener('click', handleClicks); +}; + +const createSlider = (slider) => { + const slides = slider.querySelector('.slides'); + + if (!slides) { + return; + } + + const isRightToLeft = document.documentElement.getAttribute('dir') === 'rtl'; + + const prevArrow = slider.querySelector('.slides-arrow--previous'); + const nextArrow = slider.querySelector('.slides-arrow--next'); + + const slidesWithContent = Array.from(slider.querySelectorAll('.slide-contentWrapper')); + + slidesWithContent.forEach((wrapper) => { + wrapper.addEventListener('click', (event) => { + const isToggle = event.target.matches('.slider-toggleContent'); + const isOverlay = event.target.matches('.slide-contentWrapper.is-open'); + + if (!isToggle && !isOverlay) { + return; + } + + event.preventDefault(); + + wrapper.classList.toggle('is-open'); + + if (wrapper.classList.contains('is-open')) { + prevArrow.style.display = 'none'; + nextArrow.style.display = 'none'; + } else { + prevArrow.style.display = 'block'; + nextArrow.style.display = 'block'; + } + }); + }); + + const slidesInstance = new Flickity(slides, { + rightToLeft: isRightToLeft, + prevNextButtons: false, + pageDots: false, + }); + + const lastSlideInSlider = slidesInstance.slides.length - 1; + const numberOfSlides = slidesInstance.slides.length; + + slidesInstance.on('change', (slideNo) => { + if (slideNo > 0) { + prevArrow.style.display = 'block'; + } else { + prevArrow.style.display = 'none'; + } + if (slideNo === lastSlideInSlider) { + nextArrow.style.display = 'none'; + } else { + nextArrow.style.display = 'block'; + } + }); + + if (nextArrow && prevArrow) { + prevArrow.addEventListener('click', () => slidesInstance.previous()); + nextArrow.addEventListener('click', () => slidesInstance.next()); + } + + const sliderNavigation = slider.querySelector('.slider-nav'); + + if (!sliderNavigation) { + return; + } + + const slideNavContainer = slider.querySelector('.slider-navContainer'); + let arrowsVisible = false; + const hideArrows = () => slideNavContainer.classList.remove('has-arrows'); + const showArrows = () => slideNavContainer.classList.add('has-arrows'); + + const workoutArrows = (instance) => { + if (instance.slides.length > 1 && !arrowsVisible) { + showArrows(); + arrowsVisible = true; + return; + } + + if (instance.slides.length > 1 && arrowsVisible) { + return; + } + + if (arrowsVisible) { + arrowsVisible = false; + hideArrows(); + } + }; + + const prevNavArrow = createArrowButton('prev'); + const nextNavArrow = createArrowButton('next'); + + const navigationSlider = new Flickity(sliderNavigation, { + asNavFor: slides, + contain: true, + pageDots: false, + prevNextButtons: false, + draggable: false, + groupCells: true, + rightToLeft: isRightToLeft, + on: { + ready() { + if (!slideNavContainer) { + return; + } + + slideNavContainer.appendChild(prevNavArrow); + slideNavContainer.appendChild(nextNavArrow); + + prevNavArrow.addEventListener('click', () => this.previous()); + nextNavArrow.addEventListener('click', () => this.next()); + + workoutArrows(this); + }, + }, + }); + + navigationSlider.on('change', () => workoutArrows(navigationSlider)); + window.addEventListener( + 'resize', + debounce(() => workoutArrows(navigationSlider), 150), + ); + + // we process arrow logic only if the arrows are available + if (numberOfSlides > 1) { + handleSlideArrowNavigationEvents(slider, prevArrow, nextArrow); + if (nextArrow) { + nextArrow.style.display = 'block'; + } + } +}; + +(() => { + const sliders = Array.from(document.querySelectorAll('.slider')); + sliders.forEach(createSlider); +})(); diff --git a/private/src/blocks/stat-counter/block.json b/private/src/blocks/stat-counter/block.json new file mode 100644 index 00000000..2a877be3 --- /dev/null +++ b/private/src/blocks/stat-counter/block.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/counter", + "title": "Counter", + "category": "amnesty-core", + "description": "Add a numeric field which, when scrolled into view, will count up from zero", + "keywords": ["Stat", "Counter"], + "icon": "<svg width=\"61px\" height=\"25px\" viewBox=\"0 0 61 25\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#000000\" fillRule=\"even-odd\" strokeWidth=\"1\" d=\"M17.476,24 L17.476,19.716 L12.292,19.716 L12.292,1.14 L8.404,1.14 C7.972,1.404 7.534,1.638 7.09,1.842 C6.646,2.046 6.172,2.232 5.668,2.4 C5.164,2.568 4.606,2.718 3.994,2.85 C3.382,2.982 2.692,3.108 1.924,3.228 L1.924,3.228 L1.924,6.504 L7,6.504 L7,19.716 L0.844,19.716 L0.844,24 L17.476,24 Z M38.86,24 L38.86,19.536 L33.424,19.536 C32.824,19.536 32.146,19.566 31.39,19.626 C30.634,19.686 29.932,19.752 29.284,19.824 C30.388,18.864 31.444,17.886 32.452,16.89 C33.46,15.894 34.354,14.898 35.134,13.902 C35.914,12.906 36.532,11.91 36.988,10.914 C37.444,9.918 37.672,8.94 37.672,7.98 C37.672,6.876 37.474,5.88 37.078,4.992 C36.682,4.104 36.13,3.342 35.422,2.706 C34.714,2.07 33.868,1.578 32.884,1.23 C31.9,0.882 30.808,0.708 29.608,0.708 C28.72,0.708 27.91,0.786 27.178,0.942 C26.446,1.098 25.75,1.326 25.09,1.626 C24.43,1.926 23.806,2.304 23.218,2.76 C22.63,3.216 22.036,3.744 21.436,4.344 L21.436,4.344 L24.28,7.188 C24.928,6.564 25.63,6.018 26.386,5.55 C27.142,5.082 27.976,4.848 28.888,4.848 C30.088,4.848 31.012,5.142 31.66,5.73 C32.308,6.318 32.632,7.176 32.632,8.304 C32.632,9.12 32.368,9.984 31.84,10.896 C31.312,11.808 30.568,12.78 29.608,13.812 C28.648,14.844 27.496,15.954 26.152,17.142 C24.808,18.33 23.32,19.608 21.688,20.976 L21.688,20.976 L21.688,24 L38.86,24 Z M51.244,24.432 C52.444,24.432 53.596,24.282 54.7,23.982 C55.804,23.682 56.77,23.25 57.598,22.686 C58.426,22.122 59.086,21.426 59.578,20.598 C60.07,19.77 60.316,18.828 60.316,17.772 C60.316,16.284 59.824,15.078 58.84,14.154 C57.856,13.23 56.644,12.576 55.204,12.192 L55.204,12.192 L55.204,12.048 C56.572,11.52 57.64,10.842 58.408,10.014 C59.176,9.186 59.56,8.172 59.56,6.972 C59.56,5.964 59.356,5.076 58.948,4.308 C58.54,3.54 57.964,2.886 57.22,2.346 C56.476,1.806 55.588,1.398 54.556,1.122 C53.524,0.846 52.384,0.708 51.136,0.708 C49.648,0.708 48.262,0.966 46.978,1.482 C45.694,1.998 44.488,2.712 43.36,3.624 L43.36,3.624 L46.024,6.864 C46.816,6.24 47.596,5.748 48.364,5.388 C49.132,5.028 49.972,4.848 50.884,4.848 C51.94,4.848 52.768,5.07 53.368,5.514 C53.968,5.958 54.268,6.576 54.268,7.368 C54.268,8.28 53.806,9.018 52.882,9.582 C51.958,10.146 50.368,10.428 48.112,10.428 L48.112,10.428 L48.112,14.172 C49.456,14.172 50.572,14.25 51.46,14.406 C52.348,14.562 53.056,14.778 53.584,15.054 C54.112,15.33 54.484,15.672 54.7,16.08 C54.916,16.488 55.024,16.944 55.024,17.448 C55.024,18.312 54.622,18.978 53.818,19.446 C53.014,19.914 51.988,20.148 50.74,20.148 C49.684,20.148 48.682,19.932 47.734,19.5 C46.786,19.068 45.928,18.516 45.16,17.844 L45.16,17.844 L42.712,21.192 C43.6,22.176 44.752,22.962 46.168,23.55 C47.584,24.138 49.276,24.432 51.244,24.432 Z\"/></svg>", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "file:./view.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "render": "file:./render.php", + "supports": { + "align": ["left", "center", "right"] + }, + "attributes": { + "alignment": { + "type": "string", + "default": "" + }, + "duration": { + "type": "number", + "default": 2 + }, + "value": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/scripts/editor/blocks/stat-counter/deprecated.jsx b/private/src/blocks/stat-counter/deprecated.jsx similarity index 100% rename from private/src/scripts/editor/blocks/stat-counter/deprecated.jsx rename to private/src/blocks/stat-counter/deprecated.jsx diff --git a/private/src/blocks/stat-counter/edit.jsx b/private/src/blocks/stat-counter/edit.jsx new file mode 100644 index 00000000..930686e0 --- /dev/null +++ b/private/src/blocks/stat-counter/edit.jsx @@ -0,0 +1,142 @@ +import { isInteger } from 'lodash'; +import apiFetch from '@wordpress/api-fetch'; +import { BlockControls, InspectorControls, useBlockProps } from '@wordpress/block-editor'; +import { Button, RangeControl, TextControl, ToolbarGroup, PanelBody } from '@wordpress/components'; +import { useEntityRecord } from '@wordpress/core-data'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const toRawNumber = (value = '0') => { + if (isInteger(value)) { + return value; + } + + const trimmed = value.replace(/[^\d]/g, ''); + const inted = parseInt(trimmed, 10); + + return inted; +}; + +const toFormattedString = (value, locale = 'en_GB', group = false) => { + if (!value) { + return ''; + } + + const options = { + useGrouping: 'auto', + }; + + if (group) { + options.useGrouping = group; + } + + const formatted = toRawNumber(value).toLocaleString(locale.replace('_', '-'), options); + + return formatted; +}; + +export default function Edit({ attributes, setAttributes }) { + const blockProps = useBlockProps(); + + const [useGrouping, setUseGrouping] = useState(null); + const [preview, setPreviewing] = useState(false); + const [current, setCurrent] = useState('0'); + const [progress, setProgress] = useState(0); + + const { language } = useEntityRecord('root', 'site'); + const formatForLocale = (value, group = null) => toFormattedString(value, language, group); + + useEffect(() => { + apiFetch({ path: '/wp/v2/settings' }).then((settings) => { + setUseGrouping(settings?.amnestyCoreI18n?.enforce_grouping_separators === 'on'); + }); + }, []); + + const countUp = () => { + const duration = Math.abs(attributes.duration * 1000); + const end = toRawNumber(attributes.value); + let startTime = null; + + const step = (timestamp) => { + if (!startTime) { + startTime = timestamp; + } + + const newProgress = Math.min((timestamp - startTime) / duration, 1); + const newCurrent = Math.floor(progress * end); + + setCurrent(formatForLocale(newCurrent, useGrouping)); + setProgress(newProgress); + + if (progress < 1) { + requestAnimationFrame(step); + } + }; + + requestAnimationFrame(step); + }; + + const togglePreview = () => { + setCurrent(0); + setProgress(0); + setPreviewing(!preview); + + const willBePreviewing = !preview; + + if (willBePreviewing) { + countUp(); + } + }; + + if (preview) { + countUp(); + } + + /* translators: [admin] */ + const buttonLabel = preview ? __('Edit Counter', 'amnesty') : __('Preview Counter', 'amnesty'); + + return ( + <> + <InspectorControls> + <PanelBody> + <RangeControl + /* translators: [admin] */ + label={__('Duration', 'amnesty')} + /* translators: [admin] */ + help={__('How long it should take the counter to count up', 'amnesty')} + min={1} + max={5} + step={0.5} + value={attributes.duration} + onChange={(duration) => setAttributes({ duration })} + /> + </PanelBody> + </InspectorControls> + <BlockControls> + <ToolbarGroup> + <Button label={buttonLabel} onClick={togglePreview}> + {preview + ? /* translators: [admin] */ __('Edit', 'amnesty') + : /* translators: [admin] */ __('Preview', 'amnesty')} + </Button> + </ToolbarGroup> + </BlockControls> + <div {...blockProps}> + {!preview && ( + <TextControl + /* translators: [admin] */ + label={__('Enter the value to which this field should count', 'amnesty')} + value={formatForLocale(attributes.value, useGrouping)} + onChange={(value) => setAttributes({ value })} + placeholder={0} + /> + )} + {preview && ( + <div className="preview" style={{ opacity: progress }}> + {formatForLocale(current, useGrouping)} + </div> + )} + </div> + </> + ); +} diff --git a/private/src/styles/blocks/stat-counter/_editor.scss b/private/src/blocks/stat-counter/editor.scss similarity index 100% rename from private/src/styles/blocks/stat-counter/_editor.scss rename to private/src/blocks/stat-counter/editor.scss diff --git a/private/src/blocks/stat-counter/index.js b/private/src/blocks/stat-counter/index.js new file mode 100644 index 00000000..d44ea295 --- /dev/null +++ b/private/src/blocks/stat-counter/index.js @@ -0,0 +1,14 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata.name, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/stat-counter/render.php b/private/src/blocks/stat-counter/render.php new file mode 100644 index 00000000..12a81b9b --- /dev/null +++ b/private/src/blocks/stat-counter/render.php @@ -0,0 +1,19 @@ +<?php + +$value = $attributes['value']; +$options = get_option( 'amnesty_localisation_options_page' ); + +if ( 'on' === ( $options['enforce_grouping_separators'] ?? false ) ) { + $value = number_format_i18n( $value ); +} + +$wrapper_attributes = get_block_wrapper_attributes( + [ + 'class' => "align{$attributes['alignment']}", + 'data-duration' => $attributes['duration'], + 'data-value' => $value, + ] +); + +?> +<div <?php echo wp_kses_data( $wrapper_attributes ); ?>><?php echo wp_kses_post( $value ); ?></div> diff --git a/private/src/blocks/stat-counter/style.scss b/private/src/blocks/stat-counter/style.scss new file mode 100644 index 00000000..809184cf --- /dev/null +++ b/private/src/blocks/stat-counter/style.scss @@ -0,0 +1,19 @@ +.wp-block-amnesty-core-counter { + font-family: var(--wp--preset--font-family--secondary); + font-size: 85px; + font-weight: bold; +} + +.wp-block-amnesty-core-counter.aligncenter { + text-align: center; +} + +.wp-block-amnesty-core-counter.alignright { + text-align: right; + float: none !important; +} + +.wp-block-amnesty-core-counter.alignleft { + text-align: left; + float: none !important; +} diff --git a/private/src/blocks/stat-counter/view.js b/private/src/blocks/stat-counter/view.js new file mode 100644 index 00000000..3ee047ab --- /dev/null +++ b/private/src/blocks/stat-counter/view.js @@ -0,0 +1,98 @@ +import './style.scss'; + +import { isInteger } from 'lodash'; + +const { currentLocale = 'en-GB', enforceGroupingSeparators } = window.amnestyCoreI18n; + +// ensure value is an int +const toRawNumber = (value = '0') => { + if (isInteger(value)) { + return value; + } + + const trimmed = value.replace(/[^\d]/g, ''); + const inted = parseInt(trimmed, 10); + + return inted; +}; + +// format a value as a locale-aware number +const toFormattedString = (value) => { + if (!value) { + return ''; + } + + const options = {}; + + if (enforceGroupingSeparators) { + options.useGrouping = true; + } + + const formatted = toRawNumber(value).toLocaleString(currentLocale.replace('_', '-'), options); + + return formatted; +}; + +// animate an element's value from 0 to its end result +// eslint-disable-next-line default-param-last +const countUp = (target, end, duration = 2000, observerObj) => { + let current = 0; + let progress = 0; + let startTime = 0; + + const step = (timestamp) => { + if (!startTime) { + startTime = timestamp; + } + progress = Math.min((timestamp - startTime) / duration, 1); + current = Math.floor(progress * end); + // eslint-disable-next-line no-param-reassign + target.textContent = toFormattedString(current); + target.setAttribute('style', `opacity: ${progress}`); + + if (progress < 1) { + requestAnimationFrame(step); + } + + // this one's done now. + if (progress === 1) { + observerObj.unobserve(target); + } + }; + + requestAnimationFrame(step); +}; + +// animate once the element's well into view +const observer = new IntersectionObserver( + (entries, observerObj) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) { + return; + } + + if (entry.intersectionRatio < 1) { + return; + } + + const { target } = entry; + const { duration } = target.dataset; + const end = toRawNumber(target.dataset.value); + countUp(target, end, duration * 1000, observerObj); + }); + }, + { + rootMargin: '0px 0px -200px 0px', + threshold: [1], + }, +); + +document.addEventListener('DOMContentLoaded', () => { + const elems = document.querySelectorAll('.wp-block-amnesty-core-counter'); + + Array.from(elems).forEach((elem) => { + // doing this in JS so that it's still visible if the JS doesn't work + elem.setAttribute('style', 'opacity: 0'); + observer.observe(elem); + }); +}); diff --git a/private/src/blocks/term-list/block.json b/private/src/blocks/term-list/block.json new file mode 100644 index 00000000..2d5daadb --- /dev/null +++ b/private/src/blocks/term-list/block.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/term-list", + "title": "Term A–Z", + "category": "amnesty-core", + "description": "List all visible terms in a taxonomy, grouped by first letter", + "keywords": ["Term List", "A-Z Terms", "Countries"], + "icon": "editor-textcolor", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "file:./view.js", + "style": "file:./style-view.css", + "render": "file:./render.php", + "attributes": { + "title": { + "type": "string", + "default": "A-Z of Countries and Regions" + }, + "taxonomy": { + "type": "string", + "default": "location" + }, + "alignment": { + "type": "string", + "default": "" + } + } +} diff --git a/private/src/blocks/term-list/edit.jsx b/private/src/blocks/term-list/edit.jsx new file mode 100644 index 00000000..c90db28f --- /dev/null +++ b/private/src/blocks/term-list/edit.jsx @@ -0,0 +1,130 @@ +import { filter, map } from 'lodash'; +import { + BlockAlignmentToolbar, + BlockControls, + InspectorControls, + RichText, + useBlockProps, +} from '@wordpress/block-editor'; +import { PanelBody, SelectControl } from '@wordpress/components'; +import { useEntityRecords } from '@wordpress/core-data'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const groupTerms = (terms) => + terms?.reduce((grouped, term) => { + const char = term.name.charAt(0).toUpperCase(); + // eslint-disable-next-line no-param-reassign + if (!grouped[char]) grouped[char] = []; + grouped[char].push(term); + return grouped; + }, {}) || {}; + +export default function Edit({ attributes, className, setAttributes }) { + const [activeLetter, setActiveLetter] = useState(''); + + const { records: taxonomies, isResolving: taxonomiesLoading } = useEntityRecords( + 'root', + 'taxonomy', + ); + const { records: terms, isResolving: termsLoading } = useEntityRecords( + 'taxonomy', + attributes.taxonomy, + { per_page: -1 }, + ); + + const [groupedTerms, setGroupedTerms] = useState({}); + const [options, setOptions] = useState([]); + + useEffect(() => { + if (!taxonomiesLoading) { + const filteredTaxonomies = filter(taxonomies, (t) => t.amnesty); + setOptions(map(filteredTaxonomies, (tax) => ({ label: tax.name, value: tax.slug }))); + const currentTaxonomy = filteredTaxonomies.find((t) => t.slug === attributes.taxonomy); + if (currentTaxonomy) { + setAttributes({ taxonomy: currentTaxonomy.slug }); + } + } + }, [taxonomies, taxonomiesLoading, attributes.taxonomy, setAttributes]); + + useEffect(() => { + if (!termsLoading && terms) { + const grouped = groupTerms(terms); + setGroupedTerms(grouped); + setActiveLetter(Object.keys(grouped)[0] || ''); + } + }, [terms, termsLoading]); + + const handleSetActiveLetter = (letter) => { + if (groupedTerms[letter]) setActiveLetter(letter); + }; + + const renderInspectorControls = () => ( + <InspectorControls> + <PanelBody title={__('Display Options', 'amnesty')}> + <SelectControl + label={__('Choose taxonomy to display', 'amnesty')} + options={options} + value={attributes.taxonomy} + onChange={(taxonomy) => setAttributes({ taxonomy })} + /> + </PanelBody> + </InspectorControls> + ); + + const renderBlockControls = () => ( + <BlockControls> + <BlockAlignmentToolbar + value={attributes.alignment} + onChange={(alignment) => setAttributes({ alignment })} + /> + </BlockControls> + ); + + const letterItems = groupedTerms[activeLetter] || []; + + const blockProps = useBlockProps({ + className, + }); + + return ( + <> + {renderInspectorControls()} + {renderBlockControls()} + <aside {...blockProps}> + <RichText + tagName="h2" + format="string" + className={attributes.alignment ? `is-${attributes.alignment}-aligned` : ''} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + placeholder={__('A-Z of Countries and Regions', 'amnesty')} + withoutInteractiveFormatting + /> + <div className="navigation"> + {/* Render buttons for each letter */} + {Object.keys(groupedTerms).map((letter) => ( + <button + key={letter} + className={letter === activeLetter ? 'is-active' : ''} + onClick={() => handleSetActiveLetter(letter)} + disabled={groupedTerms[letter]?.length === 0} + > + {letter} + </button> + ))} + </div> + <div className="listContainer"> + <div className="activeLetter">{activeLetter}</div> + <ul className="listItems"> + {letterItems.map((item) => ( + <li className="listItem" key={item.id}> + <a href={item.link}>{item.name}</a> + </li> + ))} + </ul> + </div> + </aside> + </> + ); +} diff --git a/private/src/blocks/term-list/index.js b/private/src/blocks/term-list/index.js new file mode 100644 index 00000000..a1823e39 --- /dev/null +++ b/private/src/blocks/term-list/index.js @@ -0,0 +1,10 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; + +registerBlockType(metadata, { + ...metadata, + edit, + save: () => null, +}); diff --git a/private/src/blocks/term-list/render.php b/private/src/blocks/term-list/render.php new file mode 100644 index 00000000..954d0df9 --- /dev/null +++ b/private/src/blocks/term-list/render.php @@ -0,0 +1,84 @@ +<?php + +if ( ! function_exists( 'amnesty_term_list_block_get_terms' ) ) { + /** + * Retrieve terms for the term list block + * + * @package Amnesty\Blocks + * + * @param string $taxonomy the taxonomy name + * + * @return array<int,WP_Term> + */ + function amnesty_term_list_block_get_terms( string $taxonomy ) { + return get_terms( + [ + 'taxonomy' => $taxonomy, + 'hide_empty' => false, + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + 'meta_query' => [ + 'relation' => 'AND', + [ + 'relation' => 'OR', + [ + 'key' => 'type', + 'value' => 'default', + 'compare' => '=', + ], + [ + 'key' => 'type', + 'compare' => 'NOT EXISTS', + ], + ], + ], + ] + ); + } +} + +if ( ! taxonomy_exists( $attributes['taxonomy'] ) ) { + return; +} + +$cache_key = md5( sprintf( '%s:%s', __FILE__, $attributes['taxonomy'] ) ); +$terms = wp_cache_get( $cache_key ); + +if ( ! $terms ) { + $terms = amnesty_term_list_block_get_terms( $attributes['taxonomy'] ); + wp_cache_add( $cache_key, $terms ); +} + +$groups = group_terms_by_initial_ascii_letter( $terms ); + +foreach ( $groups as $key => &$terms ) { + usort( + $terms, + fn ( WP_Term $a, WP_Term $b ): int => remove_accents( $a->name ) <=> remove_accents( $b->name ) + ); +} + +$letters = array_keys( $groups ); +$first = $letters[0]; + +?> +<aside class="wp-block-amnesty-core-term-list"> + <h2 class="<?php echo esc_attr( $attributes['alignment'] ? sprintf( 'u-text%s', ucfirst( $attributes['alignment'] ) ) : '' ); ?>"><?php echo esc_html( $attributes['title'] ); ?></h2> + <div class="navigation"> + <?php foreach ( $letters as $letter ) : ?> + <button class="<?php echo esc_attr( $first === $letter ? 'is-active' : '' ); ?>" <?php disabled( empty( $groups[ $letter ] ) ); ?>><?php echo esc_html( $letter ); ?></button> + <?php endforeach; ?> + </div> + <div class="listContainer"> + <div class="activeLetter"><?php echo esc_html( $first ); ?></div> + <?php foreach ( $letters as $letter ) : ?> + <?php if ( empty( $groups[ $letter ] ) ) continue; // phpcs:ignore Generic.ControlStructures.InlineControlStructure.NotAllowed ?> + <ul class="listItems" data-key="<?php echo esc_attr( $letter ); ?>" style="display:<?php echo esc_attr( $first === $letter ? 'flex' : 'none' ); ?>"> + <?php foreach ( $groups[ $letter ] as $_term ) : ?> + <li class="listItem"> + <a href="<?php echo esc_url( amnesty_term_link( $_term ) ); ?>"><?php echo esc_html( $_term->name ); ?></a> + </li> + <?php endforeach; ?> + </ul> + <?php endforeach; ?> + </div> +</aside> diff --git a/private/src/blocks/term-list/style.scss b/private/src/blocks/term-list/style.scss new file mode 100644 index 00000000..331ccf7f --- /dev/null +++ b/private/src/blocks/term-list/style.scss @@ -0,0 +1,113 @@ +.wp-block-amnesty-core-term-list .navigation { + margin-bottom: 48px; + text-align: center; + + @media all and (min-width: 760px) { + text-align: left; + + .rtl & { + text-align: right; + } + } +} + +.wp-block-amnesty-core-term-list .navigation button { + appearance: none; + border: none; + margin: 1px; + width: 75px; + height: 75px; + background-color: var(--wp--preset--color--grey-lighter); + font-family: var(--wp--preset--font-family--secondary); + font-size: 28px; + font-weight: bold; + color: var(--wp--preset--color--black); + + &[disabled] { + color: var(--wp--preset--color--grey-base); + + &:hover, + &:active, + &:focus { + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--grey-base); + cursor: auto; + } + } + + &.is-active { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + } + + &:hover, + &:active, + &:focus { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + transition: background-color .25s, color .25s; + cursor: pointer; + } +} + +.wp-block-amnesty-core-term-list .listContainer { + display: flex; + align-items: stretch; +} + +.wp-block-amnesty-core-term-list .activeLetter { + flex-basis: 10%; + font-family: var(--wp--preset--font-family--secondary); + font-size: 80px; + line-height: 1; +} + +.wp-block-amnesty-core-term-list .listItems { + flex-direction: row; + display: flex; + flex-wrap: wrap; + width: 100%; + margin: 0; + list-style: none; +} + +.wp-block-amnesty-core-term-list .listItem { + display: inline-flex; + flex: 1 1 100%; + max-width: 100%; + margin-bottom: 24px; + padding-right: 12px; + + .rtl & { + padding-right: 0; + padding-left: 12px; + } + + @media all and (min-width: 540px) { + flex-basis: 50%; + max-width: 50%; + } + + @media all and (min-width: 760px) { + flex-basis: 25%; + max-width: 25%; + } +} + +.wp-block-amnesty-core-term-list .listItems a { + text-decoration: none; + color: inherit; + + &:hover, + &:active, + &:focus { + text-decoration: underline; + text-decoration-skip-ink: auto; + } +} + +.rtl .wp-block-amnesty-core-term-list .navigation { + @media all and (min-width: 760px) { + text-align: right; + } +} diff --git a/private/src/blocks/term-list/view.js b/private/src/blocks/term-list/view.js new file mode 100644 index 00000000..14d48adb --- /dev/null +++ b/private/src/blocks/term-list/view.js @@ -0,0 +1,48 @@ +import './style.scss'; + +const showCorrectList = (target) => { + const letter = target.textContent; + const block = target.parentElement.parentElement; // block container + const lists = block.querySelectorAll('.listItems'); + const activeLetter = block.querySelector('.activeLetter'); + + activeLetter.innerText = letter; + + Array.from(lists).forEach((list) => { + const display = list.dataset.key === letter ? 'flex' : 'none'; + list.setAttribute('style', `display:${display}`); + }); +}; + +const handleBlockClickEvents = (event) => { + const { target } = event; + const { nodeName } = target; + + if (nodeName !== 'BUTTON') { + return; + } + + if (target.getAttribute('disabled')) { + return; + } + + const buttons = target.parentElement.getElementsByTagName('button'); + Array.from(buttons).forEach((button) => { + button.setAttribute('class', ''); + }); + + target.setAttribute('class', 'is-active'); + showCorrectList(target); +}; + +document.addEventListener('DOMContentLoaded', () => { + const elements = document.querySelectorAll('.wp-block-amnesty-core-term-list'); + + if (!elements) { + return; + } + + Array.from(elements).forEach((item) => { + item.addEventListener('click', handleBlockClickEvents); + }); +}); diff --git a/private/src/blocks/tweet/block.json b/private/src/blocks/tweet/block.json new file mode 100644 index 00000000..8c754332 --- /dev/null +++ b/private/src/blocks/tweet/block.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "amnesty-core/tweet-block", + "title": "Tweet Action", + "category": "amnesty-core", + "description": "Add a Tweet Action block", + "icon": "twitter", + "textdomain": "amnesty", + "editorScript": "file:./index.js", + "viewScript": "file:./view.js", + "editorStyle": "file:./index.css", + "style": "file:./style-view.css", + "render": "file:./render.php", + "supports": { + "className": true, + "align": ["left", "center", "right"] + }, + "attributes": { + "title": { + "type": "string", + "default": "" + }, + "content": { + "type": "string", + "default": "" + }, + "size": { + "type": "string", + "default": "" + }, + "alignment": { + "type": "string", + "default": "center" + }, + "embedLink": { + "type": "boolean", + "default": false + } + }, + "styles": [ + { + "name": "default", + "label": "Default", + "isDefault": true + }, + { + "name": "alternative-style", + "label": "Alternative" + } + ] +} diff --git a/private/src/blocks/tweet/deprecated.jsx b/private/src/blocks/tweet/deprecated.jsx new file mode 100644 index 00000000..5025d731 --- /dev/null +++ b/private/src/blocks/tweet/deprecated.jsx @@ -0,0 +1,104 @@ +import classnames from 'classnames'; +import { __ } from '@wordpress/i18n'; + +const blockAttributes = { + title: { + type: 'string', + }, + content: { + type: 'string', + }, + size: { + type: 'string', + }, + alignment: { + type: 'string', + }, +}; + +const v2 = { + supports: { + className: true, + }, + attributes: blockAttributes, + save({ attributes }) { + const { content = '', size = '', title = '', alignment = 'center', className } = attributes; + + const shareBase = 'https://twitter.com/intent/tweet'; + const fullUrl = `${shareBase}?text=${encodeURIComponent(content)}`; + + const blockClasses = classnames(className, 'tweetAction', { + 'tweetAction--narrow': size === 'narrow', + }); + + const buttonClasses = classnames(['btn', 'btn--fill', 'btn--large']); + + return ( + <div className={`tweetBlock align-${alignment}`}> + <div className={blockClasses}> + <div className="tweetAction-header"> + <span className="dashicons dashicons-twitter" aria-label="Twitter Logo"></span> + <h3 className="tweetAction-title">{title}</h3> + </div> + <div className="tweetAction-content">{content}</div> + <div className="tweetButton"> + <a + className={buttonClasses} + href={fullUrl} + target="_blank" + rel="noopener noreferrer" + /* translators: [admin] */ + aria-label={__('Send this Tweet', 'amnesty')} + > + {/* translators: [admin] */ __('Send this Tweet', 'amnesty')} + </a> + </div> + </div> + </div> + ); + }, +}; + +const v1 = { + supports: { + className: false, + }, + attributes: blockAttributes, + save({ attributes }) { + const { centred = false, content = '', size = '', title = '' } = attributes; + + const shareBase = 'https://twitter.com/intent/tweet'; + const fullUrl = `${shareBase}?text=${encodeURIComponent(content)}`; + + const blockClasses = classnames('tweetAction', { + 'tweetAction--narrow': size === 'narrow', + aligncentre: centred === true, + }); + + const buttonClasses = classnames(['btn', 'btn--fill', 'btn--large']); + + return ( + <div className={blockClasses}> + <div className="tweetAction-header"> + <span className="dashicons dashicons-twitter" aria-label="Twitter Logo"></span> + <h3 className="tweetAction-title">{title}</h3> + </div> + <div className="tweetAction-content">{content}</div> + <div> + <a + className={buttonClasses} + href={fullUrl} + target="_blank" + rel="noopener noreferrer" + /* translators: [admin] */ + aria-label={__('Send this Tweet', 'amnesty')} + > + {/* translators: [admin] */ __('Send this Tweet', 'amnesty')} + </a> + </div> + </div> + ); + }, +}; + +export default [v2, v1]; diff --git a/private/src/blocks/tweet/edit.jsx b/private/src/blocks/tweet/edit.jsx new file mode 100644 index 00000000..7288b907 --- /dev/null +++ b/private/src/blocks/tweet/edit.jsx @@ -0,0 +1,111 @@ +import classnames from 'classnames'; + +import { InspectorControls, PlainText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, SelectControl, ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +// https://developer.twitter.com/en/docs/twitter-api/v1/developer-utilities/configuration/api-reference/get-help-configuration +const TCO_LENGTH = 23; + +const getContent = (content) => { + let { length } = content; + let cropAt = 280; + + if (length <= cropAt) { + return content; + } + + content.match(/https?:\/\/[^\s]+/g).forEach((link) => { + length -= link.length; + cropAt += link.length; + + length += Math.min(link.length, TCO_LENGTH); + cropAt -= Math.min(link.length, TCO_LENGTH); + }); + + // limit to maximum tweet length + if (length > 280) { + // eslint-disable-next-line no-param-reassign -- we _want_ to override the param + content = content.substring(0, cropAt); + } + + return content; +}; + +export default function Edit({ attributes, setAttributes }) { + const blockClasses = classnames('tweetAction', { + 'tweetAction--narrow': attributes.size === 'narrow', + }); + const buttonClasses = classnames(['btn', 'btn--fill', 'btn--large']); + + return ( + <> + <InspectorControls> + <PanelBody> + <SelectControl + /* translators: [admin] */ + label={__('Size', 'amnesty')} + value={attributes.size} + onChange={(size) => setAttributes({ size })} + options={[ + /* translators: [admin] */ + { value: '', label: __('Default', 'amnesty') }, + /* translators: [admin] */ + { value: 'narrow', label: __('Narrow', 'amnesty') }, + ]} + /> + <ToggleControl + /* translators: [admin] */ + label={__('Embed Link', 'amnesty')} + /* translators: [admin] */ + help={__('Includes a link to current post/page in tweet', 'amnesty')} + checked={attributes.embedLink} + onChange={(embedLink) => setAttributes({ embedLink })} + /> + </PanelBody> + </InspectorControls> + <div {...useBlockProps()}> + <div className={blockClasses}> + <div className="tweetAction-header"> + <span className="dashicons dashicons-twitter" aria-label="Twitter Logo"></span> + <PlainText + className="tweetAction-title" + /* translators: [admin] */ + placeholder={__('(Action Title)', 'amnesty')} + value={attributes.title} + onChange={(title) => setAttributes({ title })} + /> + </div> + <div className="tweetAction-textBox"> + <PlainText + className="tweetAction-content" + rows={attributes?.className?.match(/is-style-alternative-style/) ? 4 : 8} + /* translators: [admin] */ + placeholder={__('(Place Tweet text proforma here)', 'amnesty')} + value={attributes.content} + onChange={(content) => setAttributes({ content: getContent(content) })} + /> + {attributes.embedLink && ( + <p className="embedLink-placeholder"> + { + /* translators: [admin] */ __( + 'A link to the current page/post will now appear below the Tweet content when published/updated.', + 'amnesty', + ) + } + </p> + )} + </div> + <div> + <button + className={buttonClasses} + aria-label={/* translators: [admin] */ __('Send this Tweet', 'amnesty')} + > + {/* translators: [admin] */ __('Send this Tweet', 'amnesty')} + </button> + </div> + </div> + </div> + </> + ); +} diff --git a/private/src/blocks/tweet/editor.scss b/private/src/blocks/tweet/editor.scss new file mode 100644 index 00000000..b5f20693 --- /dev/null +++ b/private/src/blocks/tweet/editor.scss @@ -0,0 +1,45 @@ +.wp-block-amnesty-core-tweet-block .block-editor-plain-text { + border-radius: 0; +} + +.tweetAction-title { + display: inline-block; + padding: var(--wp--preset--spacing--half); + max-width: calc(100% - 54px); + background: transparent; + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--heading-4); + font-weight: bold; + line-height: 1.4; + text-transform: uppercase; +} + +.tweetAction-content { + margin-top: var(--wp--preset--spacing--half); + margin-bottom: var(--wp--preset--spacing--half); + padding: var(--wp--preset--spacing--half); + font-family: var(--wp--preset--font-family--primary); + font-size: var(--wp--preset--font-size--heading-5); +} + +.tweetAction-button { + padding-right: var(--wp--preset--spacing--half); + padding-left: var(--wp--preset--spacing--half); +} + +.block-editor-block-list__layout .tweetBlock { + display: flex; + min-width: 400px; +} + +.block-editor-block-list__layout .tweetBlock.alignleft { + justify-content: flex-start; +} + +.block-editor-block-list__layout .tweetBlock.aligncenter { + justify-content: center; +} + +.block-editor-block-list__layout .tweetBlock.alignright { + justify-content: flex-end; +} diff --git a/private/src/blocks/tweet/index.js b/private/src/blocks/tweet/index.js new file mode 100644 index 00000000..d44ea295 --- /dev/null +++ b/private/src/blocks/tweet/index.js @@ -0,0 +1,14 @@ +import './editor.scss'; + +import { registerBlockType } from '@wordpress/blocks'; + +import edit from './edit.jsx'; +import metadata from './block.json'; +import deprecated from './deprecated.jsx'; + +registerBlockType(metadata.name, { + ...metadata, + deprecated, + edit, + save: () => null, +}); diff --git a/private/src/blocks/tweet/render.php b/private/src/blocks/tweet/render.php new file mode 100644 index 00000000..dea01c23 --- /dev/null +++ b/private/src/blocks/tweet/render.php @@ -0,0 +1,36 @@ +<?php + +$tweet_url = get_permalink(); +$share_base = 'https://twitter.com/intent/tweet'; +$full_url = sprintf( '%s?text=%s', $share_base, rawurlencode( $attributes['content'] ?? '' ) ); + +$block_classes = 'tweetAction'; +if ( 'narrow' === $attributes['size'] ) { + $block_classes .= ' tweetAction--narrow'; +} +?> + +<div <?php echo wp_kses_data( get_block_wrapper_attributes() ); ?>> + <div class="<?php echo esc_attr( $block_classes ); ?>"> + <div class="tweetAction-header"> + <span class="dashicons dashicons-twitter" aria-label="<?php /* translators: [front] ARIA */ esc_attr_e( 'Twitter Logo', 'amnesty' ); ?>"></span> + <?php if ( isset( $attributes['title'] ) ) : ?> + <h3 class="tweetAction-title"><?php echo esc_html( $attributes['title'] ); ?></h3> + <?php endif; ?> + </div> + <div class="tweetAction-content"> + <?php echo esc_html( $attributes['content'] ); ?> + + <?php if ( $attributes['embedLink'] && $tweet_url ) : ?> + <p class="tweetAction-embed"> + <?php echo esc_url( $tweet_url ); ?> + </p> + <?php endif; ?> + </div> + <div class="tweetButton"> + <a class="btn btn--fill btn--large" href="<?php echo esc_url( $full_url ); ?>" target="_blank" rel="noopener noreferrer" aria-label="<?php /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b012-tweet-action/ */ esc_attr_e( 'Send this Tweet', 'amnesty' ); ?>"> + <?php /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b012-tweet-action/ */ esc_html_e( 'Send this Tweet', 'amnesty' ); ?> + </a> + </div> + </div> +</div> diff --git a/private/src/blocks/tweet/style.scss b/private/src/blocks/tweet/style.scss new file mode 100644 index 00000000..f7e8bf03 --- /dev/null +++ b/private/src/blocks/tweet/style.scss @@ -0,0 +1,153 @@ +.tweetAction { + padding: var(--wp--preset--spacing--single); + max-width: 350px; + background-color: var(--wp--preset--color--grey-lighter); + flex: 1; + + @media all and (min-width: 760px) { + max-width: 480px; + } +} + +.tweetAction--narrow { + max-width: 350px; +} + +.wp-block-amnesty-core-tweet-block.aligncenter { + display: flex; + justify-content: center; +} + +.wp-block-amnesty-core-tweet-block.alignleft { + display: flex; + justify-content: left; + float: unset !important; +} + +.wp-block-amnesty-core-tweet-block.alignright { + display: flex; + justify-content: flex-end; + float: unset !important; +} + +.tweetAction-header { + display: flex; + align-items: center; +} + +.tweetAction .dashicons-twitter { + margin-right: 14px; + width: auto; + height: auto; + font-size: var(--wp--preset--font-size--x-large); + color: var(--wp--preset--color--blue-twitter); +} + +.tweetAction-title { + display: inline-block; + margin-bottom: 0; + text-transform: uppercase; +} + +.tweetAction-content { + margin-top: var(--wp--preset--spacing--half); + margin-bottom: var(--wp--preset--spacing--half); + padding: var(--wp--preset--spacing--half); + min-height: 150px; + max-height: 278px; + overflow-y: auto; + background-color: var(--wp--preset--color--white); + font-family: var(--wp--preset--font-family--primary); + font-size: var(--wp--preset--font-size--heading-5); + + @media all and (min-width: 760px) { + max-height: none; + overflow-y: unset; + } +} + +.wp-block-amnesty-core-tweet-block.is-style-alternative-style .tweetAction .dashicons-twitter { + order: 2; + transform: scale(1.4); + color: var(--wp--preset--color--blue-twitter); + margin-top: var(--wp--preset--spacing--single); + margin-bottom: var(--wp--preset--spacing--half); + margin-right: 0; +} + +.wp-block-amnesty-core-tweet-block.is-style-alternative-style .tweetAction { + background-color: var(--wp--preset--color--white); + padding: var(--wp--preset--spacing--single); + flex-wrap: wrap; + display: flex; + justify-content: center; + height: 100%; + flex-direction: column; +} + +.wp-block-amnesty-core-tweet-block.is-style-alternative-style .tweetAction .tweetAction-content { + min-height: 20px; +} + +.wp-block-amnesty-core-tweet-block.is-style-alternative-style .tweetAction .tweetButton { + align-self: center; +} + +.is-style-alternative-style .tweetAction-header { + flex-direction: column; +} + +.is-style-alternative-style .tweetAction-content { + padding: 0 var(--wp--preset--spacing--double); + min-height: unset; + max-height: unset; + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--heading-5); + text-align: center; +} + +.wp-block-amnesty-core-tweet-block.is-style-alternative-style .tweetAction .btn { + border: none; + display: block; + margin: 0 auto; + padding: var(--wp--preset--spacing--half) var(--wp--preset--spacing--single); + max-width: 230px; + line-height: normal; + color: var(--wp--preset--color--black); + background-color: var(--wp--preset--color--blue-twitter); + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--regular); +} + +.is-style-alternative-style .tweetButton { + display: flex; + justify-content: center; + align-self: center; +} + +.tweetAction-embed { + margin-top: var(--wp--preset--spacing--single); +} + +.wp-block-amnesty-core-tweet-block.is-style-alternative-style .tweetAction .tweetAction-title { + text-align: center; +} + +.tweetAction .tweetAction-textBox { + margin-bottom: var(--wp--preset--spacing--single); + background-color: var(--wp--preset--color--white); + display: flex; + flex-direction: column; +} + +.wp-block-amnesty-core-tweet-block.is-style-alternative-style .tweetAction .tweetAction-textBox { + text-align: center; +} + +.tweetAction .embedLink-placeholder { + padding: 10px; +} + +.tweetAction .tweetAction-content iframe { + width: 100% !important; +} diff --git a/private/src/blocks/tweet/view.js b/private/src/blocks/tweet/view.js new file mode 100644 index 00000000..92dd8f85 --- /dev/null +++ b/private/src/blocks/tweet/view.js @@ -0,0 +1,28 @@ +import './style.scss'; + +const shareBase = 'https://twitter.com/intent/tweet'; + +const handleTweetAction = (e) => { + if (!e.target.classList.contains('btn')) { + return; + } + + e.preventDefault(); + + const container = e.target.parentNode.parentNode; + const content = container.querySelector('.tweetAction-content').innerText; + + const fullUrl = `${shareBase}?text=${encodeURIComponent(content)}`; + + window.open(fullUrl); +}; + +document.addEventListener('DOMContentLoaded', () => { + const blocks = document.getElementsByClassName('tweetAction'); + + if (!blocks.length) { + return; + } + + Array.from(blocks).forEach((block) => block.addEventListener('click', handleTweetAction)); +}); diff --git a/private/src/components/BackgroundImageOriginControl.jsx b/private/src/components/BackgroundImageOriginControl.jsx new file mode 100644 index 00000000..1e39d7f1 --- /dev/null +++ b/private/src/components/BackgroundImageOriginControl.jsx @@ -0,0 +1,27 @@ +import { SelectControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +export default function BackgroundImageOriginControl({ origin, setOrigin }) { + return ( + <SelectControl + /* translators: [admin] */ + label={__('Background Image Origin', 'amnesty')} + options={[ + /* translators: [admin] */ + { label: __('Top', 'amnesty'), value: 'top' }, + /* translators: [admin] */ + { label: __('Right', 'amnesty'), value: 'right' }, + /* translators: [admin] */ + { label: __('Bottom', 'amnesty'), value: 'bottom' }, + /* translators: [admin] */ + { label: __('Left', 'amnesty'), value: 'left' }, + /* translators: [admin] */ + { label: __('Centre', 'amnesty'), value: 'center' }, + /* translators: [admin] */ + { label: __('Initial', 'amnesty'), value: 'initial' }, + ]} + value={origin} + onChange={setOrigin} + /> + ); +} diff --git a/private/src/components/BackgroundImageSelectorControl.jsx b/private/src/components/BackgroundImageSelectorControl.jsx new file mode 100644 index 00000000..61dbc373 --- /dev/null +++ b/private/src/components/BackgroundImageSelectorControl.jsx @@ -0,0 +1,43 @@ +import { MediaUpload, MediaUploadCheck } from '@wordpress/block-editor'; +import { Button } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +function makeRenderer(imageId, onRemove) { + const render = ({ open }) => { + if (!imageId) { + return ( + <Button variant="primary" onClick={open}> + {/* translators: [admin] */ __('Select background image', 'amnesty')} + </Button> + ); + } + + return ( + <> + <Button variant="primary" onClick={open}> + {/* translators: [admin] */ __('Edit image', 'amnesty')} + </Button> + <Button isDestructive variant="secondary" onClick={onRemove} style={{ marginLeft: '6px' }}> + {/* translators: [admin] */ __('Remove image', 'amnesty')} + </Button> + </> + ); + }; + + return render; +} + +export default function BackgroundImageSelectorControl({ imageId, onRemove, onSelect }) { + return ( + <div className="components-base-control"> + <MediaUploadCheck> + <MediaUpload + onSelect={onSelect} + allowedTypes={['image']} + value={imageId} + render={makeRenderer(imageId, onRemove)} + /> + </MediaUploadCheck> + </div> + ); +} diff --git a/private/src/components/MediaMetadata.jsx b/private/src/components/MediaMetadata.jsx new file mode 100644 index 00000000..2a0624c3 --- /dev/null +++ b/private/src/components/MediaMetadata.jsx @@ -0,0 +1,18 @@ +const MediaMetadata = ({ media, showMediaCaption, showMediaCopyright }) => { + if (!showMediaCaption && !showMediaCopyright) { + return null; + } + + return ( + <div className="image-metadata"> + {showMediaCaption && ( + <span className="image-metadataItem image-caption">{media.caption}</span> + )} + {showMediaCopyright && ( + <span className="image-metadataItem image-copyright">{media.description}</span> + )} + </div> + ); +}; + +export default MediaMetadata; diff --git a/private/src/components/MediaMetadataVisibilityControls.jsx b/private/src/components/MediaMetadataVisibilityControls.jsx new file mode 100644 index 00000000..95650b06 --- /dev/null +++ b/private/src/components/MediaMetadataVisibilityControls.jsx @@ -0,0 +1,36 @@ +import { ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +export default function MediaMetadataVisibilityControls({ + type = 'image', + hideCaption, + hideCopyright, + setAttributes, +}) { + /* translators: [admin] */ + let captionLabel = __('Hide Image Caption', 'amnesty'); + /* translators: [admin] */ + let copyrightLabel = __('Hide Image Credit', 'amnesty'); + + if (type === 'video') { + /* translators: [admin] */ + captionLabel = __('Hide Video Caption', 'amnesty'); + /* translators: [admin] */ + copyrightLabel = __('Hide Video Credit', 'amnesty'); + } + + return ( + <> + <ToggleControl + label={captionLabel} + checked={hideCaption} + onChange={() => setAttributes({ hideImageCaption: !hideCaption })} + /> + <ToggleControl + label={copyrightLabel} + checked={hideCopyright} + onChange={() => setAttributes({ hideImageCopyright: !hideCopyright })} + /> + </> + ); +} diff --git a/private/src/components/PostFeaturedVideo.jsx b/private/src/components/PostFeaturedVideo.jsx new file mode 100644 index 00000000..b8c22426 --- /dev/null +++ b/private/src/components/PostFeaturedVideo.jsx @@ -0,0 +1,111 @@ +import { MediaUpload } from '@wordpress/block-editor'; +import { Button } from '@wordpress/components'; +import { Component } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/* translators: [admin] */ +const DEFAULT_SET_FEATURE_VIDEO_LABEL = __('Set featured video', 'amnesty'); +/* translators: [admin] */ +const DEFAULT_REMOVE_FEATURE_VIDEO_LABEL = __('Remove featured video', 'amnesty'); + +class PostFeaturedVideo extends Component { + constructor(...args) { + super(...args); + + this.state = { + media: false, + }; + } + + componentDidMount() { + if (this.props.featuredVideoId && !this.state.media) { + this.fetchMediaObject(); + } + } + + fetchMediaObject() { + const { featuredVideoId } = this.props; + wp.apiRequest({ + path: `/wp/v2/media/${featuredVideoId}`, + }).then((resp) => { + this.setState({ + media: { ...resp }, + }); + }); + } + + onUpdateVideo = (media) => { + if (!media) { + this.setState({ media: false }); + + this.props.onUpdate(''); + return; + } + + this.setState({ media }); + this.props.onUpdate(media.id); + }; + + onRemoveVideo = () => this.onUpdateVideo(false); + + render() { + const { featuredVideoId } = this.props; + const { media } = this.state; + + return ( + <div className="editor-post-featured-image"> + {!!featuredVideoId && ( + <MediaUpload + title={DEFAULT_SET_FEATURE_VIDEO_LABEL} + onSelect={this.onUpdateVideo} + allowedTypes={['video']} + modalClass="editor-post-featured-image__media-modal" + render={({ open }) => ( + <Button className="editor-post-featured-image__preview" onClick={open} /> + )} + /> + )} + {!!featuredVideoId && media && !media.isLoading && ( + <MediaUpload + title={DEFAULT_SET_FEATURE_VIDEO_LABEL} + onSelect={this.onUpdateVideo} + allowedTypes={['video']} + modalClass="editor-post-featured-image__media-modal" + render={({ open }) => ( + <div> + <video> + <source src={media.source_url || media.url} /> + </video> + <Button onClick={open} isSecondary isLarge> + {/* translators: [admin] */ __('Replace Video', 'amnesty')} + </Button> + </div> + )} + /> + )} + {!featuredVideoId && ( + <div> + <MediaUpload + title={DEFAULT_SET_FEATURE_VIDEO_LABEL} + onSelect={this.onUpdateVideo} + allowedTypes={['video']} + modalClass="editor-post-featured-image__media-modal" + render={({ open }) => ( + <Button className="editor-post-featured-image__toggle" onClick={open}> + {DEFAULT_SET_FEATURE_VIDEO_LABEL} + </Button> + )} + /> + </div> + )} + {!!featuredVideoId && ( + <Button onClick={this.onRemoveVideo} isLink isDestructive> + {DEFAULT_REMOVE_FEATURE_VIDEO_LABEL} + </Button> + )} + </div> + ); + } +} + +export default PostFeaturedVideo; diff --git a/private/src/components/PostMediaSelector.jsx b/private/src/components/PostMediaSelector.jsx new file mode 100644 index 00000000..b100d5a1 --- /dev/null +++ b/private/src/components/PostMediaSelector.jsx @@ -0,0 +1,106 @@ +import { MediaUpload } from '@wordpress/block-editor'; +import { Button, Spinner } from '@wordpress/components'; +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +import { fetchMediaUrl } from '../utils'; + +/* translators: [admin] */ +const DEFAULT_SET_MEDIA_LABEL = __('Set Image', 'amnesty'); +/* translators: [admin] */ +const DEFAULT_REPLACE_MEDIA_LABEL = __('Replace Image', 'amnesty'); +/* translators: [admin] */ +const DEFAULT_REMOVE_MEDIA_LABEL = __('Remove Image', 'amnesty'); + +export default function PostMediaSelector(props) { + const { onUpdate } = props; + const [media, setMedia] = useState(null); + const [loading, setLoading] = useState(false); + const mounted = useRef(false); + + // UseEffect to fetch media on mount or when mediaId changes + useEffect(() => { + if (!mounted.current) { + mounted.current = true; + if (props.mediaId) { + setLoading(true); + fetchMediaUrl(props.mediaId, setMedia).then(() => setLoading(false)); + } + } + }, [props.mediaId]); + + // Update media + const doUpdate = (newMedia) => { + if (!newMedia) { + setMedia(null); + onUpdate(); + return; + } + + setLoading(true); + fetchMediaUrl(newMedia.id, setMedia).then(() => { + setLoading(false); + onUpdate(newMedia.id); + }); + }; + + // Remove media + const doRemove = () => doUpdate(false); + + const { + mediaId, + labels: { + set: setMediaLabel = DEFAULT_SET_MEDIA_LABEL, + remove: removeMediaLabel = DEFAULT_REMOVE_MEDIA_LABEL, + replace: replaceMediaLabel = DEFAULT_REPLACE_MEDIA_LABEL, + } = {}, + type: mediaType = 'image', + } = props; + + return ( + <div className="editor-post-featured-image"> + <div> + {!mediaId && ( + <MediaUpload + title={setMediaLabel} + onSelect={doUpdate} + allowedTypes={[mediaType]} + modalClass="editor-post-featured-image__media-modal" + render={({ open }) => ( + <Button className="editor-post-featured-image__toggle" onClick={open}> + {setMediaLabel} + </Button> + )} + /> + )} + + {!!mediaId && ( + <MediaUpload + title={mediaId ? replaceMediaLabel : setMediaLabel} + onSelect={doUpdate} + allowedTypes={[mediaType]} + modalClass="editor-post-featured-image__media-modal" + render={({ open }) => ( + <div> + {!loading && media && ( + <> + {mediaType === 'video' && ( + <video> + <source src={media.source_url || media.url} /> + </video> + )} + {mediaType === 'image' && <img src={media.source_url || media.url} />} + <Button onClick={open}>{replaceMediaLabel}</Button> + </> + )} + {loading && <Spinner />} + </div> + )} + /> + )} + + {!!mediaId && <Button onClick={doRemove}>{removeMediaLabel}</Button>} + </div> + </div> + ); +} diff --git a/private/src/scripts/editor/plugins/appearance-options/AppearanceOptions.jsx b/private/src/editor-plugins/appearance-options/AppearanceOptions.jsx similarity index 94% rename from private/src/scripts/editor/plugins/appearance-options/AppearanceOptions.jsx rename to private/src/editor-plugins/appearance-options/AppearanceOptions.jsx index ff8c6e3a..16192f88 100644 --- a/private/src/scripts/editor/plugins/appearance-options/AppearanceOptions.jsx +++ b/private/src/editor-plugins/appearance-options/AppearanceOptions.jsx @@ -1,4 +1,8 @@ /* eslint-disable no-underscore-dangle */ +import { PanelBody } from '@wordpress/components'; +import { PluginSidebar } from '@wordpress/editor'; +import { __ } from '@wordpress/i18n'; + import FeaturedImage from './components/FeaturedImage.jsx'; import Header from './components/Header.jsx'; import Metadata from './components/Metadata.jsx'; @@ -6,10 +10,6 @@ import RelatedContent from './components/RelatedContent.jsx'; import Sidebar from './components/Sidebar.jsx'; import TermFeature from './components/TermFeature.jsx'; -const { PanelBody } = wp.components; -const { PluginSidebar } = wp.editPost; -const { __ } = wp.i18n; - /** * Renders options specific to the page post type * diff --git a/private/src/scripts/editor/plugins/appearance-options/components/Byline.jsx b/private/src/editor-plugins/appearance-options/components/Byline.jsx similarity index 91% rename from private/src/scripts/editor/plugins/appearance-options/components/Byline.jsx rename to private/src/editor-plugins/appearance-options/components/Byline.jsx index 3bdab6b5..65c9a86a 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/Byline.jsx +++ b/private/src/editor-plugins/appearance-options/components/Byline.jsx @@ -1,10 +1,10 @@ /* eslint-disable camelcase */ -const { PanelRow, TextControl, ToggleControl } = wp.components; -const { compose, ifCondition } = wp.compose; -const { useDispatch, useSelect } = wp.data; -const { Fragment, useCallback } = wp.element; -const { __ } = wp.i18n; +import { PanelRow, TextControl, ToggleControl } from '@wordpress/components'; +import { compose, ifCondition } from '@wordpress/compose'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { Fragment, useCallback } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; const useByline = () => { const { _display_author_info, byline_is_author, byline_entity, byline_context } = useSelect( diff --git a/private/src/scripts/editor/plugins/appearance-options/components/DocumentReference.jsx b/private/src/editor-plugins/appearance-options/components/DocumentReference.jsx similarity index 79% rename from private/src/scripts/editor/plugins/appearance-options/components/DocumentReference.jsx rename to private/src/editor-plugins/appearance-options/components/DocumentReference.jsx index 9620c920..fb4ca8ab 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/DocumentReference.jsx +++ b/private/src/editor-plugins/appearance-options/components/DocumentReference.jsx @@ -1,6 +1,6 @@ -const { TextControl } = wp.components; -const { PluginPostStatusInfo } = wp.editPost; -const { __ } = wp.i18n; +import { TextControl } from '@wordpress/components'; +import { PluginPostStatusInfo } from '@wordpress/editor'; +import { __ } from '@wordpress/i18n'; /** * Render the Document Reference (amnesty.eu) diff --git a/private/src/scripts/editor/plugins/appearance-options/components/FeaturedImage.jsx b/private/src/editor-plugins/appearance-options/components/FeaturedImage.jsx similarity index 92% rename from private/src/scripts/editor/plugins/appearance-options/components/FeaturedImage.jsx rename to private/src/editor-plugins/appearance-options/components/FeaturedImage.jsx index 30a025ee..79fc1438 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/FeaturedImage.jsx +++ b/private/src/editor-plugins/appearance-options/components/FeaturedImage.jsx @@ -1,6 +1,6 @@ /* eslint-disable no-underscore-dangle */ -const { ToggleControl } = wp.components; -const { __ } = wp.i18n; +import { ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; /** * Render the featured image options diff --git a/private/src/scripts/editor/plugins/appearance-options/components/Header.jsx b/private/src/editor-plugins/appearance-options/components/Header.jsx similarity index 91% rename from private/src/scripts/editor/plugins/appearance-options/components/Header.jsx rename to private/src/editor-plugins/appearance-options/components/Header.jsx index 173a3655..18bb3cfd 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/Header.jsx +++ b/private/src/editor-plugins/appearance-options/components/Header.jsx @@ -1,6 +1,6 @@ /* eslint-disable no-underscore-dangle */ -const { PanelBody, ToggleControl } = wp.components; -const { __ } = wp.i18n; +import { PanelBody, ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; /** * Renders options specific to the page header diff --git a/private/src/scripts/editor/plugins/appearance-options/components/Metadata.jsx b/private/src/editor-plugins/appearance-options/components/Metadata.jsx similarity index 93% rename from private/src/scripts/editor/plugins/appearance-options/components/Metadata.jsx rename to private/src/editor-plugins/appearance-options/components/Metadata.jsx index 87a00e80..8bf48c37 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/Metadata.jsx +++ b/private/src/editor-plugins/appearance-options/components/Metadata.jsx @@ -1,10 +1,10 @@ +import { PanelBody, ToggleControl } from '@wordpress/components'; +import { compose, ifCondition } from '@wordpress/compose'; +import { __ } from '@wordpress/i18n'; + import Byline from './Byline.jsx'; import ShareButtons from './ShareButtons.jsx'; -const { PanelBody, ToggleControl } = wp.components; -const { compose, ifCondition } = wp.compose; -const { __ } = wp.i18n; - /** * Render an option to toggle the published date's visibility * diff --git a/private/src/scripts/editor/plugins/appearance-options/components/RelatedContent.jsx b/private/src/editor-plugins/appearance-options/components/RelatedContent.jsx similarity index 88% rename from private/src/scripts/editor/plugins/appearance-options/components/RelatedContent.jsx rename to private/src/editor-plugins/appearance-options/components/RelatedContent.jsx index 61a8e913..272f66aa 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/RelatedContent.jsx +++ b/private/src/editor-plugins/appearance-options/components/RelatedContent.jsx @@ -1,5 +1,5 @@ -const { ToggleControl } = wp.components; -const { __ } = wp.i18n; +import { ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; /** * Renders options specific to related content diff --git a/private/src/scripts/editor/plugins/appearance-options/components/ShareButtons.jsx b/private/src/editor-plugins/appearance-options/components/ShareButtons.jsx similarity index 85% rename from private/src/scripts/editor/plugins/appearance-options/components/ShareButtons.jsx rename to private/src/editor-plugins/appearance-options/components/ShareButtons.jsx index 6b0ffb0e..647a9a67 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/ShareButtons.jsx +++ b/private/src/editor-plugins/appearance-options/components/ShareButtons.jsx @@ -1,7 +1,7 @@ /* eslint-disable no-underscore-dangle */ -const { ToggleControl } = wp.components; -const { compose, ifCondition } = wp.compose; -const { __ } = wp.i18n; +import { ToggleControl } from '@wordpress/components'; +import { compose, ifCondition } from '@wordpress/compose'; +import { __ } from '@wordpress/i18n'; /** * Render the Share Button options diff --git a/private/src/editor-plugins/appearance-options/components/Sidebar.jsx b/private/src/editor-plugins/appearance-options/components/Sidebar.jsx new file mode 100644 index 00000000..6b15802d --- /dev/null +++ b/private/src/editor-plugins/appearance-options/components/Sidebar.jsx @@ -0,0 +1,95 @@ +/* eslint-disable no-underscore-dangle */ +import { PanelBody, SelectControl, ToggleControl } from '@wordpress/components'; +import { useEntityRecords } from '@wordpress/core-data'; +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/** + * Render the Sidebar options + * + * @param {Function} createMetaUpdate creates an update function + * @param {Object} props the plugin props + * + * @returns {wp.element.Component|null} + */ +const Sidebar = ({ createMetaUpdate, props }) => { + const { records, isResolving } = useEntityRecords('postType', 'sidebar'); + const [options, setOptions] = useState([]); + + useEffect(() => { + const optsArray = [ + { + label: __('Use global default sidebar', 'amnesty'), + value: null, + }, + ]; + + if (!isResolving && Array.isArray(records)) { + records.forEach((record) => { + optsArray.push({ + label: record.title.raw, + value: record.id, + }); + }); + } + + setOptions(optsArray); + }, [records, isResolving]); + + if (!['page', 'post'].includes(props.type)) { + return null; + } + + return ( + <PanelBody title={/* translators: [admin] */ __('Sidebar', 'amnesty')} initialOpen={false}> + <ToggleControl + // translators: [admin] + label={__('Maximize Content', 'amnesty')} + help={ + // translators: [admin] + __( + 'Remove the sidebar and the sidebar area on posts and pages. Generally used to create pages with a full-width page design.', + 'amnesty', + ) + } + checked={props.meta._maximize_post_content} + onChange={() => + createMetaUpdate( + '_maximize_post_content', + !props.meta._maximize_post_content, + props.meta, + props.oldMeta, + ) + } + /> + <ToggleControl + // translators: [admin] + label={__('Disable Sidebar', 'amnesty')} + help={ + // translators: [admin] + __( + 'Remove the sidebar, but not the sidebar area; this keeps an empty space to the side of the content. Generally used for text heavy pages.', + 'amnesty', + ) + } + checked={props.meta._disable_sidebar} + onChange={() => + createMetaUpdate( + '_disable_sidebar', + !props.meta._disable_sidebar, + props.meta, + props.oldMeta, + ) + } + /> + <SelectControl + onChange={(sidebarId) => + createMetaUpdate('_sidebar_id', sidebarId, props.meta, props.oldMeta) + } + options={options} + /> + </PanelBody> + ); +}; + +export default Sidebar; diff --git a/private/src/scripts/editor/plugins/appearance-options/components/TermFeature.jsx b/private/src/editor-plugins/appearance-options/components/TermFeature.jsx similarity index 85% rename from private/src/scripts/editor/plugins/appearance-options/components/TermFeature.jsx rename to private/src/editor-plugins/appearance-options/components/TermFeature.jsx index fa04bfe4..e4f7f22a 100644 --- a/private/src/scripts/editor/plugins/appearance-options/components/TermFeature.jsx +++ b/private/src/editor-plugins/appearance-options/components/TermFeature.jsx @@ -1,8 +1,8 @@ -const { map } = lodash; -const { apiFetch } = wp; -const { SelectControl } = wp.components; -const { useEffect, useRef, useState } = wp.element; -const { __ } = wp.i18n; +import { map } from 'lodash'; +import apiFetch from '@wordpress/api-fetch'; +import { SelectControl } from '@wordpress/components'; +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; /** * Render a select control to choose which term archive to feature the post on diff --git a/private/src/editor-plugins/appearance-options/index.jsx b/private/src/editor-plugins/appearance-options/index.jsx new file mode 100644 index 00000000..4887e6c4 --- /dev/null +++ b/private/src/editor-plugins/appearance-options/index.jsx @@ -0,0 +1,44 @@ +import { compose, ifCondition } from '@wordpress/compose'; +import { withSelect, withDispatch } from '@wordpress/data'; +import { registerPlugin } from '@wordpress/plugins'; + +import reviseData from '../../utils/reviseData'; +import AppearanceOptions from './AppearanceOptions.jsx'; + +const plugin = compose([ + withSelect((select) => { + // Grab the post meta that has been edited. + const postMeta = select('core/editor').getEditedPostAttribute('meta') || {}; + // Grab the post meta that was present on load. + const oldPostMeta = select('core/editor').getCurrentPostAttribute('meta') || {}; + + const template = (select('core/editor').getEditedPostAttribute('template') || '') + .replace('templates/', '') + .replace('.php', ''); + + return { + template, + meta: { ...oldPostMeta, ...postMeta }, + oldMeta: oldPostMeta, + type: select('core/editor').getEditedPostAttribute('type'), + }; + }), + withDispatch((dispatch) => ({ + createMetaUpdate(key, value, newMeta = {}, oldMeta = {}) { + const meta = { + ...reviseData(oldMeta, newMeta), + [key]: value, + }; + + dispatch('core/editor').editPost({ meta }); + }, + })), + ifCondition(() => + ['post', 'page'].includes(wp.data.select('core/editor').getEditedPostAttribute('type')), + ), +])(AppearanceOptions); + +registerPlugin('amnesty-appearance', { + icon: 'admin-appearance', + render: plugin, +}); diff --git a/private/src/editor-plugins/index.js b/private/src/editor-plugins/index.js new file mode 100644 index 00000000..0f470b07 --- /dev/null +++ b/private/src/editor-plugins/index.js @@ -0,0 +1,2 @@ +import './appearance-options/index.jsx'; +import './pop-in/index.jsx'; diff --git a/private/src/scripts/editor/plugins/pop-in/block-restrictions.js b/private/src/editor-plugins/pop-in/block-restrictions.js similarity index 81% rename from private/src/scripts/editor/plugins/pop-in/block-restrictions.js rename to private/src/editor-plugins/pop-in/block-restrictions.js index 0aec72ab..18eeeb98 100644 --- a/private/src/scripts/editor/plugins/pop-in/block-restrictions.js +++ b/private/src/editor-plugins/pop-in/block-restrictions.js @@ -1,5 +1,5 @@ -const { getBlockTypes, unregisterBlockType } = wp.blocks; -const { select } = wp.data; +import { getBlockTypes, unregisterBlockType } from '@wordpress/blocks'; +import { select } from '@wordpress/data'; const allowedBlocks = [ 'core/button', diff --git a/private/src/editor-plugins/pop-in/index.jsx b/private/src/editor-plugins/pop-in/index.jsx new file mode 100644 index 00000000..881887ac --- /dev/null +++ b/private/src/editor-plugins/pop-in/index.jsx @@ -0,0 +1,64 @@ +import { ToggleControl } from '@wordpress/components'; +import { compose, ifCondition } from '@wordpress/compose'; +import { select, useDispatch, useSelect } from '@wordpress/data'; +import { Fragment, useCallback } from '@wordpress/element'; +import { PluginDocumentSettingPanel } from '@wordpress/editor'; +import { __ } from '@wordpress/i18n'; +import { registerPlugin } from '@wordpress/plugins'; + +import './block-restrictions'; +import { validateBool } from '../../utils/index'; + +const useRenderTitle = (props) => { + const { renderTitle } = useSelect( + (store) => { + const meta = store('core/editor').getEditedPostAttribute('meta'); + return { + renderTitle: validateBool(meta?.renderTitle) ? 'yes' : 'no', + }; + }, + [props], + ); + + const { editPost } = useDispatch('core/editor'); + const onRenderTitleToggle = useCallback( + (value) => { + editPost({ + meta: { + renderTitle: validateBool(value) ? 'yes' : 'no', + }, + }); + }, + [editPost], + ); + + return { renderTitle, onRenderTitleToggle }; +}; + +const PopInSettings = (props) => { + const { renderTitle, onRenderTitleToggle } = useRenderTitle(props); + + return ( + <Fragment> + <PluginDocumentSettingPanel + name="pop-in" + title={/* translators: [admin] */ __('Pop-in Settings', 'amnesty')} + > + <ToggleControl + // translators: [admin] + label={__('Render Title', 'amnesty')} + // translators: [admin] + help={__('Should the title be rendered when showing this pop-in to the user?', 'amnesty')} + checked={validateBool(renderTitle)} + onChange={(value) => onRenderTitleToggle(value)} + /> + </PluginDocumentSettingPanel> + </Fragment> + ); +}; + +registerPlugin('amnesty-core-pop-in', { + render: compose([ + ifCondition(() => select('core/editor').getEditedPostAttribute('type') === 'pop-in'), + ])(PopInSettings), +}); diff --git a/private/src/styles/blocks/core-blocks/_blockquote-editor.scss b/private/src/editor/_blockquote.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_blockquote-editor.scss rename to private/src/editor/_blockquote.scss diff --git a/private/src/editor/_container.scss b/private/src/editor/_container.scss new file mode 100644 index 00000000..0d6e6942 --- /dev/null +++ b/private/src/editor/_container.scss @@ -0,0 +1,7 @@ +@use '../utils/functions/flexy' as f; + +.container { + @media all and (min-width: 1490px) { + padding: 0 f.flexy-gutter(); + } +} diff --git a/private/src/styles/layout/footer/_editor.scss b/private/src/editor/_footer.scss similarity index 100% rename from private/src/styles/layout/footer/_editor.scss rename to private/src/editor/_footer.scss diff --git a/private/src/styles/blocks/core-blocks/_gallery-editor.scss b/private/src/editor/_gallery.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_gallery-editor.scss rename to private/src/editor/_gallery.scss diff --git a/private/src/editor/_grid.scss b/private/src/editor/_grid.scss new file mode 100644 index 00000000..c0e5c07b --- /dev/null +++ b/private/src/editor/_grid.scss @@ -0,0 +1,278 @@ +[data-type="amnesty-core/block-list"] { + max-width: 100% !important; + width: 100% !important; +} + +.linklist-container { + max-width: 600px; + margin: 0 auto; +} + +.edit-post-visual-editor .linkList:not(.wp-block-gallery) { + list-style: none; +} + +.linkList-item, +.grid-item { + position: relative; + + .editor-url-input__button { + position: relative; + } + + .editor-url-input__button-modal { + position: absolute; + left: 0; + width: 340px; + z-index: 999; + } +} + +.grid-itemTitle a, +.grid-itemMeta, +.linkList-itemTitle, +.linkList-itemMeta { + display: inline-flex !important; + align-items: center; + font-family: var(--wp--preset--font-family--secondary); +} + +.grid-item { + box-sizing: border-box; +} + +.grid-itemContent { + width: 100%; + font-family: var(--wp--preset--font-family--primary); +} + +.grid-itemContent .components-button svg { + fill: unset; +} + +.linkList-options { + position: absolute; + z-index: 10; + right: 0; + top: 0; + background-color: var(--wp--preset--color--white); + + .rtl & { + right: unset; + left: 0; + } +} + +.wp-block-bigbite-postlist { + border: 1px solid var(--wp--preset--color--grey-lightest); + + .filter select { + margin-right: 10px; + } + + .title-wrapper { + padding: 10px; + } + + .post-selectorHeader { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px; + background-color: var(--wp--preset--color--grey-lightest); + } + + .post-selectorHeader .searchbox label, + .post-selectorHeader .searchbox { + display: flex; + flex-grow: 1; + align-items: center; + } + + .post-selectorHeader .searchbox svg { + width: 25px; + height: 25px; + fill: var(--wp--preset--color--grey-base); + } + + .post-selectorHeader input { + width: 100%; + margin-left: 8px; + } + + .post-selectorHeader input, + .post-selectorHeader select { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + border-radius: 0; + padding: 8px; + font-size: var(--wp--preset--font-size--regular); + border: none; + box-shadow: none; + max-height: none; + height: auto; + background-color: transparent; + transition: all .25s ease-in-out; + border-bottom: 2px solid transparent; + } + + .post-selectorHeader select { + margin-left: 14px; + background-color: var(--wp--preset--color--white); + } + + .post-selectorHeader input:focus { + box-shadow: none; + border-bottom: 2px solid var(--wp--preset--color--black); + } + + .post { + position: relative; + display: flex; + align-items: center; + margin-bottom: 8px; + min-height: auto !important; + + &:hover { + background-color: color-mix(in srgb, var(--wp--preset--color--black) 5%, transparent);; + } + } + + .post .editor-block-icon .dashicons-plus { + margin-top: 4px; + } + + .post-figure { + width: 50px; + height: 50px; + flex-basis: 50px; + flex-shrink: 0; + background-color: var(--wp--preset--color--grey-lighter); + background-repeat: no-repeat; + background-size: cover; + margin: 0; + margin-right: 16px; + } + + .post-title { + margin: 0; + line-height: 1; + margin-bottom: 4px; + font-size: var(--wp--preset--font-size--regular); + } + + .post-meta { + font-size: var(--wp--preset--font-size--x-small); + font-style: oblique; + color: rgb(85, 93, 102); + } + + .post-selectorContainer { + display: flex; + justify-content: space-between; + margin: 5px 0; + padding: 0 10px; + } + + .post-list { + flex-basis: 50%; + padding: 0 1%; + max-height: 200px; + height: 200px; + overflow-y: auto; + + &:first-child { + border-right: 1px solid var(--wp--preset--color--grey-lighter); + } + } + + .post button { + position: absolute; + top: 50%; + right: 5px; + opacity: 0; + z-index: -999; + width: 35px; + height: 35px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--wp--preset--color--grey-lighter); + border: none; + border-radius: 50%; + box-shadow: 1px 1px 5px 1px color-mix(in srgb, var(--wp--preset--color--grey-dark) 23%, transparent); + transform: translate(0, -50%); + } + + .post:hover button { + opacity: 1; + z-index: 100; + } + + .post-list > button { + background-color: var(--wp--preset--color--black); + width: 100%; + padding: 12px 18px; + font-size: var(--wp--preset--font-size--x-small); + font-weight: bold; + border: none; + color: var(--wp--preset--color--white); + margin-bottom: 8px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + transition: all .25s ease-in-out; + } + + .post-list > button:not([disabled]):hover, + .post-list > button:not([disabled]):focus, + .post-list > button:not([disabled]):active { + background-color: var(--wp--preset--color--black); + } + + .post-list > button[disabled] { + opacity: .7; + } + + .blocks-plain-text { + line-height: 1.8; + font-size: 1.6em; + font-weight: bold; + } +} + +.grid-item .components-button { + background-color: var(--wp--preset--color--white); +} + +.grid-itemMeta { + overflow: visible; + gap: 6px; + align-items: stretch; +} + +.grid-itemMeta > span { + padding: 2px 12px; + background-color: var(--wp--preset--color--black); + line-height: 1.8; +} + +.grid-itemTitle { + box-sizing: border-box; + margin-top: 0; + width: 100%; + line-height: 1.125; +} + +.grid-itemTitle .block-editor-url-input__button { + display: inline-block; + margin-left: 30px; +} + +.rtl .grid-itemTitle .block-editor-url-input__button { + margin-right: 30px; + margin-left: 0; +} + +.wp-block-bigbite-postlist label, +.wp-block-bigbite-postlist input, +.wp-block-bigbite-postlist select { + text-transform: none; +} diff --git a/private/src/editor/_images.scss b/private/src/editor/_images.scss new file mode 100644 index 00000000..43a90d82 --- /dev/null +++ b/private/src/editor/_images.scss @@ -0,0 +1,83 @@ +@use '../utils/functions/flexy' as f; + +.wp-block-image figcaption { + text-align: left !important; +} + +.rtl .wp-block-image figcaption { + text-align: right !important; +} + +.image-metadata { + position: absolute; + right: 0; + bottom: 0; + left: 0; + display: flex; + flex-direction: column-reverse; + justify-content: space-between; + align-items: flex-end; + width: 100%; + font-size: var(--wp--preset--font-size--small); + background-color: color-mix(in srgb, var(--wp--preset--color--black) 55%, transparent); + color: var(--wp--preset--color--white); + word-break: keep-all; + + @media all and (min-width: 760px) { + flex-direction: row; + gap: 16px; + } +} + +.image-metadataItem { + display: block; + padding: 4px; +} + +// specificity to avoid old image caption class collision +.image-metadataItem.image-caption { + padding: 4px f.flexy-gutter(); + max-width: 800px; + width: 100%; + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--grey-dark); + text-align: left; + + @media all and (min-width: 760px) { + padding: 4px; + background-color: transparent; + color: var(--wp--preset--color--white); + } +} + +.single .image-metadataItem.image-caption { + padding: 4px var(--wp--preset--spacing--single); + + @media all and (min-width: 760px) { + padding: 4px; + } +} + +.image-copyright { + margin-left: auto; + text-align: right; + + @media all and (min-width: 760px) { + max-width: 400px; + } +} + +.rtl .image-metadataItem.image-caption { + text-align: right; +} + +.rtl .image-copyright { + margin-right: auto; + margin-left: 0; + text-align: left; +} + +// alt text field in editor +.page-hero + .components-base-control { + display: none; +} diff --git a/private/src/styles/components/form/_input-editor.scss b/private/src/editor/_inputs.scss similarity index 100% rename from private/src/styles/components/form/_input-editor.scss rename to private/src/editor/_inputs.scss diff --git a/private/src/styles/blocks/core-blocks/_latest-posts-editor.scss b/private/src/editor/_latest-posts.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_latest-posts-editor.scss rename to private/src/editor/_latest-posts.scss diff --git a/private/src/editor/_page-hero.scss b/private/src/editor/_page-hero.scss new file mode 100644 index 00000000..34cbe068 --- /dev/null +++ b/private/src/editor/_page-hero.scss @@ -0,0 +1,192 @@ +[data-type="amnesty-core/block-hero"] { + max-width: 100% !important; + width: 100% !important; +} + +.page-hero { + padding-top: 111px; + padding-bottom: 80px; + min-height: 450px; + background-size: cover; + background-position: center center; + color: var(--wp--preset--color--white); + +} + +.page-hero + .components-base-control { + display: none; +} + +.page-heroTitle { + margin: 0; + padding: 0 20px; + font-size: var(--wp--preset--font-size--heading-1); + line-height: 1.3 !important; + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + color: var(--wp--preset--color--white); + box-decoration-break: clone; +} + +p.page-heroContent { + margin-top: 0; + margin-bottom: 0; + padding: 10px 20px; + max-width: 460px; + font-family: var(--wp--preset--font-family--secondary); + font-size: var(--wp--preset--font-size--heading-5); + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + color: var(--wp--preset--color--white); +} + +.page-heroCta { + position: relative; + display: inline-flex; + align-items: center; + padding: 20px; + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + + .editor-url-input__button { + position: relative; + transform: translateX(50%); + + .rtl & { + transform: translateX(-50%); + } + } + + .editor-url-input__button-modal { + position: absolute; + left: 0; + width: 340px; + } + + .page-heroAlignment--right & .editor-url-input__button-modal { + left: initial; + right: 0; + } + + .page-heroAlignment--center & .editor-url-input__button-modal { + left: initial; + right: calc(50% - 170px); + } +} + +.page-heroSize--small { + min-height: 450px; +} + +.page-heroSize--large { + min-height: 710px; +} + +.page-heroBackground--dark .page-heroContent, +.page-heroBackground--dark .page-heroCta, +.page-heroBackground--dark .page-heroTitle { + background-color: var(--wp--preset--color--black); +} + +.page-heroBackground--light .page-heroContent, +.page-heroBackground--light .page-heroCta, +.page-heroBackground--light .page-heroTitle { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.page-heroBackground--none .page-heroContent, +.page-heroBackground--none .page-heroCta, +.page-heroBackground--none .page-heroTitle { + background-color: transparent; + color: var(--wp--preset--color--white); +} + +.page-hero .container { + width: 100%; + max-width: var(--wp--preset--layout--contentSize); + margin: 0 auto; + + .hero-content { + max-width: 840px; + } +} + +.page-heroAlignment--center .hero-content { + text-align: center; + max-width: 840px; +} + +.page-heroAlignment--center .page-heroContent { + margin: 0 auto; +} + +.page-heroAlignment--center .page-heroTitle.editor-rich-text__tinymce.mce-content-body { + left: 0; +} + +.editor-rich-text__tinymce + .editor-rich-text__tinymce { + background-color: transparent; +} + +.page-heroAlignment--right .hero-content { + margin-left: auto; + text-align: right; + max-width: 840px; + + .rtl & { + margin-left: 0; + margin-right: auto; + text-align: left; + } +} + +.page-heroAlignment--right .page-heroContent { + margin-left: auto; + text-align: right; + + .rtl & { + margin-left: 0; + margin-right: auto; + } +} + +.page-heroAlignment--left .page-heroContent.mce-content-body { + left: 0; + + .rtl & { + right: 0; + } +} + +.page-heroAlignment--right .page-heroContent.mce-content-body { + right: 0; + + .rtl & { + left: 0; + } +} + +.page-heroAlignment--center .page-heroContent.mce-content-body:not(:last-child) { + left: 50%; + transform: translateX(-50%); + margin: 0; +} + +.page-heroAlignment--right .editor-rich-text__tinymce[data-is-placeholder-visible="true"] { + right: 0; +} + +.page-heroCta .editor-rich-text__tinymce.mce-content-body { + line-height: 1; +} + +.page-heroCta .btn { + display: flex; + align-items: center; +} + +.page-heroAlignment--center .has-donation-block .page-heroContent { + margin: 0; +} + +.page-heroAlignment--center .hero-content.has-donation-block { + text-align: left; +} diff --git a/private/src/editor/_pop-in.scss b/private/src/editor/_pop-in.scss new file mode 100644 index 00000000..3873a19a --- /dev/null +++ b/private/src/editor/_pop-in.scss @@ -0,0 +1,4 @@ +.pop-in .wp-block { + max-width: none; + width: 100%; +} diff --git a/private/src/styles/blocks/core-blocks/post/_editor.scss b/private/src/editor/_post.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/post/_editor.scss rename to private/src/editor/_post.scss diff --git a/private/src/styles/blocks/core-blocks/query-pagination/_editor.scss b/private/src/editor/_query-pagination.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/query-pagination/_editor.scss rename to private/src/editor/_query-pagination.scss diff --git a/private/src/styles/blocks/core-blocks/_rss-editor.scss b/private/src/editor/_rss.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_rss-editor.scss rename to private/src/editor/_rss.scss diff --git a/private/src/styles/blocks/core-blocks/_social-links-editor.scss b/private/src/editor/_social-links.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_social-links-editor.scss rename to private/src/editor/_social-links.scss diff --git a/private/src/styles/blocks/tabbed-content/editor.scss b/private/src/editor/_tabbed-content.scss similarity index 100% rename from private/src/styles/blocks/tabbed-content/editor.scss rename to private/src/editor/_tabbed-content.scss diff --git a/private/src/editor/core-mods/details/index.js b/private/src/editor/core-mods/details/index.js new file mode 100644 index 00000000..7a0366e6 --- /dev/null +++ b/private/src/editor/core-mods/details/index.js @@ -0,0 +1,18 @@ +import { assign } from 'lodash'; +import { addFilter } from '@wordpress/hooks'; + +/** + * Remove button styles + */ +addFilter('blocks.registerBlockType', 'amnesty-core', (settings, name) => { + if (name !== 'core/details') { + return settings; + } + + return assign({}, settings, { + supports: { + ...settings.supports, + anchor: true, + }, + }); +}); diff --git a/private/src/editor/core-mods/index.js b/private/src/editor/core-mods/index.js new file mode 100644 index 00000000..7034a04f --- /dev/null +++ b/private/src/editor/core-mods/index.js @@ -0,0 +1,3 @@ +import './details'; +import './post-title'; +import './query/pagination'; diff --git a/private/src/editor/core-mods/post-title/index.js b/private/src/editor/core-mods/post-title/index.js new file mode 100644 index 00000000..ead2f75e --- /dev/null +++ b/private/src/editor/core-mods/post-title/index.js @@ -0,0 +1,18 @@ +import { assign } from 'lodash'; +import { addFilter } from '@wordpress/hooks'; + +/** + * Remove button styles + */ +addFilter('blocks.registerBlockType', 'amnesty-core', (settings, name) => { + if (name !== 'core/post-title') { + return settings; + } + + return assign({}, settings, { + supports: { + ...settings.supports, + anchor: true, + }, + }); +}); diff --git a/private/src/editor/core-mods/query/pagination/index.js b/private/src/editor/core-mods/query/pagination/index.js new file mode 100644 index 00000000..a445050b --- /dev/null +++ b/private/src/editor/core-mods/query/pagination/index.js @@ -0,0 +1,21 @@ +import { assign } from 'lodash'; +import { addFilter } from '@wordpress/hooks'; + +import QueryPaginationNextEdit from './next.jsx'; +import QueryPaginationPreviousEdit from './previous.jsx'; + +addFilter('blocks.registerBlockType', 'amnesty-core', (settings, name) => { + if (name === 'core/query-pagination-next') { + return assign({}, settings, { + edit: QueryPaginationNextEdit, + }); + } + + if (name === 'core/query-pagination-previous') { + return assign({}, settings, { + edit: QueryPaginationPreviousEdit, + }); + } + + return settings; +}); diff --git a/private/src/scripts/editor/blocks/core-mods/query/pagination/next.jsx b/private/src/editor/core-mods/query/pagination/next.jsx similarity index 91% rename from private/src/scripts/editor/blocks/core-mods/query/pagination/next.jsx rename to private/src/editor/core-mods/query/pagination/next.jsx index 4f1458ec..e4ba5915 100644 --- a/private/src/scripts/editor/blocks/core-mods/query/pagination/next.jsx +++ b/private/src/editor/core-mods/query/pagination/next.jsx @@ -1,5 +1,5 @@ -const { useBlockProps, PlainText } = wp.blockEditor; -const { __ } = wp.i18n; +import { useBlockProps, PlainText } from '@wordpress/block-editor'; +import { __ } from '@wordpress/i18n'; const arrowMap = { none: '', diff --git a/private/src/scripts/editor/blocks/core-mods/query/pagination/previous.jsx b/private/src/editor/core-mods/query/pagination/previous.jsx similarity index 91% rename from private/src/scripts/editor/blocks/core-mods/query/pagination/previous.jsx rename to private/src/editor/core-mods/query/pagination/previous.jsx index d5bff607..15ee4ec8 100644 --- a/private/src/scripts/editor/blocks/core-mods/query/pagination/previous.jsx +++ b/private/src/editor/core-mods/query/pagination/previous.jsx @@ -1,5 +1,5 @@ -const { useBlockProps, PlainText } = wp.blockEditor; -const { __ } = wp.i18n; +import { useBlockProps, PlainText } from '@wordpress/block-editor'; +import { __ } from '@wordpress/i18n'; const arrowMap = { none: '', diff --git a/private/src/editor/index.js b/private/src/editor/index.js new file mode 100644 index 00000000..490664f5 --- /dev/null +++ b/private/src/editor/index.js @@ -0,0 +1,2 @@ +import './index.scss'; +import './core-mods'; diff --git a/private/src/editor/index.scss b/private/src/editor/index.scss new file mode 100644 index 00000000..2eed03d8 --- /dev/null +++ b/private/src/editor/index.scss @@ -0,0 +1,15 @@ +@use './blockquote'; +@use './container'; +@use './footer'; +@use './gallery'; +@use './grid'; +@use './images'; +@use './inputs'; +@use './latest-posts'; +@use './page-hero'; +@use './pop-in'; +@use './post'; +@use './query-pagination'; +@use './rss'; +@use './social-links'; +@use './tabbed-content'; diff --git a/private/src/frontend/index.js b/private/src/frontend/index.js new file mode 100644 index 00000000..da4266b6 --- /dev/null +++ b/private/src/frontend/index.js @@ -0,0 +1,33 @@ +import './index.scss'; +import 'intersection-observer'; + +import Overlays from './modules/overlays'; +import fluidText from './modules/fluid-text'; +import languageSelector from './modules/language-selector'; +import header from './modules/header'; +import mobileMenu from './modules/navigation'; +import subcatDrops from './modules/subcategory-dropdown'; +import latestFilters from './modules/latest-filters'; +import searchFilters from './modules/search-filters'; +import filterPosts from './modules/filter-posts'; +import loadVideos from './modules/video-loaded'; +import categorySlider from './modules/category-slider'; +import tabbedNav from './modules/tabbed-nav'; +import addFlickityToTabs from './modules/tabbed-content-flickity'; + +document.addEventListener('DOMContentLoaded', () => { + languageSelector(); + header(); + mobileMenu(); + Overlays(); + subcatDrops(); + latestFilters(); + searchFilters(); + filterPosts(); + categorySlider(); + tabbedNav(); + loadVideos(); + addFlickityToTabs(); + + fluidText(document.getElementsByClassName('article-shareTitle'), 0.9); +}); diff --git a/private/src/frontend/index.scss b/private/src/frontend/index.scss new file mode 100644 index 00000000..7d9ec7af --- /dev/null +++ b/private/src/frontend/index.scss @@ -0,0 +1,72 @@ +// Base +@use "styles/base/reset"; +@use "styles/base/shared"; +@use "styles/base/base"; +@use "styles/base/type"; +@use "styles/base/links"; +@use "styles/base/images"; +@use "styles/base/container"; +@use "styles/base/overlay"; + +// Layout +@use "styles/layout/language-banner"; +@use "styles/layout/header"; +@use "styles/layout/navigation"; +@use "styles/layout/page-hero"; +@use "styles/layout/footer"; + +// Components +@use "styles/components/fluid"; +@use "styles/components/form"; +@use "styles/components/grid"; +@use "styles/components/icon"; +@use "styles/components/list"; +@use "styles/components/modal"; +@use "styles/components/news-filters"; +@use "styles/components/pop-in"; +@use "styles/components/social"; +@use "styles/components/tabbed-nav"; + +// Pages +@use "styles/pages/fourohfour"; +@use "styles/pages/archive"; +@use "styles/pages/article"; +@use "styles/pages/author"; +@use "styles/pages/news"; +@use "styles/pages/petitions"; +@use "styles/pages/search"; +@use "styles/pages/single"; + +// WooCommerce +@use "styles/woocommerce/global"; +@use "styles/woocommerce/shop-index"; +@use "styles/woocommerce/product-archive"; +@use "styles/woocommerce/product-single"; +@use "styles/woocommerce/cart"; +@use "styles/woocommerce/checkout"; +@use "styles/woocommerce/my-account"; +@use "styles/woocommerce/orders"; + +// other +@use "styles/tabbed-content"; + +// Flickity slider, from npm +@import "~flickity/dist/flickity.css"; + +:root { + --wp--preset--layout--contentSize: 1468px; +} + +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); // stylelint-disable property-no-vendor-prefix + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + word-wrap: normal !important; +} diff --git a/private/src/scripts/modules/animate.js b/private/src/frontend/modules/animate.js similarity index 100% rename from private/src/scripts/modules/animate.js rename to private/src/frontend/modules/animate.js diff --git a/private/src/scripts/modules/category-slider.js b/private/src/frontend/modules/category-slider.js similarity index 100% rename from private/src/scripts/modules/category-slider.js rename to private/src/frontend/modules/category-slider.js diff --git a/private/src/scripts/modules/filter-posts.js b/private/src/frontend/modules/filter-posts.js similarity index 100% rename from private/src/scripts/modules/filter-posts.js rename to private/src/frontend/modules/filter-posts.js diff --git a/private/src/scripts/modules/fluid-text.js b/private/src/frontend/modules/fluid-text.js similarity index 100% rename from private/src/scripts/modules/fluid-text.js rename to private/src/frontend/modules/fluid-text.js diff --git a/private/src/scripts/modules/header.js b/private/src/frontend/modules/header.js similarity index 100% rename from private/src/scripts/modules/header.js rename to private/src/frontend/modules/header.js diff --git a/private/src/scripts/modules/language-selector.js b/private/src/frontend/modules/language-selector.js similarity index 100% rename from private/src/scripts/modules/language-selector.js rename to private/src/frontend/modules/language-selector.js diff --git a/private/src/scripts/modules/latest-filters.js b/private/src/frontend/modules/latest-filters.js similarity index 96% rename from private/src/scripts/modules/latest-filters.js rename to private/src/frontend/modules/latest-filters.js index bcd04cbb..2da1705c 100644 --- a/private/src/scripts/modules/latest-filters.js +++ b/private/src/frontend/modules/latest-filters.js @@ -1,4 +1,4 @@ -import { inputsToObject, objectToQueryString, queryStringToObject } from '../utils/url'; +import { inputsToObject, objectToQueryString, queryStringToObject } from '../../utils/url'; const { merge } = lodash; diff --git a/private/src/scripts/modules/navigation.js b/private/src/frontend/modules/navigation.js similarity index 100% rename from private/src/scripts/modules/navigation.js rename to private/src/frontend/modules/navigation.js diff --git a/private/src/scripts/modules/overlays.js b/private/src/frontend/modules/overlays.js similarity index 98% rename from private/src/scripts/modules/overlays.js rename to private/src/frontend/modules/overlays.js index e4142f0c..ff16db38 100644 --- a/private/src/scripts/modules/overlays.js +++ b/private/src/frontend/modules/overlays.js @@ -1,4 +1,4 @@ -import { findTarget, hasOpenOrActiveItems, toggleElementVisibility } from '../utils/dom'; +import { findTarget, hasOpenOrActiveItems, toggleElementVisibility } from '../../utils/dom'; const html = document.documentElement; const classCache = html.className; diff --git a/private/src/scripts/modules/search-filters.js b/private/src/frontend/modules/search-filters.js similarity index 96% rename from private/src/scripts/modules/search-filters.js rename to private/src/frontend/modules/search-filters.js index 0bd5b248..2f991b8d 100644 --- a/private/src/scripts/modules/search-filters.js +++ b/private/src/frontend/modules/search-filters.js @@ -1,5 +1,5 @@ -import { getFormInputData } from '../utils/form-data'; -import { objectToQueryString, queryStringToObject } from '../utils/url'; +import { getFormInputData } from '../../utils/form-data'; +import { objectToQueryString, queryStringToObject } from '../../utils/url'; const { xor } = lodash; diff --git a/private/src/scripts/modules/subcategory-dropdown.js b/private/src/frontend/modules/subcategory-dropdown.js similarity index 100% rename from private/src/scripts/modules/subcategory-dropdown.js rename to private/src/frontend/modules/subcategory-dropdown.js diff --git a/private/src/scripts/modules/tabbed-content-flickity.js b/private/src/frontend/modules/tabbed-content-flickity.js similarity index 100% rename from private/src/scripts/modules/tabbed-content-flickity.js rename to private/src/frontend/modules/tabbed-content-flickity.js diff --git a/private/src/scripts/modules/tabbed-nav.js b/private/src/frontend/modules/tabbed-nav.js similarity index 100% rename from private/src/scripts/modules/tabbed-nav.js rename to private/src/frontend/modules/tabbed-nav.js diff --git a/private/src/scripts/modules/video-loaded.js b/private/src/frontend/modules/video-loaded.js similarity index 100% rename from private/src/scripts/modules/video-loaded.js rename to private/src/frontend/modules/video-loaded.js diff --git a/private/src/frontend/styles/_tabbed-content.scss b/private/src/frontend/styles/_tabbed-content.scss new file mode 100644 index 00000000..7d142554 --- /dev/null +++ b/private/src/frontend/styles/_tabbed-content.scss @@ -0,0 +1,110 @@ +.wp-block-bigbite-tabs .tabsContainer { + display: flex !important; + background-color: var(--wp--preset--color--grey-lighter) !important; + overflow: hidden !important; + padding: 0 44px; +} + +.wp-block-bigbite-tabs .tabsContainer.has-no-nav-arrows { + gap: 0; + padding: 0; +} + +.wp-block-bigbite-tabs .tabsContainer.flickity-enabled { + display: block !important; +} + +.wp-block-bigbite-tabs.is-style-default .tabsContainer, +.wp-block-bigbite-tabs.is-style-grey .tabsContainer { + background-color: var(--wp--preset--color--grey-lighter) !important; +} + +.wp-block-bigbite-tabs.is-style-light .tabsContainer { + background-color: var(--wp--preset--color--white) !important; + color: var(--wp--preset--color--black) !important; +} + +.wp-block-bigbite-tabs .tabsContainer button.tab { + color: var(--wp--preset--color--black) !important; + width: 100%; + display: flex; + justify-content: center; + font-family: var(--wp--preset--font-family--secondary); + min-height: 100% !important; + cursor: pointer; + transition: background-color .5s ease; + white-space: unset; + border: solid transparent !important; + border-width: 0 0 6px 0 !important; + + &::before { + display: block; + text-align: center; + font-size: 80px; + } + + @media all and (min-width: 760px) { + width: 28%; + } +} + +.is-style-dark.wp-block-bigbite-tabs .tabsContainer button.tab { + color: var(--wp--preset--color--white) !important; +} + +.wp-block-bigbite-tabs .tabsContainer button.addNewTabButton { + background-color: var(--wp--preset--color--white) !important; +} + +.wp-block-bigbite-tabs.is-style-dark .tabsContainer button.addNewTabButton { + color: var(--wp--preset--color--white) !important; +} + +.wp-block-bigbite-tabs.tabPanelContainer { + border: none; +} + +.wp-block-bigbite-tabs .tabsContainer button.tab[class*="is-selected"] { + background: none !important; + color: var(--wp--preset--color--black) !important; + border: solid var(--wp--preset--color--black) !important; + border-width: 0 0 6px 0 !important; +} + +.wp-block-bigbite-tabs .tabsContainer.has-no-nav-arrows button.tab[class*="is-selected"] { + border: solid var(--wp--preset--color--black) !important; + border-width: 0 0 6px 0 !important; +} + +.wp-block-bigbite-tabs .tabPanelContainer { + border: none !important; +} + +.wp-block-bigbite-tabs .flickity-button { + background: none; +} + +.wp-block-bigbite-tabs .tabsContainer button.tab:hover { + background-color: var(--wp--preset--color--grey-light) !important; +} + +.wp-block-bigbite-tabs.is-style-default .tabsContainer button.tab:hover, +.wp-block-bigbite-tabs.is-style-grey .tabsContainer button.tab:hover, +.wp-block-bigbite-tabs.is-style-light .tabsContainer button.tab:hover { + background-color: var(--wp--preset--color--grey-light) !important; +} + +.wp-block-bigbite-tabs .flickity-prev-next-button { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + border-radius: 0%; + height: 100%; +} + +.wp-block-bigbite-tabs .flickity-prev-next-button.previous { + left: 0; +} + +.wp-block-bigbite-tabs .flickity-prev-next-button.next { + right: 0; +} diff --git a/private/src/frontend/styles/base/_base.scss b/private/src/frontend/styles/base/_base.scss new file mode 100755 index 00000000..67ead4c1 --- /dev/null +++ b/private/src/frontend/styles/base/_base.scss @@ -0,0 +1,81 @@ +/** + * Apply box-sizing here, then inherit. + * https://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ + */ +html { + box-sizing: border-box; +} + +html.menu-open, +html.mobile-menu-open, +html.search-active, +html.modal-open, +html.lang-open { + body { + overflow: hidden; + } +} + +*, *::after, *::before { + box-sizing: inherit; +} + +/** + * Page level styles. + * + * 1. Use advanced typographic features included in some OpenType fonts. Only enable if + * font supports it. + * 2. Prevent certain mobile browsers from automatically zooming fonts. + * 3. Fonts on OSX will look more consistent with other systems that do not + * render text using sub-pixel anti-aliasing. + */ +body { + // font-feature-settings: "kern", "liga", "pnum"; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ + -moz-osx-font-smoothing: grayscale; /* 3 */ + -webkit-font-smoothing: antialiased; /* 3 */ + overflow-x: hidden; + min-height: 100vh; + margin: 0; + display: flex; + flex-direction: column; +} + +body.admin-bar { + min-height: calc(100vh - 46px); + + @media all and (min-width: 781px) { + min-height: calc(100vh - 32px); + } +} + +body.rtl { + direction: rtl; +} + +main { + position: relative; + flex: 1 0 auto; + display: block; +} + +address { + font-style: normal; +} + +.only-mobile { + @media all and (min-width: 760px) { + display: none !important; + } +} + +.only-desktop { + @media all and (max-width: 759px) { + display: none !important; + } +} + +.is-layout-flex { + display: flex; +} diff --git a/private/src/frontend/styles/base/_container.scss b/private/src/frontend/styles/base/_container.scss new file mode 100644 index 00000000..7a90fcf5 --- /dev/null +++ b/private/src/frontend/styles/base/_container.scss @@ -0,0 +1,25 @@ +@use "../../../utils/functions/flexy" as f; + +.container { + display: block; + width: 100%; + max-width: var(--wp--preset--layout--contentSize); + margin: 0 auto; + padding: 0 f.flexy-gutter(); + + @media all and (min-width: 1490px) { + padding: 0; + } +} + +.container .container { + padding: 0; +} + +.container--small { + max-width: 1113px; +} + +.has-gutter { + padding: 0 40px; +} diff --git a/private/src/frontend/styles/base/_images.scss b/private/src/frontend/styles/base/_images.scss new file mode 100755 index 00000000..215f4181 --- /dev/null +++ b/private/src/frontend/styles/base/_images.scss @@ -0,0 +1,113 @@ +@use "../../../utils/functions/flexy" as f; + +/** + * Images responsive by default. + * + * 1. Fluid. + * 2. Offset `alt` text from surrounding copy + * 3. Setting `vertical-align` removes the whitespace that appears under `img` + * elements when they are dropped into a page as-is. Safer alternative to + * using `display: block;`. + */ +img { + max-width: 100%; /* 1 */ + font-style: oblique; /* 2 */ + vertical-align: middle; /* 3 */ +} + +/** + * Styles for non-responsive images. + * + * 1. Respect if a `width` and/or `height` attribute have been explicitly defined. + * 2. Fix Google Maps, doesn't like fluid images. + */ +img[width], /* 1 */ /* stylelint-disable-line */ +img[height], /* 1 */ /* stylelint-disable-line */ +.gm-style img { /* 2 */ /* stylelint-disable-line */ + max-width: none; +} + +/** + * Remove default figure marging and padding. + */ +figure { + margin: 0; + padding: 0; +} + +.has-caption { + position: relative; + + &[class*="wp-image-"] { + display: inline-block; + } +} + +.image-metadata { + position: absolute; + right: 0; + bottom: 0; + left: 0; + display: flex; + flex-direction: column-reverse; + justify-content: space-between; + align-items: flex-end; + width: 100%; + font-size: var(--wp--preset--font-size--small); + background-color: color-mix(in srgb, var(--wp--preset--color--black) 55%, transparent); + color: var(--wp--preset--color--white); + word-break: keep-all; + + @media all and (min-width: 760px) { + flex-direction: row; + gap: 16px; + } +} + +.image-metadataItem { + display: block; + padding: 4px; +} + +// specificity to avoid old image caption class collision +.image-metadataItem.image-caption { + padding: 4px f.flexy-gutter(); + max-width: 800px; + width: 100%; + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--grey-dark); + text-align: left; + + @media all and (min-width: 760px) { + padding: 4px; + background-color: transparent; + color: var(--wp--preset--color--white); + } +} + +.single .image-metadataItem.image-caption { + padding: 4px var(--wp--preset--spacing--single); + + @media all and (min-width: 760px) { + padding: 4px; + } +} + +.image-copyright { + margin-left: auto; + text-align: right; + + @media all and (min-width: 760px) { + max-width: 400px; + } +} + +.rtl .image-metadataItem.image-caption { + text-align: right; +} + +.rtl .image-copyright { + margin-right: auto; + margin-left: 0; + text-align: left; +} diff --git a/private/src/styles/base/_links.scss b/private/src/frontend/styles/base/_links.scss similarity index 93% rename from private/src/styles/base/_links.scss rename to private/src/frontend/styles/base/_links.scss index 7fcf9cee..54d1f856 100755 --- a/private/src/styles/base/_links.scss +++ b/private/src/frontend/styles/base/_links.scss @@ -11,7 +11,7 @@ a { text-decoration: underline; } -.single main a { +.single main p a { text-decoration: underline; } diff --git a/private/src/styles/base/_overlay.scss b/private/src/frontend/styles/base/_overlay.scss similarity index 89% rename from private/src/styles/base/_overlay.scss rename to private/src/frontend/styles/base/_overlay.scss index b6557e73..c58dc0d3 100644 --- a/private/src/styles/base/_overlay.scss +++ b/private/src/frontend/styles/base/_overlay.scss @@ -12,7 +12,7 @@ .admin-bar .overlay { top: 118px; - @include mq(wp-adminbar) { + @media all and (min-width: 781px) { top: 104px; } } diff --git a/private/src/styles/base/_reset.scss b/private/src/frontend/styles/base/_reset.scss similarity index 97% rename from private/src/styles/base/_reset.scss rename to private/src/frontend/styles/base/_reset.scss index 6c16388f..3f0f4d34 100755 --- a/private/src/styles/base/_reset.scss +++ b/private/src/frontend/styles/base/_reset.scss @@ -51,8 +51,6 @@ a { */ abbr[title] { border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - // stylelint-disable-next-line declaration-block-no-duplicate-properties text-decoration: underline dotted; /* 2 */ } diff --git a/private/src/styles/base/_shared.scss b/private/src/frontend/styles/base/_shared.scss similarity index 100% rename from private/src/styles/base/_shared.scss rename to private/src/frontend/styles/base/_shared.scss diff --git a/private/src/styles/base/_type.scss b/private/src/frontend/styles/base/_type.scss similarity index 100% rename from private/src/styles/base/_type.scss rename to private/src/frontend/styles/base/_type.scss diff --git a/private/src/styles/blocks/core-blocks/_blockquote.scss b/private/src/frontend/styles/blocks/_blockquote.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_blockquote.scss rename to private/src/frontend/styles/blocks/_blockquote.scss diff --git a/private/src/styles/blocks/core-blocks/_columns.scss b/private/src/frontend/styles/blocks/_columns.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_columns.scss rename to private/src/frontend/styles/blocks/_columns.scss diff --git a/private/src/styles/blocks/core-blocks/_cover.scss b/private/src/frontend/styles/blocks/_cover.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_cover.scss rename to private/src/frontend/styles/blocks/_cover.scss diff --git a/private/src/styles/blocks/core-blocks/_embed.scss b/private/src/frontend/styles/blocks/_embed.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_embed.scss rename to private/src/frontend/styles/blocks/_embed.scss diff --git a/private/src/styles/blocks/core-blocks/_file.scss b/private/src/frontend/styles/blocks/_file.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_file.scss rename to private/src/frontend/styles/blocks/_file.scss diff --git a/private/src/styles/blocks/core-blocks/_gallery.scss b/private/src/frontend/styles/blocks/_gallery.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_gallery.scss rename to private/src/frontend/styles/blocks/_gallery.scss diff --git a/private/src/styles/blocks/core-blocks/_image.scss b/private/src/frontend/styles/blocks/_image.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_image.scss rename to private/src/frontend/styles/blocks/_image.scss diff --git a/private/src/styles/blocks/core-blocks/_latest-posts.scss b/private/src/frontend/styles/blocks/_latest-posts.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_latest-posts.scss rename to private/src/frontend/styles/blocks/_latest-posts.scss diff --git a/private/src/styles/blocks/core-blocks/_menu.scss b/private/src/frontend/styles/blocks/_menu.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_menu.scss rename to private/src/frontend/styles/blocks/_menu.scss diff --git a/private/src/styles/blocks/core-blocks/_rss.scss b/private/src/frontend/styles/blocks/_rss.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_rss.scss rename to private/src/frontend/styles/blocks/_rss.scss diff --git a/private/src/styles/blocks/core-blocks/_separator.scss b/private/src/frontend/styles/blocks/_separator.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_separator.scss rename to private/src/frontend/styles/blocks/_separator.scss diff --git a/private/src/styles/blocks/core-blocks/_social-links.scss b/private/src/frontend/styles/blocks/_social-links.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_social-links.scss rename to private/src/frontend/styles/blocks/_social-links.scss diff --git a/private/src/styles/blocks/core-blocks/_table.scss b/private/src/frontend/styles/blocks/_table.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_table.scss rename to private/src/frontend/styles/blocks/_table.scss diff --git a/private/src/styles/blocks/core-blocks/_video.scss b/private/src/frontend/styles/blocks/_video.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/_video.scss rename to private/src/frontend/styles/blocks/_video.scss diff --git a/private/src/frontend/styles/blocks/index.scss b/private/src/frontend/styles/blocks/index.scss new file mode 100644 index 00000000..c7c93d04 --- /dev/null +++ b/private/src/frontend/styles/blocks/index.scss @@ -0,0 +1,14 @@ +@use "./blockquote"; +@use "./columns"; +@use "./cover"; +@use "./embed"; +@use "./file"; +@use "./gallery"; +@use "./image"; +@use "./latest-posts"; +@use "./menu"; +@use "./rss"; +@use "./separator"; +@use "./social-links"; +@use "./table"; +@use "./video"; diff --git a/private/src/styles/components/_add-item.scss b/private/src/frontend/styles/components/_add-item.scss similarity index 100% rename from private/src/styles/components/_add-item.scss rename to private/src/frontend/styles/components/_add-item.scss diff --git a/private/src/styles/components/_fluid.scss b/private/src/frontend/styles/components/_fluid.scss similarity index 100% rename from private/src/styles/components/_fluid.scss rename to private/src/frontend/styles/components/_fluid.scss diff --git a/private/src/frontend/styles/components/_icon.scss b/private/src/frontend/styles/components/_icon.scss new file mode 100644 index 00000000..0eab8d78 --- /dev/null +++ b/private/src/frontend/styles/components/_icon.scss @@ -0,0 +1,76 @@ +@use "../../../utils/mixins/icon" as i; + +.icon { + @include i.icon-wrapper(); + @include i.icon-dimensions(); + display: inline-block; +} + +.icon-arrow-left { + @include i.icon(234px, 240px, 16px, 16px); + display: inline-block; + + .rtl & { + @include i.icon(110px, 265px, 16px, 16px); + } +} + +.icon-arrow-right { + @include i.icon(234px, 240px, 16px, 16px); + display: inline-block; + transform: rotate(180deg); + + .rtl & { + @include i.icon(110px, 265px, 16px, 16px); + transform: rotate(180deg); + } +} + +.icon-remove { + @include i.icon(0, 285px, 16px, 16px); + display: inline-block; + + .remove-link:hover &, + .remove-link:active &, + .remove-link:focus & { + background-position: -20px -285px; + } +} + +.icon-remove-alt { + @include i.icon(20px, 285px, 16px, 16px); + display: inline-block; +} + +.icon-document { + @include i.icon(26px, 265px, 16px, 16px); + display: inline-block; +} + +.icon-cart { + @include i.icon-size(22px, 22px); +} + +.icon-search { + @include i.icon-size(18px, 18px); +} + +.icon-close { + @include i.icon-dimensions(1.5); + @include i.icon-size(24px, 24px); + + @media all and (min-width: 760px) { + @include i.icon-dimensions(2); + @include i.icon-size(32px, 32px); + } +} + +.icon-arrow-down { + @include i.icon-dimensions(1.5); + @include i.icon-size(24px, 24px); +} + +.icon-burger { + @include i.icon-dimensions(2); + @include i.icon-size(24px, 32px); +} diff --git a/private/src/styles/components/_social.scss b/private/src/frontend/styles/components/_social.scss similarity index 91% rename from private/src/styles/components/_social.scss rename to private/src/frontend/styles/components/_social.scss index 6879e1cc..22b9c710 100644 --- a/private/src/styles/components/_social.scss +++ b/private/src/frontend/styles/components/_social.scss @@ -10,10 +10,6 @@ width: 20px; height: 20px; color: transparent; - - .ie & { - visibility: hidden; - } } .social-facebook::after, @@ -29,7 +25,7 @@ display: block; width: 20px; height: 20px; - background-image: url("../images/sprite.svg"), none; + background-image: var(--amnesty-icon-path); background-repeat: no-repeat; background-size: 313px 300px; visibility: visible; diff --git a/private/src/styles/components/form/_checkbox-group.scss b/private/src/frontend/styles/components/form/_checkbox-group.scss similarity index 89% rename from private/src/styles/components/form/_checkbox-group.scss rename to private/src/frontend/styles/components/form/_checkbox-group.scss index c1d5619e..655a98f3 100644 --- a/private/src/styles/components/form/_checkbox-group.scss +++ b/private/src/frontend/styles/components/form/_checkbox-group.scss @@ -1,3 +1,5 @@ +@use "../../../../utils/mixins/icon" as i; + .checkboxGroup { position: relative; font-size: var(--wp--preset--font-size--small); @@ -18,7 +20,7 @@ cursor: pointer; &::after { - @include icon(271px, 215px, 16px, 16px); + @include i.icon(271px, 215px, 16px, 16px); position: absolute; top: calc(50% - 8px); right: 10px; @@ -152,7 +154,17 @@ .checkboxGroup.is-form input, .checkboxGroup.is-nav input, .checkboxGroup.is-control input { - @extend %hidden-visually; + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); // stylelint-disable property-no-vendor-prefix + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + word-wrap: normal !important; } .checkboxGroup.is-form label, diff --git a/private/src/styles/components/form/_fieldset.scss b/private/src/frontend/styles/components/form/_fieldset.scss similarity index 100% rename from private/src/styles/components/form/_fieldset.scss rename to private/src/frontend/styles/components/form/_fieldset.scss diff --git a/private/src/frontend/styles/components/form/_index.scss b/private/src/frontend/styles/components/form/_index.scss new file mode 100644 index 00000000..363a5cd0 --- /dev/null +++ b/private/src/frontend/styles/components/form/_index.scss @@ -0,0 +1,5 @@ +@use "./fieldset"; +@use "./checkbox-group"; +@use "./select2"; +@use "./input"; +@use "./woocommerce"; diff --git a/private/src/styles/components/form/_input.scss b/private/src/frontend/styles/components/form/_input.scss similarity index 95% rename from private/src/styles/components/form/_input.scss rename to private/src/frontend/styles/components/form/_input.scss index 213ca73f..21c118d2 100644 --- a/private/src/styles/components/form/_input.scss +++ b/private/src/frontend/styles/components/form/_input.scss @@ -1,3 +1,5 @@ +@use "../../../../utils/mixins/placeholder" as p; + label, input, optgroup, @@ -54,7 +56,7 @@ input[type="radio"] { input, textarea { - @include placeholder { + @include p.placeholder { font-family: var(--wp--preset--font-family--secondary); font-size: var(--wp--preset--font-size--small); font-weight: normal; diff --git a/private/src/styles/components/form/_select2.scss b/private/src/frontend/styles/components/form/_select2.scss similarity index 100% rename from private/src/styles/components/form/_select2.scss rename to private/src/frontend/styles/components/form/_select2.scss diff --git a/private/src/styles/components/form/_woocommerce.scss b/private/src/frontend/styles/components/form/_woocommerce.scss similarity index 100% rename from private/src/styles/components/form/_woocommerce.scss rename to private/src/frontend/styles/components/form/_woocommerce.scss diff --git a/private/src/frontend/styles/components/grid/_index.scss b/private/src/frontend/styles/components/grid/_index.scss new file mode 100644 index 00000000..7cc90d9e --- /dev/null +++ b/private/src/frontend/styles/components/grid/_index.scss @@ -0,0 +1,247 @@ +@use "../../../../utils/functions/flexy" as f; + +.grid-item { + position: relative; + display: flex; + align-items: flex-end; + flex: 1 1 100%; + max-width: none; + min-height: 360px; + padding: 24px; + background-color: var(--wp--preset--color--grey-light); + background-position: center; + background-size: cover; + + @include f.flexy-grid(1, f.flexy-gutter()); + + @media all and (min-width: 540px) { + @include f.flexy-grid(2, f.flexy-gutter()); + } +} + +// should be moved to plugin +.grid-item.aimc-ignore { + padding-bottom: 32px; +} + +.grid-item .grid-content { + max-width: 100%; +} + +.grid-itemContent p { + max-width: 100%; + margin-top: 20px; + margin-bottom: 0; + padding: 12px; + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); + font-size: var(--wp--preset--font-size--small); + line-height: 1.4; +} + +.grid-itemContent a { + color: var(--wp--preset--color--black); + font-weight: bold; + font-family: var(--wp--preset--font-family--secondary); + text-transform: uppercase; +} + +.grid-itemMeta { + position: relative; + z-index: 2; + display: block; + padding: 2px 12px; + width: max-content; + max-width: 100%; + overflow: hidden; + text-transform: uppercase; + text-decoration: none; + font-size: var(--wp--preset--font-size--regular); + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + white-space: nowrap; + text-overflow: ellipsis; + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); +} + +.grid-itemMeta a { + color: inherit; +} + +// increased specificity to override global link decoration +.single main .grid-itemMeta { + text-decoration: none; +} + +.grid-itemTitle { + display: block; + margin-top: 0; + margin-bottom: 0; + padding: 2px 12px; + max-width: 100%; + font-size: var(--wp--preset--font-size--heading-5); + text-decoration: none; +} + +h3.grid-itemTitle > span, +h3.grid-itemTitle > a { + color: var(--wp--preset--color--black); + background-color: var(--wp--preset--color--white); + box-shadow: -12px 0 0 0 var(--wp--preset--color--white), 12px 0 0 0 var(--wp--preset--color--white); + box-decoration-break: clone; + text-decoration: none; + max-width: 100%; +} + +.grid-itemTitle a::before { + position: absolute; + content: ""; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.grid { + display: grid; + row-gap: 20px; + column-gap: 20px; +} + +.grid-many { + grid-template-columns: 1fr; + + @media all and (min-width: 540px) { + grid-template-columns: repeat(4, 1fr); + } + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-template-columns: repeat(2, 1fr); + } +} + +.grid .grid-item { + max-width: 100%; + width: 100%; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: end; +} + +.grid-2 { + grid-template-columns: 1fr; + + @media all and (min-width: 540px) { + grid-template-columns: repeat(2, 1fr); + } +} + +.grid-5 { + grid-template-columns: 1fr; + + @media all and (min-width: 540px) { + grid-template-columns: repeat(6, 1fr); + } + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-template-columns: repeat(2, 1fr); + } +} + +.grid-5 :nth-child(n+3) { + grid-column: span 3; + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-column: span 1; + } + + @media all and (min-width: 940px) { + grid-column: span 2; + } +} + +.grid-5 :nth-child(-n+2) { + grid-column: span 3; + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-column: span 1; + } +} + +.grid-3 { + grid-template-columns: 1fr; + + @media all and (min-width: 540px) { + grid-template-columns: repeat(3, 1fr); + } +} + +.grid-1 .grid-item { + width: 33%; +} + +.grid-6 { + grid-template-columns: 1fr; + + @media all and (min-width: 540px) { + grid-template-columns: repeat(4, 1fr); + } + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-template-columns: repeat(2, 1fr); + } +} + +.grid-6 :nth-child(-n+2) { + grid-column: span 1; + + @media all and (min-width: 540px) { + grid-column: span 2; + } + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-column: span 1; + } +} + +.grid-7 { + grid-template-columns: 1fr; + + @media all and (min-width: 540px) { + grid-template-columns: repeat(12, 1fr); + } + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-template-columns: repeat(2, 1fr); + } +} + +.grid-7 :nth-child(-n+3) { + grid-column: span 1; + + @media all and (min-width: 540px) { + grid-column: span 4; + } + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-column: span 1; + } +} + +.grid-7 :nth-child(n+4) { + grid-column: span 1; + + @media all and (min-width: 540px) { + grid-column: span 3; + } + + @media all and (min-width: 540px) and (max-width: 940px) { + grid-column: span 1; + } +} + +:lang(fa-IR) .grid .grid-content > * { + line-height: 1.75; +} diff --git a/private/src/styles/components/list/_bare.scss b/private/src/frontend/styles/components/list/_bare.scss similarity index 100% rename from private/src/styles/components/list/_bare.scss rename to private/src/frontend/styles/components/list/_bare.scss diff --git a/private/src/styles/components/list/_base.scss b/private/src/frontend/styles/components/list/_base.scss similarity index 100% rename from private/src/styles/components/list/_base.scss rename to private/src/frontend/styles/components/list/_base.scss diff --git a/private/src/styles/components/list/_dl.scss b/private/src/frontend/styles/components/list/_dl.scss similarity index 100% rename from private/src/styles/components/list/_dl.scss rename to private/src/frontend/styles/components/list/_dl.scss diff --git a/private/src/frontend/styles/components/list/_index.scss b/private/src/frontend/styles/components/list/_index.scss new file mode 100755 index 00000000..b552f363 --- /dev/null +++ b/private/src/frontend/styles/components/list/_index.scss @@ -0,0 +1,4 @@ +@use "./base"; +@use "./inline"; +@use "./bare"; +@use "./dl"; diff --git a/private/src/styles/components/list/_inline.scss b/private/src/frontend/styles/components/list/_inline.scss similarity index 100% rename from private/src/styles/components/list/_inline.scss rename to private/src/frontend/styles/components/list/_inline.scss diff --git a/private/src/frontend/styles/components/modal/_index.scss b/private/src/frontend/styles/components/modal/_index.scss new file mode 100644 index 00000000..f84602fb --- /dev/null +++ b/private/src/frontend/styles/components/modal/_index.scss @@ -0,0 +1,64 @@ +@use "../../../../utils/mixins/icon" as i; + +.modal-container { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + overflow: auto; + overscroll-behavior: contain; + background-color: color-mix(in srgb, var(--wp--preset--color--grey-darkest) 80%, transparent); + opacity: 0; + z-index: -999; + transition: opacity .3s ease-in-out, z-index .3s step-end; +} + +.modal-container.is-open { + z-index: 999; + opacity: 1; + transition: opacity .3s ease-in-out, z-index .3s step-start; +} + +.modal-container .container { + max-height: 100%; + max-width: 860px; + overflow: auto; + margin: 0; + overscroll-behavior: contain; + opacity: 0; + transform: translateY(50px); + transition: opacity .3s ease-in-out, transform .3s ease-in-out; + transition-delay: .2s; + + @media screen and (max-height: 450px) { + max-width: 450px; + } +} + +.modal-container.is-open .container { + opacity: 1; + transform: translateY(0); +} + +.modal-container iframe { + border: none; +} + +.modal-close { + display: flex; + align-items: center; + margin-bottom: 16px; + margin-left: auto; + backface-visibility: hidden; +} + +.modal-close::after { + @include i.icon_scale(194px, 265px, 16px, 16px, 1); + content: ""; + display: inline-block; + margin-left: 8px; +} diff --git a/private/src/frontend/styles/components/news-filters/_index.scss b/private/src/frontend/styles/components/news-filters/_index.scss new file mode 100644 index 00000000..0da0d820 --- /dev/null +++ b/private/src/frontend/styles/components/news-filters/_index.scss @@ -0,0 +1,9 @@ +.news-filters { + display: flex; + width: 100%; + flex-direction: column; + + @media all and (min-width: 940px) { + flex-direction: row; + } +} diff --git a/private/src/frontend/styles/components/pop-in/_index.scss b/private/src/frontend/styles/components/pop-in/_index.scss new file mode 100644 index 00000000..23d39360 --- /dev/null +++ b/private/src/frontend/styles/components/pop-in/_index.scss @@ -0,0 +1,49 @@ +.pop-in { + position: relative; + padding: 12px 0; + background-color: var(--wp--preset--color--grey-lighter); + box-shadow: inset 0 -5px 9px -7px var(--wp--preset--color--black); + max-height: 1000px; + overflow-y: hidden; + transition-property: all; + transition-duration: .5s; + transition-timing-function: cubic-bezier(0, 1, .5, 1); +} + +.pop-in.is-closed { + max-height: 0; +} + +.pop-in-close { + position: absolute; + z-index: 1; + top: 10px; + right: 0; + display: inline-block; + margin-top: var(--wp--preset--spacing--single); + margin-right: var(--wp--preset--spacing--single); + appearance: none; + background: none; + border: none; + border-radius: 0; + color: var(--wp--preset--color--black); + font-family: Arial, sans-serif; + font-size: 20px; + line-height: 1; + cursor: pointer; + + .rtl & { + margin-right: 0; + margin-left: var(--wp--preset--spacing--single); + } +} + +.pop-in[aria-hidden="false"] ~ .page-header--transparent-light { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +// negishim +.pop-in[aria-hidden="false"] ~ .accessibility_component .btn_accessibility { + top: 165px; +} diff --git a/private/src/styles/components/tabbed-nav/main.scss b/private/src/frontend/styles/components/tabbed-nav/_index.scss similarity index 100% rename from private/src/styles/components/tabbed-nav/main.scss rename to private/src/frontend/styles/components/tabbed-nav/_index.scss diff --git a/private/src/styles/layout/_language-banner.scss b/private/src/frontend/styles/layout/_language-banner.scss similarity index 89% rename from private/src/styles/layout/_language-banner.scss rename to private/src/frontend/styles/layout/_language-banner.scss index c0ce53b5..fe82b511 100644 --- a/private/src/styles/layout/_language-banner.scss +++ b/private/src/frontend/styles/layout/_language-banner.scss @@ -1,3 +1,5 @@ +@use "../../../utils/mixins/icon" as i; + .language-selector { display: none; padding: 14px 0; @@ -15,7 +17,7 @@ flex-wrap: wrap; color: var(--wp--preset--color--white); - @include mq(medium) { + @media all and (min-width: 940px) { justify-content: flex-end; } } @@ -36,7 +38,7 @@ justify-content: center; flex-wrap: wrap; - @include mq(medium) { + @media all and (min-width: 940px) { order: 2; flex-basis: auto; margin-left: 24px; @@ -71,7 +73,7 @@ button.language-selectorClose { font-size: var(--wp--preset--font-size--small); order: 0; - @include mq(xx-small) { + @media all and (min-width: 465px) { order: 3; } @@ -81,7 +83,7 @@ button.language-selectorClose { } .language-selectorClose::after { - @include icon(194px, 265px, 16px, 16px); + @include i.icon(194px, 265px, 16px, 16px); content: ""; display: inline-block; margin-left: 11px; diff --git a/private/src/frontend/styles/layout/_page-hero.scss b/private/src/frontend/styles/layout/_page-hero.scss new file mode 100644 index 00000000..a4f5d778 --- /dev/null +++ b/private/src/frontend/styles/layout/_page-hero.scss @@ -0,0 +1,218 @@ +.page-hero { + position: relative; + padding-top: 111px; + padding-bottom: 110px; + // height: 400px; + // max-height: 40vh; // these two break the home page + background-size: cover; + background-position: center center; + color: var(--wp--preset--color--white); + max-width: 1468px; + margin: 0 auto; + width: 100%; + + @media all and (min-width: 760px) { + padding-bottom: 80px; + min-height: 450px; + max-height: none; + height: auto; + } +} + +.page-hero:has(+ main) { + margin-bottom: var(--wp--preset--spacing--double); +} + +.page-header--light ~ .page-hero, +.page-header--shaded ~ .page-hero { + padding-top: 80px; +} + +.page-header--transparent-dark ~ .page-hero, +.page-header--transparent-light ~ .page-hero { + padding-top: 152px; +} + +.page-heroTitle { + max-width: 840px; + margin: 0; + padding: 0 16px; + font-size: var(--wp--preset--font-size--heading-1); + line-height: 1.2; + text-transform: uppercase; + + @media all and (min-width: 465px) { + padding: 0 20px; + } +} + +.page-heroTitle span { + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + color: var(--wp--preset--color--white); + box-shadow: 20px 0 0 color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent), -20px 0 0 color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + box-decoration-break: clone; +} + +p.page-heroContent { + display: table; + margin-bottom: 0; + padding: 10px 16px; + max-width: 460px; + font-size: var(--wp--preset--font-size--regular); + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + + @media all and (min-width: 465px) { + padding: 10px 20px; + } +} + +.page-heroContent a { + color: inherit; + text-decoration: underline; +} + +.page-heroCta { + display: inline-block; + background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); + padding: 16px; + + .btn { + font-size: var(--wp--preset--font-size--heading-5); + padding: 10px 14px; + + @media all and (min-width: 465px) { + padding: 11px 20px; + } + } + + @media all and (min-width: 465px) { + padding: 20px; + } +} + +.page-heroSize--small { + @media all and (min-width: 760px) { + min-height: 450px; + } +} + +.page-heroSize--large { + @media all and (min-width: 760px) { + min-height: 710px; + } +} + +.page-heroBackground--dark .page-heroContent, +.page-heroBackground--dark .page-heroCta, +.page-heroBackground--dark .page-heroTitle span { + background-color: var(--wp--preset--color--black); +} + +.page-heroBackground--dark .page-heroTitle span { + box-shadow: 16px 0 0 var(--wp--preset--color--black), -16px 0 0 var(--wp--preset--color--black); + + @media all and (min-width: 465px) { + box-shadow: 20px 0 0 var(--wp--preset--color--black), -20px 0 0 var(--wp--preset--color--black); + } +} + +.page-heroBackground--light .page-heroContent, +.page-heroBackground--light .page-heroCta, +.page-heroBackground--light .page-heroTitle span { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.page-heroBackground--light .page-heroTitle span { + box-shadow: 16px 0 0 var(--wp--preset--color--white), -16px 0 0 var(--wp--preset--color--white); + + @media all and (min-width: 465px) { + box-shadow: 20px 0 0 var(--wp--preset--color--white), -20px 0 0 var(--wp--preset--color--white); + } +} + +.page-heroBackground--light .btn { + border-color: var(--wp--preset--color--black); + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); + + &:hover, + &:focus { + background-color: color-mix(in srgb, var(--wp--preset--color--black) 80%, transparent); + color: var(--wp--preset--color--white); + } +} + +.page-heroBackground--none .page-heroContent, +.page-heroBackground--none .page-heroCta, +.page-heroBackground--none .page-heroTitle, +.page-heroBackground--none .page-heroTitle span { + padding-left: 0; + padding-right: 0; + color: var(--wp--preset--color--white); + background-color: transparent; +} + +.page-heroBackground--none .page-heroTitle span { + box-shadow: none; +} + +.page-heroAlignment--centre .hero-content, +.page-heroAlignment--center .hero-content { + text-align: center; + max-width: 840px; +} + +.page-heroAlignment--right .hero-content { + text-align: end; +} + +.page-hero--video { + position: relative; + z-index: 0; +} + +.page-heroVideoContainer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: -1; +} + +.page-heroVideo { + position: absolute; + top: 50%; + left: 50%; + display: none; + min-width: 100%; + min-height: 100%; + transform: translate(-50%, -50%); + object-fit: cover; + + @media all and (min-width: 760px) { + display: block; + } +} + +.play-icon { + display: inline-block; + width: 0; + height: 0; + margin-right: 12px; + border-style: solid; + border-width: 10px 0 10px 18px; + border-color: transparent transparent transparent var(--wp--preset--color--black); + text-indent: -1000vw; + overflow: hidden; +} + +.page-heroBackground--light .play-icon { + border-color: transparent transparent transparent var(--wp--preset--color--white); +} + +.page-hero + main .article-container { + padding-top: 0; +} diff --git a/private/src/frontend/styles/layout/footer/_index.scss b/private/src/frontend/styles/layout/footer/_index.scss new file mode 100644 index 00000000..d66ef772 --- /dev/null +++ b/private/src/frontend/styles/layout/footer/_index.scss @@ -0,0 +1,2 @@ +@use "styles/classic"; +@use "styles/fse"; diff --git a/private/src/styles/layout/footer/styles/_classic.scss b/private/src/frontend/styles/layout/footer/styles/_classic.scss similarity index 84% rename from private/src/styles/layout/footer/styles/_classic.scss rename to private/src/frontend/styles/layout/footer/styles/_classic.scss index df0c6236..55169132 100755 --- a/private/src/styles/layout/footer/styles/_classic.scss +++ b/private/src/frontend/styles/layout/footer/styles/_classic.scss @@ -1,3 +1,6 @@ +@use "../../../../../utils/functions/flexy" as f; +@use "../../../../../utils/mixins/states" as s; + .page-footer { padding: 28px 20px; background-color: var(--wp--preset--color--black); @@ -39,7 +42,7 @@ } .page-footerSections { - @include flexy-wrapper; + @include f.flexy-wrapper; list-style: none; margin: 0; } @@ -48,8 +51,8 @@ flex: 1 1 100%; margin-top: 24px; - @include mq(x-small) { - @include flexy-column(6); + @media all and (min-width: 540px) { + @include f.flexy-column(6); flex-grow: 1; max-width: none; @@ -58,15 +61,15 @@ } } - @include mq(small) { - @include flexy-column(3); + @media all and (min-width: 760px) { + @include f.flexy-column(3); flex-grow: 1; margin-top: 0; max-width: none; } - @include mq(large) { - @include flexy-column(2); + @media all and (min-width: 1110px) { + @include f.flexy-column(2); flex-grow: 1; max-width: none; } @@ -77,22 +80,22 @@ } .page-footerSections li.page-footerSection--large { - @include flexy-column(12); + @include f.flexy-column(12); margin-top: 24px; - @include mq(small) { - @include flexy-column(6); + @media all and (min-width: 760px) { + @include f.flexy-column(6); margin-top: 0; } - @include mq(small, large) { + @media all and (min-width: 760px) and (max-width: 1110px) { &:nth-child(n + 2):not(:nth-child(3)) { margin-top: 24px; } } - @include mq(large) { - @include flexy-column(4); + @media all and (min-width: 1110px) { + @include f.flexy-column(4); margin-top: 0; } } @@ -163,7 +166,7 @@ } .page-footerBottom { - @include flexy-wrapper; + @include f.flexy-wrapper; flex-wrap: wrap-reverse; margin-top: 24px; padding-top: 48px; @@ -171,14 +174,14 @@ } .page-footerBottomHalf { - @include flexy-column(12); + @include f.flexy-column(12); display: flex; flex-direction: column; justify-content: center; align-items: center; - @include mq(large) { - @include flexy-column(6); + @media all and (min-width: 1110px) { + @include f.flexy-column(6); justify-content: flex-start; align-items: flex-start; } @@ -211,7 +214,7 @@ } .page-footerBottomNav li + li::before { - @include mq(small) { + @media all and (min-width: 760px) { content: "|"; display: inline-block; padding-right: 12px; @@ -241,7 +244,7 @@ align-items: center; margin-bottom: 24px; - @include mq(large) { + @media all and (min-width: 1110px) { justify-content: flex-end; flex-direction: row; margin-bottom: 0; @@ -254,7 +257,7 @@ color: var(--wp--preset--color--white); margin-bottom: 12px; - @include mq(large) { + @media all and (min-width: 1110px) { margin-bottom: 0; } } @@ -274,7 +277,7 @@ } .page-footerSocial a { - @include state-background(var(--wp--preset--color--grey-darkest)); + @include s.state-background(var(--wp--preset--color--grey-darkest)); display: block; } diff --git a/private/src/styles/layout/footer/styles/_fse.scss b/private/src/frontend/styles/layout/footer/styles/_fse.scss similarity index 100% rename from private/src/styles/layout/footer/styles/_fse.scss rename to private/src/frontend/styles/layout/footer/styles/_fse.scss diff --git a/private/src/frontend/styles/layout/header/_index.scss b/private/src/frontend/styles/layout/header/_index.scss new file mode 100644 index 00000000..84d48dd7 --- /dev/null +++ b/private/src/frontend/styles/layout/header/_index.scss @@ -0,0 +1,7 @@ +@use "shared/base"; +@use "shared/logo"; +@use "shared/burger"; +@use "shared/button"; +@use "shared/search"; +@use "styles/light"; +@use "styles/transparent-light"; diff --git a/private/src/frontend/styles/layout/header/shared/_base.scss b/private/src/frontend/styles/layout/header/shared/_base.scss new file mode 100644 index 00000000..957618ec --- /dev/null +++ b/private/src/frontend/styles/layout/header/shared/_base.scss @@ -0,0 +1,66 @@ +.page-header { + position: sticky; + top: -100%; + z-index: 11; + height: 60px; + font-size: var(--wp--preset--font-size--regular); + color: var(--wp--preset--color--black); + transition: top .5s ease-in-out; + font-family: var(--wp--preset--font-family--secondary); + text-transform: uppercase; + + li button { + text-transform: uppercase; + } + + @media all and (min-width: 760px) { + height: 72px; + } +} + +.page-header .container { + padding: 0; +} + +.page-header .container, +.page-headerItems { + height: 100%; +} + +.page-header.stick { + top: 0; +} + +.admin-bar .page-header.stick { + top: 0; + + @media all and (min-width: 600px) { + top: 46px; + } + + @media all and (min-width: 782px) { + top: 32px; + } +} + +.page-headerItems { + display: flex; + align-items: flex-start; +} + +.page-header a { + color: inherit; + transition: unset; +} + +.page-header .btn { + display: flex; + align-items: center; + font-size: var(--wp--preset--font-size--heading-4); + color: var(--wp--preset--color--black); + transition: background-color .2s ease-in-out, color .2s ease-in-out; +} + +.page-header .menu-item { + transition: background-color .2s ease-in-out, color .2s ease-in-out; +} diff --git a/private/src/frontend/styles/layout/header/shared/_burger.scss b/private/src/frontend/styles/layout/header/shared/_burger.scss new file mode 100644 index 00000000..ebed64f0 --- /dev/null +++ b/private/src/frontend/styles/layout/header/shared/_burger.scss @@ -0,0 +1,40 @@ +.burger { + display: inline-flex; + align-items: center; + justify-content: center; + width: 60px; + height: 100%; + border: 2px solid transparent; + font-family: var(--wp--preset--font-family--secondary); + background-color: transparent; + cursor: pointer; + + @media all and (min-width: 760px) { + width: 70px; + } + + @media all and (min-width: 1024px) { + display: none; + } +} + +.burger:active, +.burger:focus { + border: 2px solid var(--wp--preset--color--orange-base); +} + +.burger .icon-burger { + display: block; +} + +.burger .icon-close { + display: none; +} + +.mobile-menu-open .burger .icon-close { + display: block; +} + +.mobile-menu-open .burger .icon-burger { + display: none; +} diff --git a/private/src/styles/layout/header/shared/_button.scss b/private/src/frontend/styles/layout/header/shared/_button.scss similarity index 83% rename from private/src/styles/layout/header/shared/_button.scss rename to private/src/frontend/styles/layout/header/shared/_button.scss index 86e98aa4..b0e01718 100644 --- a/private/src/styles/layout/header/shared/_button.scss +++ b/private/src/frontend/styles/layout/header/shared/_button.scss @@ -1,7 +1,7 @@ .page-headerButtonWrapper { position: relative; - border-right: 1px solid #e5e5e5; - border-left: 1px solid #e5e5e5; + border-right: 1px solid var(--wp--preset--color--grey-lighter); + border-left: 1px solid var(--wp--preset--color--grey-lighter); } .page-headerButton { @@ -22,7 +22,7 @@ transition: background-color .2s ease-in-out, color .2s ease-in-out; cursor: pointer; - @include mq(small) { + @media all and (min-width: 760px) { min-width: 72px; height: 72px; } diff --git a/private/src/styles/layout/header/shared/_logo.scss b/private/src/frontend/styles/layout/header/shared/_logo.scss similarity index 85% rename from private/src/styles/layout/header/shared/_logo.scss rename to private/src/frontend/styles/layout/header/shared/_logo.scss index d803e746..61dd3d10 100644 --- a/private/src/styles/layout/header/shared/_logo.scss +++ b/private/src/frontend/styles/layout/header/shared/_logo.scss @@ -3,7 +3,7 @@ align-items: center; height: 60px; - @include mq(small) { + @media all and (min-width: 760px) { height: 72px; } } @@ -32,7 +32,7 @@ .logo-logoType { display: none; - @include mq(small) { + @media all and (min-width: 760px) { display: block; } } @@ -40,7 +40,7 @@ .logo-logoMark { display: block; - @include mq(small) { + @media all and (min-width: 760px) { display: none; } } diff --git a/private/src/frontend/styles/layout/header/shared/_search.scss b/private/src/frontend/styles/layout/header/shared/_search.scss new file mode 100644 index 00000000..e0ad4835 --- /dev/null +++ b/private/src/frontend/styles/layout/header/shared/_search.scss @@ -0,0 +1,27 @@ +@use "../../../../../utils/mixins/icon" as i; + +.search-menu-item a::after { + @include i.icon-wrapper(); + @include i.icon-dimensions(); + @include i.icon-size(18px, 18px); + @include i.icon-position(128px, 240px);; + display: inline-block; + margin-left: var(--wp--preset--spacing--half); + content: ""; + + @media all and (min-width: 1024px) { + margin-left: 0; + } +} + +.search-menu-item span { + @media all and (min-width: 1024px) { + position: absolute !important; + overflow: hidden !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; + } +} diff --git a/private/src/frontend/styles/layout/header/styles/_light.scss b/private/src/frontend/styles/layout/header/styles/_light.scss new file mode 100644 index 00000000..63bd8fb8 --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/_light.scss @@ -0,0 +1,3 @@ +@use "./light/base"; +@use "./light/burger"; +@use "./light/search"; diff --git a/private/src/frontend/styles/layout/header/styles/_transparent-light.scss b/private/src/frontend/styles/layout/header/styles/_transparent-light.scss new file mode 100644 index 00000000..67f8b6cc --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/_transparent-light.scss @@ -0,0 +1,3 @@ +@use "./transparent-light/base"; +@use "./transparent-light/burger"; +@use "./transparent-light/search"; diff --git a/private/src/frontend/styles/layout/header/styles/light/_base.scss b/private/src/frontend/styles/layout/header/styles/light/_base.scss new file mode 100644 index 00000000..09798207 --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/light/_base.scss @@ -0,0 +1,25 @@ +@use "../../../../../../utils/mixins/icon" as i; + +.page-header.is-light { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.page-header.stick { + border-bottom: 1px solid var(--wp--preset--color--grey-lighter); +} + +.page-header.is-light .page-headerButton:hover, +.page-header.is-light .page-headerButton:active, +.page-header.is-light .page-headerButton:focus { + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--black); +} + +.page-header.is-light .icon-cart { + @include i.icon-position(284px, 230px); +} + +.page-header.is-light .page-nav--main .current-menu-item .icon-cart { + @include i.icon-position(284px, 260px); +} diff --git a/private/src/frontend/styles/layout/header/styles/light/_burger.scss b/private/src/frontend/styles/layout/header/styles/light/_burger.scss new file mode 100644 index 00000000..5ae6eb11 --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/light/_burger.scss @@ -0,0 +1,29 @@ +@use "../../../../../../utils/mixins/icon" as i; + +.page-header.is-light .burger:hover, +.page-header.is-light .burger:active, +.page-header.is-light .burger:focus { + background-color: var(--wp--preset--color--grey-lighter); +} + +.page-header.is-light .burger .icon-burger { + @include i.icon-position(80px, 570px); +} + +.mobile-menu-open .page-header.is-light .burger { + background-color: var(--wp--preset--color--black); +} + +.mobile-menu-open .page-header.is-light .burger:hover, +.mobile-menu-open .page-header.is-light .burger:active, +.mobile-menu-open .page-header.is-light .burger:focus { + background-color: var(--wp--preset--color--grey-dark); +} + +.mobile-menu-open .page-header.is-light .burger .icon-close { + @include i.icon-position(406.5px, 354px); + + @media all and (min-width: 760px) { + @include i.icon-position(542px, 472px); + } +} diff --git a/private/src/frontend/styles/layout/header/styles/light/_search.scss b/private/src/frontend/styles/layout/header/styles/light/_search.scss new file mode 100644 index 00000000..42fcddca --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/light/_search.scss @@ -0,0 +1,13 @@ +@use "../../../../../../utils/mixins/icon" as i; + +.page-header.is-light .search-menu-item span::after { + @include i.icon-position(128px, 240px);; +} + +.page-header.is-light .search-menu-item.current-menu-item span::after { + @include i.icon-position(105px, 240px); +} + +.page-header.is-light .search-menu-item.current-menu-item a::after { + @include i.icon-position(105px, 240px); +} diff --git a/private/src/frontend/styles/layout/header/styles/transparent-light/_base.scss b/private/src/frontend/styles/layout/header/styles/transparent-light/_base.scss new file mode 100644 index 00000000..bb62c56c --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/transparent-light/_base.scss @@ -0,0 +1,68 @@ +@use "../../../../../../utils/mixins/icon" as i; + +.page-header.is-transparent-light { + background: linear-gradient(var(--wp--preset--color--black), transparent); + color: var(--wp--preset--color--white); +} + +.page-header.is-transparent-light.stick { + background: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); + border-bottom: 1px solid var(--wp--preset--color--grey-lighter); +} + +.page-header.is-transparent-light ~ .page-hero { + margin-top: -72px; +} + +.page-header.is-transparent-light .menu-item:hover > a, +.page-header.is-transparent-light .menu-item a:active, +.page-header.is-transparent-light .menu-item a:focus, +.page-header.is-transparent-light .menu-item:focus-within > a, +.page-header.is-transparent-light .page-headerButton:hover, +.page-header.is-transparent-light .page-headerButton:active, +.page-header.is-transparent-light .page-headerButton:focus { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.page-header.is-transparent-light .mobile-menu .menu-item a:hover, +.page-header.is-transparent-light .mobile-menu .menu-item a:active, +.page-header.is-transparent-light .mobile-menu .menu-item a:focus { + background-color: var(--wp--preset--color--grey-lighter); +} + +.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); +} + +.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a:hover, +.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a:active, +.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a:focus, +.page-header.is-transparent-light .sub-menu .menu-item a:hover, +.page-header.is-transparent-light .sub-menu .menu-item a:active, +.page-header.is-transparent-light .sub-menu .menu-item a:focus { + background-color: var(--wp--preset--color--grey-dark); + color: var(--wp--preset--color--white); +} + +.page-header.is-transparent-light .page-nav--main .current-menu-item, +.page-header.is-transparent-light .page-nav--main .current-menu-ancestor { + background-color: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); +} + +.page-header.is-transparent-light .page-nav--main .mobile-menu .current-menu-item, +.page-header.is-transparent-light .page-nav--main .mobile-menu .current-menu-ancestor { + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); +} + +.page-header.is-transparent-light .icon-cart { + @include i.icon-position(284px, 260px); +} + +.page-header.is-transparent-light .site-separator { + display: none; +} diff --git a/private/src/frontend/styles/layout/header/styles/transparent-light/_burger.scss b/private/src/frontend/styles/layout/header/styles/transparent-light/_burger.scss new file mode 100644 index 00000000..673d2832 --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/transparent-light/_burger.scss @@ -0,0 +1,34 @@ +@use "../../../../../../utils/mixins/icon" as i; + +.page-header.is-transparent-light .burger:hover, +.page-header.is-transparent-light .burger:active, +.page-header.is-transparent-light .burger:focus { + background-color: var(--wp--preset--color--white); +} + +.page-header.is-transparent-light .burger .icon-burger { + @include i.icon-position(120px, 570px); +} + +.page-header.is-transparent-light .burger:hover .icon-burger, +.page-header.is-transparent-light .burger:active .icon-burger, +.page-header.is-transparent-light .burger:focus .icon-burger { + @include i.icon-position(80px, 570px); +} + +.mobile-menu-open .page-header.is-transparent-light .burger { + background-color: var(--wp--preset--color--black); +} + +.mobile-menu-open .page-header.is-transparent-light .burger:hover, +.mobile-menu-open .page-header.is-transparent-light .burger:active { + background-color: var(--wp--preset--color--grey-dark); +} + +.mobile-menu-open .page-header.is-transparent-light .burger .icon-close { + @include i.icon-position(406.5px, 354px); + + @media all and (min-width: 760px) { + @include i.icon-position(542px, 472px); + } +} diff --git a/private/src/frontend/styles/layout/header/styles/transparent-light/_search.scss b/private/src/frontend/styles/layout/header/styles/transparent-light/_search.scss new file mode 100644 index 00000000..e584974f --- /dev/null +++ b/private/src/frontend/styles/layout/header/styles/transparent-light/_search.scss @@ -0,0 +1,19 @@ +@use "../../../../../../utils/mixins/icon" as i; + +.page-header.is-transparent-light .search-menu-item a::after { + @include i.icon-position(105px, 240px); +} + +.page-header.is-transparent-light .search-menu-item a:hover::after, +.page-header.is-transparent-light .search-menu-item a:active::after, +.page-header.is-transparent-light .search-menu-item a:focus::after { + @include i.icon-position(128px, 240px);; +} + +.page-header.is-transparent-light.stick .search-menu-item a::after { + @include i.icon-position(128px, 240px);; +} + +.page-header.is-transparent-light .mobile-menu .search-menu-item a::after { + @include i.icon-position(128px, 240px);; +} diff --git a/private/src/frontend/styles/layout/navigation/_index.scss b/private/src/frontend/styles/layout/navigation/_index.scss new file mode 100644 index 00000000..5b51ebc3 --- /dev/null +++ b/private/src/frontend/styles/layout/navigation/_index.scss @@ -0,0 +1,5 @@ +@use "./shared/keyframes"; +@use "./shared/desktop" as shared-desktop; +@use "./shared/mobile" as shared-mobile; +@use "./styles/light/desktop" as light-desktop; +@use "./styles/transparent-light/desktop" as trans-light-desktop; diff --git a/private/src/styles/layout/navigation/shared/_desktop.scss b/private/src/frontend/styles/layout/navigation/shared/_desktop.scss similarity index 97% rename from private/src/styles/layout/navigation/shared/_desktop.scss rename to private/src/frontend/styles/layout/navigation/shared/_desktop.scss index 78cae9c1..b228b9c6 100644 --- a/private/src/styles/layout/navigation/shared/_desktop.scss +++ b/private/src/frontend/styles/layout/navigation/shared/_desktop.scss @@ -94,7 +94,7 @@ .page-nav--main > ul > .menu-item { display: none; - @include mq(mobile-nav) { + @media all and (min-width: 1024px) { display: flex; } } diff --git a/private/src/styles/layout/navigation/shared/_keyframes.scss b/private/src/frontend/styles/layout/navigation/shared/_keyframes.scss similarity index 100% rename from private/src/styles/layout/navigation/shared/_keyframes.scss rename to private/src/frontend/styles/layout/navigation/shared/_keyframes.scss diff --git a/private/src/styles/layout/navigation/shared/_mobile.scss b/private/src/frontend/styles/layout/navigation/shared/_mobile.scss similarity index 89% rename from private/src/styles/layout/navigation/shared/_mobile.scss rename to private/src/frontend/styles/layout/navigation/shared/_mobile.scss index 5f31cc31..ff025320 100644 --- a/private/src/styles/layout/navigation/shared/_mobile.scss +++ b/private/src/frontend/styles/layout/navigation/shared/_mobile.scss @@ -1,3 +1,5 @@ +@use "../../../../../utils/mixins/icon" as i; + .mobile-menu { position: fixed; top: 60px; // header height on mobile @@ -15,7 +17,7 @@ font-size: var(--wp--preset--font-size--small); background-color: var(--wp--preset--color--white); - @include mq(small) { + @media all and (min-width: 760px) { top: 72px; // header height on larger screens max-height: calc(100vh - 72px); } @@ -36,11 +38,11 @@ top: 106px; // admin bar + header height max-height: calc(100vh - 118px); - @include mq(small) { + @media all and (min-width: 760px) { top: 118px; // admin bar + header height } - @include mq(wp-adminbar) { + @media all and (min-width: 781px) { top: 104px; // admin bar + header height max-height: calc(100vh - 104px); } @@ -50,12 +52,12 @@ top: 0; max-height: calc(100vh - 72px); // header height - @include mq(601px) { + @media all and (min-width: 601px) { top: 118px; max-height: calc(100vh - 118px); } - @include mq(wp-adminbar) { + @media all and (min-width: 781px) { top: 104px; max-height: calc(100vh - 104px); } @@ -160,12 +162,12 @@ } .mobile-menu .icon-arrow-down { - @extend %icon-arrow-down-dark; + @include i.icon-position(406.5px, 322.5px); transition: transform .2s ease-in-out; position: absolute; right: 18px; - @include mq(small) { + @media all and (min-width: 760px) { right: 23px; } } @@ -174,17 +176,17 @@ right: unset; left: 18px; - @include mq(small) { + @media all and (min-width: 760px) { right: unset; left: 23px; } } .mobile-menu .menu-item.is-open .icon-arrow-down { - @extend %icon-arrow-down-light; + @include i.icon-position(406.5px, 196.5px); transform: rotate(180deg); } .mobile-menu .icon-cart { - @extend %icon-cart-dark; + @include i.icon-position(284px, 230px); } diff --git a/private/src/styles/layout/navigation/styles/light/_desktop.scss b/private/src/frontend/styles/layout/navigation/styles/light/_desktop.scss similarity index 100% rename from private/src/styles/layout/navigation/styles/light/_desktop.scss rename to private/src/frontend/styles/layout/navigation/styles/light/_desktop.scss diff --git a/private/src/styles/layout/navigation/styles/transparent-light/_desktop.scss b/private/src/frontend/styles/layout/navigation/styles/transparent-light/_desktop.scss similarity index 100% rename from private/src/styles/layout/navigation/styles/transparent-light/_desktop.scss rename to private/src/frontend/styles/layout/navigation/styles/transparent-light/_desktop.scss diff --git a/private/src/styles/pages/_archive.scss b/private/src/frontend/styles/pages/_archive.scss similarity index 92% rename from private/src/styles/pages/_archive.scss rename to private/src/frontend/styles/pages/_archive.scss index b0e7cd80..85034bb9 100644 --- a/private/src/styles/pages/_archive.scss +++ b/private/src/frontend/styles/pages/_archive.scss @@ -25,7 +25,7 @@ width: 100%; padding: 0 !important; - @include mq(medium) { + @media all and (min-width: 940px) { flex-direction: row; } } @@ -33,7 +33,7 @@ .taxonomyArchive-filters + * { margin-top: var(--wp--preset--spacing--single); - @include mq(medium) { + @media all and (min-width: 940px) { margin-top: 0; margin-left: var(--wp--preset--spacing--single); diff --git a/private/src/frontend/styles/pages/_article.scss b/private/src/frontend/styles/pages/_article.scss new file mode 100644 index 00000000..2eef9ed7 --- /dev/null +++ b/private/src/frontend/styles/pages/_article.scss @@ -0,0 +1,8 @@ +@use "./article/base"; +@use "./article/featured-image"; +@use "./article/byline"; +@use "./article/back-link"; +@use "./article/meta"; +@use "./article/header"; +@use "./article/footer"; +@use "./article/share"; diff --git a/private/src/styles/pages/_author.scss b/private/src/frontend/styles/pages/_author.scss similarity index 87% rename from private/src/styles/pages/_author.scss rename to private/src/frontend/styles/pages/_author.scss index f524abf5..048cc4ca 100644 --- a/private/src/styles/pages/_author.scss +++ b/private/src/frontend/styles/pages/_author.scss @@ -7,7 +7,7 @@ display: flex; align-items: flex-end; - @include mq(large) { + @media all and (min-width: 1110px) { text-align: unset; } } @@ -19,7 +19,7 @@ width: 100%; flex-direction: column; - @include mq(large) { + @media all and (min-width: 1110px) { flex-direction: row; align-items: center; padding: 20px; @@ -30,7 +30,7 @@ max-width: 150px; margin-bottom: 10px; - @include mq(large) { + @media all and (min-width: 1110px) { padding-right: 20px; margin-bottom: unset; } @@ -42,7 +42,7 @@ padding: 24px; align-items: center; - @include mq(large) { + @media all and (min-width: 1110px) { align-items: flex-start; } } @@ -59,7 +59,7 @@ transform: scale(.6); vertical-align: -10%; pointer-events: none; - background-image: url("../images/sprite.svg"), none; + background-image: var(--amnesty-icon-path); background-repeat: no-repeat; background-size: 313px 353px; width: 20px; @@ -67,7 +67,7 @@ background-position: -246px -82px; } - @include mq(large) { + @media all and (min-width: 1110px) { text-align: left; } } @@ -86,7 +86,7 @@ padding: 5%; text-align: center; - @include mq(large) { + @media all and (min-width: 1110px) { display: block; color: var(--wp--preset--color--white); padding: unset; @@ -98,7 +98,7 @@ margin-right: 0; width: 100%; - @include mq(large) { + @media all and (min-width: 1110px) { margin-right: 10%; } } @@ -148,7 +148,7 @@ color: var(--wp--preset--color--white); text-align: center; - @include mq(large) { + @media all and (min-width: 1110px) { font-style: unset; text-align: unset; } @@ -161,7 +161,7 @@ bottom: 0; max-width: 100%; - @include mq(large) { + @media all and (min-width: 1110px) { position: absolute; right: 0; left: auto; diff --git a/private/src/styles/pages/_404.scss b/private/src/frontend/styles/pages/_fourohfour.scss similarity index 100% rename from private/src/styles/pages/_404.scss rename to private/src/frontend/styles/pages/_fourohfour.scss diff --git a/private/src/frontend/styles/pages/_news.scss b/private/src/frontend/styles/pages/_news.scss new file mode 100644 index 00000000..3670e1ee --- /dev/null +++ b/private/src/frontend/styles/pages/_news.scss @@ -0,0 +1,61 @@ +@use "sass:math"; +@use "../../../utils/functions/flexy" as f; + +.blog main > .container:first-child { + padding: 0; + + @media all and (min-width: 570px) { + padding: 0 f.flexy-gutter(); + } +} + +.blog .postlist .wp-block-post-template.columns-4 { + width: 100%; +} + +.has-subcategories { + display: flex; + align-items: flex-start; + flex-wrap: wrap; +} + +.has-subcategories .news-section { + @media all and (min-width: 940px) { + margin-right: f.flexy-gutter(); + flex: 0 0 #{67% - math.div(f.flexy-gutter(), 2)}; + } + + @media all and (min-width: 1110px) { + flex: 0 0 #{75% - math.div(f.flexy-gutter(), 2)}; + } +} + +.news-sidebar { + flex: 0 0 100%; + padding-top: 0; + padding-bottom: 0; + + @media all and (min-width: 940px) { + flex: 0 0 #{33% - math.div(f.flexy-gutter(), 2)}; + } + + @media all and (min-width: 1110px) { + flex: 0 0 #{25% - math.div(f.flexy-gutter(), 2)}; + } +} + +.news-sidebar .checkboxGroup { + display: inline-block; +} + +.news-sidebar .checkboxGroup-list { + width: 100%; +} + +.post-pagination { + padding-top: 0; + + @media all and (min-width: 596px) { + padding-top: 20px; + } +} diff --git a/private/src/styles/pages/_petitions.scss b/private/src/frontend/styles/pages/_petitions.scss similarity index 100% rename from private/src/styles/pages/_petitions.scss rename to private/src/frontend/styles/pages/_petitions.scss diff --git a/private/src/frontend/styles/pages/_search.scss b/private/src/frontend/styles/pages/_search.scss new file mode 100644 index 00000000..5b603ae3 --- /dev/null +++ b/private/src/frontend/styles/pages/_search.scss @@ -0,0 +1,4 @@ +@use "search/searchbox"; +@use "search/results"; +@use "search/results/filters"; +@use "search/results/active-filters"; diff --git a/private/src/styles/pages/_single.scss b/private/src/frontend/styles/pages/_single.scss similarity index 96% rename from private/src/styles/pages/_single.scss rename to private/src/frontend/styles/pages/_single.scss index 43baf1e9..65a30d38 100644 --- a/private/src/styles/pages/_single.scss +++ b/private/src/frontend/styles/pages/_single.scss @@ -1,6 +1,7 @@ .article-container { margin-top: var(--wp--preset--spacing--single); margin-bottom: var(--wp--preset--spacing--single); + gap: var(--wp--preset--spacing--single); } .article-footer .article-meta { diff --git a/private/src/styles/pages/article/_back-link.scss b/private/src/frontend/styles/pages/article/_back-link.scss similarity index 76% rename from private/src/styles/pages/article/_back-link.scss rename to private/src/frontend/styles/pages/article/_back-link.scss index b7ab6524..d05a8514 100644 --- a/private/src/styles/pages/article/_back-link.scss +++ b/private/src/frontend/styles/pages/article/_back-link.scss @@ -1,3 +1,5 @@ +@use "../../../../utils/mixins/icon" as i; + .article-backLink { display: inline-flex; text-decoration: underline; @@ -10,7 +12,7 @@ display: inline-flex; &::before { - @include icon(290px, 200px, 17px, 11px); + @include i.icon(290px, 200px, 17px, 11px); content: " "; } diff --git a/private/src/frontend/styles/pages/article/_base.scss b/private/src/frontend/styles/pages/article/_base.scss new file mode 100644 index 00000000..5130d236 --- /dev/null +++ b/private/src/frontend/styles/pages/article/_base.scss @@ -0,0 +1,97 @@ +@use "../../../../utils/functions/flexy" as f; + +.article { + flex: 1 1 100%; + width: 100%; + max-width: 100%; + + @media all and (min-width: 840px) { + flex: 1 1 calc(100% - 88px); + } +} + +.article-container { + @include f.flexy-wrapper; + + @media all and (min-width: 1110px) { + flex-wrap: nowrap; + } +} + +.article-container--report .article-content { + padding-top: 30px; + border-top: 1px solid var(--wp--preset--color--grey-lighter); +} + +.article.has-sidebar { + flex: 1 1 100%; + width: 100%; + max-width: 100%; + margin-right: auto; + + @media all and (min-width: 840px) { + flex: 1 1 calc(100% - 88px); + } + + @media all and (min-width: 1110px) { + flex: 1 0 900px; + width: 900px; + max-width: 900px; + } + + .rtl & { + margin-right: 0; + margin-left: auto; + } +} + +.article-figure { + position: relative; + display: flex; + align-items: center; + max-height: 710px; // hero-md image height + overflow-y: hidden; + background-color: var(--wp--preset--color--grey-lighter); + text-align: center; + + // aiic-added wrapper for metadata + > div[style="position:relative"] { + width: 100%; + } + + &.is-stretched img { + min-width: 100%; + } +} + +.article-title { + margin-bottom: 0; + font-size: var(--wp--preset--font-size--article-title); +} + +.article-termWrapper { + background: var(--wp--preset--color--black); + padding: 8px 10px; + color: var(--wp--preset--color--white); +} + +.article-content > h4, +.article-content > h6 { + color: var(--wp--preset--color--grey-base); +} + +.article-content a { + &:hover, + &:active, + &:focus { + text-decoration: none; + } +} + +.article-content a:focus-within { + text-decoration: none; +} + +.article-content .btn { + text-decoration: none; +} diff --git a/private/src/styles/pages/article/_byline.scss b/private/src/frontend/styles/pages/article/_byline.scss similarity index 87% rename from private/src/styles/pages/article/_byline.scss rename to private/src/frontend/styles/pages/article/_byline.scss index 8a012559..fa256879 100644 --- a/private/src/styles/pages/article/_byline.scss +++ b/private/src/frontend/styles/pages/article/_byline.scss @@ -1,3 +1,5 @@ +@use "../../../../utils/mixins/icon" as i; + .avatarContainer { padding-right: 10px; } @@ -25,7 +27,7 @@ transform: scale(.6); vertical-align: -20%; - @include icon(246px, 131px, 20px, 17px); + @include i.icon(246px, 131px, 20px, 17px); } } diff --git a/private/src/styles/pages/article/_featured-image.scss b/private/src/frontend/styles/pages/article/_featured-image.scss similarity index 100% rename from private/src/styles/pages/article/_featured-image.scss rename to private/src/frontend/styles/pages/article/_featured-image.scss diff --git a/private/src/styles/pages/article/_footer.scss b/private/src/frontend/styles/pages/article/_footer.scss similarity index 100% rename from private/src/styles/pages/article/_footer.scss rename to private/src/frontend/styles/pages/article/_footer.scss diff --git a/private/src/frontend/styles/pages/article/_header.scss b/private/src/frontend/styles/pages/article/_header.scss new file mode 100644 index 00000000..a575764a --- /dev/null +++ b/private/src/frontend/styles/pages/article/_header.scss @@ -0,0 +1,36 @@ +.article-header { + margin-bottom: 16px; + + @media all and (min-width: 760px) { + margin-bottom: 24px; + } +} + +.article-header .article-header-block { + display: inline-block; + padding: 16px; + margin-bottom: 32px; + background: var(--wp--preset--color--black); + color: var(--wp--preset--color--white); +} + +.article-header .article-header-block h1 { + color: var(--wp--preset--color--white); + text-transform: uppercase; +} + +.article-header .article-term { + font-size: var(--wp--preset--font-size--small); + text-transform: uppercase; + font-family: var(--wp--preset--font-family--secondary); +} + +.article-header.is-narrow, +.article-content.is-narrow { + padding-right: 60px; + + .rtl & { + padding-right: 0; + padding-left: 60px; + } +} diff --git a/private/src/styles/pages/article/_meta.scss b/private/src/frontend/styles/pages/article/_meta.scss similarity index 100% rename from private/src/styles/pages/article/_meta.scss rename to private/src/frontend/styles/pages/article/_meta.scss diff --git a/private/src/frontend/styles/pages/article/_share.scss b/private/src/frontend/styles/pages/article/_share.scss new file mode 100644 index 00000000..1429a015 --- /dev/null +++ b/private/src/frontend/styles/pages/article/_share.scss @@ -0,0 +1,23 @@ +@use "../../../../utils/mixins/states" as s; + +ul.article-share { + display: flex; + gap: .5rem; + margin: 0 0 0 auto; + padding: 0; + list-style: none; +} + +.article-share a { + @include s.state-background(var(--wp--preset--color--grey-darker)); + display: block; + padding: 8px; + width: 47px; + height: 47px; + text-align: center; + background-color: var(--wp--preset--color--black); +} + +.article-share img { + max-height: 100%; +} diff --git a/private/src/styles/pages/search/_additional-filters.scss b/private/src/frontend/styles/pages/search/_additional-filters.scss similarity index 92% rename from private/src/styles/pages/search/_additional-filters.scss rename to private/src/frontend/styles/pages/search/_additional-filters.scss index bec2d565..023d160b 100644 --- a/private/src/styles/pages/search/_additional-filters.scss +++ b/private/src/frontend/styles/pages/search/_additional-filters.scss @@ -13,7 +13,7 @@ padding-bottom: var(--wp--preset--spacing--half); overflow-y: visible; - @include mq(medium) { + @media all and (min-width: 940px) { max-height: 150px; } } @@ -23,7 +23,7 @@ align-items: center; padding: 0 !important; - @include mq(medium) { + @media all and (min-width: 940px) { flex-direction: row; } } @@ -40,7 +40,7 @@ justify-content: space-between; flex-wrap: wrap; - @include mq(medium) { + @media all and (min-width: 940px) { justify-content: flex-start; align-items: flex-start; flex-wrap: nowrap; @@ -62,7 +62,7 @@ margin-bottom: var(--wp--preset--spacing--half); width: 100%; - @include mq(medium) { + @media all and (min-width: 940px) { margin-bottom: 0; } diff --git a/private/src/styles/pages/search/_initial-filters.scss b/private/src/frontend/styles/pages/search/_initial-filters.scss similarity index 88% rename from private/src/styles/pages/search/_initial-filters.scss rename to private/src/frontend/styles/pages/search/_initial-filters.scss index 7f05cef3..63dfb2dc 100644 --- a/private/src/styles/pages/search/_initial-filters.scss +++ b/private/src/frontend/styles/pages/search/_initial-filters.scss @@ -10,7 +10,7 @@ display: grid; grid-template-columns: repeat(12, 1fr); - @include mq(medium) { + @media all and (min-width: 940px) { grid-template-columns: repeat(11, 1fr); align-items: stretch; } @@ -25,11 +25,11 @@ pointer-events: none; } - @include mq(xx-small) { + @media all and (min-width: 465px) { grid-column: 10 / span 4; } - @include mq(medium) { + @media all and (min-width: 940px) { order: 5; grid-column: 11 / span 1; padding: var(--wp--preset--spacing--half); @@ -39,7 +39,7 @@ .horizontal-search .initial-filters .section { margin-top: 0; - @include mq($until: medium) { + @media all and (max-width: 939px) { flex-direction: column; } } @@ -54,7 +54,7 @@ transition: max-height .3s, padding .3s; overflow-y: hidden; - @include mq(medium) { + @media all and (min-width: 940px) { flex-wrap: nowrap; gap: var(--wp--preset--spacing--single); grid-column: 5 / span 6; @@ -69,7 +69,7 @@ padding-top: var(--wp--preset--spacing--half); overflow: visible; - @include mq(medium) { + @media all and (min-width: 940px) { max-height: initial; padding-top: 0; } diff --git a/private/src/styles/pages/search/_results.scss b/private/src/frontend/styles/pages/search/_results.scss similarity index 84% rename from private/src/styles/pages/search/_results.scss rename to private/src/frontend/styles/pages/search/_results.scss index d6f1e6de..899b76a9 100644 --- a/private/src/styles/pages/search/_results.scss +++ b/private/src/frontend/styles/pages/search/_results.scss @@ -1,3 +1,5 @@ +@use "../../../../utils/mixins/states" as s; + body.search main, body.page-template-searchpage main { margin-top: var(--wp--preset--spacing--single); @@ -19,7 +21,7 @@ body.page-template-searchpage .section .page-search { flex-direction: column; background-color: unset; - @include mq(xx-small) { + @media all and (min-width: 465px) { flex-direction: row; } } @@ -28,13 +30,13 @@ body.search .section .page-search input, body.page-template-searchpage .section .page-search input { margin-bottom: 10px; - @include mq(xx-small) { + @media all and (min-width: 465px) { margin-bottom: 0; } } .post--result { - @include state-background(var(--wp--preset--color--grey-lighter)); + @include s.state-background(var(--wp--preset--color--grey-lighter)); position: relative; } diff --git a/private/src/styles/pages/search/_searchbox.scss b/private/src/frontend/styles/pages/search/_searchbox.scss similarity index 84% rename from private/src/styles/pages/search/_searchbox.scss rename to private/src/frontend/styles/pages/search/_searchbox.scss index d09ab742..3bb32417 100644 --- a/private/src/styles/pages/search/_searchbox.scss +++ b/private/src/frontend/styles/pages/search/_searchbox.scss @@ -1,5 +1,6 @@ -@import "./initial-filters"; -@import "./additional-filters"; +@use "../../../../utils/mixins/icon" as i; +@use "./initial-filters"; +@use "./additional-filters"; .horizontal-search { margin-bottom: var(--wp--preset--spacing--single); @@ -15,7 +16,7 @@ padding: var(--wp--preset--spacing--half); line-height: 1.15; - @include mq(medium) { + @media all and (min-width: 940px) { padding: var(--wp--preset--spacing--half) var(--wp--preset--spacing--single); } } @@ -31,11 +32,11 @@ height: 100%; } - @include mq(xx-small) { + @media all and (min-width: 465px) { grid-column: 1 / span 9; } - @include mq(medium) { + @media all and (min-width: 940px) { grid-column: 1 / span 4; } } @@ -80,7 +81,7 @@ } .btn.toggle-search-filters .icon-arrow-down { - @extend %icon-arrow-down-light; + @include i.icon-position(406.5px, 196.5px); transform: scale(.75); transition: transform .3s; } @@ -96,22 +97,22 @@ } .horizontal-search .icon-search { - @extend %icon-search-light; + @include i.icon-position(105px, 240px); display: block; - @include mq(medium) { + @media all and (min-width: 940px) { display: none; } } .horizontal-search .btn.is-active .icon-search { - @extend %icon-search-dark; + @include i.icon-position(128px, 240px);; } .horizontal-search .search-button-text { word-break: keep-all; - @include mq($until: medium) { + @media all and (max-width: 939px) { display: none; } } diff --git a/private/src/styles/pages/search/results/_active-filters.scss b/private/src/frontend/styles/pages/search/results/_active-filters.scss similarity index 100% rename from private/src/styles/pages/search/results/_active-filters.scss rename to private/src/frontend/styles/pages/search/results/_active-filters.scss diff --git a/private/src/styles/pages/search/results/_filters.scss b/private/src/frontend/styles/pages/search/results/_filters.scss similarity index 93% rename from private/src/styles/pages/search/results/_filters.scss rename to private/src/frontend/styles/pages/search/results/_filters.scss index 65862c62..d59df13b 100644 --- a/private/src/styles/pages/search/results/_filters.scss +++ b/private/src/frontend/styles/pages/search/results/_filters.scss @@ -2,7 +2,7 @@ flex-basis: 100%; margin-bottom: var(--wp--preset--spacing--single); - @include mq(medium) { + @media all and (min-width: 940px) { flex-basis: 25%; margin-right: var(--wp--preset--spacing--single); margin-bottom: 0; diff --git a/private/src/styles/woocommerce/_cart.scss b/private/src/frontend/styles/woocommerce/_cart.scss similarity index 100% rename from private/src/styles/woocommerce/_cart.scss rename to private/src/frontend/styles/woocommerce/_cart.scss diff --git a/private/src/styles/woocommerce/_checkout.scss b/private/src/frontend/styles/woocommerce/_checkout.scss similarity index 90% rename from private/src/styles/woocommerce/_checkout.scss rename to private/src/frontend/styles/woocommerce/_checkout.scss index 0951d6e3..ab7b0b9d 100644 --- a/private/src/styles/woocommerce/_checkout.scss +++ b/private/src/frontend/styles/woocommerce/_checkout.scss @@ -12,7 +12,7 @@ } #order_review_heading { - margin-top: $spacing-unit; + margin-top: var(--wp--preset--spacing--single); } #ship-to-different-address h3 { diff --git a/private/src/styles/woocommerce/_base.scss b/private/src/frontend/styles/woocommerce/_global.scss similarity index 100% rename from private/src/styles/woocommerce/_base.scss rename to private/src/frontend/styles/woocommerce/_global.scss diff --git a/private/src/styles/woocommerce/_my-account.scss b/private/src/frontend/styles/woocommerce/_my-account.scss similarity index 100% rename from private/src/styles/woocommerce/_my-account.scss rename to private/src/frontend/styles/woocommerce/_my-account.scss diff --git a/private/src/styles/woocommerce/_orders.scss b/private/src/frontend/styles/woocommerce/_orders.scss similarity index 89% rename from private/src/styles/woocommerce/_orders.scss rename to private/src/frontend/styles/woocommerce/_orders.scss index f187349b..d3bf42b3 100644 --- a/private/src/styles/woocommerce/_orders.scss +++ b/private/src/frontend/styles/woocommerce/_orders.scss @@ -17,5 +17,5 @@ } .woocommerce-columns + .woocommerce-columns { - margin-top: $spacing-unit; + margin-top: var(--wp--preset--spacing--single); } diff --git a/private/src/styles/woocommerce/_product-archive.scss b/private/src/frontend/styles/woocommerce/_product-archive.scss similarity index 100% rename from private/src/styles/woocommerce/_product-archive.scss rename to private/src/frontend/styles/woocommerce/_product-archive.scss diff --git a/private/src/styles/woocommerce/_product-single.scss b/private/src/frontend/styles/woocommerce/_product-single.scss similarity index 81% rename from private/src/styles/woocommerce/_product-single.scss rename to private/src/frontend/styles/woocommerce/_product-single.scss index 91856bdb..362360a0 100644 --- a/private/src/styles/woocommerce/_product-single.scss +++ b/private/src/frontend/styles/woocommerce/_product-single.scss @@ -20,7 +20,7 @@ } .product-description h2 { - margin-bottom: $spacing-unit--half; + margin-bottom: var(--wp--preset--spacing--half); } .product-description p { @@ -29,14 +29,14 @@ } .variations_form { - @include mq(x-small) { + @media all and (min-width: 540px) { max-width: 250px; } } .woocommerce-product-gallery .flex-viewport { border: 1px solid var(--wp--preset--color--grey-lighter); - margin-bottom: $spacing-unit; + margin-bottom: var(--wp--preset--spacing--single); max-width: 472px; } @@ -53,27 +53,27 @@ border: 1px solid var(--wp--preset--color--grey-lighter); & + li { - margin-left: $spacing-unit; + margin-left: var(--wp--preset--spacing--single); } } .single-product .variations .label { - padding-right: $spacing-unit; + padding-right: var(--wp--preset--spacing--single); font-family: var(--wp--preset--font-family--secondary); text-transform: uppercase; } .single-product .variations .value { - padding-bottom: $spacing-unit; + padding-bottom: var(--wp--preset--spacing--single); } .single-product .reset_variations { - margin-bottom: $spacing-unit; + margin-bottom: var(--wp--preset--spacing--single); } .single-product .price { margin-top: 0; - margin-bottom: $spacing-unit; + margin-bottom: var(--wp--preset--spacing--single); font-family: var(--wp--preset--font-family--primary); color: var(--wp--preset--color--black); } diff --git a/private/src/styles/woocommerce/_shop-index.scss b/private/src/frontend/styles/woocommerce/_shop-index.scss similarity index 94% rename from private/src/styles/woocommerce/_shop-index.scss rename to private/src/frontend/styles/woocommerce/_shop-index.scss index 37138dc6..022a1e1f 100644 --- a/private/src/styles/woocommerce/_shop-index.scss +++ b/private/src/frontend/styles/woocommerce/_shop-index.scss @@ -14,7 +14,7 @@ min-height: 0; text-align: center; - @include mq(x-small) { + @media all and (min-width: 540px) { min-height: 400px; } } diff --git a/private/src/images/sprite.svg b/private/src/images/sprite.svg new file mode 100644 index 00000000..dc8bb2a1 --- /dev/null +++ b/private/src/images/sprite.svg @@ -0,0 +1,450 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="300" viewBox="0 0 313 300" width="313"> + <svg height="46" viewBox="0 0 50 46" width="50" x="184" y="82"> + <path fill="#FFFFFF" d="M23.9,13.6l1.5,1.5L17.6,23l7.9,7.9l-1.6,1.5L14.5,23L23.9,13.6z"/> + <path fill="#FFFFFF" d="M33.9,13.6l1.5,1.5L27.6,23l7.9,7.9l-1.6,1.5L24.5,23L33.9,13.6z"/> + </svg> + <svg height="46" viewBox="0 0 50 46" width="50" x="5" y="159"> + <path fill="#FFFFFF" d="M15.6,24.1l1.5-1.5l7.9,7.8l7.9-7.9l1.5,1.6L25,33.5L15.6,24.1z"/> + <path fill="#FFFFFF" d="M15.6,14.1l1.5-1.5l7.9,7.8l7.9-7.9l1.5,1.6L25,23.5L15.6,14.1z"/> + </svg> + <svg height="46" viewBox="0 0 50 46" width="50" x="60" y="159"> + <path fill="#FFFFFF" d="M26.1,32.4l-1.5-1.5l7.8-7.9l-7.9-7.9l1.6-1.5l9.4,9.4L26.1,32.4z"/> + <path fill="#FFFFFF" d="M16.1,32.4l-1.5-1.5l7.8-7.9l-7.9-7.9l1.6-1.5l9.4,9.4L16.1,32.4z"/> + </svg> + <svg height="17.2" viewBox="0 0 32 18" width="31.3" x="184" y="133"> + <circle fill="#FFFFFF" cx="15.6" cy="8.6" r="2.1"/> + <path fill="#FFFFFF" d="M30.7,8.1c-3.1-4.5-8.7-7.4-14.8-7.4c-0.1,0-0.2,0-0.3,0s-0.2,0-0.3,0C9.3,0.7,3.6,3.6,0.6,8.1L0.2,8.6 l0.4,0.5c3.1,4.5,8.7,7.4,14.8,7.4c0.1,0,0.2,0,0.3,0s0.2,0,0.3,0c6.1-0.1,11.7-2.9,14.8-7.4L31,8.6L30.7,8.1z M15.6,14.6 c-3.4,0-6.2-2.7-6.2-6s2.8-6,6.2-6s6.2,2.7,6.2,6S19,14.6,15.6,14.6z M2.5,8.6c1.6-2.1,3.9-3.8,6.6-4.8C8,5.1,7.4,6.8,7.4,8.6 s0.7,3.5,1.7,4.8C6.4,12.4,4.1,10.8,2.5,8.6z M22.1,13.5c1.1-1.3,1.7-3,1.7-4.8s-0.7-3.5-1.7-4.8c2.6,1,4.9,2.7,6.6,4.8 C27.1,10.8,24.8,12.4,22.1,13.5z"/> + </svg> + <svg height="17.2" viewBox="0 0 32 18" width="31.3" x="115" y="159"> + <circle fill="#000000" cx="15.6" cy="8.6" r="2.1"/> + <path fill="#000000" d="M30.7,8.1c-3.1-4.5-8.7-7.4-14.8-7.4c-0.1,0-0.2,0-0.3,0s-0.2,0-0.3,0C9.3,0.7,3.6,3.6,0.6,8.1L0.2,8.6 l0.4,0.5c3.1,4.5,8.7,7.4,14.8,7.4c0.1,0,0.2,0,0.3,0s0.2,0,0.3,0c6.1-0.1,11.7-2.9,14.8-7.4L31,8.6L30.7,8.1z M15.6,14.6 c-3.4,0-6.2-2.7-6.2-6s2.8-6,6.2-6s6.2,2.7,6.2,6S19,14.6,15.6,14.6z M2.5,8.6c1.6-2.1,3.9-3.8,6.6-4.8C8,5.1,7.4,6.8,7.4,8.6 s0.7,3.5,1.7,4.8C6.4,12.4,4.1,10.8,2.5,8.6z M22.1,13.5c1.1-1.3,1.7-3,1.7-4.8s-0.7-3.5-1.7-4.8c2.6,1,4.9,2.7,6.6,4.8 C27.1,10.8,24.8,12.4,22.1,13.5z"/> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="5" y="210"> + <g> + <path fill="#ffffff" d="M12.4,12.2L5.4,24.6H0.1L5,12.2H0.5V0.4h11.8V12.2z M30.9,12.2L24,24.6h-5.3l4.9-12.4h-4.5V0.4h11.8V12.2z"/> + </g> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="41" y="210"> + <g> + <path d="M0.1,12.8L7,0.4h5.3L7.4,12.8h4.5v11.8H0.1V12.8z M18.7,12.8l6.9-12.4h5.3L26,12.8h4.5v11.8H18.7V12.8z"/> + </g> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="77" y="210"> + <g> + <path fill="#ffffff" d="M0.1,12.8L7,0.4h5.3L7.4,12.8h4.5v11.8H0.1V12.8z M18.7,12.8l6.9-12.4h5.3L26,12.8h4.5v11.8H18.7V12.8z"/> + </g> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="113" y="210"> + <g> + <path d="M12.4,12.2L5.4,24.6H0.1L5,12.2H0.5V0.4h11.8V12.2z M30.9,12.2L24,24.6h-5.3l4.9-12.4h-4.5V0.4h11.8V12.2z"/> + </g> + </svg> + <svg height="21" viewBox="0 0 30 21" width="30" x="115" y="182"> + <!-- Generator: Sketch 44 (41411) - http://www.bohemiancoding.com/sketch --> + <title>youtube-play-dark</title> + <desc>Created with Sketch.</desc> + <defs/> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="youtube-play-dark" fill-rule="nonzero"> + <polygon id="Shape" fill="#FFFFFF" points="11.6665665 14.1560367 19.6126029 10.0390685 11.6665665 5.89331037"/> + <polygon id="Shape" fill="#000000" opacity="0.12" points="11.6665665 5.89331037 18.6337434 10.546636 19.6126029 10.0390685"/> + <path d="M29.1132987,4.46187221 C29.1132987,4.46187221 28.8253988,2.43534501 27.945001,1.54314331 C26.8267979,0.371678734 25.5721303,0.365632837 24.9983458,0.297400567 C20.8831051,0 14.7102439,0 14.7102439,0 L14.6975763,0 C14.6975763,0 8.5247152,0 4.40947443,0.297400567 C3.83568999,0.365632837 2.58159815,0.371678734 1.46281925,1.54314331 C0.58242144,2.43534501 0.294521569,4.46187221 0.294521569,4.46187221 C0.294521569,4.46187221 0,6.84165255 0,9.22143289 L0,11.452369 C0,13.8321493 0.294521569,16.2119297 0.294521569,16.2119297 C0.294521569,16.2119297 0.58242144,18.2384569 1.46281925,19.1309465 C2.58159815,20.3021231 4.05103909,20.265272 4.7054355,20.3879173 C7.05815325,20.6136308 14.7039101,20.6833026 14.7039101,20.6833026 C14.7039101,20.6833026 20.8831051,20.6740898 24.9983458,20.3764013 C25.5741456,20.3078811 26.82651,20.3021231 27.945001,19.1306586 C28.8253988,18.2384569 29.1132987,16.2119297 29.1132987,16.2119297 C29.1132987,16.2119297 29.4069566,13.8321493 29.4069566,11.452369 L29.4069566,9.22143289 C29.4075324,6.84165255 29.1132987,4.46187221 29.1132987,4.46187221 Z M11.6665665,14.1560367 L11.6665665,5.89331037 L19.6126029,10.0390685 L11.6665665,14.1560367 Z" id="Shape" fill="#282928"/> + </g> + </g> + </svg> + <svg height="20" viewBox="0 0 29 20" width="29" x="150" y="182"> + <!-- Generator: Sketch 44 (41411) - http://www.bohemiancoding.com/sketch --> + <title>youtube-play-red</title> + <desc>Created with Sketch.</desc> + <defs> + <linearGradient x1="50.0014671%" y1="0%" x2="50.0014671%" y2="100%" id="linearGradient-1"> + <stop stop-color="#E52D27" offset="0%"/> + <stop stop-color="#BF171D" offset="100%"/> + </linearGradient> + </defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="youtube-play-red"> + <polygon id="Shape" fill="#FFFFFF" fill-rule="nonzero" points="11.2720445 13.6773296 18.9493741 9.69958275 11.2720445 5.69401947"/> + <polygon id="Shape" fill="#420000" opacity="0.12" points="11.2720445 5.69401947 18.0036161 10.1899861 18.9493741 9.69958275"/> + <path d="M28.12879,4.31098748 C28.12879,4.31098748 27.8506259,2.35299026 27,1.49095967 C25.9196106,0.359109875 24.7073713,0.353268428 24.1529903,0.287343533 C20.1769124,0 14.2127955,0 14.2127955,0 L14.2005563,0 C14.2005563,0 8.2364395,0 4.26036161,0.287343533 C3.70598053,0.353268428 2.49429764,0.359109875 1.41335188,1.49095967 C0.562726008,2.35299026 0.284561892,4.31098748 0.284561892,4.31098748 C0.284561892,4.31098748 0,6.61029207 0,8.90959666 L0,11.0650904 C0,13.364395 0.284561892,15.6636996 0.284561892,15.6636996 C0.284561892,15.6636996 0.562726008,17.6216968 1.41335188,18.4840056 C2.49429764,19.6155772 3.91404729,19.5799722 4.54631433,19.6984701 C6.81947149,19.9165508 14.2066759,19.9838665 14.2066759,19.9838665 C14.2066759,19.9838665 20.1769124,19.9749652 24.1529903,19.6873435 C24.7093185,19.6211405 25.9193324,19.6155772 27,18.4837274 C27.8506259,17.6216968 28.12879,15.6636996 28.12879,15.6636996 C28.12879,15.6636996 28.4125174,13.364395 28.4125174,11.0650904 L28.4125174,8.90959666 C28.4130737,6.61029207 28.12879,4.31098748 28.12879,4.31098748 Z M11.2720445,13.6773296 L11.2720445,5.69401947 L18.9493741,9.69958275 L11.2720445,13.6773296 Z" id="Shape" fill="url(#linearGradient-1)" fill-rule="nonzero"/> + </g> + </g> + </svg> + <svg height="25" viewBox="0 0 25 25" width="25" x="149" y="210"> + <defs id="defs3348"/> + <g transform="matrix(0.27121977,0,0,0.27121977,-0.88977756,-1.016128)" id="g3338"> + <path id="path3340" d="m 21.207,39.091 c 0,0.174 0,0.336 0,0.511 0.395,0.278 1.323,0.186 1.161,-0.511 -0.221,-0.187 -0.952,-0.187 -1.161,0 z"/> + <path id="path3342" d="m 82.124,64.929 c 0.012,-0.371 0.186,-0.545 0.104,-0.998 0.674,-0.487 0.615,-1.068 0.882,-2.078 0.396,-1.485 2.183,-4.016 0.662,-5.153 -0.558,0.511 -0.162,0.917 -0.441,1.428 -0.452,0.848 -1.694,0.952 -2.193,1.648 -0.546,0.766 -0.72,2.159 -0.325,2.855 -0.801,0.894 -1.288,2.274 -0.558,3.609 1.011,-0.046 1.312,-0.812 1.869,-1.311 z"/> + <path id="path3344" d="M 92.037,33.937 C 89.75,27.948 86.233,22.565 81.776,18.125 73.731,10.109 62.67,5.123 50.436,5.002 c -0.151,0 -0.29,-0.006 -0.43,-0.006 -8.091,0 -15.671,2.147 -22.229,5.873 -9.542,5.438 -16.901,14.257 -20.441,24.832 -1.497,4.457 -2.321,9.228 -2.333,14.185 0,0.046 0,0.069 0,0.115 0,2.658 0.244,5.271 0.685,7.812 0.615,3.517 1.637,6.883 3.019,10.075 6.87,15.822 22.553,26.919 40.857,27.105 0.151,0 0.29,0.011 0.441,0.011 8.067,0 15.624,-2.136 22.171,-5.85 13.627,-7.73 22.82,-22.368 22.82,-39.153 C 94.997,44.337 93.94,38.928 92.037,33.937 Z M 63.761,85.822 c -0.673,-0.081 -0.882,-0.429 -1.474,-0.104 0.022,-0.58 -1.011,-0.104 -1.057,-0.638 -1.672,0.221 -3.238,0.395 -4.504,1.056 -0.464,0.244 -0.801,0.743 -1.266,0.848 -0.312,0.058 -0.754,-0.15 -1.056,-0.104 -0.929,0.116 -2.473,1.393 -3.563,1.579 -0.499,0.069 -1.01,-0.07 -1.591,0 -0.127,0.058 -0.278,0.104 -0.418,0.162 -3.354,-0.104 -6.593,-0.627 -9.669,-1.532 0.081,-0.128 0.174,-0.255 0.116,-0.534 -1.66,-0.998 -2.832,-2.483 -4.411,-3.575 -0.034,-0.801 0.639,-0.894 1.266,-1.044 -0.418,-0.999 -2.612,-0.569 -2.519,0.835 0.022,0.477 0.359,0.441 0.417,1.057 -0.476,-0.221 -0.545,-0.859 -1.16,-0.94 0.29,-0.197 0.243,-0.72 -0.209,-0.743 -0.487,-0.093 -0.197,0.581 -0.418,0.743 -0.522,0 -0.511,-0.116 -0.94,0 0.047,0.65 0.905,0.871 1.358,0.522 0.221,0.371 0.221,0.569 0,0.952 0.395,0.58 1.369,0.522 1.996,0.406 0.209,0.034 -0.022,-0.29 -0.104,-0.313 0.221,-0.278 0.465,0.302 0.522,0.534 -0.313,0.139 -0.639,0.209 -0.951,0.243 -1.104,-0.499 -2.171,-1.045 -3.216,-1.637 -0.116,-0.255 -0.395,-0.359 -0.708,-0.418 l 0,0 c -0.221,-0.116 -0.43,-0.255 -0.639,-0.383 0,0 0,0 0,-0.012 -0.012,0 -0.012,0 -0.034,-0.012 -2.821,-1.764 -5.387,-3.877 -7.661,-6.291 -0.07,-0.14 -0.175,-0.255 -0.302,-0.313 C 15.228,69.283 11.363,60.09 11.363,50.002 c 0,-3.842 0.557,-7.544 1.602,-11.05 0.15,0.441 0.128,1.057 0.487,1.288 0.639,-0.383 -0.081,-1.462 -0.186,-2.217 0,-0.023 0.012,-0.058 0.023,-0.081 0.243,0.673 0.812,1.276 0.998,1.984 0.104,0.406 -0.14,0.686 -0.104,1.045 0.128,1.254 1.103,1.394 2.205,2.217 0.522,0.128 0.441,-0.324 0.836,-0.312 0.302,1.404 2.356,1.079 2.426,2.716 0.209,0.348 0.697,0.418 0.72,0.951 0.558,-0.104 0.499,0.406 1.161,0.43 0.197,-0.162 0.023,-0.685 0.418,-0.639 0.534,0.453 0.568,1.405 0.522,2.415 -0.384,0.963 -1.684,2.345 -0.731,3.366 -0.812,0.836 0.046,2.193 0.731,2.519 0.406,1.532 1.01,2.844 1.892,3.877 0.883,0.186 1.23,0.882 1.684,1.475 0.012,2.229 0.302,4.155 0.522,6.094 0.139,1.057 -0.244,2.112 -0.197,3.146 0.058,1.428 1.114,2.356 0.939,3.889 -0.174,0.012 -0.406,-0.047 -0.418,0.104 -0.174,0.639 0.406,0.499 0.522,0.848 0.453,1.497 0.767,3.146 2.206,3.668 0.325,0.046 0.081,-0.488 0.325,-0.511 0.104,-0.279 0.034,0.894 -0.313,0.836 0.452,0.661 1.856,1.032 2.728,0.73 -0.929,-0.673 -1.788,-1.428 -2.311,-2.519 0.303,-0.464 0.569,-0.975 0.836,-1.463 -0.058,-0.511 -0.592,-0.522 -0.836,-0.847 -0.093,-0.441 0.465,-0.232 0.627,-0.418 -0.162,-0.151 -0.093,-0.534 -0.104,-0.848 0.128,-0.14 0.511,-0.035 0.522,-0.313 0.047,-0.522 -0.836,-0.14 -0.731,-0.731 0.268,0.093 0.558,0.14 0.94,0.104 0.174,-0.359 0,-0.696 0,-1.044 1.556,0.533 2.438,-0.639 1.684,-1.788 0.302,0.012 0.685,-0.058 0.847,0.104 1.23,-0.72 1.637,-2.275 2.52,-3.366 0.034,-0.487 -0.197,-0.72 -0.104,-1.254 0.395,-0.649 1.242,-0.847 1.775,-1.369 0.477,-0.047 0.895,0.15 1.266,0 0.963,-0.384 1.358,-3.354 1.161,-5.038 0.395,-0.313 2.414,-2.391 1.984,-3.575 -0.464,-1.3 -3.319,-2.635 -5.246,-2.414 -0.488,-1.126 -1.765,-0.976 -2.729,-1.475 -0.359,-1.88 -1.138,-3.343 -3.575,-3.146 -0.476,-1.045 -1.961,-1.463 -2.101,-2.519 -0.674,-0.081 -1.138,0.047 -1.358,0.418 -0.395,-0.256 -0.592,-0.14 -1.16,-0.104 -0.187,-0.383 -0.593,-0.522 -0.731,-0.94 -0.487,0 -0.441,0.349 -0.639,-0.116 -0.87,0.395 -1.741,0.778 -1.996,1.787 -0.384,-0.197 -1.23,-0.464 -1.881,0 -1.126,-0.916 0.696,-4.085 -1.996,-3.261 0.197,-0.871 0.568,-1.591 0.73,-2.508 -0.127,-0.093 -0.255,-0.139 -0.359,-0.186 0.302,-0.383 0.801,-0.557 1.556,-0.487 0,-1.451 -1.567,-1.475 -2.705,-1.149 -0.186,-0.337 -0.627,-0.731 -1.149,-1.079 0.256,-0.418 0.604,-0.731 1.08,-0.883 0.511,-0.046 0.522,0.395 0.952,0.418 0.278,-0.104 0.348,-0.43 0.312,-0.847 0.802,-0.163 0.895,0.186 1.579,0 0.093,0.882 0.278,1.694 0.627,2.31 1.184,-1.045 -0.163,-2.855 0.627,-4.086 0.58,-0.894 1.671,-0.894 1.996,-1.996 0.059,-0.349 -0.069,-0.488 -0.104,-0.731 0.627,-0.395 0.812,-1.23 1.161,-1.904 0.673,-0.231 0.858,-0.951 1.566,-1.148 0.14,-0.418 -0.336,-0.209 -0.209,-0.627 0.302,-0.674 1.22,-0.755 1.684,-1.254 0.14,0.162 -0.093,0.615 0.209,0.836 0.673,-0.476 1.567,-0.743 2.205,-1.266 0.093,-0.464 -0.186,-0.58 -0.522,-0.627 0.012,-0.302 0.441,-0.186 0.418,-0.521 -0.069,-0.372 -0.801,-0.116 -1.044,-0.313 0.081,-0.932 0.975,-0.418 1.566,-0.836 0.104,-0.525 -0.661,-0.183 -0.836,-0.427 0.65,-0.36 1.8,-0.232 1.893,-1.161 0.94,-0.139 1.428,-0.736 1.671,-1.572 -0.046,-0.54 -0.812,-0.36 -0.73,-1.051 -0.384,0.035 -0.686,-0.018 -0.94,-0.099 -0.244,-1.021 -0.511,-2.014 -0.848,-2.948 -0.302,0.041 -0.487,0.191 -0.639,0.383 -0.022,-0.012 -0.034,-0.029 -0.058,-0.035 -0.104,0.14 -0.349,0.094 -0.546,-0.028 2.275,-1.358 4.701,-2.49 7.255,-3.366 0.116,0.15 0.244,0.296 0.499,0.319 -0.197,0.435 -0.209,0.615 0.104,0.939 0.43,0.082 0.604,-0.099 0.952,-0.099 0.209,0.14 0.267,0.436 0.522,0.522 0.801,-0.493 1.903,-1.213 1.578,-2.205 0.256,-0.128 0.396,-0.383 0.511,-0.662 2.717,-0.604 5.525,-0.923 8.416,-0.923 4.353,0 8.531,0.731 12.443,2.061 -0.349,1.01 0.069,2.728 0.998,2.885 0.72,0.122 0.894,-0.447 1.684,-0.627 0.162,0.737 0.627,1.189 1.044,1.678 0.023,0.517 -0.777,0.203 -0.626,0.841 0.209,0.645 1.647,0.662 2.101,0.418 0.128,-0.923 0.081,-2.014 0.848,-2.31 0.012,-0.093 0.012,-0.174 0,-0.238 0.731,0.4 1.439,0.824 2.136,1.271 0.116,0.342 0.476,0.568 0.487,1.073 -0.499,0.029 -0.325,-0.598 -0.848,-0.528 -0.685,0.215 -0.499,1.312 -0.836,1.893 -1.265,-0.465 -2.402,0.54 -3.459,-0.424 0.325,-0.708 -0.464,-0.667 -0.742,-1.051 0.278,-0.754 0.313,-1.103 0,-1.886 -1.405,0.075 -1.219,1.59 -0.731,2.519 -0.465,0.041 -1.23,0.012 -1.788,0.215 -0.359,0.412 -0.418,1.126 -1.265,1.051 -0.325,-0.29 0.359,-0.522 0,-0.848 -0.151,-0.203 -0.534,-0.156 -0.731,-0.313 -0.023,-0.72 -0.43,-1.045 -0.952,-1.265 0.081,-0.39 0.14,-0.743 -0.418,-0.731 -0.069,-0.447 0.337,-0.424 0.313,-0.842 -0.069,-0.267 -0.336,-0.365 -0.731,-0.313 -0.093,-0.296 0.151,-0.272 0.104,-0.522 -0.174,-0.18 -0.615,-0.087 -0.951,-0.11 -0.499,0.308 -0.418,1.185 -0.836,1.579 -0.047,0.331 0.511,0.034 0.418,0.418 0.069,0.418 -0.499,0.133 -0.522,0 -0.685,0.272 -0.859,0.853 -1.684,0.736 0.094,0.401 0.14,0.848 0.104,1.364 0.268,0.267 0.743,0.313 0.94,0.633 0.627,-0.128 1.08,-0.389 1.37,-0.848 0,-0.313 0,-0.627 0,-0.94 0.255,-0.093 0.464,-0.249 0.848,-0.209 -0.104,0.412 0.312,0.313 0.208,0.726 -0.255,-0.006 -0.511,-0.012 -0.626,0.11 -0.082,0.395 0.174,0.447 0.104,0.842 -0.268,-0.018 -0.511,-0.018 -0.627,0.11 0.022,0.272 0.243,0.371 0.627,0.313 -0.047,0.436 -0.5,0.481 -0.627,0.836 0.731,0.249 1.973,0.093 2.623,-0.104 -0.209,0.522 0.337,0.278 0.313,0.627 -1.033,-0.528 -1.068,0.423 -2.31,0.214 -0.151,0.134 -0.104,0.453 -0.104,0.737 0.928,0.482 2.298,1.033 1.671,2.72 -1.474,0.243 -3.122,-0.812 -3.981,0.115 0.615,1.277 -0.139,2.543 0.104,3.784 0.627,0.163 1.532,0.059 1.881,0.511 -0.313,0.291 -0.627,0.569 -0.627,1.161 -1.544,0.349 -1.335,2.461 -2.31,3.366 -1.893,0.708 -2.392,2.798 -3.471,4.295 0.905,0.917 0.476,2.972 -0.104,3.9 0.162,0.359 0.44,0.604 0.313,1.253 0.312,0.5 0.858,0.755 1.369,1.057 0.731,1.66 1.556,3.784 3.354,3.981 0.79,0.093 1.196,-0.592 1.893,-0.627 0.673,-0.023 0.87,0.476 1.578,0.522 1.08,-0.29 2.066,-1.23 3.157,-1.045 0.905,0.162 1.532,1.741 2.624,0.94 0.383,0.731 0.231,2.205 -0.116,2.832 0.406,1.358 1.428,2.09 1.683,3.575 1.985,1.404 -0.29,3.506 -0.104,5.363 0.093,0.928 0.929,1.625 1.057,2.623 0.232,1.95 0.824,3.378 1.787,4.828 0.012,0.303 -0.359,0.209 -0.209,0.627 0.406,1.637 2.136,-0.081 3.146,0.313 1.01,-0.638 2.182,-1.103 2.519,-2.414 1.347,-0.511 1.416,-2.299 2.101,-3.471 0.175,0 0.349,0 0.522,0 0.383,-0.558 0.418,-1.741 0,-2.299 0.477,-0.998 1.382,-1.566 2.206,-2.205 0.046,-1.323 0.557,-2.136 0.209,-3.157 -0.163,-0.487 -0.778,-0.731 -0.836,-1.161 -0.256,-1.659 1.927,-2.089 2.101,-3.877 0.278,-0.069 0.395,-0.302 0.627,-0.418 0.337,-1.845 1.637,-3.272 1.475,-5.258 -0.79,0.383 -1.765,0.477 -2.52,0.639 -0.278,-0.337 0.186,-0.592 0.313,-0.848 -0.858,-1.312 -2.611,-2.739 -2.31,-4.515 -0.696,-0.917 -1.475,-2.311 -1.579,-3.46 0.65,-0.139 0.859,1.011 1.057,1.672 0.093,0.43 0.557,0.499 0.731,0.848 0.093,1.938 1.578,2.473 1.671,4.411 0.418,0.324 0.36,1.114 0.952,1.253 0.418,0.07 0.302,-0.395 0.313,-0.731 1.126,-0.766 2.496,-1.276 3.459,-2.205 0,-0.777 0.487,-0.859 0.43,-1.475 -0.069,-0.673 -0.952,-0.917 -0.952,-1.671 0.546,0.046 0.917,0.267 1.416,0.371 1.138,3.634 1.741,7.487 1.741,11.479 0,15.59 -9.251,29.031 -22.554,35.125 -1.007,-0.046 -1.843,0.047 -2.33,0.696 z M 28.996,23.861 c -0.29,-0.093 0.093,-0.369 0.093,-0.525 0.406,0.053 0.522,-0.191 0.952,-0.104 -0.059,0.501 -0.767,0.354 -1.045,0.629 z m 0.523,1.254 c 0.243,0.034 0.43,0.127 0.627,0.22 -0.094,0.221 -0.767,0.14 -0.627,-0.22 z m -5.364,-1.779 c -0.359,-0.558 -0.127,-1.271 0,-1.892 0.012,-0.07 -0.023,-0.094 -0.069,-0.104 0.661,-0.599 1.347,-1.161 2.043,-1.719 -0.128,0.993 -0.894,1.353 -1.451,1.928 0.267,0.574 0.313,1.74 -0.523,1.787 z m -0.836,3.996 c -0.452,-0.406 -0.557,0.221 -0.626,0.522 -0.104,-0.313 -0.256,-0.592 -0.325,-0.952 0.325,0.151 0.383,-0.046 0.847,0 -0.011,0.198 0.128,0.221 0.104,0.43 z M 21.01,26.38 c 0.151,-0.197 0.441,-0.255 0.522,-0.522 0.337,0.093 0.546,0.29 0.522,0.731 -0.36,-0.081 -0.395,0.163 -0.731,0.104 0.116,-0.325 0.105,-0.337 -0.313,-0.313 z m -0.314,0.43 c -0.186,-0.081 -0.012,-0.197 0,-0.325 0.186,0.08 0.012,0.185 0,0.325 z m -2.449,11.63 c -0.023,0.244 0.151,0.29 0.128,0.522 -0.36,-0.023 -0.696,-0.012 -0.639,0.383 0.232,0.615 0.848,0.325 1.3,0.569 -0.812,0.104 -0.685,1.973 -2.02,1.706 -0.104,-0.313 -0.197,-0.662 -0.255,-1.01 0.116,-0.023 0.267,-0.047 0.464,-0.104 -0.116,-0.65 -0.371,-0.812 -0.592,-0.755 -0.023,-0.302 -0.012,-0.615 0.012,-0.917 0.697,0.036 1.08,-0.254 1.602,-0.394 z m 6.547,6.628 c -0.012,-0.255 0.162,-0.313 0.209,-0.522 0.383,0.081 0.128,0.569 -0.209,0.522 z m 60.383,-7.765 c -0.336,0.511 -0.464,1.207 -1.369,1.161 -0.232,-0.29 -0.302,-0.755 -0.313,-1.266 -0.197,-0.197 -0.384,-0.034 -0.627,0 -0.174,-0.673 -0.604,-1.079 -0.639,-1.892 1.138,0.313 0.894,1.973 2.008,2.31 0.452,0.035 0.534,-0.302 0.94,-0.313 z m -2.844,-8.474 c 0,0.023 0,0.047 0.012,0.07 0.081,0.115 0.174,0.231 0.256,0.348 0.046,0.069 0.081,0.14 0.115,0.197 0.256,0.395 0.453,0.836 0.465,1.451 -1.591,0.069 -2.206,-1.161 -1.672,-2.623 -0.673,-0.674 -1.3,-1.684 -1.566,-2.693 0.846,1.033 1.647,2.124 2.39,3.25 z m -11.225,4.794 c -1.66,-0.58 -2.6,-1.88 -4.202,-2.519 0.244,-0.859 -0.487,-1.01 -0.209,-1.579 -0.313,-0.116 -0.615,-0.22 -0.847,-0.418 -0.313,0.035 -0.465,0.232 -0.731,0.325 -1.312,-0.162 -2.473,-0.278 -3.68,0 -1.126,0.244 -2.264,1.149 -3.354,0.209 1.357,-0.081 2.321,-0.43 3.041,-1.16 -0.232,-1.776 1.335,-1.753 1.578,-3.053 0.999,0.371 1.765,0.104 2.52,-0.313 0.848,1.323 2.763,1.578 3.146,3.366 -0.546,0.093 -1.021,0.267 -1.567,-0.104 -0.197,0.615 0.488,1.172 0.836,1.578 0.325,0.081 0.383,-0.116 0.627,-0.104 0.047,-0.371 -0.035,-0.592 -0.104,-0.848 0.313,0 0.534,0.313 0.743,0.116 0.058,-0.324 0.29,-0.487 0.627,-0.533 0.069,-0.384 -0.232,-0.406 -0.209,-0.731 0.348,0 0.511,0.499 0.835,0.209 0.035,-0.94 -0.998,-0.824 -1.148,-1.579 0.627,-0.186 0.824,0.081 1.253,0.325 0.256,1.729 0.895,3.088 2.311,3.668 0.174,0.081 0.174,-0.487 0,-0.418 0.104,-0.325 0.29,0.116 0.418,0.104 0.255,0.035 -0.059,-0.476 0.324,-0.313 -0.267,-0.836 -0.429,-1.138 -0.429,-2.205 0.824,0 0.754,1.276 0.742,1.787 0.488,0.674 1.208,1.625 2.415,1.254 0.371,-0.023 0.336,0.359 0.627,0.418 0.452,0 0.673,-0.244 1.16,-0.209 -0.116,0.998 -0.023,1.787 -0.209,2.832 -2.055,-0.162 -4.062,-0.325 -5.142,-1.671 -0.313,0.312 -1.207,0.058 -1.475,0.406 -0.082,0.511 0.162,0.684 0.103,1.16 z m -9.982,-13.02 c 0.325,-0.151 0.15,0.609 -0.104,0.522 -0.047,-0.25 0.185,-0.227 0.104,-0.522 z m 13.546,6.729 c -0.197,-0.256 -0.359,-0.546 -0.627,-0.743 0.337,-0.534 0.558,-1.184 0.94,-1.683 0.499,-0.035 0.476,0.429 1.057,0.313 -0.128,0.312 -0.035,0.359 0.093,0.638 0.464,-0.231 0.94,0.012 1.381,0.104 0.082,-0.406 -0.231,-0.406 -0.429,-0.533 0.162,-0.209 0.742,-0.023 0.951,-0.209 -0.034,0.243 0.023,0.406 0.209,0.429 0.012,0.221 -0.371,0.047 -0.522,0.093 0.07,0.221 0.197,0.372 0.337,0.522 -0.151,0.012 -0.302,0.035 -0.441,0.104 -0.058,0.755 0.372,0.999 0.778,1.277 0.255,-0.209 0.708,-0.221 0.963,-0.441 0.268,0.209 0.477,0.465 0.558,0.859 -1.882,0.047 -2.961,-1.369 -5.248,-0.73 z"/> + </g> + </svg> + <svg height="24" viewBox="0 0 24 24" width="24" x="179" y="210"> + <g> + <path fill="#FFFFFF" d="M24,2.5L14.5,12l9.5,9.5L21.5,24L12,14.5L2.5,24L0,21.5L9.5,12L0,2.5L2.5,0L12,9.5L21.5,0L24,2.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="184" y="182"> + <path fill="#000000" d="M17.1,0c0.8,0,1.5,0.3,2.1,0.9C19.7,1.4,20,2.1,20,2.9v14.2c0,0.8-0.3,1.5-0.9,2.1c-0.6,0.6-1.3,0.9-2.1,0.9 H2.9c-0.8,0-1.5-0.3-2.1-0.9S0,17.9,0,17.1V2.9c0-0.8,0.3-1.5,0.9-2.1S2.1,0,2.9,0C2.9,0,17.1,0,17.1,0z M10,6.2 c-1,0-1.9,0.4-2.7,1.1S6.3,9,6.3,10s0.4,1.9,1.1,2.7c0.7,0.7,1.6,1.1,2.7,1.1c1,0,1.9-0.4,2.7-1.1c0.7-0.7,1.1-1.6,1.1-2.7 s-0.4-1.9-1.1-2.7C11.9,6.6,11,6.2,10,6.2z M17.9,17.5V8.7h-2.2c0.1,0.4,0.1,0.8,0.1,1.2c0,1.1-0.3,2-0.8,2.9s-1.2,1.6-2.1,2.1 c-0.9,0.5-1.9,0.8-2.9,0.8S8,15.6,7.1,15c-0.9-0.5-1.6-1.2-2.1-2.1C4.4,12,4.2,11.1,4.2,10c0-0.4,0-0.9,0.1-1.2H2.1v8.7 c0,0.1,0,0.2,0.1,0.3s0.2,0.1,0.3,0.1h15c0.1,0,0.2,0,0.3-0.1C17.9,17.7,17.9,17.6,17.9,17.5L17.9,17.5z M17.9,5V2.5 c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.2-0.1-0.3-0.1H15c-0.1,0-0.2,0-0.3,0.1c-0.1,0.1-0.1,0.2-0.1,0.3V5c0,0.1,0,0.2,0.1,0.3 c0.1,0.1,0.2,0.1,0.3,0.1h2.5c0.1,0,0.2,0,0.3-0.1C17.9,5.2,17.9,5.1,17.9,5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="209" y="182"> + <g> + <path fill="#ffffff" d="M11.4,7.3c-0.2-0.2-0.5-0.3-0.8-0.3C10,6.9,9.5,7.3,9,8.1c-0.5,0.8-0.7,1.5-0.7,2.3c0,0.4,0.1,0.8,0.3,1.1 c0.2,0.3,0.5,0.4,0.9,0.4c0.6,0,1.2-0.5,1.6-1.5c0.4-1,0.6-1.7,0.6-2.3C11.7,7.8,11.6,7.5,11.4,7.3z"/> + <path fill="#ffffff" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M10.8,12.5 c-0.5,0.5-1.1,0.7-1.8,0.7c-0.7,0-1.3-0.3-1.8-0.8c-0.5-0.5-0.7-1.3-0.7-2.2c0-1.1,0.4-2.1,1.1-3.1c0.7-1,1.7-1.4,2.7-1.4 c0.6,0,1.1,0.2,1.5,0.5c0.3,0.3,0.4,0.6,0.5,0.9L12.5,6h1.7l-1.2,3.9c-0.1,0.3-0.2,0.6-0.2,0.7c0,0.2-0.1,0.3-0.1,0.4 c0,0.2,0.1,0.4,0.2,0.5c0.1,0.2,0.3,0.2,0.6,0.2c0.5,0,1-0.3,1.6-1c0.5-0.7,0.8-1.6,0.8-2.7c0-1.7-0.7-2.8-2.1-3.6 c-0.9-0.5-1.9-0.7-3-0.7c-2,0-3.7,0.6-4.9,1.9C4.7,6.9,4.2,8.2,4.2,9.8c0,1.8,0.7,3.2,2,4.2c1.2,0.9,2.6,1.4,4.3,1.4 c1.1,0,2.2-0.2,3.2-0.6c0.5-0.2,1.1-0.5,1.7-0.9l0.2-0.2l0.7,1c-0.9,0.7-1.8,1.2-2.8,1.5c-1,0.3-2,0.5-3.1,0.5 c-2.5,0-4.4-0.8-5.8-2.3C3.3,13,2.8,11.5,2.8,9.7c0-2,0.7-3.7,2.1-5c1.5-1.5,3.4-2.2,5.7-2.2c1.9,0,3.5,0.5,4.7,1.5 c1.3,1,2,2.4,2,4.2c0,1.4-0.4,2.5-1.2,3.5c-0.8,1-1.8,1.5-2.8,1.5c-0.6,0-1-0.2-1.3-0.5c-0.3-0.3-0.4-0.6-0.4-1c0,0,0-0.1,0-0.1 c0-0.1,0-0.1,0-0.2C11.3,11.9,11.1,12.2,10.8,12.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="208" y="210"> + <g> + <path fill="#000000" d="M11.4,7.3c-0.2-0.2-0.5-0.3-0.8-0.3C10,6.9,9.5,7.3,9,8.1c-0.5,0.8-0.7,1.5-0.7,2.3c0,0.4,0.1,0.8,0.3,1.1 c0.2,0.3,0.5,0.4,0.9,0.4c0.6,0,1.2-0.5,1.6-1.5c0.4-1,0.6-1.7,0.6-2.3C11.7,7.8,11.6,7.5,11.4,7.3z"/> + <path fill="#000000" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M10.8,12.5 c-0.5,0.5-1.1,0.7-1.8,0.7c-0.7,0-1.3-0.3-1.8-0.8c-0.5-0.5-0.7-1.3-0.7-2.2c0-1.1,0.4-2.1,1.1-3.1c0.7-1,1.7-1.4,2.7-1.4 c0.6,0,1.1,0.2,1.5,0.5c0.3,0.3,0.4,0.6,0.5,0.9L12.5,6h1.7l-1.2,3.9c-0.1,0.3-0.2,0.6-0.2,0.7c0,0.2-0.1,0.3-0.1,0.4 c0,0.2,0.1,0.4,0.2,0.5c0.1,0.2,0.3,0.2,0.6,0.2c0.5,0,1-0.3,1.6-1c0.5-0.7,0.8-1.6,0.8-2.7c0-1.7-0.7-2.8-2.1-3.6 c-0.9-0.5-1.9-0.7-3-0.7c-2,0-3.7,0.6-4.9,1.9C4.7,6.9,4.2,8.2,4.2,9.8c0,1.8,0.7,3.2,2,4.2c1.2,0.9,2.6,1.4,4.3,1.4 c1.1,0,2.2-0.2,3.2-0.6c0.5-0.2,1.1-0.5,1.7-0.9l0.2-0.2l0.7,1c-0.9,0.7-1.8,1.2-2.8,1.5c-1,0.3-2,0.5-3.1,0.5 c-2.5,0-4.4-0.8-5.8-2.3C3.3,13,2.8,11.5,2.8,9.7c0-2,0.7-3.7,2.1-5c1.5-1.5,3.4-2.2,5.7-2.2c1.9,0,3.5,0.5,4.7,1.5 c1.3,1,2,2.4,2,4.2c0,1.4-0.4,2.5-1.2,3.5c-0.8,1-1.8,1.5-2.8,1.5c-0.6,0-1-0.2-1.3-0.5c-0.3-0.3-0.4-0.6-0.4-1c0,0,0-0.1,0-0.1 c0-0.1,0-0.1,0-0.2C11.3,11.9,11.1,12.2,10.8,12.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="5"> + <path fill="#FFFFFF" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M15,5h-1.4c-1.1,0-1.1,0.9-1.1,1.6 v2.1h2.4l-0.3,2.5h-2.1v6.2H10v-6.2H7.5V8.8H10V6.4c0-2.2,1.2-3.4,3.2-3.4C14.1,2.9,15,3,15,3V5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="30"> + <path fill="#000000" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M15,5h-1.4c-1.1,0-1.1,0.9-1.1,1.6 v2.1h2.4l-0.3,2.5h-2.1v6.2H10v-6.2H7.5V8.8H10V6.4c0-2.2,1.2-3.4,3.2-3.4C14.1,2.9,15,3,15,3V5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="55"> + <path fill="#FFFFFF" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="80"> + <path fill="#000000" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="105"> + <path fill="#27346A" d="M15.8 1.7C14.9.7 13.3.2 11.2.2H5.1c-.4.1-.8.4-.8.8L1.8 17c-.1.3.2.6.5.6H6l.9-6v.2c.1-.4.4-.7.9-.7h1.8c3.5 0 6.2-1.4 7-5.5 0-.1 0-.2.1-.4-.1-.1-.1-.1 0 0 .2-1.5-.1-2.5-.9-3.5"/> + <path fill="#27346A" d="M8.4 4.7c.1 0 .2-.1.3-.1h4.7c.6 0 1.1 0 1.6.1.1 0 .3 0 .4.1.2 0 .4.1.6.2.2.1.5.2.7.3.2-1.5 0-2.5-.8-3.5C15 .8 13.4.3 11.3.3H5.1c-.4 0-.8.3-.8.7L1.8 17c-.1.3.2.6.5.6H6L8 5.2c0-.2.1-.4.4-.5z"/> + <path fill="#2790C3" d="M16.6 5.6c-.8 4.1-3.5 5.5-7 5.5H7.8c-.4 0-.8.3-.9.7l-1.2 7.4c0 .3.2.5.4.5h3.1c.4 0 .7-.3.7-.6v-.2l.6-3.8v-.2c.1-.4.4-.6.7-.6h.8c3.1 0 5.4-1.2 6.1-4.8.3-1.5.1-2.7-.6-3.6-.2-.3-.5-.5-.9-.7v.4z"/> + <path fill="#1F264F" d="M15.8 4.9c-.1 0-.2-.1-.4-.1-.1 0-.3-.1-.4-.1-.5-.1-1-.1-1.6-.1H8.7c-.1 0-.2 0-.3.1-.3.1-.4.3-.4.5l-1 6.4v.2c.1-.4.4-.7.9-.7h1.8c3.5 0 6.2-1.4 7-5.5 0-.1 0-.2.1-.4-.4-.1-.6-.2-.8-.3h-.2"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="130"> + <path fill="#55acee" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="155"> + <g> + <path fill="#FFF" d="M9.2,3.1c-0.3-0.3-0.6-0.4-1-0.4c-0.5,0-1,0.2-1.3,0.6c-0.4,0.5-0.5,1-0.5,1.5C6.4,5.5,6.6,6.2,7,7 c0.2,0.4,0.5,0.7,0.8,0.9c0.3,0.3,0.7,0.4,1.1,0.4c0.5,0,0.9-0.2,1.3-0.6c0.2-0.2,0.3-0.5,0.3-0.8c0-0.3,0-0.5,0-0.7 c0-0.8-0.2-1.6-0.6-2.3C9.8,3.6,9.5,3.3,9.2,3.1z"/> + <path fill="#FFF" d="M9.1,11.4c-0.1,0-0.4,0-0.8,0c-0.4,0.1-0.8,0.1-1.2,0.3c-0.1,0-0.2,0.1-0.4,0.2c-0.2,0.1-0.4,0.2-0.6,0.4 c-0.2,0.2-0.3,0.4-0.5,0.6c-0.1,0.2-0.2,0.5-0.2,0.9c0,0.7,0.3,1.3,0.9,1.7c0.6,0.4,1.4,0.7,2.4,0.7c0.9,0,1.6-0.2,2.1-0.6 c0.6-0.4,0.8-0.9,0.8-1.6c0-0.5-0.2-0.9-0.5-1.3c-0.3-0.4-0.9-0.8-1.6-1.3C9.4,11.4,9.2,11.4,9.1,11.4z"/> + <path fill="#FFF" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M11.3,3.3 c0.1,0.2,0.3,0.2,0.4,0.4C11.9,4,12,4.2,12.1,4.5c0.1,0.3,0.1,0.6,0.1,1c0,0.7-0.2,1.2-0.5,1.7c-0.1,0.2-0.3,0.4-0.5,0.6 s-0.4,0.3-0.6,0.5c-0.1,0.1-0.2,0.3-0.3,0.4c-0.1,0.2-0.2,0.3-0.2,0.6c0,0.2,0.1,0.4,0.2,0.5c0.1,0.1,0.2,0.2,0.3,0.3l0.7,0.5 c0.4,0.3,0.8,0.7,1.1,1.1c0.3,0.4,0.4,1,0.5,1.6c0,1-0.4,1.8-1.3,2.5C10.8,16.6,9.5,17,7.9,17c-1.4,0-2.4-0.3-3.1-0.9 c-0.7-0.5-1-1.2-1-1.9c0-0.4,0.1-0.8,0.3-1.2c0.2-0.4,0.6-0.8,1.2-1.2c0.6-0.4,1.3-0.6,2-0.7C8,11,8.5,10.9,9,10.9 c-0.1-0.2-0.3-0.4-0.4-0.6c-0.1-0.2-0.2-0.5-0.2-0.7s0-0.3,0.1-0.4c0-0.1,0.1-0.2,0.1-0.3c-0.2,0-0.4,0-0.6,0c-1,0-1.8-0.3-2.4-1 C5,7.2,4.7,6.5,4.7,5.8c0-1,0.4-1.8,1.2-2.6C6.5,2.7,7,2.4,7.6,2.3C8.3,2.1,8.9,2,9.4,2h3.9l-1.2,1.2h-1.2 C11,3.2,11.2,3.2,11.3,3.3z M18.8,5.2h-1.8v0.5V6v1h-1.3V6.1V5.7V5.2H15h-0.3h-1V3.8h0.9H15h0.5V2h1.3v1.8h1.8V5.2z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="180"> + <path fill="#FFFFFF" d="M17.1,0c0.8,0,1.5,0.3,2.1,0.9C19.7,1.4,20,2.1,20,2.9v14.2c0,0.8-0.3,1.5-0.9,2.1c-0.6,0.6-1.3,0.9-2.1,0.9 H2.9c-0.8,0-1.5-0.3-2.1-0.9S0,17.9,0,17.1V2.9c0-0.8,0.3-1.5,0.9-2.1S2.1,0,2.9,0C2.9,0,17.1,0,17.1,0z M10,6.2 c-1,0-1.9,0.4-2.7,1.1S6.3,9,6.3,10s0.4,1.9,1.1,2.7c0.7,0.7,1.6,1.1,2.7,1.1c1,0,1.9-0.4,2.7-1.1c0.7-0.7,1.1-1.6,1.1-2.7 s-0.4-1.9-1.1-2.7C11.9,6.6,11,6.2,10,6.2z M17.9,17.5V8.7h-2.2c0.1,0.4,0.1,0.8,0.1,1.2c0,1.1-0.3,2-0.8,2.9s-1.2,1.6-2.1,2.1 c-0.9,0.5-1.9,0.8-2.9,0.8S8,15.6,7.1,15c-0.9-0.5-1.6-1.2-2.1-2.1C4.4,12,4.2,11.1,4.2,10c0-0.4,0-0.9,0.1-1.2H2.1v8.7 c0,0.1,0,0.2,0.1,0.3s0.2,0.1,0.3,0.1h15c0.1,0,0.2,0,0.3-0.1C17.9,17.7,17.9,17.6,17.9,17.5L17.9,17.5z M17.9,5V2.5 c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.2-0.1-0.3-0.1H15c-0.1,0-0.2,0-0.3,0.1c-0.1,0.1-0.1,0.2-0.1,0.3V5c0,0.1,0,0.2,0.1,0.3 c0.1,0.1,0.2,0.1,0.3,0.1h2.5c0.1,0,0.2,0,0.3-0.1C17.9,5.2,17.9,5.1,17.9,5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="205"> + <path fill="#FFFFFF" d="M10,2.9c3,0,5,0,6,0.1c1.4,0.1,2.3,0.4,2.9,0.8c0.5,0.4,0.8,1.1,1,2C19.9,6.5,20,7.8,20,9.7V10 c0,2,0,3.3-0.1,3.9c-0.1,1-0.4,1.7-0.9,2.1c-0.5,0.5-1.4,0.8-2.7,0.9c-1,0.1-2.9,0.2-5.8,0.2H10c-3,0-5,0-6-0.1 c-1.4-0.1-2.3-0.4-2.9-0.8c-0.5-0.4-0.8-1.1-1-2C0.1,13.5,0,12.2,0,10.3V10c0-2,0-3.3,0.1-3.9c0.1-1,0.4-1.7,0.9-2.1 c0.5-0.5,1.4-0.8,2.7-0.9c1-0.1,2.9-0.2,5.8-0.2C9.6,2.9,10,2.9,10,2.9z M7.5,13.7l6.2-3.7L7.5,6.2V13.7L7.5,13.7z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="5" y="240"> + <g> + <path d="M16.2,12.8v2.7c0,1.4-1.1,2.5-2.5,2.5H2.5C1.1,18,0,16.9,0,15.5v-10C0,4.1,1.1,3,2.5,3h7v1C8.1,4.3,6.8,4.8,5.8,5.5H2.5 v9.9h11.2v-1L16.2,12.8z M19.9,8c0,0.1-0.1,0.3-0.2,0.3l-7.9,5.4c-0.1,0-0.1,0.1-0.2,0.1c-0.1,0-0.1,0-0.2,0 c-0.1-0.1-0.2-0.2-0.2-0.4v-2.9c-5,0.1-6.2,1.8-6.2,1.8c-0.1,0.1-0.2,0.2-0.3,0.2H4.5c-0.2,0-0.3-0.2-0.3-0.4C4.2,12,4,9.5,5.9,7.6 c1.2-1.3,3-2,5.4-2.1V2.6c0-0.2,0.1-0.3,0.2-0.4c0.1-0.1,0.3-0.1,0.4,0l7.9,5.4C19.9,7.7,19.9,7.9,19.9,8z"/> + </g> + <g display="none"> + <path display="inline" d="M9.2,18.3c-2.1,2.1-5.5,2.1-7.6,0s-2.1-5.5,0-7.6l2.8-2.8C4.4,9,4.5,10,4.9,11l-1.5,1.5 c-1.1,1.1-1.1,2.9,0,4.1s2.9,1.1,4.1,0l3.1-3.1c1.1-1.1,1.1-2.9,0-4.1c-0.5-0.5-0.5-1.3,0-1.8s1.3-0.5,1.8,0c2.1,2.1,2.1,5.5,0,7.6 L9.2,18.3z M15.5,12.1c0.1-1.1,0-2.1-0.4-3.1l1.5-1.5c1.1-1.1,1.1-2.9,0-4.1c-1.1-1.1-2.9-1.1-4.1,0L9.4,6.5 c-1.1,1.1-1.1,2.9,0,4.1c0.5,0.5,0.5,1.3,0,1.7c-0.5,0.5-1.3,0.5-1.7,0c-2.1-2.1-2.1-5.5,0-7.6l3.1-3.1c2.1-2.1,5.5-2.1,7.6,0 s2.1,5.5,0,7.6L15.5,12.1z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="30" y="240"> + <g display="none"> + <path display="inline" d="M16.2,10.6v2.7c0,1.4-1.1,2.5-2.5,2.5H2.5c-1.4,0-2.5-1.1-2.5-2.5V3.3c0-1.4,1.1-2.5,2.5-2.5h7v1 C8.1,2.1,6.8,2.6,5.8,3.3H2.5v9.9h11.2v-1L16.2,10.6z M19.9,5.8c0,0.1-0.1,0.3-0.2,0.3l-7.9,5.4c-0.1,0-0.1,0.1-0.2,0.1 c-0.1,0-0.1,0-0.2,0c-0.1-0.1-0.2-0.2-0.2-0.4V8.3C6.2,8.4,5,10.1,5,10.1c-0.1,0.1-0.2,0.2-0.3,0.2H4.5c-0.2,0-0.3-0.2-0.3-0.4 c0-0.1-0.2-2.6,1.7-4.5c1.2-1.3,3-2,5.4-2.1V0.4c0-0.2,0.1-0.3,0.2-0.4c0.1-0.1,0.3-0.1,0.4,0l7.9,5.4C19.9,5.5,19.9,5.7,19.9,5.8z "/> + </g> + <g> + <path d="M9.2,18.3c-2.1,2.1-5.5,2.1-7.6,0c-2.1-2.1-2.1-5.5,0-7.6l2.8-2.8C4.4,9,4.5,10,4.9,11l-1.5,1.5c-1.1,1.1-1.1,2.9,0,4.1 s2.9,1.1,4.1,0l3.1-3.1c1.1-1.1,1.1-2.9,0-4.1c-0.5-0.5-0.5-1.3,0-1.8c0.5-0.5,1.3-0.5,1.8,0c2.1,2.1,2.1,5.5,0,7.6L9.2,18.3z M15.5,12.1c0.1-1.1,0-2.1-0.4-3.1l1.5-1.5c1.1-1.1,1.1-2.9,0-4.1c-1.1-1.1-2.9-1.1-4.1,0L9.4,6.5c-1.1,1.1-1.1,2.9,0,4.1 c0.5,0.5,0.5,1.3,0,1.7c-0.5,0.5-1.3,0.5-1.7,0c-2.1-2.1-2.1-5.5,0-7.6l3.1-3.1c2.1-2.1,5.5-2.1,7.6,0c2.1,2.1,2.1,5.5,0,7.6 L15.5,12.1z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="55" y="240"> + <g> + <circle cx="2.7" cy="2.7" r="2.3"/> + <rect x="0.7" y="6.8" width="4" height="12.8"/> + <path d="M14.8,6.5c-1.9,0-3.2,1.1-3.8,2.1H11V6.8H7.2v12.8h4v-6.3c0-1.7,0.3-3.3,2.4-3.3c2,0,2.1,1.9,2.1,3.4v6.2h4v-7 C19.6,9.1,18.8,6.5,14.8,6.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="80" y="240"> + <path d="M16.7 12.6V17H3.3v-4.4H.7v5.7c0 .7.6 1.3 1.3 1.3h16c.7 0 1.3-.6 1.3-1.3v-5.7h-2.6zM9.8 12.2L6.1 7.7s-.6-.5 0-.5h2.1v-.9V.7s-.1-.3.4-.3h2.9c.3 0 .3.3.3.3V7.1h1.9c.7 0 .2.6.2.6s-3.1 4.2-3.6 4.6c-.2.2-.5-.1-.5-.1z"/> + </svg> + <svg height="16" viewBox="0 0 20 16" width="20" x="221" y="133"> + <path fill="#FFFFFF" d="M18.4,2h-5.7l-0.9-1.3c-0.2-0.5-0.6-0.7-1-0.7H8.3c-0.5,0-0.9,0.3-1,0.7L6.4,2H4.5V1h-2v1H0.9 C0.3,2,0.5,2.7,0.5,3.3v11c0,0.6-0.2,1.7,0.4,1.7h17.5c0.6,0,1.1-1.1,1.1-1.7v-11C19.5,2.7,19,2,18.4,2z M9.6,13.1 c-2.4,0-4.3-1.9-4.3-4.3s1.9-4.3,4.3-4.3s4.3,1.9,4.3,4.3S12,13.1,9.6,13.1z M16.5,6.6c-0.8,0-1.4-0.6-1.4-1.4s0.7-1.5,1.5-1.5 c0.8,0,1.5,0.7,1.5,1.5S17.4,6.6,16.5,6.6z"/> + </svg> + <svg height="16" viewBox="0 0 20 16" width="20" x="152" y="159"> + <path fill="#FFFFFF" d="M19.6,0h-6.9c-1.3,0-1.5,0.5-1.5,1.8V1.7C11.2,0.4,9.3,0,8,0H1v12.7V13l2.3,1.9H8c0,0,0.6,0.9,1.1,0.9h2.3 c0.7,0,1.1-0.9,1.1-0.9h4.7l2.3-1.9v-0.3L19.6,0L19.6,0z M1.9,0.9h6l0,0c0.7,0,1.4,0.1,1.4,0.7v10.4H1.9V0.9z M18.7,12.1h-6.5V1.8 c0-0.7-0.1-0.8,0.6-0.8h6V12.1z"/> + <rect x="13.1" y="4.7" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="13.1" y="1.9" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="13.1" y="6.5" fill="#FFFFFF" width="4.7" height="1.9"/> + <rect x="13.1" y="10.2" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="2.8" y="4.7" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="2.8" y="1.9" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="2.8" y="6.5" fill="#FFFFFF" width="4.7" height="1.9"/> + <rect x="2.8" y="10.2" fill="#FFFFFF" width="4.7" height="0.9"/> + </svg> + <svg height="16" viewBox="0 0 20 16" width="20" x="177" y="159"> + <path fill="#000000" d="M19.6,0h-6.9c-1.3,0-1.5,0.5-1.5,1.8V1.7C11.2,0.4,9.3,0,8,0H1v12.7V13l2.3,1.9H8c0,0,0.6,0.9,1.1,0.9h2.3 c0.7,0,1.1-0.9,1.1-0.9h4.7l2.3-1.9v-0.3L19.6,0L19.6,0z M1.9,0.9h6l0,0c0.7,0,1.4,0.1,1.4,0.7v10.4H1.9V0.9z M18.7,12.1h-6.5V1.8 c0-0.7-0.1-0.8,0.6-0.8h6V12.1z"/> + <rect x="13.1" y="4.7" fill="#000000" width="4.7" height="0.9"/> + <rect x="13.1" y="1.9" fill="#000000" width="4.7" height="0.9"/> + <rect x="13.1" y="6.5" fill="#000000" width="4.7" height="1.9"/> + <rect x="13.1" y="10.2" fill="#000000" width="4.7" height="0.9"/> + <rect x="2.8" y="4.7" fill="#000000" width="4.7" height="0.9"/> + <rect x="2.8" y="1.9" fill="#000000" width="4.7" height="0.9"/> + <rect x="2.8" y="6.5" fill="#000000" width="4.7" height="1.9"/> + <rect x="2.8" y="10.2" fill="#000000" width="4.7" height="0.9"/> + </svg> + <svg height="17.2" viewBox="0 0 18 18" width="17.5" x="105" y="240"> + <path fill="#FFFFFF" d="M6.9,1.1c3.1,0,5.6,2.5,5.6,5.6s-2.5,5.6-5.6,5.6c-3.1,0-5.6-2.5-5.6-5.6S3.8,1.1,6.9,1.1 M6.9,0 c-3.7,0-6.7,3-6.7,6.7c0,3.7,3,6.7,6.7,6.7c3.7,0,6.7-3,6.7-6.7C13.5,2.9,10.6,0,6.9,0L6.9,0z"/> + <rect x="12.4" y="11.2" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -5.7168 14.1519)" fill="#FFFFFF" width="3.6" height="5.5"/> + </svg> + <svg height="17.2" viewBox="0 0 18 18" width="17.5" x="128" y="240"> + <path fill="#000000" d="M6.9,1.1c3.1,0,5.6,2.5,5.6,5.6s-2.5,5.6-5.6,5.6c-3.1,0-5.6-2.5-5.6-5.6S3.8,1.1,6.9,1.1 M6.9,0 c-3.7,0-6.7,3-6.7,6.7c0,3.7,3,6.7,6.7,6.7c3.7,0,6.7-3,6.7-6.7C13.5,2.9,10.6,0,6.9,0L6.9,0z"/> + <rect x="12.4" y="11.2" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -5.7168 14.1519)" fill="#000000" width="3.6" height="5.5"/> + </svg> + <svg height="16" viewBox="0 0 17 16" width="16.4" x="202" y="159"> + <path fill="#FFFFFF" d="M14.4,5.9l-3.3,3.3V6.7C11.1,6.2,10.5,6,10,6H0.8C0.3,6,0.1,6.2,0.1,6.7v8.1c0,0.6,0.1,1.1,0.7,1.1H10 c0.6,0,1.1-0.6,1.1-1.1v-2.5l3.3,3.3c0.7,0.5,1.7,0,1.7-0.8V6.7C16.1,5.9,15.1,5.4,14.4,5.9z"/> + <g> + <circle fill="#FFFFFF" cx="2.3" cy="2.4" r="2.3"/> + </g> + <g> + <circle fill="#FFFFFF" cx="8.5" cy="2.4" r="2.3"/> + </g> + </svg> + <svg height="16" viewBox="0 0 17 16" width="16.4" x="223" y="159"> + <path fill="#000000" d="M14.4,5.9l-3.3,3.3V6.7C11.1,6.2,10.5,6,10,6H0.8C0.3,6,0.1,6.2,0.1,6.7v8.1c0,0.6,0.1,1.1,0.7,1.1H10 c0.6,0,1.1-0.6,1.1-1.1v-2.5l3.3,3.3c0.7,0.5,1.7,0,1.7-0.8V6.7C16.1,5.9,15.1,5.4,14.4,5.9z"/> + <circle fill="#000000" cx="2.3" cy="2.4" r="2.3"/> + <circle fill="#000000" cx="8.5" cy="2.4" r="2.3"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="150" y="240"> + <path fill="#FFFFFF" d="M7,7.9L8.1,9l-4.9,4.9h4.5v1.6H0.5V8.3h1.6v4.5L7,7.9z M8.3,0.5h7.2v7.2h-1.6V3.2L9,8.1L7.9,7l4.9-4.9H8.3 L8.3,0.5L8.3,0.5z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="171" y="240"> + <g> + <polygon fill="#000000" points="3.3,10.7 4.3,15.7 6.4,15.7 5.4,10.7 "/> + <path fill="#000000" d="M0,6.7c0,2.5,2,3,2,3h5v-6H2C2,3.7,0,4.1,0,6.7z"/> + <path fill="#000000" d="M14.6,0.4L8,3.7v6l6.6,3.3c0.7,0.3,1.4-0.2,1.4-0.9V1.3C16,0.6,15.2,0.1,14.6,0.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="192" y="240"> + <g> + <polygon fill="#FFFFFF" points="3.3,10.7 4.3,15.7 6.4,15.7 5.4,10.7 "/> + <path fill="#FFFFFF" d="M0,6.7c0,2.5,2,3,2,3h5v-6H2C2,3.7,0,4.1,0,6.7z"/> + <path fill="#FFFFFF" d="M14.6,0.4L8,3.7v6l6.6,3.3c0.7,0.3,1.4-0.2,1.4-0.9V1.3C16,0.6,15.2,0.1,14.6,0.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="213" y="240"> + <path fill="#ffffff" d="M11,15l-7-7l7-7l1.1,1.1L6.1,8l5.9,5.9L11,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="234" y="240"> + <path fill="#010101" d="M11,15l-7-7l7-7l1.1,1.1L6.1,8l5.9,5.9L11,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="5"> + <rect id="XMLID_4_" x="6.8" y="1.2" fill="#FFFFFF" width="3" height="10"/> + <rect id="XMLID_1_" x="7" y="12" fill="#FFFFFF" width="3" height="3"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="26"> + <g id="XMLID_5_"> + <polygon id="XMLID_3_" fill="#010101" points="0,15.3 8,0.5 16,15.3 "/> + <rect id="XMLID_2_" x="6.9" y="5.1" fill="#FFFFFF" width="2.3" height="5.7"/> + <rect id="XMLID_1_" x="6.9" y="11.9" fill="#FFFFFF" width="2.3" height="2.3"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="47"> + <path fill="#DF0202" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="68"> + <g id="XMLID_5_"> + <polygon id="XMLID_3_" fill="#FFFFFF" points="0,15.3 8,0.5 16,15.3 "/> + <rect id="XMLID_2_" x="6.9" y="5.1" fill="#000000" width="2.3" height="5.7"/> + <rect id="XMLID_1_" x="6.9" y="11.9" fill="#000000" width="2.3" height="2.3"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="89"> + <g> + <path fill="#FFFFFF" d="M3,0.5v2h10v10.5c0,0.8,0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5V5.8V3.1V0.5H3z"/> + <g> + <path fill="#FFFFFF" d="M12,14.5c0-0.5,0-11,0-11H0v9c0,1.7,1.3,3,3,3c0,0,9.6,0,10,0C12.5,15.5,12,15,12,14.5z M6,12.5H1v-1h5 V12.5z M6,10.5H1v-1h5V10.5z M6,8.5H1v-1h5V8.5z M6,6.5H1v-1h5V6.5z M11,12.5H7v-7h4V12.5z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="110"> + <g> + <path fill="#000000" d="M3,0.5v2h10v10.5c0,0.8,0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5V5.8V3.1V0.5H3z"/> + <g> + <path fill="#000000" d="M12,14.5c0-0.5,0-11,0-11H0v9c0,1.7,1.3,3,3,3c0,0,9.6,0,10,0C12.5,15.5,12,15,12,14.5z M6,12.5H1v-1h5 V12.5z M6,10.5H1v-1h5V10.5z M6,8.5H1v-1h5V8.5z M6,6.5H1v-1h5V6.5z M11,12.5H7v-7h4V12.5z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="131"> + <path fill="#ffffff" d="M15.1,5.1l-7,7l-7-7l1.1-1.1l5.9,6l5.9-5.9L15.1,5.1z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="152"> + <g id="XMLID_6_"> + <path id="XMLID_4_" fill="#000" d="M6.9,8.5l-4.3,5.4H0.5l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + <path id="XMLID_2_" fill="#000" d="M15.5,8.5l-4.3,5.4H9.1l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="173"> + <g id="XMLID_6_"> + <path id="XMLID_4_" fill="#FFF" d="M6.9,8.5l-4.3,5.4H0.5l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + <path id="XMLID_2_" fill="#FFF" d="M15.5,8.5l-4.3,5.4H9.1l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="194"> + <path fill="#ffffff" d="M1.1,11l7-7l7,7L14,12.1l-5.9-6L2.2,12L1.1,11z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="215"> + <path fill="#010101" d="M15.1,5.1l-7,7l-7-7l1.1-1.1l5.9,6l5.9-5.9L15.1,5.1z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="236"> + <path fill="#FFFFFF" d="M13.3,3.8L9.1,8l4.2,4.2l-1.1,1.1L8,9.1l-4.2,4.2l-1.1-1.1L6.9,8L2.7,3.8l1.1-1.1L8,6.9l4.2-4.2L13.3,3.8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="5" y="265"> + <g> + <polygon fill="#FFFFFF" points="15,4.6 16,4.1 8,0.1 0,4.1 8,8.1 14,5.1 14,13.5 13.4,15.9 15.6,15.9 15,13.5 "/> + <path fill="#FFFFFF" d="M3,6.6v4c0,0,1.4,2.5,5,2.5s5-2.5,5-2.5V7.1L8,9.6L3,6.6z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="26" y="265"> + <g> + <path fill="#FFFFFF" d="M12,16H4.5l-1-1H12c0.8,0,1.5-0.6,1.5-1.5v-12l1,0.5v11.5C14.5,14.9,13.4,16,12,16z"/> + <g> + <path fill="#FFFFFF" d="M1.5,0v12c0,1.1,0.9,2,2,2h7c1.1,0,2-0.9,2-2V0H1.5z M8.5,1h1v1h-1V1z M6.5,1h1v1h-1V1z M4.5,1h1v1h-1V1z M2.5,1h1v1h-1V1z M10.5,11h-7v-1h7V11z M10.5,9h-7V8h7V9z M10.5,7h-7V6h7V7z M10.5,5h-7V4h7V5z M11.5,2h-1V1h1V2z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="47" y="265"> + <g> + <path fill="#000000" d="M12,16H4.5l-1-1H12c0.8,0,1.5-0.6,1.5-1.5v-12l1,0.5v11.5C14.5,14.9,13.4,16,12,16z"/> + <g> + <path fill="#000000" d="M1.5,0v12c0,1.1,0.9,2,2,2h7c1.1,0,2-0.9,2-2V0H1.5z M8.5,1h1v1h-1V1z M6.5,1h1v1h-1V1z M4.5,1h1v1h-1V1z M2.5,1h1v1h-1V1z M10.5,11h-7v-1h7V11z M10.5,9h-7V8h7V9z M10.5,7h-7V6h7V7z M10.5,5h-7V4h7V5z M11.5,2h-1V1h1V2z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="68" y="265"> + <path fill="#010101" d="M8,0.5c1,0,2,0.2,2.9,0.6s1.7,0.9,2.4,1.6c0.7,0.7,1.2,1.5,1.6,2.4C15.3,6,15.5,7,15.5,8c0,1-0.2,2-0.6,2.9 c-0.4,0.9-0.9,1.7-1.6,2.4c-0.7,0.7-1.5,1.3-2.4,1.6C10,15.3,9,15.5,8,15.5c-1,0-2-0.2-2.9-0.6c-0.9-0.4-1.7-0.9-2.4-1.6 c-0.7-0.7-1.2-1.5-1.6-2.4S0.5,9,0.5,8c0-1,0.2-2,0.6-2.9C1.4,4.2,2,3.4,2.7,2.7s1.5-1.3,2.4-1.6C6,0.7,7,0.5,8,0.5z M12.3,12.3 c0.6-0.6,1-1.2,1.3-2C13.9,9.6,14,8.8,14,8c0-1.1-0.3-2.1-0.8-3c-0.5-0.9-1.3-1.7-2.2-2.2S9.1,2,8,2C7.2,2,6.4,2.1,5.7,2.4 C5,2.7,4.3,3.2,3.7,3.7s-1,1.2-1.3,2S2,7.2,2,8c0,1.1,0.3,2.1,0.8,3c0.5,0.9,1.3,1.7,2.2,2.2C5.9,13.8,6.9,14,8,14 c0.8,0,1.6-0.2,2.3-0.5C11.1,13.3,11.7,12.8,12.3,12.3L12.3,12.3z M7.2,5.7V4.2h1.5v1.5H7.2z M7.2,11.8V6.6h1.5v5.2H7.2z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="89" y="265"> + <path fill="#ffffff" d="M5.1,15l-1.1-1.1L9.8,8L3.9,2.1L5.1,1l7,7L5.1,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="110" y="265"> + <path fill="#010101" d="M5.1,15l-1.1-1.1L9.8,8L3.9,2.1L5.1,1l7,7L5.1,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="131" y="265"> + <ellipse fill="#FFFFFF" cx="2.5" cy="13.6" rx="2.1" ry="2.1"/> + <path fill="#FFFFFF" d="M10.5,15.7H7.5c0-4-3.2-7.2-7.1-7.2l0,0v-3C6,5.5,10.5,10.1,10.5,15.7z"/> + <path fill="#FFFFFF" d="M12.6,15.7c0-6.8-5.5-12.3-12.2-12.3V0.3c8.4,0,15.2,6.9,15.2,15.4H12.6z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="152" y="265"> + <ellipse fill="#000000" cx="2.5" cy="13.6" rx="2.1" ry="2.1"/> + <path fill="#000000" d="M10.5,15.7H7.5c0-4-3.2-7.2-7.1-7.2l0,0v-3C6,5.5,10.5,10.1,10.5,15.7z"/> + <path fill="#000000" d="M12.6,15.7c0-6.8-5.5-12.3-12.2-12.3V0.3c8.4,0,15.2,6.9,15.2,15.4H12.6z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="173" y="265"> + <g> + <polygon fill="#000000" points="15,4.6 16,4.1 8,0.1 0,4.1 8,8.1 14,5.1 14,13.5 13.4,15.9 15.6,15.9 15,13.5 "/> + <path fill="#000000" d="M3,6.6v4c0,0,1.4,2.5,5,2.5s5-2.5,5-2.5V7.1L8,9.6L3,6.6z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="194" y="265"> + <path fill="#010101" d="M13.3,3.8L9.1,8l4.2,4.2l-1.1,1.1L8,9.1l-4.2,4.2l-1.1-1.1L6.9,8L2.7,3.8l1.1-1.1L8,6.9l4.2-4.2L13.3,3.8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="215" y="265"> + <path fill="#010101" d="M1.1,11l7-7l7,7L14,12.1l-5.9-6L2.2,12L1.1,11z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="236" y="265"> + <g id="XMLID_2_"> + <circle id="XMLID_8_" fill="#FFFFFF" cx="8" cy="8" r="1"/> + <path id="XMLID_3_" fill="#FFFFFF" d="M15.4,7.7c-1.5-2.2-4.3-3.6-7.2-3.6c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-3,0-5.7,1.4-7.2,3.6 L0.5,8l0.2,0.3c1.5,2.2,4.3,3.6,7.2,3.6c0,0,0.1,0,0.1,0s0.1,0,0.1,0c3,0,5.7-1.4,7.2-3.6L15.5,8L15.4,7.7z M8,10.9 c-1.7,0-3-1.3-3-2.9s1.4-2.9,3-2.9s3,1.3,3,2.9S9.7,10.9,8,10.9z M1.6,8c0.8-1,1.9-1.9,3.2-2.4C4.3,6.3,4,7.1,4,8s0.3,1.7,0.8,2.4 C3.5,9.9,2.4,9,1.6,8z M11.2,10.4C11.7,9.7,12,8.9,12,8s-0.3-1.7-0.8-2.4C12.5,6.1,13.6,7,14.4,8C13.6,9,12.5,9.9,11.2,10.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="257" y="265"> + <g id="XMLID_2_"> + <circle id="XMLID_8_" fill="#000000" cx="8" cy="8" r="1"/> + <path id="XMLID_3_" fill="#000000" d="M15.4,7.7c-1.5-2.2-4.3-3.6-7.2-3.6c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-3,0-5.7,1.4-7.2,3.6 L0.5,8l0.2,0.3c1.5,2.2,4.3,3.6,7.2,3.6c0,0,0.1,0,0.1,0s0.1,0,0.1,0c3,0,5.7-1.4,7.2-3.6L15.5,8L15.4,7.7z M8,10.9 c-1.7,0-3-1.3-3-2.9s1.4-2.9,3-2.9s3,1.3,3,2.9S9.7,10.9,8,10.9z M1.6,8c0.8-1,1.9-1.9,3.2-2.4C4.3,6.3,4,7.1,4,8s0.3,1.7,0.8,2.4 C3.5,9.9,2.4,9,1.6,8z M11.2,10.4C11.7,9.7,12,8.9,12,8s-0.3-1.7-0.8-2.4C12.5,6.1,13.6,7,14.4,8C13.6,9,12.5,9.9,11.2,10.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="292" y="5"> + <rect id="XMLID_4_" x="6.8" y="1.2" fill="#000000" width="3" height="10"/> + <rect id="XMLID_1_" x="7" y="12" fill="#000000" width="3" height="3"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="292" y="26"> + <path fill="#2BBD03" d="M13.9,4.5l-1.2-1.2c-0.2-0.2-0.5-0.2-0.6,0l-6,6L4,7.2C3.8,7,3.5,7,3.3,7.2L2.1,8.4C2,8.6,2,8.9,2.1,9.1 l3.5,3.5c0.2,0.2,0.3,0.3,0.5,0.3s0.3-0.2,0.5-0.3l7.3-7.3C14,5,14,4.7,13.9,4.5z"/> + </svg> + <svg height="16" viewBox="0 0 13 16" width="12.1" x="292" y="47"> + <polygon fill="#FFFFFF" points="3.2,0 0.1,3 3.2,3"/> + <path fill="#FFFFFF" d="M4.1,0v4h-4v12h12V0H4.1z M10.1,13h-8v-1h8V13z M10.1,11h-8v-1h8V11z M10.1,9h-8V8h8V9z M10.1,7h-8V6h8V7z"/> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="68"> + <g> + <polygon fill="#000000" points="4.6,0.2 1.9,2.8 4.6,2.8"/> + <path class="st0" d="M5.3,0.2v3.4H1.9v10.1h10.1V0.2H5.3z M10.4,11.2H3.6v-0.8h6.8V11.2z M10.4,9.5H3.6V8.7h6.8V9.5z M10.4,7.8H3.6 V7h6.8V7.8z M10.4,6.2H3.6V5.3h6.8V6.2z"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="87"> + <g> + <path fill="#FFFFFF" d="M13,3H7.7l0.4,1H13v7.1l1-0.9c0,0,0-5.7,0-6.7S12.6,3,12.6,3"/> + <path fill="#FFFFFF" d="M11.1,5H7.3L6.2,3c0,0-0.4-1-1.1-1H4.2H3.1H2.4C1.7,2,1.2,2.8,1.2,2.8L0,4.5v7c0,1,1.1,1.5,1.1,1.5h10 c0,0,0.9-0.5,0.9-1.5v-6C12,4.5,11.1,5,11.1,5z"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="106"> + <g id="XMLID_2_"> + <path id="XMLID_3_" fill="#000000" d="M10.1,3.7c0.9-0.2,1.6-0.4,2.4-0.7C11.6,1.9,10.4,1,9.1,0.6C9.5,1.6,9.8,2.6,10.1,3.7z"/> + <path id="XMLID_9_" fill="#000000" d="M4,3.7c0.3-1.1,0.6-2.2,1-3.3C3.6,0.9,2.4,1.8,1.5,3C2.3,3.3,3.1,3.6,4,3.7z"/> + <path id="XMLID_10_" fill="#000000" d="M4.9,3.9C5.6,4,6.3,4.1,7,4.1S8.4,4,9.1,3.9C8.9,2.6,8.5,1.4,7.9,0.2C7.6,0.2,7.3,0.1,7,0.1 s-0.5,0-0.8,0.1C5.6,1.4,5.2,2.6,4.9,3.9z"/> + <path id="XMLID_11_" fill="#000000" d="M9.3,9.1C9.4,8.5,9.5,7.7,9.5,7S9.4,5.5,9.3,4.9C8.5,4.9,7.8,5,7,5S5.5,4.9,4.8,4.9 C4.7,5.5,4.6,6.2,4.6,7c0,0.7,0.1,1.5,0.2,2.1C5.5,9.1,6.2,9,7,9S8.5,9.1,9.3,9.1z"/> + <path id="XMLID_12_" fill="#000000" d="M13,10.1c0.5-0.9,0.8-2,0.8-3.1S13.5,4.8,13,3.8c-0.9,0.3-1.8,0.7-2.7,0.9 c0.1,0.8,0.2,1.5,0.2,2.3s-0.1,1.5-0.2,2.3C11.2,9.5,12.2,9.7,13,10.1z"/> + <path id="XMLID_13_" fill="#000000" d="M9.1,10.1C8.5,10,7.8,9.9,7.1,9.9S5.7,10,5,10.1c0.3,1.3,0.7,2.5,1.3,3.7 c0.3,0,0.5,0.1,0.8,0.1s0.6,0,0.9-0.1C8.5,12.6,8.9,11.4,9.1,10.1z"/> + <path id="XMLID_14_" fill="#000000" d="M10.1,10.3c-0.3,1.1-0.6,2.2-1,3.3c1.4-0.4,2.6-1.4,3.4-2.5C11.7,10.7,10.9,10.4,10.1,10.3z"/> + <path id="XMLID_15_" fill="#000000" d="M3.8,9.3C3.7,8.5,3.7,7.8,3.7,7s0.1-1.5,0.2-2.3C2.9,4.5,1.9,4.2,1,3.8C0.5,4.8,0.2,5.9,0.2,7 S0.5,9.2,1,10.2C1.9,9.7,2.9,9.5,3.8,9.3z"/> + <path id="XMLID_16_" fill="#000000" d="M4,10.3c-0.9,0.2-1.6,0.4-2.5,0.8c0.9,1.2,2.1,2.1,3.5,2.5C4.5,12.5,4.2,11.4,4,10.3z"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="125"> + <g> + <rect fill="#000000" id="XMLID_2_" x="0.8" y="1.4" width="1.9" height="12.4"/> + <polygon fill="#000000" id="XMLID_1_" points="3.7,1.2 13.2,4.5 3.7,7.9 "/> + <circle fill="#000000" id="XMLID_4_" cx="1.8" cy="1.2" r="1"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="144"> + <path fill="#000000" d="M7,0.2c-2.8,0-5.1,2.3-5.1,5.1C1.9,7,3,8.4,4.3,10l2.9,3.9l3-4.2c1.2-1.5,2-2.6,2-4.2C12.2,2.5,9.8,0.2,7,0.2z M7,7.5c-1.2,0-2.2-0.9-2.2-2.2S5.8,3.1,7,3.1S9.2,4,9.2,5.3S8.2,7.5,7,7.5z"/> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="163"> + <path fill="#FFFFFF" d="M7,0.2c-2.8,0-5.1,2.3-5.1,5.1C1.9,7,3,8.4,4.3,10l2.9,3.9l3-4.2c1.2-1.5,2-2.6,2-4.2C12.2,2.5,9.8,0.2,7,0.2z M7,7.5c-1.2,0-2.2-0.9-2.2-2.2S5.8,3.1,7,3.1S9.2,4,9.2,5.3S8.2,7.5,7,7.5z"/> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="182"> + <g> + <path fill="#000000" d="M13,3H7.7l0.4,1H13v7.1l1-0.9c0,0,0-5.7,0-6.7S12.6,3,12.6,3"/> + <path fill="#000000" d="M11.1,5H7.3L6.2,3c0,0-0.4-1-1.1-1H4.2H3.1H2.4C1.7,2,1.2,2.8,1.2,2.8L0,4.5v7c0,1,1.1,1.5,1.1,1.5h10 c0,0,0.9-0.5,0.9-1.5v-6C12,4.5,11.1,5,11.1,5z"/> + </g> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="292" y="201"> + <polygon points="3.5,1 3.9,1.4 2.2,3.2 12,3.2 12,3.8 2.2,3.8 3.9,5.6 3.5,6 1,3.5 "/> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="292" y="213"> + <polygon points="9.5,1 9.1,1.4 10.8,3.2 1,3.2 1,3.8 10.8,3.8 9.1,5.6 9.5,6 12,3.5 "/> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="250" y="238"> + <polygon fill="#fff" points="3.5,1 3.9,1.4 2.2,3.2 12,3.2 12,3.8 2.2,3.8 3.9,5.6 3.5,6 1,3.5 "/> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="250" y="251"> + <polygon fill="#fff" points="9.5,1 9.1,1.4 10.8,3.2 1,3.2 1,3.8 10.8,3.8 9.1,5.6 9.5,6 12,3.5 "/> + </svg> + <svg viewBox="0 0 100 100" height="22" width="22" x="283" y="230"> + <path style="text-indent:0;text-transform:none;block-progression:tb" d="M10 13a2 2 0 1 0 0 4h10.375l10.531 49.75c.256 1.23 1.077 2.263 2.094 2.25h50c1.057.015 2.031-.943 2.031-2s-.974-2.015-2.031-2H34.625L23.969 14.563C23.77 13.679 22.906 12.993 22 13zm20 12l6 30h49l7-30zm13 48a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm30 0a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" overflow="visible" color="#000"/> + </svg> + <svg viewBox="0 0 100 100" height="22" width="22" x="283" y="260"> + <path style="text-indent:0;text-transform:none;block-progression:tb" d="M10 13a2 2 0 1 0 0 4h10.375l10.531 49.75c.256 1.23 1.077 2.263 2.094 2.25h50c1.057.015 2.031-.943 2.031-2s-.974-2.015-2.031-2H34.625L23.969 14.563C23.77 13.679 22.906 12.993 22 13zm20 12l6 30h49l7-30zm13 48a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm30 0a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" overflow="visible" fill="#fff"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="0" y="285"> + <path fill="#000" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="20" y="285"> + <path fill="#fff" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> + </svg> + <svg viewBox="0 0 12 16" width="12" height="16" x="40" y="285"> + <rect y="3" width="12" height="2"></rect> + <rect y="7" width="12" height="2"></rect> + <rect y="11" width="12" height="2"></rect> + </svg> + <svg viewBox="0 0 12 16" width="12" height="16" x="60" y="285" fill="#fff"> + <rect y="3" width="12" height="2"></rect> + <rect y="7" width="12" height="2"></rect> + <rect y="11" width="12" height="2"></rect> + </svg> + <svg width="32" height="32" viewBox="0 0 32 32" fill="none" x="52" y="153"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M5.78754 14.0196C5.83131 14.0344 5.87549 14.0448 5.91963 14.0512C5.96777 14.1644 6.02996 14.3107 6.10252 14.4818C6.27959 14.8994 6.51818 15.4643 6.76446 16.0535C7.2667 17.2552 7.77332 18.4939 7.88521 18.8485C8.02372 19.2868 8.17013 19.5848 8.32996 19.7883C8.4126 19.8935 8.50819 19.9853 8.62003 20.0549C8.67633 20.0899 8.7358 20.1186 8.79788 20.14C8.80062 20.141 8.80335 20.1419 8.80608 20.1428C9.1261 20.2636 9.41786 20.2133 9.60053 20.1518C9.69827 20.1188 9.77735 20.0791 9.8334 20.0469C9.86198 20.0304 9.88612 20.0151 9.90538 20.0021L9.90992 19.9991L12.7361 18.2366L16.0007 20.7394C16.0488 20.7763 16.1014 20.8073 16.157 20.8316C16.5492 21.0027 16.929 21.0624 17.2862 21.0136C17.6429 20.9649 17.926 20.8151 18.1368 20.6464C18.3432 20.4813 18.4832 20.2963 18.5703 20.1589C18.6148 20.0887 18.6482 20.0266 18.6718 19.9791C18.6836 19.9552 18.6931 19.9346 18.7005 19.9181L18.7099 19.8963L18.7135 19.8877L18.715 19.8841L18.7156 19.8824L18.7163 19.8808C18.7334 19.8379 18.7466 19.7935 18.7556 19.7482L21.7358 4.72274C21.7453 4.67469 21.7501 4.62581 21.7501 4.57682C21.7501 4.13681 21.5843 3.71841 21.1945 3.46452C20.8613 3.24752 20.4901 3.23818 20.2556 3.25598C20.0025 3.27519 19.7688 3.33766 19.612 3.38757C19.5304 3.41355 19.4619 3.43861 19.4126 3.45773C19.3878 3.46734 19.3675 3.47559 19.3523 3.48188L19.341 3.48666L2.62725 10.0432L2.62509 10.044C2.61444 10.0479 2.60076 10.053 2.58451 10.0593C2.55215 10.0719 2.50878 10.0896 2.45813 10.1126C2.35935 10.1574 2.22077 10.2273 2.07856 10.3247C1.85137 10.4803 1.32888 10.9064 1.41686 11.6097C1.48705 12.1708 1.87143 12.5154 2.10562 12.6811C2.23421 12.7721 2.35638 12.8371 2.44535 12.8795C2.48662 12.8991 2.57232 12.9339 2.6095 12.9491L2.61889 12.9529L5.78754 14.0196ZM19.9259 4.86786L19.9236 4.86888C19.9152 4.8725 19.9069 4.87596 19.8984 4.87928L3.1644 11.4438C3.15566 11.4472 3.14686 11.4505 3.138 11.4536L3.12869 11.4571C3.11798 11.4613 3.09996 11.4686 3.07734 11.4788C3.06451 11.4846 3.05112 11.491 3.03747 11.4978C3.05622 11.5084 3.07417 11.5175 3.09012 11.5251C3.10543 11.5324 3.11711 11.5374 3.1235 11.54L6.26613 12.598C6.32365 12.6174 6.37727 12.643 6.42649 12.674L16.8033 6.59948L16.813 6.59374C16.8205 6.58927 16.8305 6.58353 16.8424 6.5768C16.866 6.56345 16.8984 6.54568 16.937 6.52603C17.009 6.48938 17.1243 6.43497 17.2541 6.39485C17.3444 6.36692 17.6109 6.28823 17.899 6.38064C18.0768 6.43767 18.2609 6.56028 18.3807 6.76798C18.4401 6.87117 18.4718 6.97483 18.4872 7.06972C18.528 7.2192 18.5215 7.36681 18.4896 7.49424C18.4208 7.76875 18.228 7.98287 18.0525 8.14665C17.9021 8.28706 15.9567 10.1629 14.0376 12.0147C13.0805 12.9381 12.1333 13.8525 11.4252 14.5359L10.9602 14.9849L16.8321 19.4867C16.9668 19.5349 17.0464 19.5325 17.0832 19.5274C17.1271 19.5214 17.163 19.5045 17.1997 19.4752C17.2407 19.4424 17.2766 19.398 17.3034 19.3557L17.3045 19.354L20.195 4.78102C20.1521 4.79133 20.1087 4.80361 20.0669 4.81691C20.0196 4.83198 19.9805 4.84634 19.9547 4.85637C19.9418 4.86134 19.9326 4.86511 19.9276 4.86719L19.9259 4.86786ZM11.4646 17.2618L10.2931 16.3636L10.0093 18.1693L11.4646 17.2618ZM9.21846 14.5814L10.3834 13.4567C11.0915 12.7732 12.0389 11.8588 12.9961 10.9352L13.9686 9.997L7.44853 13.8138L7.48351 13.8963C7.66121 14.3154 7.90087 14.8827 8.14845 15.4751C8.33358 15.918 8.52717 16.3844 8.70349 16.8162L8.98653 15.0158C9.01381 14.8422 9.09861 14.692 9.21846 14.5814Z" fill="white"/> + </svg> +</svg> diff --git a/private/src/register-admin-assets.php b/private/src/register-admin-assets.php new file mode 100644 index 00000000..d2829dcc --- /dev/null +++ b/private/src/register-admin-assets.php @@ -0,0 +1,28 @@ +<?php + +declare( strict_types = 1 ); + +add_action( 'admin_enqueue_scripts', 'humanity_register_admin_assets' ); + +if ( ! function_exists( 'humanity_register_admin_assets' ) ) { + /** + * Register admin assets that aren't associated with blocks + * + * @return void + */ + function humanity_register_admin_assets(): void { + $deps = []; + $theme = wp_get_theme(); + + $ds = DIRECTORY_SEPARATOR; + + if ( file_exists( __DIR__ . $ds . 'admin.asset.php' ) ) { + $data = require_once __DIR__ . $ds . 'admin.asset.php'; + $deps = $data['dependencies'] ?? []; + } + + wp_enqueue_script( 'theme-admin', get_template_directory_uri() . '/build/admin.js', $deps, $theme->get( 'Version' ), true ); + wp_enqueue_style( 'theme-admin', get_template_directory_uri() . '/build/admin.css', [], $theme->get( 'Version' ) ); + wp_add_inline_style( 'theme-admin', sprintf( ':root{--amnesty-icon-path:url("%s"),none}', esc_url( get_template_directory_uri() . '/images/sprite.svg' ) ) ); + } +} diff --git a/private/src/register-blocks.php b/private/src/register-blocks.php new file mode 100644 index 00000000..936772fc --- /dev/null +++ b/private/src/register-blocks.php @@ -0,0 +1,230 @@ +<?php + +declare( strict_types = 1 ); + +namespace Amnesty; + +use DirectoryIterator; +use IteratorIterator; +use RecursiveDirectoryIterator; +use RecursiveIteratorIterator; + +use function add_action; +use function generate_block_asset_handle; +use function register_block_type; +use function wp_cache_get; +use function wp_cache_set; +use function wp_is_development_mode; +use function wp_localize_script; + +/** + * https://gist.github.com/jaymcp/c243340b54cc565dd78b85ca59cbdd50 + */ +new class() { + + /** + * List of found blocks + * + * @var array<string,array{'block.json'?:string,'autoload':array<int,string>,'localisation':array<int,string>}> + */ + protected array $blocks = []; + + /** + * Constructor. + */ + public function __construct() { + add_action( 'init', [ $this, 'init' ] ); + + foreach ( [ 'admin', 'editor', 'editor-plugins', 'frontend', 'shared' ] as $slug ) { + $file = __DIR__ . DIRECTORY_SEPARATOR . 'register-' . $slug . '-assets.php'; + if ( file_exists( $file ) ) { + require_once $file; + } + } + } + + /** + * Initialise. + * + * @return void + */ + public function init(): void { + $this->blocks = wp_cache_get( 'block-list', __NAMESPACE__ ) ?: []; + + if ( wp_is_development_mode( 'plugin' ) || 0 === count( $this->blocks ) ) { + $this->find_blocks(); + } + + $this->load_blocks(); + $this->load_block_styles(); + } + + /** + * Find all blocks defined by the iterator + * + * @return void + */ + protected function find_blocks(): void { + $ds = DIRECTORY_SEPARATOR; + + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + __DIR__ . $ds . 'blocks', + ), + ); + + $blocks = []; + + /** + * Each entry is an object instance + * + * @var \SplFileInfo $entry + */ + foreach ( $iterator as $entry ) { + if ( ! $entry->isFile() ) { + continue; + } + + $dirname = basename( dirname( $entry->getRealPath() ) ); + $basename = $entry->getBasename(); + + // some blocks load their HTML from within a views dir + if ( 'views' === $dirname ) { + continue; + } + + if ( ! array_key_exists( $dirname, $blocks ) ) { + $blocks[ $dirname ] = [ + 'autoload' => [], + 'localisation' => [], + ]; + } + + if ( 'block.json' === $basename ) { + $blocks[ $dirname ]['block.json'] = $entry->getRealPath(); + continue; + } + + // we only care about php files here + if ( 'php' !== $entry->getExtension() ) { + continue; + } + + // we don't need to do anything with asset data + if ( str_ends_with( $basename, '.asset.php' ) ) { + continue; + } + + // renderers are included automagically + if ( str_starts_with( $basename, 'render' ) ) { + continue; + } + + if ( str_starts_with( $basename, 'localise' ) ) { + $blocks[ $dirname ]['localisation'][] = $entry->getRealPath(); + continue; + } + + $blocks[ $dirname ]['autoload'][] = $entry->getRealPath(); + } + + ksort( $blocks ); + + wp_cache_set( 'block-list', $blocks, __NAMESPACE__ ); + + $this->blocks = $blocks; + } + + /** + * Register blocks, autoload, and localise their assets + * + * @return void + */ + protected function load_blocks(): void { + foreach ( $this->blocks as $dirname => $block ) { + // block is invalid + if ( ! array_key_exists( 'block.json', $block ) ) { + continue; + } + + // load its required files + foreach ( $block['autoload'] as $file ) { + require_once $file; + } + + // register the block + register_block_type_from_metadata( $block['block.json'] ); + + // localise block assets + $this->localise( $dirname, $block['localisation'] ); + } + } + + /** + * Load block style registrations + * + * @return void + */ + protected function load_block_styles(): void { + if ( ! is_dir( __DIR__ . DIRECTORY_SEPARATOR . 'block-styles' ) ) { + return; + } + + $iterator = new IteratorIterator( new DirectoryIterator( __DIR__ . DIRECTORY_SEPARATOR . 'block-styles' ) ); + + /** + * Each entry is an object instance + * + * @var \SplFileInfo $entry + */ + foreach ( $iterator as $entry ) { + if ( $entry->isFile() && 'php' === $entry->getExtension() ) { + require_once $entry->getPathname(); + } + } + } + + /** + * Perform asset localisation + * + * @param string $block The block name + * @param array<int,string> $files The localisation files + * + * @return void + */ + protected function localise( string $block, array $files ): void { + foreach ( $files as $file ) { + $field_name = $this->camel( preg_replace( '/^localise-(.*)\.php$/', '$1', basename( $file ) ) ); + $asset_handle = generate_block_asset_handle( 'amnesty-core/' . $block, $field_name ); + $file_data = require $file; + + foreach ( $file_data as $object_name => $data ) { + wp_localize_script( $asset_handle, $object_name, $data ); + } + } + } + + /** + * Convert a string to PascalCase + * + * @param string $the_string the string to texturise + * + * @return string + */ + protected function pascal( string $the_string = '' ): string { + $the_string = preg_replace( '/[\'"]/', '', $the_string ); + $the_string = preg_replace( '/[^a-zA-Z0-9]+/', ' ', $the_string ); + return preg_replace( '/\s+/', '', ucwords( $the_string ) ); + } + + /** + * Convert a string to camelCase + * + * @param string $the_string the string to texturise + * + * @return string + */ + protected function camel( string $the_string = '' ): string { + return lcfirst( $this->pascal( $the_string ) ); + } +}; diff --git a/private/src/register-editor-assets.php b/private/src/register-editor-assets.php new file mode 100644 index 00000000..6693f6e9 --- /dev/null +++ b/private/src/register-editor-assets.php @@ -0,0 +1,34 @@ +<?php + +declare( strict_types = 1 ); + +add_action( 'enqueue_block_editor_assets', 'humanity_register_editor_assets' ); + +if ( ! function_exists( 'humanity_register_editor_assets' ) ) { + /** + * Register editor assets that aren't associated with blocks + * + * @return void + */ + function humanity_register_editor_assets(): void { + $theme = wp_get_theme(); + + wp_enqueue_style( 'amnesty-core-gutenberg', get_template_directory_uri() . '/build/editor.css', [], $theme->get( 'Version' ) ); + wp_add_inline_style( 'amnesty-core-gutenberg', sprintf( ':root{--amnesty-icon-path:url("%s"),none}', esc_url( get_template_directory_uri() . '/images/sprite.svg' ) ) ); + + $ol_characters = amnesty_get_option( 'ol_locale_option', 'amnesty_localisation_options_page' ); + + if ( $ol_characters ) { + $chosen_ol_format = sprintf( 'ol{list-style-type:%s;}', $ol_characters ); + wp_add_inline_style( 'amnesty-core-gutenberg', $chosen_ol_format ); + } + + $open_double = _x( '“', 'open double quote', 'amnesty' ); + $close_double = _x( '”', 'close double quote', 'amnesty' ); + $open_single = _x( '‘', 'open single quote', 'amnesty' ); + $close_single = _x( '’', 'close single quote', 'amnesty' ); + + $quotes = sprintf( 'blockquote{quotes:\'%s\' \'%s\' "%s" "%s"}', $open_double, $close_double, $open_single, $close_single ); + wp_add_inline_style( 'amnesty-core-gutenberg', $quotes ); + } +} diff --git a/private/src/register-editor-plugins-assets.php b/private/src/register-editor-plugins-assets.php new file mode 100644 index 00000000..231b9d9b --- /dev/null +++ b/private/src/register-editor-plugins-assets.php @@ -0,0 +1,100 @@ +<?php // phpcs:disable Squiz.Commenting.InlineComment.WrongStyle,PEAR.Commenting.InlineComment.WrongStyle + +declare( strict_types = 1 ); + +add_action( 'enqueue_block_editor_assets', 'humanity_register_editor_plugins_assets' ); + +if ( ! function_exists( 'humanity_register_editor_plugins_assets' ) ) { + /** + * Register editor plugins assets + * + * @return void + */ + function humanity_register_editor_plugins_assets(): void { + $deps = []; + $theme = wp_get_theme(); + + $ds = DIRECTORY_SEPARATOR; + + if ( file_exists( __DIR__ . $ds . 'editorPlugins.asset.php' ) ) { + $data = require_once __DIR__ . $ds . 'editorPlugins.asset.php'; + $deps = $data['dependencies'] ?? []; + } + + wp_enqueue_script( + 'amnesty-core-gutenberg', + get_template_directory_uri() . '/build/editorPlugins.js', + $deps, + $theme->get( 'Version' ), + true, + ); + + humanity_localise_editor(); + } +} + +if ( ! function_exists( 'humanity_localise_editor' ) ) { + /** + * Localise the editor script with the data it requires + * + * @return void + */ + function humanity_localise_editor(): void { + #region localisation + $data = [ + 'listSeparator' => _x( ',', 'list item separator', 'amnesty' ), + 'openDoubleQuote' => _x( '“', 'open double quote', 'amnesty' ), + 'closeDoubleQuote' => _x( '”', 'close double quote', 'amnesty' ), + 'openSingleQuote' => _x( '‘', 'open single quote', 'amnesty' ), + 'closeSingleQuote' => _x( '’', 'close single quote', 'amnesty' ), + ]; + + wp_localize_script( 'amnesty-core-gutenberg', 'amnestyCoreI18n', $data ); + #endregion localisation + + #region settings + $settings = [ + 'defaultSidebars' => [ + 'post' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar' ) ), + 'page' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar_page' ) ), + 'wp_template' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar' ) ), // for the site editor + ], + ]; + + $taxonomies = get_taxonomies( + [ + 'amnesty' => true, + 'public' => true, + ], + 'objects' + ); + + $taxonomies = apply_filters( 'amnesty_related_content_taxonomies', $taxonomies ); + + $settings += compact( 'taxonomies' ); + + if ( amnesty_taxonomy_is_enabled( 'location' ) ) { + $settings['locationSlug'] = amnesty_get_taxonomy_slug( 'location' ); + } + + wp_localize_script( 'amnesty-core-gutenberg', 'aiSettings', $settings ); + #endregion settings + + #region data + $localise_with = [ + 'archive_base_url' => get_pagenum_link( 1, false ), + 'domain' => wp_parse_url( home_url( '/', 'https' ), PHP_URL_HOST ), + 'pop_in_timeout' => 30, + 'active_pop_in' => 0, + ]; + + $pop_in = get_option( 'amnesty_pop_in_options_page' ); + + if ( ! empty( $pop_in ) ) { + $localise_with = array_merge( $localise_with, $pop_in ); + } + + wp_localize_script( 'amnesty-theme', 'amnesty_data', $localise_with ); + #endregion data + } +} diff --git a/private/src/register-frontend-assets.php b/private/src/register-frontend-assets.php new file mode 100644 index 00000000..4fe745e6 --- /dev/null +++ b/private/src/register-frontend-assets.php @@ -0,0 +1,81 @@ +<?php + +declare( strict_types = 1 ); + +add_action( 'wp_enqueue_scripts', 'humanity_register_frontend_assets' ); + +if ( ! function_exists( 'humanity_register_frontend_assets' ) ) { + /** + * Register frontend assets that aren't associated with blocks + * + * @return void + */ + function humanity_register_frontend_assets(): void { + $deps = []; + $theme = wp_get_theme(); + + if ( file_exists( __DIR__ . '/frontend.asset.php' ) ) { + $data = require_once __DIR__ . '/frontend.asset.php'; + $deps = $data['dependencies'] ?? []; + } + + wp_enqueue_script( 'amnesty-theme', get_template_directory_uri() . '/build/frontend.js', $deps, $theme->get( 'Version' ), true ); + wp_enqueue_style( 'amnesty-theme', get_template_directory_uri() . '/build/frontend.css', [], $theme->get( 'Version' ) ); + wp_add_inline_style( 'amnesty-theme', sprintf( ':root{--amnesty-icon-path:url("%s"),none}', esc_url( get_template_directory_uri() . '/images/sprite.svg' ) ) ); + + $ol_characters = amnesty_get_option( 'ol_locale_option', 'amnesty_localisation_options_page' ); + + if ( $ol_characters ) { + $chosen_ol_format = sprintf( 'ol{list-style-type:%s;}', $ol_characters ); + wp_add_inline_style( 'amnesty-theme', $chosen_ol_format ); + } + + $open_double = _x( '“', 'open double quote', 'amnesty' ); + $close_double = _x( '”', 'close double quote', 'amnesty' ); + $open_single = _x( '‘', 'open single quote', 'amnesty' ); + $close_single = _x( '’', 'close single quote', 'amnesty' ); + + $quotes = sprintf( 'blockquote{quotes:\'%s\' \'%s\' "%s" "%s"}', $open_double, $close_double, $open_single, $close_single ); + wp_add_inline_style( 'amnesty-theme', $quotes ); + } +} + +if ( ! function_exists( 'humanity_localise_frontend' ) ) { + /** + * Localise the frontend script with the data it requires + * + * @return void + */ + function humanity_localise_frontend(): void { + $data = [ + 'listSeparator' => _x( ',', 'list item separator', 'amnesty' ), + 'openDoubleQuote' => _x( '“', 'open double quote', 'amnesty' ), + 'closeDoubleQuote' => _x( '”', 'close double quote', 'amnesty' ), + 'openSingleQuote' => _x( '‘', 'open single quote', 'amnesty' ), + 'closeSingleQuote' => _x( '’', 'close single quote', 'amnesty' ), + 'currentLocale' => get_locale(), + ]; + + $options = get_option( 'amnesty_localisation_options_page' ); + if ( isset( $options['enforce_grouping_separators'] ) ) { + $data['enforceGroupingSeparators'] = 'on' === $options['enforce_grouping_separators']; + } + + wp_localize_script( 'amnesty-theme', 'amnestyCoreI18n', $data ); + + $localise_with = [ + 'archive_base_url' => get_pagenum_link( 1, false ), + 'domain' => wp_parse_url( home_url( '/', 'https' ), PHP_URL_HOST ), + 'pop_in_timeout' => 30, + 'active_pop_in' => 0, + ]; + + $pop_in = get_option( 'amnesty_pop_in_options_page' ); + + if ( ! empty( $pop_in ) ) { + $localise_with = array_merge( $localise_with, $pop_in ); + } + + wp_localize_script( 'amnesty-theme', 'amnesty_data', $localise_with ); + } +} diff --git a/private/src/register-shared-assets.php b/private/src/register-shared-assets.php new file mode 100644 index 00000000..e4a5b094 --- /dev/null +++ b/private/src/register-shared-assets.php @@ -0,0 +1,30 @@ +<?php + +declare( strict_types = 1 ); + +add_action( 'enqueue_block_editor_assets', 'humanity_register_shared_assets' ); +add_action( 'wp_enqueue_scripts', 'humanity_register_shared_assets' ); + +if ( ! function_exists( 'humanity_register_shared_assets' ) ) { + /** + * Register assets that are shared between the editor and frontend + * + * @return void + */ + function humanity_register_shared_assets(): void { + $theme = wp_get_theme(); + $deps = []; + + wp_register_script( 'flourish-embed', 'https://public.flourish.studio/resources/embed.js', [], $theme->get( 'Version' ), true ); + wp_register_script( 'tickcounter-sdk', 'https://www.tickcounter.com/static/js/loader.js', [], $theme->get( 'Version' ), true ); + + $ds = DIRECTORY_SEPARATOR; + + if ( file_exists( __DIR__ . $ds . 'shared.asset.php' ) ) { + $data = require_once __DIR__ . $ds . 'shared.asset.php'; + $deps = $data['dependencies'] ?? []; + } + + wp_enqueue_style( 'humanity-theme-shared', get_template_directory_uri() . '/build/shared.css', $deps, $theme->get( 'Version' ) ); + } +} diff --git a/private/src/scripts/App.js b/private/src/scripts/App.js deleted file mode 100755 index e3e0794f..00000000 --- a/private/src/scripts/App.js +++ /dev/null @@ -1,67 +0,0 @@ -import '../styles/app.scss'; -import './polyfills'; - -import Expose from './modules/Expose'; -import Overlays from './modules/overlays'; -import popIn from './modules/pop-in'; -import fluidText from './modules/fluid-text'; -import languageSelector from './modules/language-selector'; -import header from './modules/header'; -import mobileMenu from './modules/navigation'; -import subcatDrops from './modules/subcategory-dropdown'; -import checkboxGroup from './modules/checkbox-group'; -import latestFilters from './modules/latest-filters'; -import searchFilters from './modules/search-filters'; -import filterPosts from './modules/filter-posts'; -import loadVideos from './modules/video-loaded'; -import fluidIframe from './modules/fluid-iframe'; -import tweetAction from './modules/tweet-action'; -import categorySlider from './modules/category-slider'; -import sliderBlock from './modules/slider-block'; -import counters from './modules/counter'; -import termList from './modules/term-list'; -import countdownTimer from './modules/countdownTimer'; -import tabbedNav from './modules/tabbed-nav'; -import browserDetector from './modules/browser-detector'; -import iframeButton from './modules/iframe-button'; -import collapsableBlock from './modules/collapsable-block'; -import addFlickityToTabs from './modules/tabbed-content-flickity'; -import downloadBlock from './modules/download-block'; - -const App = () => { - browserDetector(); - popIn(); - languageSelector(); - header(); - mobileMenu(); - Overlays(); - subcatDrops(); - downloadBlock(); - checkboxGroup(); - latestFilters(); - searchFilters(); - filterPosts(); - fluidIframe(); - tweetAction(); - categorySlider(); - sliderBlock(); - counters(); - termList(); - countdownTimer(); - tabbedNav(); - loadVideos(); - iframeButton(); - collapsableBlock(); - addFlickityToTabs(); - - fluidText(document.getElementsByClassName('article-shareTitle'), 0.9); - - return { - using: Expose(), - }; -}; - -/** - * Export to `window.App.default()`. - */ -export default App; diff --git a/private/src/scripts/admin.js b/private/src/scripts/admin.js deleted file mode 100644 index da9d744a..00000000 --- a/private/src/scripts/admin.js +++ /dev/null @@ -1,5 +0,0 @@ -import '../styles/admin.scss'; -import './admin/cmb-events'; -import './admin/cmb-term-type'; -import './admin/ordered-list-preview'; -import './admin/options-general'; diff --git a/private/src/scripts/blocks.js b/private/src/scripts/blocks.js deleted file mode 100755 index bdc86fe7..00000000 --- a/private/src/scripts/blocks.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Gutenberg Blocks - * - * All blocks related JavaScript files should be imported here. - * You can create a new block folder in this dir and include code - * for that block here as well. - * - * All blocks should be included here since this is the file that - * Webpack is compiling as the input file. - */ -import '../styles/gutenberg.scss'; - -import './editor/block-styles'; - -import './editor/plugins/appearance-options/index.jsx'; -import './editor/plugins/pop-in/index.jsx'; - -import './editor/blocks/action/index.jsx'; -import './editor/blocks/blockquote/index.jsx'; -import './editor/blocks/core-mods'; -import './editor/blocks/countdown-timer/index.jsx'; -import './editor/blocks/download/index.jsx'; -import './editor/blocks/embed-flourish/index.jsx'; -import './editor/blocks/embed-infogram/index.jsx'; -import './editor/blocks/embed-sutori/index.jsx'; -import './editor/blocks/embed-tickcounter/index.jsx'; -import './editor/blocks/hero/index.jsx'; -import './editor/blocks/hero/replaceHeaders'; -import './editor/blocks/iframe-button/index.jsx'; -import './editor/blocks/iframe/index.jsx'; -import './editor/blocks/key-facts/index.jsx'; -import './editor/blocks/link-group/index.jsx'; -import './editor/blocks/menu/index.jsx'; -import './editor/blocks/petition-list/index.jsx'; -import './editor/blocks/post-list/index.jsx'; -import './editor/blocks/post-meta/index.jsx'; -import './editor/blocks/raw-code/index.jsx'; -import './editor/blocks/regions/index.jsx'; -import './editor/blocks/related-content/index.jsx'; -import './editor/blocks/section/index.jsx'; -import './editor/blocks/slider/index.jsx'; -import './editor/blocks/stat-counter/index.jsx'; -import './editor/blocks/term-list/index.jsx'; -import './editor/blocks/tweet/index.jsx'; - -import './editor/fse-blocks/archive-filters/index.jsx'; -import './editor/fse-blocks/archive-header/index.jsx'; -import './editor/fse-blocks/pop-in/index.jsx'; -import './editor/fse-blocks/query-count/index.jsx'; -import './editor/fse-blocks/search-form/index.jsx'; -import './editor/fse-blocks/search-header/index.jsx'; -import './editor/fse-blocks/sidebar/index.jsx'; - -// To remove in v2.0.0 -import './editor/blocks-deprecated/background-media/index.jsx'; -import './editor/blocks-deprecated/banner/index.jsx'; -import './editor/blocks-deprecated/button/index.jsx'; -import './editor/blocks-deprecated/call-to-action/index.jsx'; -import './editor/blocks-deprecated/collapsable/index.jsx'; -import './editor/blocks-deprecated/columns/index.jsx'; -import './editor/blocks-deprecated/custom-card/index.jsx'; -import './editor/blocks-deprecated/header/index.jsx'; -import './editor/blocks-deprecated/image/index.jsx'; -import './editor/blocks-deprecated/links-with-icons/index.jsx'; diff --git a/private/src/scripts/editor.js b/private/src/scripts/editor.js deleted file mode 100644 index 22fb6021..00000000 --- a/private/src/scripts/editor.js +++ /dev/null @@ -1 +0,0 @@ -import '../styles/editor.scss'; diff --git a/private/src/scripts/editor/block-styles/button-block.js b/private/src/scripts/editor/block-styles/button-block.js deleted file mode 100644 index 23d78db4..00000000 --- a/private/src/scripts/editor/block-styles/button-block.js +++ /dev/null @@ -1,33 +0,0 @@ -const { omit } = lodash; -const { registerBlockStyle } = wp.blocks; -const { addFilter } = wp.hooks; -const { _x } = wp.i18n; - -/** - * Remove button styles - */ -addFilter('blocks.registerBlockType', 'amnesty-core', (settings, name) => { - if (name !== 'core/button') { - return settings; - } - - return omit(settings, ['styles']); -}); - -registerBlockStyle('core/button', { - name: 'dark', - // translators: [admin] - label: _x('Dark', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/button', { - name: 'link', - // translators: [admin] - label: _x('Back Link', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/button', { - name: 'search', - // translators: [admin] - label: _x('Search', 'block style', 'amnesty'), -}); diff --git a/private/src/scripts/editor/block-styles/group-block.js b/private/src/scripts/editor/block-styles/group-block.js deleted file mode 100644 index cc686cba..00000000 --- a/private/src/scripts/editor/block-styles/group-block.js +++ /dev/null @@ -1,26 +0,0 @@ -const { registerBlockStyle } = wp.blocks; -const { _x } = wp.i18n; - -registerBlockStyle('core/group', { - name: 'square-border', - // translators: [admin] - label: _x('Square Border', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/group', { - name: 'light', - // translators: [admin] - label: _x('Light Background', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/group', { - name: 'dark', - // translators: [admin] - label: _x('Dark Background', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/group', { - name: 'top-and-bottom-border', - // translators: [admin] - label: _x('Top and Bottom Border', 'block style', 'amnesty'), -}); diff --git a/private/src/scripts/editor/block-styles/index.js b/private/src/scripts/editor/block-styles/index.js deleted file mode 100644 index 2bda0fa0..00000000 --- a/private/src/scripts/editor/block-styles/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import './tabbed-content-block'; -import './social-links-block'; -import './table-block'; -import './button-block'; -import './group-block'; diff --git a/private/src/scripts/editor/block-styles/social-links-block.js b/private/src/scripts/editor/block-styles/social-links-block.js deleted file mode 100644 index ffcfcc3f..00000000 --- a/private/src/scripts/editor/block-styles/social-links-block.js +++ /dev/null @@ -1,38 +0,0 @@ -const { registerBlockStyle } = wp.blocks; -const { _x } = wp.i18n; - -registerBlockStyle('core/social-links', { - name: 'dark', - // translators: [admin] - label: _x('Dark', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/social-links', { - name: 'dark-circle', - // translators: [admin] - label: _x('Dark Circle', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/social-links', { - name: 'light', - // translators: [admin] - label: _x('Light', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/social-links', { - name: 'light-circle', - // translators: [admin] - label: _x('Light Circle', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/social-links', { - name: 'logos-only-dark', - // translators: [admin] - label: _x('Logos Only Dark', 'block style', 'amnesty'), -}); - -registerBlockStyle('core/social-links', { - name: 'logos-only-light', - // translators: [admin] - label: _x('Logos Only Light', 'block style', 'amnesty'), -}); diff --git a/private/src/scripts/editor/block-styles/tabbed-content-block.js b/private/src/scripts/editor/block-styles/tabbed-content-block.js deleted file mode 100644 index df185df1..00000000 --- a/private/src/scripts/editor/block-styles/tabbed-content-block.js +++ /dev/null @@ -1,32 +0,0 @@ -const { registerBlockStyle } = wp.blocks; -const { _x } = wp.i18n; - -// Removes unwanted inspector controls -/* eslint-disable no-param-reassign */ -const observer = new MutationObserver(() => { - const InspectorControls = document.querySelectorAll('.bbTabs_options'); - - InspectorControls.forEach((element) => { - element.style.display = 'none'; - return observer.disconnect; - }); -}); - -// Listens for childList to be populated -observer.observe(document, { - childList: true, - subtree: true, -}); - -registerBlockStyle('bigbite/tabs', { - name: 'light', - // translators: [admin] - label: _x('Light', 'block style', 'amnesty'), -}); - -registerBlockStyle('bigbite/tabs', { - name: 'grey', - isDefault: true, - // translators: [admin] - label: _x('Grey', 'block style', 'amnesty'), -}); diff --git a/private/src/scripts/editor/block-styles/table-block.js b/private/src/scripts/editor/block-styles/table-block.js deleted file mode 100644 index d6fc237f..00000000 --- a/private/src/scripts/editor/block-styles/table-block.js +++ /dev/null @@ -1,8 +0,0 @@ -const { registerBlockStyle } = wp.blocks; -const { _x } = wp.i18n; - -registerBlockStyle('core/table', { - name: 'responsive', - // translators: [admin] - label: _x('Responsive', 'block style', 'amnesty'), -}); diff --git a/private/src/scripts/editor/blocks-deprecated/background-media/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/background-media/DisplayComponent.jsx deleted file mode 100644 index 095a16ff..00000000 --- a/private/src/scripts/editor/blocks-deprecated/background-media/DisplayComponent.jsx +++ /dev/null @@ -1,14 +0,0 @@ -const { InnerBlocks } = wp.blockEditor; - -const TEMPLATE = [ - ['amnesty-core/background-media-column', { deletable: false }], - ['amnesty-core/background-media-column', { deletable: false }], -]; - -const DisplayComponent = ({ className }) => ( - <div className={className}> - <InnerBlocks template={TEMPLATE} templateLock="all" renderAppender={false} /> - </div> -); - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks-deprecated/background-media/components/Column.jsx b/private/src/scripts/editor/blocks-deprecated/background-media/components/Column.jsx deleted file mode 100644 index 13bd47d9..00000000 --- a/private/src/scripts/editor/blocks-deprecated/background-media/components/Column.jsx +++ /dev/null @@ -1,63 +0,0 @@ -import DisplayComponent from './ColumnDisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { InnerBlocks } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/background-media-column', { - // translators: [admin] - title: __('Background Media Column', 'amnesty'), - // translators: [admin] - description: __('Column layout for Background Media block', 'amnesty'), - category: 'amnesty-core', - parent: ['amnesty-core/background-media'], - supports: { - alignWide: false, - className: false, - customClassName: false, - defaultStylePicker: false, - inserter: false, - reusable: false, - }, - attributes: { - uniqId: { - type: 'string', - default: '', - source: 'attribute', - selector: 'div', - attribute: 'id', - }, - horizontalAlignment: { - type: 'string', - }, - verticalAlignment: { - type: 'string', - }, - image: { - type: 'number', - default: 0, - }, - background: { - type: 'string', - }, - opacity: { - type: 'number', - default: 1, - }, - focalPoint: { - type: 'object', - default: { - x: 0.5, - y: 0.5, - }, - }, - }, - - edit: DisplayComponent, - - deprecated, - - // eslint-disable-next-line react/display-name - save: () => <InnerBlocks.Content />, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/background-media/components/ColumnDisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/background-media/components/ColumnDisplayComponent.jsx deleted file mode 100644 index fb9f607b..00000000 --- a/private/src/scripts/editor/blocks-deprecated/background-media/components/ColumnDisplayComponent.jsx +++ /dev/null @@ -1,177 +0,0 @@ -import classnames from 'classnames'; -import { getEditorCssV2, getDimensionsV2, getUrlV2, randId } from '../utils'; - -const { isObject } = lodash; -const { apiFetch } = wp; -const { - BlockAlignmentToolbar, - BlockControls, - BlockVerticalAlignmentToolbar, - InnerBlocks, - InspectorControls, - MediaUpload, - MediaUploadCheck, -} = wp.blockEditor; -const { Button, FocalPointPicker, PanelBody, RangeControl, SelectControl } = wp.components; -const { Fragment, useEffect, useRef, useState } = wp.element; -const { __ } = wp.i18n; - -const ALLOWED_BLOCKS = [ - 'core/heading', - 'core/paragraph', - 'core/list', - 'core/buttons', - 'core/button', -]; - -const DisplayComponent = (props) => { - const { attributes, setAttributes } = props; - const { background, horizontalAlignment, image, uniqId, verticalAlignment } = attributes; - const [focalPoint, setFocalPoint] = useState({ x: 0.5, y: 0.5 }); - const [opacity, setOpacity] = useState(1); - const [imageObject, setImageObject] = useState({}); - - // componentDidMount - const mounted = useRef(); - useEffect(() => { - if (mounted.current) { - return; - } - - mounted.current = true; - - if (!uniqId) { - setAttributes({ uniqId: randId() }); - } - - if (!image) { - return; - } - - if (isObject(image)) { - setAttributes({ image: image.id }); - return; - } - - if (!imageObject?.id) { - apiFetch({ path: `wp/v2/media/${image}` }).then(setImageObject); - } - }, [image, uniqId, setAttributes, imageObject]); - - // componentDidUpdate - useEffect(() => { - if (!mounted.current) { - return; - } - - setAttributes({ focalPoint, opacity }); - - if (!image) { - return; - } - - if (!imageObject?.id) { - apiFetch({ path: `wp/v2/media/${image}` }).then(setImageObject); - } - }, [focalPoint, image, imageObject, opacity, setAttributes]); - - const containerClasses = classnames('text-media--itemContainer', { - [`align${horizontalAlignment}`]: !!horizontalAlignment, - [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, - [`has-${background}-background-color`]: !!background, - }); - - const css = getEditorCssV2(imageObject, uniqId, focalPoint, opacity); - - return ( - <Fragment> - <InspectorControls> - {imageObject && ( - <PanelBody title={/* translators: [admin] */ __('Image Settings', 'amnesty')}> - <FocalPointPicker - // translators: [admin] - label={__('Focal Point', 'amnesty')} - url={getUrlV2(imageObject, 'lwi-block-sm@2x')} - dimensions={getDimensionsV2(imageObject, 'lwi-block-sm@2x')} - value={focalPoint} - onChange={setFocalPoint} - /> - <RangeControl - // translators: [admin] - label={__('Opacity', 'amnesty')} - min={0} - max={1} - step={0.1} - value={opacity} - onChange={(value) => setOpacity(value)} - /> - </PanelBody> - )} - {!image && ( - // translators: [admin] - <PanelBody title={__('Background Colour', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Colour', 'amnesty')} - value={background} - onChange={(value) => setAttributes({ background: value })} - options={[ - { - // translators: [admin] - label: __('White', 'amnesty'), - value: '', - }, - { - // translators: [admin] - label: __('Grey', 'amnesty'), - value: 'very-light-gray', - }, - ]} - /> - </PanelBody> - )} - </InspectorControls> - <BlockControls> - <BlockAlignmentToolbar - value={horizontalAlignment} - onChange={(value) => setAttributes({ horizontalAlignment: value })} - /> - <BlockVerticalAlignmentToolbar - value={verticalAlignment} - onChange={(value) => setAttributes({ verticalAlignment: value })} - /> - </BlockControls> - {css && <style>{css}</style>} - <div id={uniqId} className={containerClasses}> - <div> - <MediaUploadCheck> - <MediaUpload - onSelect={(media) => setAttributes({ image: media.id })} - allowedTypes={['image']} - value={isObject(image) ? image.id : image} - render={({ open }) => ( - <Button isPrimary onClick={open}> - {image - ? // translators: [admin] - __('Replace Image', 'amnesty') - : // translators: [admin] - __('Add Image', 'amnesty')} - </Button> - )} - /> - </MediaUploadCheck> - {image ? ( - <Button isSecondary onClick={() => setAttributes({ image: 0 })}> - {/* translators: [admin] */ __('Remove Image', 'amnesty')} - </Button> - ) : null} - </div> - <div> - <InnerBlocks templateLock={false} allowedBlocks={ALLOWED_BLOCKS} /> - </div> - </div> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks-deprecated/background-media/components/deprecated.jsx b/private/src/scripts/editor/blocks-deprecated/background-media/components/deprecated.jsx deleted file mode 100644 index 893018d4..00000000 --- a/private/src/scripts/editor/blocks-deprecated/background-media/components/deprecated.jsx +++ /dev/null @@ -1,267 +0,0 @@ -import classnames from 'classnames'; -import { getSaveCss } from '../utils'; - -const { assign, isObject, isString } = lodash; -const { InnerBlocks } = wp.editor; -const { Fragment } = wp.element; - -const v4 = { - supports: { - alignWide: false, - className: false, - customClassName: false, - defaultStylePicker: false, - inserter: false, - reusable: false, - }, - attributes: { - uniqId: { - type: 'string', - default: '', - source: 'attribute', - selector: 'div', - attribute: 'id', - }, - horizontalAlignment: { - type: 'string', - }, - verticalAlignment: { - type: 'string', - }, - image: { - type: 'object', - default: '', - }, - background: { - type: 'string', - }, - opacity: { - type: 'number', - default: 1, - }, - focalPoint: { - type: 'object', - default: { - x: 0.5, - y: 0.5, - }, - }, - }, - migrate(attributes, innerBlocks) { - if (isObject(attributes.image)) { - return [assign({}, attributes, { image: parseInt(attributes.image.id, 10) }), innerBlocks]; - } - - if (isString(attributes.image) && attributes.image) { - return [assign({}, attributes, { image: parseInt(attributes.image, 10) }), innerBlocks]; - } - - return [attributes, innerBlocks]; - }, - save({ attributes }) { - const { background, horizontalAlignment, uniqId, verticalAlignment } = attributes; - - const containerClasses = classnames('text-media--itemContainer', { - [`align${horizontalAlignment}`]: !!horizontalAlignment, - [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, - [`has-${background}-background-color`]: !!background, - }); - - const css = getSaveCss(attributes); - - return ( - <Fragment> - {css && <style>{css}</style>} - <div id={uniqId} className={containerClasses}> - <InnerBlocks.Content /> - </div> - </Fragment> - ); - }, -}; - -const v3 = { - supports: { - alignWide: false, - className: false, - customClassName: false, - defaultStylePicker: false, - inserter: false, - reusable: false, - }, - attributes: { - uniqId: { - type: 'string', - default: '', - source: 'attribute', - selector: 'div', - attribute: 'id', - }, - horizontalAlignment: { - type: 'string', - }, - verticalAlignment: { - type: 'string', - }, - image: { - type: 'object', - default: '', - }, - background: { - type: 'string', - }, - opacity: { - type: 'number', - default: 1, - }, - focalPoint: { - type: 'object', - default: { - x: 0.5, - y: 0.5, - }, - }, - }, - save({ attributes }) { - const { background, horizontalAlignment, uniqId, verticalAlignment, image } = attributes; - - const containerClasses = classnames('text-media--itemContainer', { - [`align${horizontalAlignment}`]: !!horizontalAlignment, - [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, - [`has-${background}-background-color`]: !!background, - }); - - const css = getSaveCss(attributes); - - return ( - <Fragment> - {css && <style>{css}</style>} - <div id={uniqId} className={containerClasses}> - <InnerBlocks.Content /> - {image && <div className="imageBlock-image"></div>} - </div> - </Fragment> - ); - }, -}; - -const v2 = { - attributes: { - uniqId: { - type: 'string', - default: '', - source: 'attribute', - selector: 'div', - attribute: 'id', - }, - horizontalAlignment: { - type: 'string', - }, - verticalAlignment: { - type: 'string', - }, - image: { - type: 'object', - default: '', - }, - background: { - type: 'string', - }, - opacity: { - type: 'number', - default: 1, - }, - focalPoint: { - type: 'object', - default: { - x: 0.5, - y: 0.5, - }, - }, - }, - save({ attributes }) { - const { background, horizontalAlignment, uniqId, verticalAlignment, image } = attributes; - - const containerClasses = classnames('text-media--itemContainer', { - [`align${horizontalAlignment}`]: !!horizontalAlignment, - [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, - [`has-${background}-background-color`]: !!background, - }); - - const css = getSaveCss(attributes); - - return ( - <Fragment> - {css && <style>{css}</style>} - <div id={uniqId} className={containerClasses}> - <InnerBlocks.Content /> - {image && ( - <div className="imageBlock-image"> - <span className="image-caption">{image.description}</span> - </div> - )} - </div> - </Fragment> - ); - }, -}; - -const v1 = { - attributes: { - uniqId: { - type: 'string', - default: '', - source: 'attribute', - selector: 'div', - attribute: 'id', - }, - horizontalAlignment: { - type: 'string', - }, - verticalAlignment: { - type: 'string', - }, - image: { - type: 'object', - default: '', - }, - background: { - type: 'string', - }, - opacity: { - type: 'number', - default: 1, - }, - focalPoint: { - type: 'object', - default: { - x: 0.5, - y: 0.5, - }, - }, - }, - save({ attributes }) { - const { background, horizontalAlignment, uniqId, verticalAlignment } = attributes; - - const containerClasses = classnames('text-media--itemContainer', { - [`align${horizontalAlignment}`]: !!horizontalAlignment, - [`is-vertically-aligned-${verticalAlignment}`]: !!verticalAlignment, - [`has-${background}-background-color`]: !!background, - }); - - const css = getSaveCss(attributes); - - return ( - <Fragment> - {css && <style>{css}</style>} - <div id={uniqId} className={containerClasses}> - <InnerBlocks.Content /> - </div> - </Fragment> - ); - }, -}; - -const deprecated = [v4, v3, v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks-deprecated/background-media/deprecated.jsx b/private/src/scripts/editor/blocks-deprecated/background-media/deprecated.jsx deleted file mode 100644 index 18fdd315..00000000 --- a/private/src/scripts/editor/blocks-deprecated/background-media/deprecated.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import classnames from 'classnames'; - -const { InnerBlocks } = wp.blockEditor; - -const v1 = { - save({ className, innerBlocks }) { - const leftImage = innerBlocks[0]?.attributes?.image?.id; - const rightImage = innerBlocks[1]?.attributes?.image?.id; - - const blockClasses = classnames(className, { - 'has-imageLeft': !!leftImage, - 'has-imageRight': !!rightImage, - }); - - return ( - <div className={blockClasses}> - <InnerBlocks.Content /> - </div> - ); - }, -}; - -const deprecated = [v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks-deprecated/background-media/index.jsx b/private/src/scripts/editor/blocks-deprecated/background-media/index.jsx deleted file mode 100644 index effae061..00000000 --- a/private/src/scripts/editor/blocks-deprecated/background-media/index.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import './components/Column.jsx'; -import deprecated from './deprecated.jsx'; - -const { InnerBlocks } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/background-media', { - // translators: [admin] - title: __('Background Media', 'amnesty'), - // translators: [admin] - description: __('Two-column layout with background images', 'amnesty'), - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Background', 'amnesty'), - // translators: [admin] - __('Media', 'amnesty'), - // translators: [admin] - __('Text', 'amnesty'), - ], - - deprecated, - edit: DisplayComponent, - - save: () => <InnerBlocks.Content />, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/background-media/utils.js b/private/src/scripts/editor/blocks-deprecated/background-media/utils.js deleted file mode 100644 index 54c0b84d..00000000 --- a/private/src/scripts/editor/blocks-deprecated/background-media/utils.js +++ /dev/null @@ -1,151 +0,0 @@ -const { pick } = lodash; - -export const getUrlV2 = (image, size) => { - // eslint-disable-next-line camelcase - if (!image || !image?.media_details) { - return ''; - } - - // eslint-disable-next-line camelcase - const { sizes } = image.media_details; - - if (!sizes) { - return ''; - } - - // eslint-disable-next-line camelcase - if (sizes[size] && sizes[size]?.source_url) { - return encodeURI(sizes[size].source_url); - } - - // eslint-disable-next-line camelcase - if (sizes?.full?.source_url) { - return encodeURI(sizes.full.source_url); - } - - return ''; -}; - -export const getDimensionsV2 = (image, size) => { - const fallback = { height: 0, width: 0 }; - - // eslint-disable-next-line camelcase - if (!image || !image?.media_details) { - return fallback; - } - - // eslint-disable-next-line camelcase - const { sizes } = image.media_details; - - if (!sizes) { - return fallback; - } - - // eslint-disable-next-line camelcase - if (sizes[size]) { - return pick(sizes[size], ['height', 'width']); - } - - // eslint-disable-next-line camelcase - if (sizes.full) { - return pick(sizes.full, ['height', 'width']); - } - - return fallback; -}; - -export const getEditorCssV2 = (imageObject, uniqId, focalPoint, opacity) => { - if (!imageObject) { - return ''; - } - - const bgopacity = parseFloat((1 - parseFloat(opacity)).toPrecision(2)); - const x = Math.round(parseFloat(focalPoint.x) * 100); - const y = Math.round(parseFloat(focalPoint.y) * 100); - const lg = '@media screen and (min-width:1440px)'; - let gradient = `linear-gradient(rgba(255,255,255,${bgopacity}),rgba(255,255,255,${bgopacity})),`; - - if (bgopacity === 0) { - gradient = ''; - } - - return ` - #${uniqId}{background-position:${x}% ${y}%} - #${uniqId}{background-image:${gradient}url("${getUrlV2(imageObject, 'lwi-block-sm@2x')}")} - ${lg}{#${uniqId}{background-image:${gradient}url("${getUrlV2(imageObject, 'lwi-block-lg@2x')}")}} - `.replace(/\s+/, ''); -}; - -export const getUrl = (image, size) => { - if (!image) { - return ''; - } - - const obj = image.sizes[size] || image.sizes.full || { url: '' }; - return encodeURI(obj.url); -}; - -export const getSaveCss = ({ focalPoint, image, opacity, uniqId }) => { - if (!image) { - return ''; - } - - const bgopacity = parseFloat((1 - parseFloat(opacity)).toPrecision(2)); - const x = parseFloat(focalPoint.x) * 100; - const y = parseFloat(focalPoint.y) * 100; - const med = '@media screen and (min-width:770px)'; - const lg = '@media screen and (min-width:1440px)'; - let gradient = `linear-gradient(rgba(255,255,255,${bgopacity}),rgba(255,255,255,${bgopacity})),`; - - if (bgopacity === 0) { - gradient = ''; - } - - return ` - #${uniqId}{background-position:${x}% ${y}%} - #${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")} - ${med}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")}} - ${lg}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-lg@2x')}")}} - `.replace(/\s+/, ''); -}; - -export const getEditorCss = ({ image, uniqId }, focalPoint, opacity) => { - if (!image) { - return ''; - } - - const bgopacity = parseFloat((1 - parseFloat(opacity)).toPrecision(2)); - const x = Math.round(parseFloat(focalPoint.x) * 100); - const y = Math.round(parseFloat(focalPoint.y) * 100); - const med = '@media screen and (min-width:770px)'; - const lg = '@media screen and (min-width:1440px)'; - let gradient = `linear-gradient(rgba(255,255,255,${bgopacity}),rgba(255,255,255,${bgopacity})),`; - - if (bgopacity === 0) { - gradient = ''; - } - - return ` - #${uniqId}{background-position:${x}% ${y}%} - #${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")} - ${med}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-sm@2x')}")}} - ${lg}{#${uniqId}{background-image:${gradient}url("${getUrl(image, 'lwi-block-lg@2x')}")}} - `.replace(/\s+/, ''); -}; - -export const getDimensions = (image, size) => { - const fallback = { height: 0, width: 0 }; - - if (!image) { - return fallback; - } - - const obj = image.sizes[size] || image.sizes.full || fallback; - return pick(obj, ['height', 'width']); -}; - -export const randId = () => - Math.random() - .toString(36) - .replace(/[^a-z]+/g, '') - .substr(2, 10); diff --git a/private/src/scripts/editor/blocks-deprecated/banner/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/banner/DisplayComponent.jsx deleted file mode 100644 index c762bde3..00000000 --- a/private/src/scripts/editor/blocks-deprecated/banner/DisplayComponent.jsx +++ /dev/null @@ -1,288 +0,0 @@ -import classnames from 'classnames'; -import MediaMetadata from '../../components/MediaMetadata.jsx'; -import MediaMetadataVisibilityControls from '../../components/MediaMetadataVisibilityControls.jsx'; -import PostFeaturedVideo from '../../components/PostFeaturedVideo.jsx'; - -const { InspectorControls, MediaUpload, RichText, URLInputButton } = wp.blockEditor; -const { IconButton, PanelBody, SelectControl, TextControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; -const { addQueryArgs } = wp.url; - -export default class DisplayComponent extends Component { - state = { - imageData: null, - videoData: null, - }; - - fetchMediaMetadata = (id, type) => { - const key = `${type}Data`; - const cached = this.state[key]?.id; - - if (id === 0) { - if (cached) { - this.setState({ [key]: null }); - } - return; - } - - if (cached && cached === id) { - return; - } - - const path = addQueryArgs(`/wp/v2/media/${id}`, { - context: 'edit', - _fields: 'id,source_url,caption,description', - }); - - wp.apiRequest({ path }).then((resp) => { - this.setState({ - [key]: { - id: resp.id, - url: resp.source_url, - caption: resp.caption.raw, - description: resp.description.raw, - }, - }); - }); - }; - - componentDidMount() { - const { imageID, type, featuredVideoId } = this.props.attributes; - - if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { - this.fetchMediaMetadata(featuredVideoId, 'video'); - } - - if (type !== 'video' && !this.state.imageData && imageID) { - this.fetchMediaMetadata(imageID, 'image'); - } - } - - componentDidUpdate(prevProps) { - const { imageID, type, featuredVideoId } = this.props.attributes; - - if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { - this.fetchMediaMetadata(featuredVideoId, 'video'); - } - - if ( - type !== 'video' && - (imageID !== prevProps.imageID || this.state.imageData?.id !== imageID) - ) { - this.fetchMediaMetadata(imageID, 'image'); - } - } - - render() { - const { attributes = {}, setAttributes } = this.props; - const { - size = false, - background = false, - alignment = false, - - content, - ctaLink, - ctaText, - embed, - featuredVideoId, - imageID, - title, - } = attributes; - - let { type } = attributes; - if (!type) { - type = 'image'; - } - - const classes = classnames('page-hero', 'headerBlock', { - 'page-heroSize--full': !size, - 'page-heroBackground--transparent': !background, - 'page-heroAlignment--left': !alignment, - 'page-hero--video': type === 'video', - [`page-heroSize--${size}`]: size, - [`page-heroBackground--${background}`]: background, - [`page-heroAlignment--${alignment}`]: alignment, - }); - - const sectionStyles = {}; - if (type === 'image' && this.state.imageData?.url) { - sectionStyles.backgroundImage = `url("${this.state.imageData.url}")`; - } - - const caption = this.state[`${type}Data`]?.caption; - const copyright = this.state[`${type}Data`]?.description; - - return ( - <Fragment> - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Alignment', 'amnesty')} - options={[ - { - /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ - label: __('Left', 'amnesty'), - value: 'left', - }, - { - // translators: [admin] text alignment. - label: __('Centre', 'amnesty'), - value: 'center', - }, - { - /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ - label: __('Right', 'amnesty'), - value: 'right', - }, - ]} - value={alignment} - onChange={(newAlignment) => setAttributes({ alignment: newAlignment })} - /> - <SelectControl - // translators: [admin] - label={__('Background Colour', 'amnesty')} - options={[ - // translators: [admin] - { value: '', label: __('Translucent black', 'amnesty') }, - // translators: [admin] - { value: 'none', label: __('None', 'amnesty') }, - // translators: [admin] - { value: 'light', label: __('White', 'amnesty') }, - // translators: [admin] - { value: 'dark', label: __('Black', 'amnesty') }, - ]} - value={background} - onChange={(newBackground) => setAttributes({ background: newBackground })} - /> - <SelectControl - // translators: [admin] - label={__('Size', 'amnesty')} - options={[ - // translators: [admin] - { value: '', label: __('Normal', 'amnesty') }, - // translators: [admin] - { value: 'small', label: __('Small', 'amnesty') }, - ]} - value={size} - onChange={(newSize) => setAttributes({ size: newSize })} - /> - <SelectControl - // translators: [admin] - label={__('Background Type', 'amnesty')} - options={[ - // translators: [admin] - { value: '', label: __('Image', 'amnesty') }, - // translators: [admin] - { value: 'video', label: __('Video', 'amnesty') }, - ]} - value={type} - onChange={(newType) => setAttributes({ type: newType })} - /> - <MediaMetadataVisibilityControls - type={attributes.type} - hideCaption={attributes.hideImageCaption} - hideCopyright={attributes.hideImageCopyright} - setAttributes={setAttributes} - /> - <TextControl - // translators: [admin] - label={__('Embed URL', 'amnesty')} - // translators: [admin] - help={__( - 'Setting this will override the call to action link and will now open a modal with the embed.', - 'amnesty', - )} - value={embed} - onChange={(newEmbed) => setAttributes({ embed: newEmbed })} - /> - </PanelBody> - {type === 'video' && ( - <PanelBody title={/* translators: [admin] */ __('Featured Video', 'amnesty')}> - <PostFeaturedVideo - featuredVideoId={featuredVideoId} - onUpdate={(newVideoID) => setAttributes({ featuredVideoId: newVideoID })} - /> - </PanelBody> - )} - </InspectorControls> - <section className={classes} style={sectionStyles}> - {type !== 'video' && ( - <div className="linkList-options"> - {imageID ? ( - <IconButton - icon="no-alt" - // translators: [admin] - label={__('Remove Image', 'amnesty')} - onClick={() => setAttributes({ imageID: 0 })} - /> - ) : ( - <MediaUpload - allowedTypes={['image']} - value={imageID} - onSelect={(media) => setAttributes({ imageID: media.id })} - render={({ open }) => <IconButton icon="format-image" onClick={open} />} - /> - )} - </div> - )} - - {this.state.videoData?.url && ( - <div className="page-heroVideoContainer"> - <video className="page-heroVideo"> - <source src={this.state.videoData.url} /> - </video> - </div> - )} - <div className="container"> - <div className="hero-content"> - <RichText - tagName="h1" - className="page-heroTitle" - value={title} - // translators: [admin] - placeholder={__('Banner Title', 'amnesty')} - format="string" - onChange={(newTitle) => setAttributes({ title: newTitle })} - /> - <RichText - tagName="p" - className="page-heroContent" - value={content} - // translators: [admin] - placeholder={__('Banner Content', 'amnesty')} - format="string" - onChange={(newContent) => setAttributes({ content: newContent })} - /> - <div className="page-heroCta"> - <div className="btn btn--large"> - {embed && <i className="play-icon"></i>} - <RichText - tagName="span" - value={ctaText} - // translators: [admin] - placeholder={__('Call to action', 'amnesty')} - format="string" - onChange={(newCtaText) => setAttributes({ ctaText: newCtaText })} - /> - {(!embed || embed.length < 1) && ( - <URLInputButton - url={ctaLink} - onChange={(newCtaLink) => setAttributes({ ctaLink: newCtaLink })} - /> - )} - </div> - </div> - </div> - </div> - <MediaMetadata - media={{ caption, copyright }} - showMediaCaption={!attributes.hideImageCaption} - showMediaCopyright={!attributes.hideImageCopyright} - /> - </section> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks-deprecated/banner/index.jsx b/private/src/scripts/editor/blocks-deprecated/banner/index.jsx deleted file mode 100644 index e12b1f67..00000000 --- a/private/src/scripts/editor/blocks-deprecated/banner/index.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { createBlock, registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/header', { - // translators: [admin] - title: __('Banner', 'amnesty'), - icon: 'format-image', - category: 'amnesty-core', - // translators: [admin] - keywords: [__('Banner', 'amnesty')], - supports: { - className: false, - inserter: false, - }, - attributes: { - title: { - type: 'string', - }, - content: { - type: 'string', - }, - ctaLink: { - type: 'string', - }, - ctaText: { - type: 'string', - }, - alignment: { - type: 'string', - }, - background: { - type: 'string', - }, - hideImageCaption: { - type: 'boolean', - default: true, - }, - hideImageCopyright: { - type: 'boolean', - default: false, - }, - size: { - type: 'string', - }, - type: { - type: 'string', - }, - embed: { - type: 'string', - }, - imageID: { - type: 'integer', - }, - imageURL: { - type: 'string', - }, - featuredVideoId: { - type: 'integer', - }, - }, - - transforms: { - from: [ - { - type: 'block', - isMultiBlock: false, - blocks: ['amnesty-core/block-hero'], - transform: (attributes) => createBlock('amnesty-core/header', attributes), - }, - ], - to: [ - { - type: 'block', - isMultiBlock: false, - blocks: ['amnesty-core/block-hero'], - transform: (attributes) => createBlock('amnesty-core/block-hero', attributes), - }, - { - type: 'block', - isMultiBlock: false, - blocks: ['amnesty-core/hero'], - transform: (attributes) => createBlock('amnesty-core/hero', attributes), - }, - ], - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/button/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/button/DisplayComponent.jsx deleted file mode 100644 index db56464a..00000000 --- a/private/src/scripts/editor/blocks-deprecated/button/DisplayComponent.jsx +++ /dev/null @@ -1,71 +0,0 @@ -import classnames from 'classnames'; - -const { InspectorControls, RichText, URLInputButton } = wp.blockEditor; -const { PanelBody, SelectControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -/** - * This is the component that renders the edit screen in the panel. - */ -class DisplayComponent extends Component { - /** - * Higher order component that takes the attribute key, - * this then returns a function which takes a value, - * when called it updates the attribute with the key. - * @param key - * @returns {function(*): *} - */ - createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - render() { - const { attributes } = this.props; - const { ctaLink, ctaText, style } = attributes; - - return ( - <Fragment> - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Button Style', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Primary (Yellow)', 'amnesty'), - value: '', - }, - { - // translators: [admin] - label: __('Dark', 'amnesty'), - value: 'dark', - }, - { - // translators: [admin] - label: __('Light', 'amnesty'), - value: 'white', - }, - ]} - value={style} - onChange={this.createUpdateAttribute('style')} - /> - </PanelBody> - </InspectorControls> - - <div className={classnames('btn', { [`btn--${attributes.style}`]: style })}> - <RichText - tagName="span" - // translators: [admin] - placeholder={__('(Button Text)', 'amnesty')} - allowedFormats={[]} - value={ctaText} - onChange={this.createUpdateAttribute('ctaText')} - /> - </div> - <URLInputButton url={ctaLink} onChange={this.createUpdateAttribute('ctaLink')} /> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks-deprecated/button/index.jsx b/private/src/scripts/editor/blocks-deprecated/button/index.jsx deleted file mode 100644 index d483c1fe..00000000 --- a/private/src/scripts/editor/blocks-deprecated/button/index.jsx +++ /dev/null @@ -1,56 +0,0 @@ -import classnames from 'classnames'; -import DisplayComponent from './DisplayComponent.jsx'; - -const { assign, isEmpty } = lodash; -const { RichText } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -const blockAttributes = { - ctaLink: { - type: 'string', - }, - ctaText: { - type: 'array', - }, - style: { - type: 'string', - }, -}; - -registerBlockType('amnesty-core/block-button', { - // translators: [admin] - title: __('Button', 'amnesty'), - icon: 'megaphone', - category: 'amnesty-core', - // translators: [admin] - keywords: [__('Button', 'amnesty')], - supports: { - className: false, - multiple: true, - inserter: false, - }, - attributes: assign({}, blockAttributes, { - ctaText: { - type: 'string', - }, - }), - - edit: DisplayComponent, - - save: ({ attributes }) => { - const { style = false, ctaLink, ctaText } = attributes; - - if (isEmpty(ctaLink) || isEmpty(ctaText)) { - return null; - } - - const linkClasses = classnames('btn', { [`btn--${style}`]: style }); - - return ( - <a href={ctaLink} className={linkClasses}> - <RichText.Content tagName="span" value={ctaText} /> - </a> - ); - }, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/call-to-action/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/call-to-action/DisplayComponent.jsx deleted file mode 100644 index 9c6bf174..00000000 --- a/private/src/scripts/editor/blocks-deprecated/call-to-action/DisplayComponent.jsx +++ /dev/null @@ -1,129 +0,0 @@ -import classnames from 'classnames'; - -const { isUndefined } = lodash; -const { InnerBlocks, InspectorControls, RichText } = wp.blockEditor; -const { PanelBody, SelectControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; -const { applyFilters } = wp.hooks; - -const ALLOWED_BLOCKS = [ - 'core/buttons', - 'amnesty-core/block-button', - 'amnesty-core/block-download', - 'amnesty-core/iframe-button', -]; - -// type is undef for old versions of block -const getTemplate = (type) => { - if (isUndefined(type)) { - return [['amnesty-core/block-button']]; - } - - if (type === 'download') { - return [['amnesty-core/block-download']]; - } - - return [['core/buttons']]; -}; - -/** - * This is the component that renders the edit screen in the panel. - */ -class DisplayComponent extends Component { - /** - * Higher order component that takes the attribute key, - * this then returns a function which takes a value, - * when called it updates the attribute with the key. - * @param key - * @returns {function(*): *} - */ - - state = { - allowedInnerBlocks: applyFilters('add-modal-to-allowed-blocks', ALLOWED_BLOCKS), - }; - - createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - componentDidMount = () => { - const { attributes } = this.props; - - if (!attributes.actionType) { - const actionTypeUpdate = this.createUpdateAttribute('actionType'); - actionTypeUpdate(''); - } - }; - - render() { - const { attributes } = this.props; - - return ( - <Fragment> - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Background Style', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Light', 'amnesty'), - value: '', - }, - { - // translators: [admin] - label: __('Grey', 'amnesty'), - value: 'shade', - }, - ]} - value={attributes.background} - onChange={this.createUpdateAttribute('background')} - /> - </PanelBody> - </InspectorControls> - <div - className={classnames('callToAction', { - [`callToAction--${attributes.background}`]: attributes.background, - })} - > - <RichText - tagName="h2" - className="callToAction-preHeading" - // translators: [admin] - placeholder={__('(Pre-heading)', 'amnesty')} - allowedFormats={[]} - value={attributes.preheading} - onChange={this.createUpdateAttribute('preheading')} - /> - <RichText - tagName="h1" - className="callToAction-heading" - // translators: [admin] - placeholder={__('(Heading)', 'amnesty')} - allowedFormats={[]} - value={attributes.title} - onChange={this.createUpdateAttribute('title')} - /> - <RichText - tagName="p" - className="callToAction-content" - // translators: [admin] - placeholder={__('(Content)', 'amnesty')} - value={attributes.content} - onChange={this.createUpdateAttribute('content')} - /> - <div className="callToAction-buttonContainer"> - <InnerBlocks - templateInsertUpdatesSelection={false} - template={getTemplate(attributes.actionType)} - templateLock={false} - allowedBlocks={this.state.allowedInnerBlocks} - /> - </div> - </div> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks-deprecated/call-to-action/deprecated.jsx b/private/src/scripts/editor/blocks-deprecated/call-to-action/deprecated.jsx deleted file mode 100644 index 9f6e254c..00000000 --- a/private/src/scripts/editor/blocks-deprecated/call-to-action/deprecated.jsx +++ /dev/null @@ -1,220 +0,0 @@ -import classnames from 'classnames'; - -const { assign, isEmpty, omit } = lodash; -const { InnerBlocks, RichText } = wp.blockEditor; -const { createBlock } = wp.blocks; - -const blockAttributes = { - preheading: { - type: 'array', - }, - title: { - type: 'string', - }, - content: { - type: 'array', - }, - ctaLink: { - type: 'string', - }, - ctaText: { - type: 'array', - }, - background: { - type: 'string', - }, - style: { - type: 'string', - }, - actionType: { - type: 'string', - }, -}; - -const v4 = { - supports: { - className: false, - multiple: true, - }, - attributes: assign({}, blockAttributes, { - preheading: { - type: 'string', - }, - content: { - type: 'string', - }, - }), - save: ({ attributes }) => { - const { background = false, preheading, title, content } = attributes; - const divClasses = classnames('callToAction', { [`callToAction--${background}`]: background }); - - return ( - <div className={divClasses} role="note" aria-label={title}> - {!isEmpty(preheading) && ( - <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> - )} - {!isEmpty(title) && ( - <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> - )} - {!isEmpty(content) && ( - <RichText.Content tagName="p" className="callToAction-content" value={content} /> - )} - <div className="innerBlocksContainer"> - <InnerBlocks.Content /> - </div> - </div> - ); - }, -}; - -const v3 = { - supports: { - className: false, - multiple: true, - }, - attributes: assign({}, omit(blockAttributes, 'actionType'), { - preheading: { - type: 'string', - }, - content: { - type: 'string', - }, - ctaText: { - type: 'string', - }, - }), - save({ attributes }) { - const { background = false, preheading, title, content } = attributes; - const divClasses = classnames('callToAction', { - [`callToAction--${background}`]: background, - }); - - return ( - <div className={divClasses} role="note" aria-label={title}> - {!isEmpty(preheading) && ( - <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> - )} - {!isEmpty(title) && ( - <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> - )} - {!isEmpty(content) && ( - <RichText.Content tagName="p" className="callToAction-content" value={content} /> - )} - <InnerBlocks.Content /> - </div> - ); - }, -}; - -const v2 = { - supports: { - className: false, - multiple: true, - }, - attributes: assign({}, omit(blockAttributes, 'actionType'), { - preheading: { - type: 'string', - }, - content: { - type: 'string', - }, - ctaText: { - type: 'string', - }, - }), - migrate: (attributes) => [ - attributes, - [ - createBlock('amnesty-core/block-button', { - ctaText: attributes.ctaText, - style: attributes.style, - ctaLink: attributes.ctaLink, - }), - ], - ], - save: ({ attributes }) => { - const { - background = false, - style = false, - preheading, - title, - content, - ctaLink, - ctaText, - } = attributes; - - const divClasses = classnames('callToAction', { - [`callToAction--${background}`]: background, - }); - - const linkClasses = classnames('btn', { [`btn--${style}`]: style }); - - return ( - <div className={divClasses} role="note" aria-label={title}> - {!isEmpty(preheading) && ( - <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> - )} - {!isEmpty(title) && ( - <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> - )} - {!isEmpty(content) && ( - <RichText.Content tagName="p" className="callToAction-content" value={content} /> - )} - {!isEmpty(ctaLink) && !isEmpty(ctaText) && ( - <a href={ctaLink} className={linkClasses}> - <RichText.Content tagName="span" value={ctaText} /> - </a> - )} - </div> - ); - }, -}; - -const v1 = { - supports: { - className: false, - multiple: true, - }, - attributes: omit(blockAttributes, 'actionType'), - save: ({ attributes }) => { - const { - background = false, - style = false, - - preheading, - title, - content, - ctaLink, - ctaText, - } = attributes; - - const divClasses = classnames('callToAction', { - [`callToAction--${background}`]: background, - }); - - const linkClasses = classnames('btn', { [`btn--${style}`]: style }); - - return ( - <div className={divClasses} role="note" aria-label={title}> - {!isEmpty(preheading) && ( - <RichText.Content tagName="h2" className="callToAction-preHeading" value={preheading} /> - )} - {!isEmpty(title) && ( - <RichText.Content tagName="h1" className="callToAction-heading" value={title} /> - )} - {!isEmpty(content) && ( - <RichText.Content tagName="p" className="callToAction-content" value={content} /> - )} - {!isEmpty(ctaLink) && !isEmpty(ctaText) && ( - <a href={ctaLink} className={linkClasses}> - <RichText.Content tagName="span" value={ctaText} /> - </a> - )} - </div> - ); - }, -}; - -const deprecated = [v4, v3, v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks-deprecated/call-to-action/index.jsx b/private/src/scripts/editor/blocks-deprecated/call-to-action/index.jsx deleted file mode 100644 index fcb15caf..00000000 --- a/private/src/scripts/editor/blocks-deprecated/call-to-action/index.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import transforms from './transforms.jsx'; -import deprecated from './deprecated.jsx'; - -const { InnerBlocks } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-call-to-action', { - // translators: [admin] - title: __('Call To Action', 'amnesty'), - icon: 'megaphone', - category: 'amnesty-core', - // translators: [admin] - keywords: [__('Call To Action', 'amnesty')], - supports: { - className: false, - inserter: false, - multiple: true, - }, - attributes: { - preheading: { - type: 'string', - }, - title: { - type: 'string', - }, - content: { - type: 'string', - }, - background: { - type: 'string', - }, - actionType: { - type: 'string', - }, - }, - - transforms, - - deprecated, - - edit: DisplayComponent, - - save: () => <InnerBlocks.Content />, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/call-to-action/transforms.jsx b/private/src/scripts/editor/blocks-deprecated/call-to-action/transforms.jsx deleted file mode 100644 index bdcc237e..00000000 --- a/private/src/scripts/editor/blocks-deprecated/call-to-action/transforms.jsx +++ /dev/null @@ -1,24 +0,0 @@ -const { createBlock } = wp.blocks; - -const transforms = { - from: [ - { - type: 'block', - isMultiBlock: true, - blocks: ['core/paragraph'], - transform: (attributes) => - attributes.map(({ content }) => - createBlock('amnesty-core/block-call-to-action', { content }), - ), - }, - { - type: 'block', - isMultiBlock: false, - blocks: ['core/heading'], - transform: ({ content }) => - createBlock('amnesty-core/block-call-to-action', { title: content }), - }, - ], -}; - -export default transforms; diff --git a/private/src/scripts/editor/blocks-deprecated/collapsable/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/collapsable/DisplayComponent.jsx deleted file mode 100644 index c1e745bd..00000000 --- a/private/src/scripts/editor/blocks-deprecated/collapsable/DisplayComponent.jsx +++ /dev/null @@ -1,88 +0,0 @@ -import classnames from 'classnames'; - -const { InnerBlocks, InspectorControls, RichText, useBlockProps } = wp.blockEditor; -const { PanelBody, PanelRow, TextControl, ToggleControl } = wp.components; -const { Fragment } = wp.element; -const { applyFilters } = wp.hooks; -const { __ } = wp.i18n; - -const ALLOWED_BLOCKS = applyFilters('amnesty.blocks.collapsable.allowedBlocks', [ - 'amnesty-core/block-call-to-action', - 'amnesty-core/block-download', - 'amnesty-core/block-section', - 'amnesty-core/countdown-timer', - 'amnesty-core/counter', - 'amnesty-core/custom-card', - 'amnesty-core/embed-flourish', - 'amnesty-core/embed-infogram', - 'amnesty-core/embed-sutori', - 'amnesty-core/embed-tickcounter', - 'amnesty-core/quote', - 'amnesty-core/tweet-block', - 'core/buttons', - 'core/embed', - 'core/heading', - 'core/image', - 'core/list', - 'core/paragraph', - 'core/spacer', -]); - -const DisplayComponent = ({ attributes, className, setAttributes }) => { - const extraProps = { - className: classnames(className, { - 'is-collapsed': attributes.collapsed, - }), - }; - - const blockProps = useBlockProps(extraProps); - - return ( - <Fragment> - <InspectorControls> - {/* translators: [admin] */} - <PanelBody title={__('Settings', 'amnesty')}> - <PanelRow> - <ToggleControl - // translators: [admin] - label={__('Collapsed by default', 'amnesty')} - // translators: [admin] - help={__('Whether the block contents should be hidden by default', 'amnesty')} - checked={attributes.collapsed} - onChange={() => setAttributes({ collapsed: !attributes.collapsed })} - /> - </PanelRow> - <PanelRow> - <TextControl - label={__('HTML anchor')} - // translators: [admin] - help={__('Label this block with an HTML anchor (#example).', 'amnesty')} - value={attributes.anchor} - onChange={(anchor) => setAttributes({ anchor })} - /> - </PanelRow> - </PanelBody> - </InspectorControls> - <figure {...blockProps}> - <figcaption> - <RichText - tagName="h2" - // translators: [admin] - placeholder={__('Find out more', 'amnesty')} - value={attributes.title} - onChange={(title) => setAttributes({ title })} - /> - <span - className="dashicons dashicon dashicons-arrow-down-alt2" - onClick={() => setAttributes({ collapsed: !attributes.collapsed })} - /> - </figcaption> - <div className={`${className}-inner`}> - <InnerBlocks allowedBlocks={ALLOWED_BLOCKS} template={[['core/paragraph']]} /> - </div> - </figure> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks-deprecated/collapsable/index.jsx b/private/src/scripts/editor/blocks-deprecated/collapsable/index.jsx deleted file mode 100644 index 1e17160b..00000000 --- a/private/src/scripts/editor/blocks-deprecated/collapsable/index.jsx +++ /dev/null @@ -1,62 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { assign } = lodash; -const { InnerBlocks } = wp.blockEditor; -const { registerBlockType, createBlock } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/collapsable', { - // translators: [admin] - title: __('Collapsable', 'amnesty'), - icon: 'arrow-down-alt2', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('collapsible', 'amnesty'), - // translators: [admin] - __('accordion', 'amnesty'), - // translators: [admin] - __('drawer', 'amnesty'), - // translators: [admin] - __('open', 'amnesty'), - // translators: [admin] - __('closed', 'amnesty'), - ], - supports: { - className: true, - inserter: false, - }, - attributes: { - anchor: { - type: 'string', - default: '', - }, - collapsed: { - type: 'boolean', - default: false, - }, - title: { - type: 'string', - default: '', - }, - }, - transforms: { - to: [ - { - type: 'block', - blocks: ['core/details'], - transform: ({ collapsed, title }, innerBlocks) => - createBlock( - 'core/details', - { - showContent: !collapsed, - summary: title, - }, - innerBlocks, - ), - }, - ], - }, - edit: DisplayComponent, - save: assign(() => <InnerBlocks.Content />, { displayName: 'CollapsableBlockSave' }), -}); diff --git a/private/src/scripts/editor/blocks-deprecated/columns/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/columns/DisplayComponent.jsx deleted file mode 100644 index fa0aefe0..00000000 --- a/private/src/scripts/editor/blocks-deprecated/columns/DisplayComponent.jsx +++ /dev/null @@ -1,56 +0,0 @@ -import classNames from 'classnames'; -import layouts from './layouts'; - -const { times } = lodash; -const { InspectorControls, InnerBlocks } = wp.blockEditor; -const { PanelBody, SelectControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -class DisplayComponent extends Component { - createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - render() { - const { attributes } = this.props; - const options = Object.keys(layouts).map((key) => ({ - value: key, - label: layouts[key].name, - })); - - const layoutKey = attributes.layout || '1/2|1/2'; - - const currentTemplate = times(layouts[layoutKey].columns, () => [ - 'amnesty-core/block-row-column', - ]); - - return ( - <Fragment> - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Layout Style', 'amnesty')} - options={options} - value={attributes.layout} - onChange={this.createUpdateAttribute('layout')} - /> - </PanelBody> - </InspectorControls> - <div - className={classNames({ - row: true, - [`layout-${layoutKey}`]: true, - })} - > - <InnerBlocks - template={currentTemplate} - templateLock="all" - allowedBlocks={['amnesty-core/block-row-column']} - /> - </div> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks-deprecated/columns/index.jsx b/private/src/scripts/editor/blocks-deprecated/columns/index.jsx deleted file mode 100644 index 3927cf4a..00000000 --- a/private/src/scripts/editor/blocks-deprecated/columns/index.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import classNames from 'classnames'; - -import './row-column.jsx'; -import DisplayComponent from './DisplayComponent.jsx'; - -const { InnerBlocks } = wp.blockEditor; -const { createBlock, registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-row', { - // translators: [admin] - title: __('Columns', 'amnesty'), - icon: 'editor-insertmore', - category: 'amnesty-core', - parent: ['amnesty-core/block-section'], - keywords: [ - // translators: [admin] - __('Content', 'amnesty'), - // translators: [admin] - __('Row', 'amnesty'), - // translators: [admin] - __('Columns', 'amnesty'), - ], - attributes: { - layout: { - type: 'string', - }, - }, - supports: { - inserter: false, - }, - - edit: DisplayComponent, - - save: Object.assign( - ({ attributes }) => { - const { layout = '1/2|1/2' } = attributes; - - return ( - <div className={classNames('row', { [`layout-${layout}`]: true })}> - <InnerBlocks.Content /> - </div> - ); - }, - { displayName: 'ColumnsBlockSave' }, - ), -}); - -const findBlockType = (blocks, type) => { - let found = []; - - // eslint-disable-next-line no-restricted-syntax - for (const block of blocks) { - if (block.name === type) { - found.push(block.clientId); - } - - if (block.innerBlocks.length) { - found = [...found, ...findBlockType(block.innerBlocks, type)]; - } - } - - return found; -}; - -wp.domReady(() => { - const select = wp.data.select('core/block-editor'); - const dispatch = wp.data.dispatch('core/block-editor'); - const allBlocks = select.getBlocks(); - const columnRows = findBlockType(allBlocks, 'amnesty-core/block-row'); - - select.getBlocksByClientId(columnRows).forEach((row) => { - const rowColumns = findBlockType(row.innerBlocks, 'amnesty-core/block-row-column'); - const newColumns = select - .getBlocksByClientId(rowColumns) - .map((column) => createBlock('core/column', {}, column.innerBlocks)); - - dispatch.replaceBlocks([row.clientId], [createBlock('core/columns', {}, newColumns)]); - }); -}); diff --git a/private/src/scripts/editor/blocks-deprecated/columns/row-column.jsx b/private/src/scripts/editor/blocks-deprecated/columns/row-column.jsx deleted file mode 100644 index e85b8425..00000000 --- a/private/src/scripts/editor/blocks-deprecated/columns/row-column.jsx +++ /dev/null @@ -1,40 +0,0 @@ -/** - * WordPress - */ -const { InnerBlocks } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-row-column', { - // translators: [admin] - title: __('Row Column', 'amnesty'), - description: '', - icon: 'plus', - category: 'layout', - parent: ['amnesty-core/block-row'], - supports: { - className: false, - inserter: false, - }, - attributes: { - size: { - type: 'string', - }, - }, - - edit() { - return ( - <div className="rowColumn"> - <InnerBlocks templateLock={false} /> - </div> - ); - }, - - save() { - return ( - <div className="rowColumn"> - <InnerBlocks.Content /> - </div> - ); - }, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/custom-card/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/custom-card/DisplayComponent.jsx deleted file mode 100644 index 5a4fd22e..00000000 --- a/private/src/scripts/editor/blocks-deprecated/custom-card/DisplayComponent.jsx +++ /dev/null @@ -1,146 +0,0 @@ -import classnames from 'classnames'; - -const { InspectorControls, MediaUpload, RichText, URLInputButton } = wp.blockEditor; -const { IconButton, PanelBody, SelectControl, TextControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -export default class BlockEdit extends Component { - render() { - const { attributes, setAttributes, className } = this.props; - const { - style = 'standard', - centred = false, - content, - imageAlt, - imageID, - imageURL, - label, - link, - linkText, - largeImageURL, - } = attributes; - - const createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - classnames('callToAction', { - [`callToAction--${attributes.background}`]: attributes.background, - }); - - const classes = classnames('customCard', { - 'customCard--wide': style === 'wide', - 'is-centred': centred, - [`${className}`]: className, - }); - - const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); - - const setURL = (image) => { - if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'large')) { - return image.url; - } - - return image.sizes.large.url; - }; - - const setLargeURL = (image) => { - if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'action-wide@2x')) { - return image.url; - } - - return image.sizes['action-wide@2x'].url; - }; - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Size', 'amnesty')} - value={style} - onChange={(newStyle) => setAttributes({ style: newStyle })} - options={[ - // translators: [admin] - { value: 'standard', label: __('Standard', 'amnesty') }, - // translators: [admin] - { value: 'wide', label: __('Wide', 'amnesty') }, - ]} - /> - <TextControl - // translators: [admin] - label={__('Scroll To Link', 'amnesty')} - value={attributes.scrollLink} - onChange={createUpdateAttribute('scrollLink')} - /> - </PanelBody> - </InspectorControls> - <figure className={classes}> - <RichText - className="customCard-label" - allowedFormats={[]} - withoutInteractiveFormatting={true} - // translators: [admin] - placeholder={__('(Label)', 'amnesty')} - value={label} - onChange={(newLabel) => setAttributes({ label: newLabel })} - /> - <div className="customCard-figure"> - <div className="linkList-options"> - {imageID ? ( - <IconButton - icon="no-alt" - // translators: [admin] - label={__('Remove Image', 'amnesty')} - onClick={() => setAttributes({ imageID: 0, imageURL: '', imageAlt: '' })} - /> - ) : ( - <MediaUpload - allowedTypes={['image']} - value={imageID} - onSelect={(media) => - setAttributes({ - imageID: media.id, - imageURL: setURL(media), - largeImageURL: setLargeURL(media), - imageAlt: media.alt, - }) - } - render={({ open }) => <IconButton icon="format-image" onClick={open} />} - /> - )} - </div> - {style === 'wide' && ( - <img className="customCard-image" src={largeImageURL} alt={imageAlt} /> - )} - {style === 'standard' && ( - <img className="customCard-image" src={imageURL} alt={imageAlt} /> - )} - </div> - <figcaption className="customCard-content"> - <RichText - // translators: [admin] - placeholder={__('Content', 'amnesty')} - allowedFormats={[]} - withoutInteractiveFormatting={true} - value={content} - onChange={(newContent) => setAttributes({ content: newContent })} - /> - <div className="customCard-editorButtonWrapper"> - <RichText - className={buttonClasses} - // translators: [admin] - placeholder={__('Button Text', 'amnesty')} - allowedFormats={[]} - withoutInteractiveFormatting={true} - value={linkText} - onChange={(newLinkText) => setAttributes({ linkText: newLinkText })} - /> - <URLInputButton url={link} onChange={(newLink) => setAttributes({ link: newLink })} /> - </div> - </figcaption> - </figure> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks-deprecated/custom-card/index.jsx b/private/src/scripts/editor/blocks-deprecated/custom-card/index.jsx deleted file mode 100644 index b1f4e47d..00000000 --- a/private/src/scripts/editor/blocks-deprecated/custom-card/index.jsx +++ /dev/null @@ -1,79 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -const blockAttributes = { - style: { - type: 'string', - }, - centred: { - type: 'boolean', - }, - label: { - type: 'string', - }, - content: { - type: 'string', - }, - imageID: { - type: 'integer', - }, - imageURL: { - type: 'string', - }, - imageAlt: { - type: 'string', - }, - link: { - type: 'string', - }, - scrollLink: { - type: 'string', - }, - linkText: { - type: 'string', - }, - largeImageURL: { - type: 'string', - }, -}; - -registerBlockType('amnesty-core/custom-card', { - // translators: [admin] - title: __('Custom Card', 'amnesty'), - // translators: [admin] - description: __('Custom Card block', 'amnesty'), - icon: 'megaphone', - category: 'amnesty-core', - supports: { - align: true, - className: false, - inserter: false, - }, - attributes: blockAttributes, - styles: [ - { - name: 'style-1', - // translators: [admin] - label: __('Style 1'), - isDefault: true, - }, - { - name: 'style-2', - // translators: [admin] - label: __('Style 2'), - }, - { - name: 'style-3', - // translators: [admin] - label: __('Style 3'), - }, - ], - - deprecated, - - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/header/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/header/DisplayComponent.jsx deleted file mode 100644 index 358b5fa0..00000000 --- a/private/src/scripts/editor/blocks-deprecated/header/DisplayComponent.jsx +++ /dev/null @@ -1,314 +0,0 @@ -import classnames from 'classnames'; -import MediaMetadata from '../../components/MediaMetadata.jsx'; -import MediaMetadataVisibilityControls from '../../components/MediaMetadataVisibilityControls.jsx'; -import PostFeaturedVideo from '../../components/PostFeaturedVideo.jsx'; - -const { InnerBlocks, InspectorControls, RichText, URLInputButton } = wp.blockEditor; -const { PanelBody, SelectControl, withFilters } = wp.components; -const { compose } = wp.compose; -const { select } = wp.data; -const { PostFeaturedImage } = wp.editor; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; -const { addQueryArgs } = wp.url; - -class DisplayComponent extends Component { - state = { - imageData: null, - videoData: null, - featuredImageId: 0, - hasInnerBlock: false, - }; - - constructor(props) { - super(props); - - const { - clientId, - context: { postId, postType }, - } = this.props; - - const post = select('core').getEntityRecord('postType', postType, postId); - const blocks = select('core/block-editor').getBlocks(clientId); - - if (post?.featured_media) { - this.state.featuredImageId = post.featured_media; - } - - if (blocks?.length > 0) { - this.state.hasInnerBlock = true; - } - } - - fetchMediaMetadata = (id, type) => { - const key = `${type}Data`; - const cached = this.state[key]?.id; - - if (id === 0) { - if (cached) { - this.setState({ [key]: null }); - } - return; - } - - if (cached && cached === id) { - return; - } - - const path = addQueryArgs(`/wp/v2/media/${id}`, { - context: 'edit', - _fields: 'id,source_url,caption,description', - }); - - wp.apiRequest({ path }).then((resp) => { - this.setState({ - [key]: { - id: resp.id, - url: resp.source_url, - caption: resp.caption.raw, - description: resp.description.raw, - }, - }); - }); - }; - - componentDidMount() { - const { featuredImageId } = this.state; - const { type, featuredVideoId } = this.props.attributes; - - if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { - this.fetchMediaMetadata(featuredVideoId, 'video'); - } - - if (type !== 'video' && featuredImageId && this.state.imageData?.id !== featuredImageId) { - this.fetchMediaMetadata(featuredImageId, 'image'); - } - } - - componentDidUpdate(prevProps) { - const { featuredImageId } = this.state; - const { type, featuredVideoId } = this.props.attributes; - - if (type === 'video' && !this.state.videoData?.url && featuredVideoId) { - this.fetchMediaMetadata(featuredVideoId, 'video'); - } - - if ( - type !== 'video' && - (featuredImageId !== prevProps.featuredImageId || - this.state.imageData?.id !== featuredImageId) - ) { - this.fetchMediaMetadata(featuredImageId, 'image'); - } - } - - /** - * Higher order component that takes the attribute key, - * this then returns a function which takes a value, - * when called it updates the attribute with the key. - * @param key - * @returns {function(*): *} - */ - createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - render() { - const { attributes = {}, setAttributes } = this.props; - - let { type } = attributes; - if (!type) { - type = 'image'; - } - - const classes = classnames('page-hero', { - 'page-heroSize--full': attributes.size === 'large', - 'page-heroBackground--transparent': !attributes.background, - 'page-heroAlignment--left': !attributes.alignment, - [`page-heroSize--${attributes.size}`]: attributes.size, - [`page-heroBackground--${attributes.background || 'dark'}`]: attributes.background || true, - [`page-heroAlignment--${attributes.alignment}`]: attributes.alignment || false, - 'page-hero--video': type === 'video', - }); - - const contentClasses = classnames('hero-content', { - 'has-donation-block': this.state.hasInnerBlock, - }); - - const sectionStyles = {}; - if (type === 'image' && this.state.imageData?.url) { - sectionStyles.backgroundImage = `url("${this.state.imageData.url}")`; - } - - const caption = this.state[`${type}Data`]?.caption; - const copyright = this.state[`${type}Data`]?.description; - - return ( - <Fragment> - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Alignment', 'amnesty')} - options={[ - { - /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ - label: __('Left', 'amnesty'), - value: 'left', - }, - { - // translators: [admin] text alignment. - label: __('Centre', 'amnesty'), - value: 'center', - }, - { - /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ - label: __('Right', 'amnesty'), - value: 'right', - }, - ]} - value={attributes.alignment} - onChange={this.createUpdateAttribute('alignment')} - /> - <SelectControl - // translators: [admin] - label={__('Background Colour', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('White', 'amnesty'), - value: 'light', - }, - { - // translators: [admin] - label: __('Black', 'amnesty'), - value: 'dark', - }, - ]} - value={attributes.background || 'dark'} - onChange={this.createUpdateAttribute('background')} - /> - <SelectControl - // translators: [admin] - label={__('Size', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Normal', 'amnesty'), - value: 'small', - }, - { - // translators: [admin] - label: __('Large', 'amnesty'), - value: 'large', - }, - ]} - value={attributes.size} - onChange={this.createUpdateAttribute('size')} - /> - - <SelectControl - // translators: [admin] - label={__('Background Type', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Image', 'amnesty'), - value: '', - }, - { - // translators: [admin] - label: __('Video', 'amnesty'), - value: 'video', - }, - ]} - value={attributes.type} - onChange={this.createUpdateAttribute('type')} - /> - <MediaMetadataVisibilityControls - type={attributes.type} - hideCaption={attributes.hideImageCaption} - hideCopyright={attributes.hideImageCopyright} - setAttributes={setAttributes} - /> - </PanelBody> - <PanelBody - title={ - attributes.type === 'video' - ? // translators: [admin] - __('Background Image', 'amnesty') - : // translators: [admin] - __('Featured Image', 'amnesty') - } - > - <PostFeaturedImage /> - </PanelBody> - {attributes.type === 'video' && ( - <PanelBody title={/* translators: [admin] */ __('Featured Video', 'amnesty')}> - <PostFeaturedVideo - featuredVideoId={attributes.featuredVideoId} - onUpdate={this.createUpdateAttribute('featuredVideoId')} - /> - </PanelBody> - )} - </InspectorControls> - <section className={classes} style={sectionStyles}> - {this.state.videoData?.url && ( - <div className="page-heroVideoContainer"> - <video className="page-heroVideo"> - <source src={this.state.videoData.url} /> - </video> - </div> - )} - <div className="container"> - <div className={contentClasses}> - <h1> - <RichText - tagName="span" - className="page-heroTitle" - value={attributes.title} - // translators: [admin] - placeholder={__('(Header Title)', 'amnesty')} - format="string" - onChange={this.createUpdateAttribute('title')} - /> - </h1> - <RichText - tagName="p" - className="page-heroContent" - value={attributes.content} - // translators: [admin] - placeholder={__('(Header Content)', 'amnesty')} - format="string" - onChange={this.createUpdateAttribute('content')} - /> - <div className="page-heroCta"> - <div className="btn btn--large"> - {attributes.embed && <i className="play-icon"></i>} - <RichText - tagName="span" - value={attributes.ctaText} - // translators: [admin] - placeholder={__('(Call to action)', 'amnesty')} - format="string" - onChange={this.createUpdateAttribute('ctaText')} - /> - <URLInputButton - url={attributes.ctaLink} - onChange={this.createUpdateAttribute('ctaLink')} - /> - </div> - </div> - </div> - <InnerBlocks allowedBlocks={['amnesty-wc/donation']} orientation="horizontal" /> - </div> - <MediaMetadata - media={{ caption, copyright }} - showMediaCaption={!attributes.hideImageCaption} - showMediaCopyright={!attributes.hideImageCopyright} - /> - </section> - </Fragment> - ); - } -} - -export default compose(withFilters('editor.PostFeaturedImage'))(DisplayComponent); diff --git a/private/src/scripts/editor/blocks-deprecated/header/index.jsx b/private/src/scripts/editor/blocks-deprecated/header/index.jsx deleted file mode 100644 index dccea12f..00000000 --- a/private/src/scripts/editor/blocks-deprecated/header/index.jsx +++ /dev/null @@ -1,119 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { createBlock, registerBlockType } = wp.blocks; -const { InnerBlocks } = wp.blockEditor; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-hero', { - // translators: [admin] - title: __('Header', 'amnesty'), - icon: 'format-image', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Header', 'amnesty'), - ], - supports: { - multiple: false, - inserter: false, - }, - attributes: { - title: { - type: 'string', - source: 'meta', - meta: '_hero_title', - }, - content: { - type: 'string', - source: 'meta', - meta: '_hero_content', - }, - ctaLink: { - type: 'string', - source: 'meta', - meta: '_hero_cta_link', - }, - ctaText: { - type: 'string', - source: 'meta', - meta: '_hero_cta_text', - }, - alignment: { - type: 'string', - source: 'meta', - meta: '_hero_alignment', - }, - background: { - type: 'string', - source: 'meta', - meta: '_hero_background', - default: 'dark', - }, - hideImageCaption: { - type: 'boolean', - source: 'meta', - meta: '_hero_hide_image_caption', - default: true, - }, - hideImageCopyright: { - type: 'boolean', - source: 'meta', - meta: '_hero_hide_image_copyright', - default: false, - }, - size: { - type: 'string', - source: 'meta', - meta: '_hero_size', - default: 'small', - }, - type: { - type: 'string', - source: 'meta', - meta: '_hero_type', - }, - embed: { - type: 'string', - source: 'meta', - meta: '_hero_embed', - }, - featuredVideoId: { - type: 'string', - source: 'meta', - meta: '_hero_video_id', - }, - }, - - usesContext: ['postId', 'postType'], - - transforms: { - from: [ - { - type: 'block', - isMultiBlock: false, - blocks: ['amnesty-core/header'], - transform: (attributes) => createBlock('amnesty-core/block-hero', attributes), - }, - ], - to: [ - { - type: 'block', - isMultiBlock: false, - blocks: ['amnesty-core/header'], - transform: (attributes) => createBlock('amnesty-core/header', attributes), - }, - { - type: 'block', - isMultiBlock: true, - blocks: ['amnesty-core/hero'], - transform: (attributes) => createBlock('amnesty-core/hero', attributes), - }, - ], - }, - - edit: DisplayComponent, - - save() { - return <InnerBlocks.Content />; - }, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/image/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/image/DisplayComponent.jsx deleted file mode 100644 index 5b65b589..00000000 --- a/private/src/scripts/editor/blocks-deprecated/image/DisplayComponent.jsx +++ /dev/null @@ -1,446 +0,0 @@ -import classnames from 'classnames'; - -const { React } = window; -const { InspectorControls, MediaUpload, PlainText, RichText, URLInputButton } = wp.blockEditor; -const { Button, IconButton, PanelBody, SelectControl, ToggleControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -const getClosestSize = (media) => { - const sizeList = media.sizes || media.media_details.sizes; - const sizes = {}; - - Object.keys(sizeList).forEach((size) => { - sizes[size] = sizeList[size].height; - }); - - let closest = 'full'; - - Object.keys(sizes).forEach((size) => { - if (Math.abs(600 - sizes[size]) < Math.abs(600 - sizes[closest])) { - closest = size; - } - }); - - return closest; -}; - -export default class DisplayComponent extends Component { - state = { - image: {}, - video: {}, - }; - - componentDidMount() { - const { attributes } = this.props; - const { type, imageID = 0, videoID = 0 } = attributes; - - let mediaID = imageID; - let key = 'image'; - - if (type === 'video') { - mediaID = videoID; - key = 'video'; - } - - wp.apiRequest({ path: `/wp/v2/media/${mediaID}` }).then((response) => - this.setState({ [key]: response }), - ); - } - - updateImage(media, style = 'loose') { - let size = 'full'; - if (style === 'fixed') { - size = getClosestSize(media); - } - - const sizeList = media.sizes || media.media_details.sizes; - const url = sizeList[size].url || sizeList[size].source_url; - - this.setState({ image: media }); - this.props.setAttributes({ imageID: media.id, imageURL: url }); - } - - removeImage = () => { - this.setState({ image: {} }); - this.props.setAttributes({ imageID: 0, imageURL: '' }); - }; - - updateVideo = (media) => { - this.removeVideo(); - - this.setState({ video: media }); - this.props.setAttributes({ videoID: media.id, videoURL: media.source_url || media.url }); - }; - - removeVideo = () => { - this.setState({ video: {} }); - this.props.setAttributes({ videoID: 0, videoURL: '' }); - }; - - updateStyle = (style) => { - this.props.setAttributes({ style }); - - if (this.state.image) { - this.updateImage(this.state.image, style); - } - }; - - updateButtonAttribute(index, attribute, value) { - const { attributes, setAttributes } = this.props; - const { buttons } = attributes; - - return setAttributes({ - buttons: [ - // old buttons up to current index - ...buttons.slice(0, Math.max(0, index)), - // current button - { - ...buttons[index], - [attribute]: value, - }, - // old buttons after current index - ...buttons.slice(index + 1, buttons.length), - ], - }); - } - - createButton(index = -1) { - const { attributes } = this.props; - const { buttons } = attributes; - - if (!buttons[index]) { - buttons[index] = { - text: '', - url: '', - }; - } - - return ( - <div style={{ position: 'relative' }} key={index}> - <div className="imageBlock-buttonWrapper"> - <PlainText - className="btn btn--white" - rows="1" - // translators: [admin] - placeholder={__('(Link Text)', 'amnesty')} - value={buttons[index].text} - onChange={(text) => this.updateButtonAttribute(index, 'text', text)} - /> - </div> - <div className="linkList-options"> - {buttons.length > 1 && ( - <IconButton - icon="no-alt" - // translators: [admin] - label={__('Remove Button', 'amnesty')} - onClick={() => this.removeButton(index)} - /> - )} - <URLInputButton - url={buttons[index].url} - onChange={(url) => this.updateButtonAttribute(index, 'url', url)} - /> - </div> - </div> - ); - } - - removeButton(index) { - const { attributes, setAttributes } = this.props; - const { buttons } = attributes; - - const newButtons = [ - ...buttons.slice(0, Math.max(0, index)), - ...buttons.slice(index + 1, buttons.length), - ]; - - setAttributes({ buttons: newButtons }); - } - - imagePanelControls() { - const { attributes, setAttributes } = this.props; - const { type = '', parallax = false, align = 'default', style = 'loose' } = attributes; - - if (parallax || type === 'video') { - return ''; - } - - return ( - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Image Style', 'amnesty')} - value={style} - onChange={(newStyle) => this.updateStyle(newStyle)} - options={[ - // translators: [admin] - { value: 'fixed', label: __('Fixed Height (600px)', 'amnesty') }, - // translators: [admin] - { value: 'loose', label: __('Actual Height', 'amnesty') }, - ]} - /> - <SelectControl - // translators: [admin] - label={__('Alignment', 'amnesty')} - // translators: [admin] - help={__('Only has an effect on images smaller than their container', 'amnesty')} - value={align} - onChange={(newAlign) => setAttributes({ align: newAlign })} - options={[ - /* translators: [admin] text alignment/. */ - { value: 'default', label: __('Default', 'amnesty') }, - /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ - { value: 'left', label: __('Left', 'amnesty') }, - /* translators: [admin] text alignment. */ - { value: 'centre', label: __('Centre', 'amnesty') }, - /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ - { value: 'right', label: __('Right', 'amnesty') }, - ]} - /> - </PanelBody> - ); - } - - imageInlineControls() { - const { type = '', imageID = 0 } = this.props.attributes; - - if (type === 'video') { - return ''; - } - - return ( - <div className="linkList-options imageBlock-action"> - {imageID ? ( - <IconButton - icon="no-alt" - // translators: [admin] - label={__('Remove Image', 'amnesty')} - onClick={this.removeImage} - /> - ) : ( - <MediaUpload - allowedTypes={['image']} - value={imageID} - onSelect={(media) => { - /** - * MediaUpload component doesn't return full sizes array, so we need to - * grab it from the API again. Inefficient, but it's a Gutenberg core issue - * that was supposedly resolved in https://github.com/WordPress/gutenberg/pull/7605, - * but either wasn't, or was subject to a regression failure. - */ - wp.apiRequest({ path: `/wp/v2/media/${media.id}` }).then((response) => { - this.updateImage({ - id: response.id, - sizes: response.media_details.sizes, - }); - }); - }} - render={({ open }) => <IconButton icon="format-image" onClick={open} />} - /> - )} - </div> - ); - } - - overlayInputFields() { - const { attributes, setAttributes } = this.props; - const { hasOverlay = false, title = '', content = '', buttons = [] } = attributes; - - if (!hasOverlay) { - return ''; - } - - return ( - <div className="imageBlock-overlay"> - <RichText - className="imageBlock-title" - rows="1" - // translators: [admin] - placeholder={__('(Title)', 'amnesty')} - value={title} - onChange={(newTitle) => setAttributes({ title: newTitle })} - /> - <RichText - className="imageBlock-content" - // translators: [admin] - placeholder={__('(Content)', 'amnesty')} - value={content} - format="string" - onChange={(newContent) => setAttributes({ content: newContent })} - /> - <div className="imageBlock-buttonsContainer"> - {buttons.map((button, index) => this.createButton(index, button))} - {buttons.length < 1 && this.createButton(0)} - <IconButton - icon="plus" - // translators: [admin] - label={__('Add Button', 'amnesty')} - onClick={() => setAttributes({ buttons: [...buttons, { text: '', url: '' }] })} - /> - </div> - </div> - ); - } - - videoPanelControls() { - const { attributes } = this.props; - const { videoURL = '', type = '' } = attributes; - - if (type !== 'video') { - return ''; - } - - if (!videoURL) { - return ( - <PanelBody> - <MediaUpload - title={__('Choose Video', 'amnesty')} - onSelect={(media) => this.updateVideo(media)} - allowedTypes={['video']} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <Button className="editor-post-featured-image__toggle" onClick={open}> - {/* translators: [admin] */ __('Choose Video', 'amnesty')} - </Button> - )} - /> - </PanelBody> - ); - } - - return ( - <PanelBody> - <MediaUpload - // translators: [admin] - title={__('Replace Video', 'amnesty')} - onSelect={(media) => this.updateVideo(media)} - allowedTypes={['video']} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <div> - <video> - <source src={videoURL} /> - </video> - <Button onClick={open} isSecondary isLarge> - {/* translators: [admin] */ __('Replace Video', 'amnesty')} - </Button> - </div> - )} - /> - <Button onClick={this.removeVideo} isLink isDestructive> - {/* translators: [admin] */ __('Remove Video', 'amnesty')} - </Button> - </PanelBody> - ); - } - - backgroundMediaFields() { - const { type = '', imageURL = '', videoURL = '' } = this.props.attributes; - - if (!type && imageURL) { - return <img className="imageBlock-image" src={imageURL} />; - } - - if (videoURL && (this.state.video.source_url || this.state.video.url)) { - return ( - <video className="imageBlock-video"> - <source src={videoURL} /> - </video> - ); - } - - return ''; - } - - render() { - const { attributes, setAttributes } = this.props; - const { - type = '', - style = 'loose', - parallax = false, - align = 'default', - hasOverlay = false, - caption, - } = attributes; - - const classes = classnames('imageBlock', { - 'imageBlock--fixed': style === 'fixed', - 'has-video': type === 'video', - 'has-parallax': parallax, - [`align${align}`]: align !== 'default', - }); - - const capClasses = classnames('imageBlock-caption', { - [`align${align}`]: align !== 'default', - }); - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Background Type', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Image', 'amnesty'), - value: '', - }, - { - // translators: [admin] - label: __('Video', 'amnesty'), - value: 'video', - }, - ]} - value={type} - onChange={(newType) => setAttributes({ type: newType })} - /> - </PanelBody> - - {this.imagePanelControls()} - - <PanelBody> - <ToggleControl - // translators: [admin] - label={__('Display Overlay', 'amnesty')} - checked={hasOverlay} - onChange={(newHasOverlay) => setAttributes({ hasOverlay: newHasOverlay })} - /> - <ToggleControl - // translators: [admin] - label={__('Enable Parallax', 'amnesty')} - checked={parallax} - onChange={(newParallax) => - setAttributes({ - parallax: newParallax, - style: newParallax ? 'loose' : style, - }) - } - /> - </PanelBody> - - {this.videoPanelControls()} - </InspectorControls> - - <div className={classes}> - {this.backgroundMediaFields()} - {this.overlayInputFields()} - </div> - - <RichText - className={capClasses} - rows="1" - // translators: [admin] - placeholder={__('(Insert Caption, if required)', 'amnesty')} - value={caption} - onChange={(newCaption) => setAttributes({ caption: newCaption })} - /> - - {this.imageInlineControls()} - <div className="clear"></div> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks-deprecated/image/deprecated.jsx b/private/src/scripts/editor/blocks-deprecated/image/deprecated.jsx deleted file mode 100644 index b042f1aa..00000000 --- a/private/src/scripts/editor/blocks-deprecated/image/deprecated.jsx +++ /dev/null @@ -1,302 +0,0 @@ -import classnames from 'classnames'; -import { uniqueId } from './utils'; - -const { RichText } = wp.blockEditor; -const { Fragment } = wp.element; - -const blockAttributes = { - type: { - type: 'string', - }, - style: { - type: 'string', - }, - align: { - type: 'string', - }, - hasOverlay: { - type: 'boolean', - }, - parallax: { - type: 'boolean', - }, - identifier: { - type: 'string', - source: 'attribute', - selector: '.imageBlock', - attribute: 'class', - }, - - imageID: { - type: 'integer', - }, - imageURL: { - type: 'string', - }, - - videoID: { - type: 'integer', - }, - videoURL: { - type: 'string', - }, - - title: { - type: 'string', - }, - content: { - type: 'string', - }, - buttons: { - type: 'array', - default: [], - }, - caption: { - type: 'string', - }, -}; - -const v2 = { - attributes: blockAttributes, - save({ attributes }) { - const { - type = '', - style = 'loose', - hasOverlay = false, - parallax = false, - align = 'default', - - imageURL = '', - videoURL = '', - - title, - content, - caption, - buttons = [], - } = attributes; - - let identifier; - if (attributes.identifier) { - // pull existing id from outer div instead of generating it. - identifier = attributes.identifier - .replace(/imageBlock\s+imageBlock-([0-9a-zA-Z]*?)\s+(?:has-parallax)?/, '$1') - .trim(); - } - - if (!identifier) { - identifier = uniqueId(); - } - - const classes = classnames('imageBlock', { - [`imageBlock-${identifier}`]: parallax, - 'imageBlock--fixed': style === 'fixed', - 'has-video': type === 'video', - 'has-parallax': parallax, - }); - - const capClasses = classnames('imageBlock-caption', { - [`align${align}`]: align !== 'default', - }); - - if (parallax) { - const css = `.imageBlock-${identifier} .imageBlock-overlay{background-image: url('${encodeURI( - imageURL, - )}')}`; - - return ( - <Fragment> - <div className={classes}> - <style>{css}</style> - {hasOverlay ? ( - <div className="imageBlock-overlay"> - <div className="imageBlock-title">{title}</div> - <div className="imageBlock-content"> - <RichText.Content tagName="p" value={content} /> - </div> - <div className="imageBlock-buttonWrapper"> - {buttons.map((button) => ( - <a key={button.url} className="btn btn--white" href={button.url}> - {button.text} - </a> - ))} - </div> - </div> - ) : ( - <div className="imageBlock-overlay"></div> - )} - </div> - {caption && <div className={capClasses}>{caption}</div>} - </Fragment> - ); - } - - const block = ( - <Fragment> - <div className={classes}> - {!type && <img className="imageBlock-image" src={encodeURI(imageURL)} />} - {type === 'video' && ( - <video className="imageBlock-video" autoPlay loop muted> - <source src={encodeURI(videoURL)} /> - </video> - )} - {hasOverlay && ( - <div className="imageBlock-overlay"> - <div className="imageBlock-title">{title}</div> - <div className="imageBlock-content"> - <RichText.Content tagName="p" value={content} /> - </div> - <div className="imageBlock-buttonWrapper"> - {buttons.map((button) => ( - <a key={encodeURI(button.url)} className="btn btn--white" href={button.url}> - {button.text} - </a> - ))} - </div> - </div> - )} - </div> - {caption && <div className={capClasses}>{caption}</div>} - </Fragment> - ); - - if (align === 'default') { - return block; - } - - const wrapperClasses = classnames('imageBlock-wrapper', 'u-cf', { - [`align${align}`]: align !== 'default', - }); - - return <div className={wrapperClasses}>{block}</div>; - }, -}; - -const v1 = { - supports: { - className: false, - }, - attributes: blockAttributes, - save({ attributes }) { - const { - type = '', - style = 'loose', - hasOverlay = false, - parallax = false, - align = 'default', - - imageURL = '', - videoURL = '', - - title, - content, - caption, - buttons = [], - } = attributes; - - let identifier; - if (attributes.identifier) { - // pull existing id from outer div instead of generating it. - identifier = attributes.identifier - .replace(/imageBlock\s+imageBlock-([0-9a-zA-Z]*?)\s+(?:has-parallax)?/, '$1') - .trim(); - } - - if (!identifier) { - identifier = uniqueId(); - } - - const classes = classnames('imageBlock', { - [`imageBlock-${identifier}`]: parallax, - 'imageBlock--fixed': style === 'fixed', - 'has-video': type === 'video', - 'has-parallax': parallax, - }); - - const capClasses = classnames('imageBlock-caption', { - [`align${align}`]: align !== 'default', - }); - - if (parallax) { - const css = `.imageBlock-${identifier} .imageBlock-overlay{background-image: url('${encodeURI( - imageURL, - )}')}`; - - return ( - <Fragment> - <div className={classes}> - <style>{css}</style> - {hasOverlay ? ( - <div className="imageBlock-overlay"> - <div className="imageBlock-title">{title}</div> - <div className="imageBlock-content"> - <RichText.Content tagName="p" value={content} /> - </div> - <div className="imageBlock-buttonWrapper"> - {buttons.map((button) => ( - <a - key={encodeURI(button.url)} - className="btn btn--white btn--ghost" - href={button.url} - > - {button.text} - </a> - ))} - </div> - </div> - ) : ( - <div className="imageBlock-overlay"></div> - )} - </div> - {caption && <div className={capClasses}>{caption}</div>} - </Fragment> - ); - } - - const block = ( - <Fragment> - <div className={classes}> - {!type && <img className="imageBlock-image" src={encodeURI(imageURL)} />} - {type === 'video' && ( - <video className="imageBlock-video" autoPlay loop muted> - <source src={encodeURI(videoURL)} /> - </video> - )} - {hasOverlay && ( - <div className="imageBlock-overlay"> - <div className="imageBlock-title">{title}</div> - <div className="imageBlock-content"> - <RichText.Content tagName="p" value={content} /> - </div> - <div className="imageBlock-buttonWrapper"> - {buttons.map((button) => ( - <a - key={encodeURI(button.url)} - className="btn btn--white btn--ghost" - href={button.url} - > - {button.text} - </a> - ))} - </div> - </div> - )} - </div> - {caption && <div className={capClasses}>{caption}</div>} - </Fragment> - ); - - if (align === 'default') { - return block; - } - - const wrapperClasses = classnames('imageBlock-wrapper', 'u-cf', { - [`align${align}`]: align !== 'default', - }); - - return <div className={wrapperClasses}>{block}</div>; - }, -}; - -const deprecated = [v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks-deprecated/image/index.jsx b/private/src/scripts/editor/blocks-deprecated/image/index.jsx deleted file mode 100644 index c3416db6..00000000 --- a/private/src/scripts/editor/blocks-deprecated/image/index.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -const blockAttributes = { - type: { - type: 'string', - }, - style: { - type: 'string', - }, - align: { - type: 'string', - }, - hasOverlay: { - type: 'boolean', - }, - parallax: { - type: 'boolean', - }, - identifier: { - type: 'string', - source: 'attribute', - selector: '.imageBlock', - attribute: 'class', - }, - - imageID: { - type: 'integer', - }, - imageURL: { - type: 'string', - }, - - videoID: { - type: 'integer', - }, - videoURL: { - type: 'string', - }, - - title: { - type: 'string', - }, - content: { - type: 'string', - }, - buttons: { - type: 'array', - default: [], - }, - caption: { - type: 'string', - }, -}; - -registerBlockType('amnesty-core/image-block', { - // translators: [admin] - title: __('Image Block', 'amnesty'), - // translators: [admin] - description: __('Add a flexible image block with optional overlay', 'amnesty'), - icon: 'format-image', - category: 'amnesty-core', - supports: { - className: false, - inserter: false, - }, - attributes: blockAttributes, - - deprecated, - - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks-deprecated/links-with-icons/DisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/links-with-icons/DisplayComponent.jsx deleted file mode 100644 index e1a11b06..00000000 --- a/private/src/scripts/editor/blocks-deprecated/links-with-icons/DisplayComponent.jsx +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Third-party - */ -import classnames from 'classnames'; -import memoize from 'memize'; - -/** - * WordPress - */ -const { times } = lodash; -const { InnerBlocks, InspectorControls } = wp.blockEditor; -const { PanelBody, RangeControl, SelectControl, ToggleControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -/** - * Module-specific - */ -// blocks allowed to be contained within the repeatable block -const ALLOWED_BLOCKS = ['amnesty-core/links-with-icons']; -// Returns the layouts configuration for a given number of repeats. -const getLayoutTemplate = memoize((blocks) => times(blocks, () => ALLOWED_BLOCKS)); -export default class DisplayComponent extends Component { - render = () => { - const { attributes, setAttributes } = this.props; - - const buttonIconOptions = [ - { - // translators: [admin] - label: __('None', 'amnesty'), - value: 'none', - }, - { - // translators: [admin] - label: __('Arrow', 'amnesty'), - value: 'arrow', - }, - { - // translators: [admin] - label: __('Ampersand', 'amnesty'), - value: 'ampersand', - }, - ]; - - const { - backgroundColor, - className, - hideLines, - orientation = 'horizontal', - quantity, - dividerIcon = 'none', - style, - } = attributes; - - const classes = classnames( - 'linksWithIcons-group', - `is-${orientation}`, - `has-${quantity}-items`, - { - [className]: !!className, - 'has-background': !!backgroundColor, - 'has-no-lines': !!hideLines, - [`has-${backgroundColor}-background-color`]: !!backgroundColor, - [`icon-${dividerIcon}`]: !!dividerIcon, - }, - ); - - if (style === 'square' && orientation !== 'horizontal') { - setAttributes({ orientation: 'horizontal' }); - } - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <RangeControl - // translators: [admin] - label={__('Quantity', 'amnesty')} - value={quantity} - onChange={(newQuantity) => setAttributes({ quantity: newQuantity })} - min={1} - max={24} - /> - {style !== 'square' && ( - <SelectControl - // translators: [admin] - label={__('Orientation', 'amnesty')} - value={orientation} - onChange={(newOrientation) => setAttributes({ orientation: newOrientation })} - options={[ - // translators: [admin] - { value: 'horizontal', label: __('Horizontal', 'amnesty') }, - // translators: [admin] - { value: 'vertical', label: __('Vertical', 'amnesty') }, - ]} - /> - )} - <SelectControl - // translators: [admin] - label={__('Background Colour', 'amnesty')} - value={backgroundColor} - onChange={(newBgColor) => setAttributes({ backgroundColor: newBgColor })} - options={[ - // translators: [admin] - { value: '', label: __('None', 'amnesty') }, - // translators: [admin] - { value: 'very-light-gray', label: __('Grey', 'amnesty') }, - ]} - /> - {style !== 'square' && ( - <ToggleControl - // translators: [admin] - label={__('Hide Lines', 'amnesty')} - checked={hideLines} - onChange={(newHideLines) => setAttributes({ hideLines: newHideLines })} - /> - )} - <SelectControl - className="radio-control-icons" - // translators: [admin] - label={__('Divider Style', 'amnesty')} - value={attributes.dividerIcon} - onChange={(value) => { - setAttributes({ dividerIcon: value }); - }} - options={buttonIconOptions} - /> - </PanelBody> - </InspectorControls> - <div className={classes}> - <InnerBlocks - template={getLayoutTemplate(quantity)} - templateLock="all" - allowedBlocks={ALLOWED_BLOCKS} - /> - </div> - </Fragment> - ); - }; -} diff --git a/private/src/scripts/editor/blocks-deprecated/links-with-icons/InnerDisplayComponent.jsx b/private/src/scripts/editor/blocks-deprecated/links-with-icons/InnerDisplayComponent.jsx deleted file mode 100644 index 25c9ae29..00000000 --- a/private/src/scripts/editor/blocks-deprecated/links-with-icons/InnerDisplayComponent.jsx +++ /dev/null @@ -1,358 +0,0 @@ -/** - * Third-party - */ -import classnames from 'classnames'; - -/** - * WordPress - */ -const { pick } = lodash; -const { React } = window; -const { InspectorControls, MediaUpload, RichText, URLInputButton } = wp.blockEditor; -const { Button, CheckboxControl, PanelBody, SelectControl, RangeControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; -export default class BlockEdit extends Component { - constructor(...params) { - super(...params); - - this.bigTextRef = React.createRef(); - } - - componentDidMount() { - const { attributes, setAttributes } = this.props; - const { style } = attributes; - - if (style === 'square') { - setAttributes({ - buttonText: document.body.classList.contains('rtl') ? '&larr;' : '&rarr;', - iconSize: 'xsmall', - imageLocation: 'top', - }); - } - - if (style === 'default' || style === '') { - setAttributes({ - style: 'icon', - }); - } - } - - componentDidUpdate() { - if (['', 'default'].indexOf(this.props.attributes.style) !== -1) { - this.props.setAttributes({ style: 'icon' }); - } - } - - getImageButton = (openEvent) => { - const { attributes } = this.props; - const { imageID, imageData, iconSize = 'medium' } = attributes; - - if (imageID && imageData) { - const imgClasses = classnames('linksWithIcons-imageWrapper', { - [`is-${iconSize}`]: iconSize !== 'medium', - }); - - let src = imageData?.full?.url; - if (Object.prototype.hasOwnProperty.call(imageData, 'lwi-block-sm')) { - src = imageData['lwi-block-sm'].url; - } - - return ( - <div className={imgClasses}> - <img className="linksWithIcons-image" src={src} onClick={openEvent} /> - </div> - ); - } - - return ( - <div className="linksWithIcons-uploadContainer"> - <Button className="button button-large" onClick={openEvent}> - {/* translators: [admin] */ __('Pick an image', 'amnesty')} - </Button> - </div> - ); - }; - - getOptionalField = () => { - const { attributes, setAttributes } = this.props; - const { style = 'icon', underlined = false, imageID, bigtext, bigTextCss } = attributes; - - if (style === 'text') { - const txtClasses = classnames('linksWithIcons-bigtext', { - 'has-underline': underlined, - }); - - return ( - <RichText - className={txtClasses} - // translators: [admin] - placeholder={__('(Insert Fact)', 'amnesty')} - value={bigtext} - allowedFormats={[]} - onChange={(newBigtext) => setAttributes({ bigtext: newBigtext })} - style={bigTextCss} - ref={this.bigTextRef} - /> - ); - } - - if (style !== 'none') { - return ( - <MediaUpload - className="linksWithIcons-upload" - allowedTypes={['image']} - value={imageID} - render={({ open }) => this.getImageButton(open)} - onSelect={(media) => - setAttributes({ - imageID: media.id, - imageAlt: media.alt, - imageData: pick(media.sizes, [ - 'full', - 'lwi-block-sm', - 'lwi-block-md', - 'lwi-block-lg', - 'lwi-block-sm@2x', - 'lwi-block-md@2x', - 'lwi-block-lg@2x', - 'logomark', - ]), - }) - } - /> - ); - } - - return null; - }; - - renderControls() { - const { attributes, setAttributes } = this.props; - const { - buttonStyle = 'white', - hasButton = true, - iconSize = 'medium', - imageLocation = '', - style = 'icon', - uncredited = false, - underlined = false, - bigTextCss, - } = attributes; - - let factFontSize = bigTextCss.fontSize; - if (typeof factFontSize === 'string') { - factFontSize = parseInt(bigTextCss.fontSize, 10); - } - - return ( - <InspectorControls> - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Style', 'amnesty')} - value={style} - onChange={(newStyle) => setAttributes({ style: newStyle })} - options={[ - // translators: [admin] - { value: 'icon', label: __('Use Image', 'amnesty') }, - // translators: [admin] - { value: 'text', label: __('Use Text', 'amnesty') }, - // translators: [admin] - { value: 'none', label: __('Plain', 'amnesty') }, - ]} - /> - {['icon', 'square'].includes(style) && ( - <SelectControl - // translators: [admin] - label={__('Icon Size', 'amnesty')} - value={iconSize} - onChange={(newSize) => setAttributes({ iconSize: newSize })} - options={[ - // translators: [admin] - { value: 'xsmall', label: __('Extra Small', 'amnesty') }, - // translators: [admin] - { value: 'small', label: __('Small', 'amnesty') }, - // translators: [admin] - { value: 'medium', label: __('Medium', 'amnesty') }, - // translators: [admin] - { value: 'large', label: __('Large', 'amnesty') }, - ]} - /> - )} - {['icon', 'square'].includes(style) && ( - <SelectControl - // translators: [admin] - label={__('Icon Position', 'amnesty')} - value={imageLocation} - onChange={(newImageLocation) => setAttributes({ imageLocation: newImageLocation })} - options={[ - // translators: [admin] - { value: '', label: __('Middle', 'amnesty') }, - // translators: [admin] - { value: 'top', label: __('Top', 'amnesty') }, - ]} - /> - )} - {style === 'icon' && ( - <CheckboxControl - // translators: [admin] - label={__('Hide Image Credit Display', 'amnesty')} - checked={uncredited} - onChange={(newCredit) => setAttributes({ uncredited: newCredit })} - /> - )} - {style === 'text' && ( - <Fragment> - <CheckboxControl - // translators: [admin] - label={__('Has Underline', 'amnesty')} - checked={underlined} - onChange={(newUnderline) => setAttributes({ underlined: newUnderline })} - /> - <RangeControl - // translators: [admin] - label={__('Font Size', 'amnesty')} - value={factFontSize} - onChange={(customFontSize) => - setAttributes({ bigTextCss: { fontSize: customFontSize } }) - } - min={30} - max={120} - /> - </Fragment> - )} - <CheckboxControl - // translators: [admin] - label={__('Display Action', 'amnesty')} - checked={hasButton} - onChange={(newHasButton) => setAttributes({ hasButton: newHasButton })} - /> - {hasButton && style !== 'square' && ( - <SelectControl - // translators: [admin] - label={__('Button Style', 'amnesty')} - options={[ - // translators: [admin] - { label: __('Primary (Yellow)', 'amnesty'), value: 'primary' }, - // translators: [admin] - { label: __('Dark', 'amnesty'), value: 'dark' }, - // translators: [admin] - { label: __('Light', 'amnesty'), value: 'white' }, - ]} - value={buttonStyle} - onChange={(newButtonStyle) => setAttributes({ buttonStyle: newButtonStyle })} - /> - )} - </PanelBody> - </InspectorControls> - ); - } - - renderAsSquare() { - const { attributes, setAttributes } = this.props; - const { - hasButton = true, - imageLocation = 'top', - - title, - buttonText, - buttonLink, - } = attributes; - - return ( - <Fragment> - {this.renderControls()} - <div className="linksWithIcons"> - {imageLocation === 'top' && this.getOptionalField()} - <RichText - className="linksWithIcons-title" - // translators: [admin] - placeholder={__('(Insert Title)', 'amnesty')} - value={title} - format="string" - allowedFormats={[]} - onChange={(newTitle) => setAttributes({ title: newTitle })} - /> - {imageLocation !== 'top' && this.getOptionalField()} - {hasButton && ( - <div className="linksWithIcons-buttonWrapper"> - <span dangerouslySetInnerHTML={{ __html: buttonText }} /> - <URLInputButton - url={buttonLink} - onChange={(newLink) => setAttributes({ buttonLink: newLink })} - /> - </div> - )} - </div> - <div className="linksWithIcons-spacer"></div> - </Fragment> - ); - } - - render() { - const { attributes, setAttributes } = this.props; - const { - hasButton = true, - buttonStyle = 'white', - imageLocation = '', - style = 'icon', - - title, - body, - buttonText, - buttonLink, - } = attributes; - - if (style === 'square') { - return this.renderAsSquare(); - } - - return ( - <Fragment> - {this.renderControls()} - <div className="linksWithIcons"> - {imageLocation === 'top' && this.getOptionalField()} - <RichText - className="linksWithIcons-title" - // translators: [admin] - placeholder={__('(Insert Title)', 'amnesty')} - value={title} - format="string" - allowedFormats={[]} - onChange={(newTitle) => setAttributes({ title: newTitle })} - /> - {imageLocation !== 'top' && this.getOptionalField()} - <RichText - className="linksWithIcons-body" - // translators: [admin] - placeholder={__('(Insert Body Text)', 'amnesty')} - value={body} - format="string" - allowedFormats={[]} - onChange={(newBody) => setAttributes({ body: newBody })} - /> - {hasButton && ( - <div className="linksWithIcons-buttonWrapper"> - <RichText - className={classnames('btn', `btn--${buttonStyle}`)} - tagName="span" - // translators: [admin] - placeholder={__('(Insert Link Text)', 'amnesty')} - value={buttonText} - format="string" - allowedFormats={[]} - onChange={(newText) => setAttributes({ buttonText: newText })} - /> - <URLInputButton - url={buttonLink} - onChange={(newLink) => setAttributes({ buttonLink: newLink })} - /> - </div> - )} - </div> - <div className="linksWithIcons-spacer"></div> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks-deprecated/links-with-icons/InnerSaveComponent.jsx b/private/src/scripts/editor/blocks-deprecated/links-with-icons/InnerSaveComponent.jsx deleted file mode 100644 index 4673a89a..00000000 --- a/private/src/scripts/editor/blocks-deprecated/links-with-icons/InnerSaveComponent.jsx +++ /dev/null @@ -1,211 +0,0 @@ -/** - * Third-Party - */ -import classnames from 'classnames'; - -/** - * WordPress - */ -const { RichText } = wp.blockEditor; -const { Fragment } = wp.element; -const { sprintf } = wp.i18n; - -/** - * Internal - */ -const sizeMap = { - xsmall: 'logomark', - small: 'lwi-block-sm', - medium: 'lwi-block-md', - large: 'lwi-block-lg', - smallRetina: 'lwi-block-sm@2x', - mediumRetina: 'lwi-block-md@2x', - largeRetina: 'lwi-block-lg@2x', -}; - -const getImageTag = (attributes) => { - const { - iconSize = 'medium', - uncredited = false, - - imageAlt, - imageData, - } = attributes; - - const getUrl = (size, retina = false) => { - const key = retina ? sizeMap[`${size}Retina`] : sizeMap[size]; - const obj = imageData[key] || imageData.full || { url: '' }; - return encodeURI(obj.url); - }; - - const imgClasses = classnames('linksWithIcons-imageWrapper', { - [`is-${iconSize}`]: iconSize !== 'medium', - 'is-uncredited': uncredited, - }); - - let srcset = false; - if (imageData) { - const x1 = getUrl(iconSize); - const x2 = getUrl(iconSize, true); - - if (x1 && x2 && x1 !== x2) { - srcset = sprintf('%1$s 1x, %2$s 2x', x1, x2); - } - } - - return ( - <div className={imgClasses}> - <img className="linksWithIcons-image" src={getUrl(iconSize)} srcSet={srcset} alt={imageAlt} /> - </div> - ); -}; - -export function saveVersionOne({ attributes }) { - const { - buttonStyle = 'white', - style = 'icon', - imageLocation = 'middle', - underlined = false, - - title, - body, - buttonText, - buttonLink, - - bigTextCss, - bigtext, - } = attributes; - - const { hasButton = buttonText && buttonLink } = attributes; - - const txtClasses = classnames('linksWithIcons-bigtext', { - 'has-underline': underlined, - }); - - if (style === 'square') { - if (!hasButton) { - return ( - <div className="linksWithIcons"> - {imageLocation === 'top' && getImageTag(attributes)} - <RichText.Content className="linksWithIcons-title" tagName="div" value={title} /> - {imageLocation !== 'top' && getImageTag(attributes)} - </div> - ); - } - - return ( - <a className="linksWithIcons" href={buttonLink}> - {imageLocation === 'top' && getImageTag(attributes)} - <RichText.Content className="linksWithIcons-title" tagName="div" value={title} /> - {imageLocation !== 'top' && getImageTag(attributes)} - {hasButton && ( - <span - dangerouslySetInnerHTML={{ - __html: document.body.classList.contains('rtl') ? '&larr;' : '&rarr;', - }} - /> - )} - </a> - ); - } - - return ( - <Fragment> - <div className="linksWithIcons"> - {style.indexOf('icon') !== -1 && imageLocation === 'top' && getImageTag(attributes)} - <RichText.Content className="linksWithIcons-title" tagName="div" value={title} /> - {style.indexOf('icon') !== -1 && imageLocation !== 'top' && getImageTag(attributes)} - {style === 'text' && ( - <RichText.Content - className={txtClasses} - tagName="div" - value={bigtext} - style={bigTextCss} - /> - )} - <RichText.Content className="linksWithIcons-body" tagName="div" value={body} /> - {hasButton && ( - <a className={classnames('btn', `btn--${buttonStyle}`)} href={buttonLink}> - {buttonText} - </a> - )} - </div> - <div className="linksWithIcons-spacer"></div> - </Fragment> - ); -} - -export default function save({ attributes }) { - const { - buttonStyle = 'white', - style = 'icon', - imageLocation = 'middle', - underlined = false, - - title, - body, - buttonText, - buttonLink, - - bigTextCss, - bigtext, - } = attributes; - - const { hasButton = buttonText && buttonLink } = attributes; - - const txtClasses = classnames('linksWithIcons-bigtext', { - 'has-underline': underlined, - }); - - if (style === 'square') { - if (!hasButton) { - return ( - <div className="linksWithIcons"> - {imageLocation === 'top' && getImageTag(attributes)} - <RichText.Content className="linksWithIcons-title" tagName="div" value={title} /> - {imageLocation !== 'top' && getImageTag(attributes)} - </div> - ); - } - - return ( - <a className="linksWithIcons" href={buttonLink}> - {imageLocation === 'top' && getImageTag(attributes)} - {title && <RichText.Content className="linksWithIcons-title" tagName="div" value={title} />} - {imageLocation !== 'top' && getImageTag(attributes)} - {hasButton && ( - <span - dangerouslySetInnerHTML={{ - __html: document.body.classList.contains('rtl') ? '&larr;' : '&rarr;', - }} - /> - )} - </a> - ); - } - - return ( - <Fragment> - <div className="linksWithIcons"> - {style.indexOf('icon') !== -1 && imageLocation === 'top' && getImageTag(attributes)} - {title && <RichText.Content className="linksWithIcons-title" tagName="div" value={title} />} - {style.indexOf('icon') !== -1 && imageLocation !== 'top' && getImageTag(attributes)} - {style === 'text' && ( - <RichText.Content - className={txtClasses} - tagName="div" - value={bigtext} - style={bigTextCss} - /> - )} - {body && <RichText.Content className="linksWithIcons-body" tagName="div" value={body} />} - {hasButton && ( - <a className={classnames('btn', `btn--${buttonStyle}`)} href={buttonLink}> - {buttonText} - </a> - )} - </div> - <div className="linksWithIcons-spacer"></div> - </Fragment> - ); -} diff --git a/private/src/scripts/editor/blocks-deprecated/links-with-icons/deprecated.jsx b/private/src/scripts/editor/blocks-deprecated/links-with-icons/deprecated.jsx deleted file mode 100644 index bb7f382d..00000000 --- a/private/src/scripts/editor/blocks-deprecated/links-with-icons/deprecated.jsx +++ /dev/null @@ -1,85 +0,0 @@ -import classnames from 'classnames'; - -const { InnerBlocks } = wp.blockEditor; -const { omit } = lodash; - -const blockAttributes = { - backgroundColor: { - type: 'string', - }, - orientation: { - type: 'string', - default: 'horizontal', - }, - quantity: { - type: 'number', - default: 2, - }, - hideLines: { - type: 'boolean', - default: false, - }, - dividerIcon: { - type: 'text', - default: 'none', - }, -}; - -const v1 = { - attributes: omit(blockAttributes, ['dividerIcon']), - save({ attributes, className }) { - const { quantity, orientation = 'horizontal', backgroundColor, hideLines } = attributes; - const classes = classnames( - 'linksWithIcons-group', - `is-${orientation}`, - `has-${quantity}-items`, - { - 'has-background': !!backgroundColor, - [`has-${backgroundColor}-background-color`]: !!backgroundColor, - 'has-no-lines': !!hideLines, - className: !!className, - }, - ); - - return ( - <div className={classes}> - <InnerBlocks.Content /> - </div> - ); - }, -}; - -const v2 = { - attributes: blockAttributes, - save({ attributes, className }) { - const { - quantity, - orientation = 'horizontal', - backgroundColor, - hideLines, - dividerIcon = 'none', - } = attributes; - const classes = classnames( - 'linksWithIcons-group', - `is-${orientation}`, - `has-${quantity}-items`, - { - className: !!className, - 'has-background': !!backgroundColor, - 'has-no-lines': !!hideLines, - [`has-${backgroundColor}-background-color`]: !!backgroundColor, - [`icon-${dividerIcon}`]: !!dividerIcon, - }, - ); - - return ( - <div className={classes}> - <InnerBlocks.Content /> - </div> - ); - }, -}; - -const deprecated = [v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks-deprecated/links-with-icons/index.jsx b/private/src/scripts/editor/blocks-deprecated/links-with-icons/index.jsx deleted file mode 100644 index cb6cf8a9..00000000 --- a/private/src/scripts/editor/blocks-deprecated/links-with-icons/index.jsx +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Module-specific - */ -import DisplayComponent from './DisplayComponent.jsx'; -import './inner-block.jsx'; -import deprecated from './deprecated.jsx'; - -/** - * WordPress - */ -const { InnerBlocks } = wp.blockEditor; -const { registerBlockStyle, registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/repeatable-block', { - // translators: [admin] - title: __('Links with Icons Group', 'amnesty'), - // translators: [admin] - description: __('Add a repeatable links-with-icons block', 'amnesty'), - icon: 'images-alt', - category: 'amnesty-core', - supports: { - className: true, - defaultStylePicker: false, - inserter: false, - }, - - attributes: { - backgroundColor: { - type: 'string', - }, - orientation: { - type: 'string', - default: 'horizontal', - }, - quantity: { - type: 'number', - default: 2, - }, - hideLines: { - type: 'boolean', - default: false, - }, - dividerIcon: { - type: 'text', - default: 'none', - }, - }, - deprecated, - edit: DisplayComponent, - - save: () => <InnerBlocks.Content />, -}); - -registerBlockStyle('amnesty-core/repeatable-block', { - name: 'square', - // translators: [admin] - label: __('Square', 'amnesty'), -}); diff --git a/private/src/scripts/editor/blocks-deprecated/links-with-icons/inner-block.jsx b/private/src/scripts/editor/blocks-deprecated/links-with-icons/inner-block.jsx deleted file mode 100644 index 7d67cb68..00000000 --- a/private/src/scripts/editor/blocks-deprecated/links-with-icons/inner-block.jsx +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Third-Party - */ -import classnames from 'classnames'; - -/** - * Module-specific - */ -import BlockEdit from './InnerDisplayComponent.jsx'; -import BlockSave, { saveVersionOne } from './InnerSaveComponent.jsx'; - -/** - * WordPress - */ -const { assign } = lodash; -const { RichText } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { Fragment } = wp.element; -const { __ } = wp.i18n; - -const blockAttributes = { - style: { - type: 'string', - }, - hasButton: { - type: 'boolean', - }, - bigTextCss: { - type: 'object', - default: { - fontSize: 20, - }, - }, - iconSize: { - type: 'string', - default: 'medium', - }, - underlined: { - type: 'boolean', - default: false, - }, - - title: { - type: 'string', - }, - body: { - type: 'string', - }, - buttonText: { - type: 'string', - }, - buttonLink: { - type: 'string', - }, - - imageID: { - type: 'number', - }, - imageAlt: { - type: 'string', - }, - imageURL: { - type: 'string', - }, - bigtext: { - type: 'string', - }, -}; - -registerBlockType('amnesty-core/links-with-icons', { - // translators: [admin] - title: __('Links with Icons', 'amnesty'), - // translators: [admin] - description: __('Add a links-with-icons block', 'amnesty'), - icon: 'plus', - category: 'layout', - parent: ['amnesty-core/repeatable-block'], - supports: { - className: false, - defaultStylePicker: false, - }, - attributes: assign({}, blockAttributes, { - uncredited: { - type: 'boolean', - default: false, - }, - imageData: { - type: 'object', - default: {}, - }, - imageLocation: { - type: 'string', - default: 'middle', - }, - buttonStyle: { - type: 'string', - default: 'white', - }, - }), - - deprecated: [ - { - supports: { - className: false, - }, - attributes: assign({}, blockAttributes, { - uncredited: { - type: 'boolean', - default: false, - }, - imageData: { - type: 'object', - default: {}, - }, - imageLocation: { - type: 'string', - default: 'middle', - }, - buttonStyle: { - type: 'string', - default: 'white', - }, - }), - save: saveVersionOne, - }, - { - supports: { - className: false, - }, - attributes: blockAttributes, - save({ attributes }) { - const { - style = 'icon', - iconSize = 'medium', - underlined = false, - - title, - body, - buttonText, - buttonLink, - - bigTextCss, - bigtext, - - imageAlt, - imageURL, - } = attributes; - - const { hasButton = buttonText && buttonLink } = attributes; - - const imgClasses = classnames('linksWithIcons-imageWrapper', { - [`is-${iconSize}`]: iconSize !== 'medium', - }); - - const txtClasses = classnames('linksWithIcons-bigtext', { - 'has-underline': underlined, - }); - - return ( - <Fragment> - <div className="linksWithIcons"> - <RichText.Content className="linksWithIcons-title" tagName="div" value={title} /> - {style === 'icon' && ( - <div className={imgClasses}> - <RichText.Content - className="linksWithIcons-image" - tagName="img" - src={imageURL} - alt={imageAlt} - /> - </div> - )} - {style === 'text' && ( - <RichText.Content - className={txtClasses} - tagName="div" - value={bigtext} - style={bigTextCss} - /> - )} - <RichText.Content className="linksWithIcons-body" tagName="div" value={body} /> - {hasButton && ( - <a className="btn btn--outline linksWithIcons-button" href={buttonLink}> - {buttonText} - </a> - )} - </div> - <div className="linksWithIcons-spacer"></div> - </Fragment> - ); - }, - }, - { - attributes: assign({}, blockAttributes, { - uncredited: { - type: 'boolean', - default: false, - }, - }), - save({ attributes }) { - const { - style = 'icon', - iconSize = 'medium', - underlined = false, - uncredited = false, - - title, - body, - buttonText, - buttonLink, - - bigTextCss, - bigtext, - - imageAlt, - imageURL, - } = attributes; - - const { hasButton = buttonText && buttonLink } = attributes; - - const imgClasses = classnames('linksWithIcons-imageWrapper', { - [`is-${iconSize}`]: iconSize !== 'medium', - 'is-uncredited': uncredited, - }); - - const txtClasses = classnames('linksWithIcons-bigtext', { - 'has-underline': underlined, - }); - - return ( - <Fragment> - <div className="linksWithIcons"> - <RichText.Content className="linksWithIcons-title" tagName="div" value={title} /> - {style === 'icon' && ( - <div className={imgClasses}> - <img className="linksWithIcons-image" src={imageURL} alt={imageAlt} /> - </div> - )} - {style === 'text' && ( - <RichText.Content - className={txtClasses} - tagName="div" - value={bigtext} - style={bigTextCss} - /> - )} - <RichText.Content className="linksWithIcons-body" tagName="div" value={body} /> - {hasButton && ( - <a className="btn btn--white" href={buttonLink}> - {buttonText} - </a> - )} - </div> - <div className="linksWithIcons-spacer"></div> - </Fragment> - ); - }, - migrate(attributes) { - return assign({}, attributes, { - imageData: { - full: { - url: attributes.imageURL, - }, - 'lwi-block-lg': { - url: attributes.imageURL, - }, - 'lwi-block-md': { - url: attributes.imageURL, - }, - 'lwi-block-sm': { - url: attributes.imageURL, - }, - }, - }); - }, - }, - ], - - edit: BlockEdit, - - save: BlockSave, -}); diff --git a/private/src/scripts/editor/blocks/action/DisplayComponent.jsx b/private/src/scripts/editor/blocks/action/DisplayComponent.jsx deleted file mode 100644 index 916161ba..00000000 --- a/private/src/scripts/editor/blocks/action/DisplayComponent.jsx +++ /dev/null @@ -1,157 +0,0 @@ -import classnames from 'classnames'; - -const { InspectorControls, MediaUpload, PlainText, URLInputButton } = wp.blockEditor; -const { IconButton, PanelBody, SelectControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -export default class BlockEdit extends Component { - componentDidMount = () => { - const { attributes, setAttributes } = this.props; - const { imageID, imageURL, style } = attributes; - - if (!imageID) { - return; - } - - wp.apiRequest({ path: `wp/v2/media/${imageID}` }).then((data) => { - const standardURL = data.media_details.sizes['action-wide'].source_url; - const wideURL = data.media_details.sizes['lwi-block-md@2x'].source_url; - if (style === 'standard' && imageURL !== standardURL) { - setAttributes({ imageURL: standardURL }); - } - - if (style === 'wide' && imageURL !== wideURL) { - setAttributes({ imageURL: wideURL }); - } - }); - }; - - componentDidUpdate = () => { - const { attributes, setAttributes } = this.props; - const { imageID, style } = attributes; - if (!imageID) { - return; - } - wp.apiRequest({ path: `wp/v2/media/${imageID}` }).then((data) => { - if (style === 'standard') { - setAttributes({ imageURL: data.media_details.sizes['action-wide'].source_url }); - } else if (style === 'wide') { - setAttributes({ imageURL: data.media_details.sizes['lwi-block-md@2x'].source_url }); - } - }); - }; - - render() { - const { attributes, setAttributes } = this.props; - const { - style = 'standard', - centred = false, - content, - imageAlt, - imageID, - imageURL, - label, - link, - linkText, - } = attributes; - - const classes = classnames('actionBlock', { - 'actionBlock--wide': style === 'wide', - 'is-centred': centred, - }); - - const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); - const setURL = (image) => { - if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'action-wide')) { - return image.url; - } - const standardIMG = 'action-wide'; - - return image.sizes[standardIMG].url; - }; - const setLargeURL = (image) => { - if (!image.sizes || !Object.prototype.hasOwnProperty.call(image.sizes, 'lwi-block-md@2x')) { - return image.url; - } - const largeIMG = 'lwi-block-md@2x'; - return image.sizes[largeIMG].url; - }; - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Size', 'amnesty')} - value={style} - onChange={(newStyle) => setAttributes({ style: newStyle })} - options={[ - // translators: [admin] - { value: 'standard', label: __('Standard', 'amnesty') }, - // translators: [admin] - { value: 'wide', label: __('Wide', 'amnesty') }, - ]} - /> - </PanelBody> - </InspectorControls> - <figure className={classes}> - <div className="actionBlock-figure"> - <div className="linkList-options"> - {imageID ? ( - <IconButton - icon="no-alt" - // translators: [admin] - label={__('Remove Image', 'amnesty')} - onClick={() => setAttributes({ imageID: 0, imageURL: '', imageAlt: '' })} - /> - ) : ( - <MediaUpload - allowedTypes={['image']} - value={imageID} - onSelect={(media) => - setAttributes({ - imageID: media.id, - imageURL: setURL(media), - largeImageURL: setLargeURL(media), - imageAlt: media.alt, - }) - } - render={({ open }) => <IconButton icon="format-image" onClick={open} />} - /> - )} - </div> - {imageURL && <img className="actionBlock-image" src={imageURL} alt={imageAlt} />} - <PlainText - className="actionBlock-label" - rows="1" - // translators: [admin] - placeholder={__('(Label)', 'amnesty')} - value={label} - onChange={(newLabel) => setAttributes({ label: newLabel })} - /> - </div> - <figcaption className="actionBlock-content"> - <PlainText - // translators: [admin] - placeholder={__('Content', 'amnesty')} - rows="3" - value={content} - onChange={(newContent) => setAttributes({ content: newContent })} - /> - <PlainText - className={buttonClasses} - // translators: [admin] - placeholder={__('Button Text', 'amnesty')} - rows="1" - value={linkText} - onChange={(newLinkText) => setAttributes({ linkText: newLinkText })} - /> - <URLInputButton url={link} onChange={(newLink) => setAttributes({ link: newLink })} /> - </figcaption> - </figure> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks/action/deprecated.jsx b/private/src/scripts/editor/blocks/action/deprecated.jsx deleted file mode 100644 index fac7d8f8..00000000 --- a/private/src/scripts/editor/blocks/action/deprecated.jsx +++ /dev/null @@ -1,220 +0,0 @@ -import classnames from 'classnames'; - -const { assign, omit } = lodash; -const { __ } = wp.i18n; - -const blockAttributes = { - style: { - type: 'string', - }, - centred: { - type: 'boolean', - }, - label: { - type: 'string', - }, - content: { - type: 'string', - }, - imageID: { - type: 'integer', - }, - imageURL: { - type: 'string', - }, - imageAlt: { - type: 'string', - }, - link: { - type: 'string', - }, - buttonBackground: { - type: 'string', - }, -}; - -const v4 = { - supports: { - className: false, - align: true, - }, - attributes: assign({}, omit(blockAttributes, 'buttonBackground'), { - linkText: { - type: 'string', - }, - largeImageURL: { - type: 'string', - }, - }), - save({ attributes }) { - const { - style = 'standard', - centred = false, - content, - imageAlt, - imageURL, - label, - link, - linkText, - largeImageURL, - } = attributes; - - const blockClasses = classnames('actionBlock', { - 'actionBlock--wide': style === 'wide', - 'is-centred': centred, - }); - - const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); - - return ( - <figure className={blockClasses}> - <div className="actionBlock-figure"> - {style === 'wide' && ( - <img className="actionBlock-image" src={largeImageURL} alt={imageAlt} /> - )} - {style === 'standard' && ( - <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> - )} - <span className="actionBlock-label">{label}</span> - </div> - <figcaption className="actionBlock-content"> - <p>{content}</p> - <a className={buttonClasses} href={link}> - {linkText} - </a> - </figcaption> - </figure> - ); - }, -}; - -const v3 = { - supports: { - className: false, - }, - attributes: blockAttributes, - save({ attributes }) { - const { - style = 'standard', - centred = false, - content, - imageAlt, - imageURL, - label, - link, - linkText, - } = attributes; - - const blockClasses = classnames('actionBlock', { - 'actionBlock--wide': style === 'wide', - 'is-centred': centred, - }); - - const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); - - return ( - <figure className={blockClasses}> - <div className="actionBlock-figure"> - <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> - <span className="actionBlock-label">{label}</span> - </div> - <figcaption className="actionBlock-content"> - <p>{content}</p> - <a className={buttonClasses} href={link}> - {linkText} - </a> - </figcaption> - </figure> - ); - }, -}; - -const v2 = { - supports: { - className: false, - }, - attributes: blockAttributes, - save({ attributes }) { - const { - style = 'standard', - label, - content, - imageURL, - imageAlt, - link, - buttonBackground, - align, - } = attributes; - - const classes = classnames('actionBlock', { - 'actionBlock--wide': style === 'wide', - align, - }); - - return ( - <figure className={classes}> - <div className="actionBlock-figure"> - <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> - <span className="actionBlock-label">{label}</span> - </div> - <figcaption className="actionBlock-content"> - <p>{content}</p> - <a - className={classnames({ - 'tweetAction-button': true, - 'actionBlock-button': true, - [`actionBlock-button--${buttonBackground}`]: !!buttonBackground, - })} - href={link} - > - {/* translators: [admin] */ __('Act Now', 'amnesty')} - </a> - </figcaption> - </figure> - ); - }, -}; - -const v1 = { - supports: { - className: false, - }, - attributes: blockAttributes, - save({ attributes }) { - const { - style = 'standard', - centred = false, - label, - content, - imageURL, - imageAlt, - link, - } = attributes; - - const blockClasses = classnames('actionBlock', { - 'actionBlock--wide': style === 'wide', - 'is-centred': centred, - }); - - const buttonClasses = classnames('btn', 'btn--fill', 'btn--large'); - - return ( - <figure className={blockClasses}> - <div className="actionBlock-figure"> - <img className="actionBlock-image" src={imageURL} alt={imageAlt} /> - <span className="actionBlock-label">{label}</span> - </div> - <figcaption className="actionBlock-content"> - <p>{content}</p> - <a className={buttonClasses} href={link}> - {/* translators: [admin] */ __('Act Now', 'amnesty')} - </a> - </figcaption> - </figure> - ); - }, -}; - -const deprecated = [v4, v3, v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks/action/index.jsx b/private/src/scripts/editor/blocks/action/index.jsx deleted file mode 100644 index 6b1837ce..00000000 --- a/private/src/scripts/editor/blocks/action/index.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { assign, omit } = lodash; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -const blockAttributes = { - style: { - type: 'string', - }, - centred: { - type: 'boolean', - }, - label: { - type: 'string', - }, - content: { - type: 'string', - }, - imageID: { - type: 'integer', - }, - imageURL: { - type: 'string', - }, - imageAlt: { - type: 'string', - }, - link: { - type: 'string', - }, - buttonBackground: { - type: 'string', - }, -}; - -registerBlockType('amnesty-core/action-block', { - // translators: [admin] - title: __('Action', 'amnesty'), - // translators: [admin] - description: __('Add an Action block', 'amnesty'), - icon: 'megaphone', - category: 'amnesty-core', - supports: { - className: false, - align: true, - }, - attributes: assign({}, omit(blockAttributes, 'buttonBackground'), { - linkText: { - type: 'string', - }, - largeImageURL: { - type: 'string', - }, - }), - - deprecated, - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/blockquote/DisplayComponent.jsx b/private/src/scripts/editor/blocks/blockquote/DisplayComponent.jsx deleted file mode 100644 index d1be4567..00000000 --- a/private/src/scripts/editor/blocks/blockquote/DisplayComponent.jsx +++ /dev/null @@ -1,152 +0,0 @@ -import classnames from 'classnames'; - -const { InspectorControls, RichText } = wp.blockEditor; -const { PanelBody, SelectControl, ToggleControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -class DisplayComponent extends Component { - static isRightToLeft = document.documentElement.getAttribute('dir') === 'rtl'; - - constructor(...args) { - super(...args); - this.hasI18n = Object.prototype.hasOwnProperty.call(window, 'amnestyCoreI18n'); - } - - getDirections() { - const directionalOptions = [ - /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ - { value: 'start', label: __('Left', 'amnesty') }, - /* translators: [admin] text alignment */ - { value: '', label: __('Default', 'amnesty') }, - ]; - - if (!this.isRightToLeft) { - /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ - directionalOptions.push({ value: 'end', label: __('Right', 'amnesty') }); - } - - return directionalOptions; - } - - getQuoteStyles() { - if (!this.hasI18n) { - return ''; - } - - const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = - window.amnestyCoreI18n; - - return `.blockquote { - quotes: '${openDoubleQuote}' '${closeDoubleQuote}' "${openSingleQuote}" "${closeSingleQuote}"; - }`; - } - - render() { - const { attributes, setAttributes } = this.props; - const { - align = '', - size = '', - colour = '', - capitalise = false, - lined = true, - content = '', - citation = '', - } = attributes; - - const classes = classnames('blockquote', { - [`align-${align}`]: !!align, - [`is-${size}`]: !!size, - [`is-${colour}`]: !!colour, - 'is-capitalised': capitalise, - 'is-lined': lined, - }); - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Alignment', 'amnesty')} - value={align} - onChange={(newAlign) => setAttributes({ align: newAlign })} - options={this.getDirections()} - /> - <SelectControl - // translators: [admin] - label={__('Size', 'amnesty')} - value={size} - onChange={(newSize) => setAttributes({ size: newSize })} - options={[ - // translators: [admin] - { value: 'small', label: __('Small', 'amnesty') }, - // translators: [admin] - { value: 'medium', label: __('Medium', 'amnesty') }, - // translators: [admin] - { value: '', label: __('Large', 'amnesty') }, - ]} - /> - <SelectControl - // translators: [admin] - label={__('Text Colour', 'amnesty')} - value={colour} - onChange={(newColour) => setAttributes({ colour: newColour })} - options={[ - // translators: [admin] - { value: '', label: __('Black', 'amnesty') }, - // translators: [admin] - { value: 'grey', label: __('Grey', 'amnesty') }, - // translators: [admin] - { value: 'white', label: __('White', 'amnesty') }, - ]} - /> - {!this.isRightToLeft && ( - <ToggleControl - // translators: [admin] - label={__('Capitalise', 'amnesty')} - // translators: [admin] - help={__('Capitalise the content.', 'amnesty')} - checked={capitalise} - onChange={(newCaps) => setAttributes({ capitalise: newCaps })} - /> - )} - <ToggleControl - // translators: [admin] - label={__('Line', 'amnesty')} - // translators: [admin] - help={__('Toggle display of line embellishment.', 'amnesty')} - checked={lined} - onChange={(newLine) => setAttributes({ lined: newLine })} - /> - </PanelBody> - </InspectorControls> - <style>{this.getQuoteStyles()}</style> - <div className={classes}> - <div> - <RichText - tagName="p" - // translators: [admin] - placeholder={__('(Insert Quote Text)', 'amnesty')} - value={content} - allowedFormats={[]} - onChange={(newContent) => setAttributes({ content: newContent })} - /> - </div> - <div> - <RichText - tagName="cite" - // translators: [admin] - placeholder={__('(Insert Citation)', 'amnesty')} - value={citation} - allowedFormats={[]} - onChange={(newCitation) => setAttributes({ citation: newCitation })} - /> - </div> - </div> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/blockquote/deprecated.jsx b/private/src/scripts/editor/blocks/blockquote/deprecated.jsx deleted file mode 100644 index 6a6663da..00000000 --- a/private/src/scripts/editor/blocks/blockquote/deprecated.jsx +++ /dev/null @@ -1,135 +0,0 @@ -import classnames from 'classnames'; - -const { RichText } = wp.blockEditor; - -const v2 = { - supports: { - className: false, - }, - attributes: { - align: { - type: 'string', - }, - size: { - type: 'string', - }, - colour: { - type: 'string', - }, - capitalise: { - type: 'boolean', - }, - lined: { - type: 'boolean', - }, - content: { - type: 'string', - }, - citation: { - type: 'string', - }, - }, - - save({ attributes }) { - const { - align = '', - size = '', - colour = '', - capitalise = false, - lined = true, - content = '', - citation = '', - } = attributes; - - const classes = classnames('blockquote', { - [`align-${align}`]: !!align, - [`is-${size}`]: !!size, - [`is-${colour}`]: !!colour, - 'is-capitalised': capitalise, - 'is-lined': lined, - }); - - const quoteStyle = {}; - if (Object.prototype.hasOwnProperty.call(window, 'amnestyCoreI18n')) { - const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = - window.amnestyCoreI18n; - - quoteStyle.quotes = `"${openDoubleQuote}" "${closeDoubleQuote}" "${openSingleQuote}" "${closeSingleQuote}";`; - } - - return ( - <blockquote className={classes} style={quoteStyle}> - <RichText.Content tagName="p" value={content} /> - <RichText.Content tagName="cite" value={citation} /> - </blockquote> - ); - }, -}; - -const v1 = { - supports: { - className: false, - }, - attributes: { - align: { - type: 'string', - }, - size: { - type: 'string', - }, - colour: { - type: 'string', - }, - capitalise: { - type: 'boolean', - }, - lined: { - type: 'boolean', - }, - content: { - type: 'string', - }, - citation: { - type: 'string', - }, - }, - - save({ attributes }) { - const { - align = '', - size = '', - colour = '', - capitalise = false, - lined = true, - content = '', - citation = '', - } = attributes; - - const classes = classnames('blockquote', { - [`align-${align}`]: !!align, - [`is-${size}`]: !!size, - [`is-${colour}`]: !!colour, - 'is-capitalised': capitalise, - 'is-lined': lined, - }); - - const quoteStyle = {}; - if (Object.prototype.hasOwnProperty.call(window, 'amnestyCoreI18n')) { - const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = - window.amnestyCoreI18n; - - quoteStyle.quotes = `"${openDoubleQuote}" "${closeDoubleQuote}" "${openSingleQuote}" "${closeSingleQuote}";`; - } - - return ( - <blockquote className={classes} style={quoteStyle}> - <RichText.Content tagName="p" value={content} /> - {citation && <RichText.Content tagName="cite" value={citation} />} - </blockquote> - ); - }, -}; - -const deprecated = [v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks/blockquote/index.jsx b/private/src/scripts/editor/blocks/blockquote/index.jsx deleted file mode 100644 index 38e9ab07..00000000 --- a/private/src/scripts/editor/blocks/blockquote/index.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; -import transforms from './transforms.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/quote', { - // translators: [admin] - title: __('Blockquote', 'amnesty'), - // translators: [admin] - description: __('Add a blockquote block', 'amnesty'), - icon: ( - <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> - <path fill="none" d="M0 0h24v24H0V0z" /> - <path d="M19 18h-6l2-4h-2V6h8v7l-2 5zm-2-2l2-3V8h-4v4h4l-2 4zm-8 2H3l2-4H3V6h8v7l-2 5zm-2-2l2-3V8H5v4h4l-2 4z" /> - </svg> - ), - category: 'amnesty-core', - supports: { - className: false, - }, - attributes: { - align: { - type: 'string', - }, - size: { - type: 'string', - }, - colour: { - type: 'string', - }, - capitalise: { - type: 'boolean', - }, - lined: { - type: 'boolean', - }, - content: { - type: 'string', - }, - citation: { - type: 'string', - }, - }, - - transforms, - - deprecated, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/blockquote/transforms.jsx b/private/src/scripts/editor/blocks/blockquote/transforms.jsx deleted file mode 100644 index 9c81cef1..00000000 --- a/private/src/scripts/editor/blocks/blockquote/transforms.jsx +++ /dev/null @@ -1,119 +0,0 @@ -import { versionCompare } from '../utils'; - -const { createBlock } = wp.blocks; - -/** - * backwards-compatible getPhrasingContentSchema - */ -const getPhrasingContentSchema = () => { - if (versionCompare(window.WPVersion, '5.6') < 0) { - return wp.blocks.getPhrasingContentSchema(); - } - - return wp.dom.getPhrasingContentSchema(); -}; - -const transforms = { - from: [ - { - type: 'block', - isMultiBlock: true, - blocks: ['core/heading'], - transform: (attributes) => - attributes.map(({ content }) => createBlock('amnesty-core/quote', { content })), - }, - { - type: 'block', - isMultiBlock: true, - blocks: ['core/paragraph'], - transform: (attributes) => - attributes.map(({ content }) => createBlock('amnesty-core/quote', { content })), - }, - { - type: 'block', - blocks: ['core/pullquote'], - transform: ({ value, citation }) => - createBlock('amnesty-core/quote', { - content: value, - citation, - }), - }, - { - type: 'pattern', - regExp: /^>\s/, - transform: ({ content }) => - createBlock('amnesty-core/quote', { - content: `<p>${content}</p>`, - }), - }, - { - type: 'raw', - selector: 'blockquote', - schema: { - blockquote: { - children: { - p: { - children: getPhrasingContentSchema(), - }, - }, - }, - }, - transform: (node) => { - const content = node.querySelector('p')?.innerHTML || ''; - const citation = node.querySelector('cite')?.innerHTML || ''; - return createBlock('amnesty-core/quote', { content, citation }); - }, - }, - ], - to: [ - { - type: 'block', - blocks: ['core/heading'], - transform: ({ content, citation, ...attrs }) => { - if (content === '<p></p>') { - return createBlock('core/heading', { - ...attrs, - content: citation, - }); - } - - return [content, citation].filter(Boolean).map((item) => - createBlock('core/heading', { - ...attrs, - content: item, - }), - ); - }, - }, - { - type: 'block', - blocks: ['core/paragraph'], - transform: ({ content, citation, ...attrs }) => { - if (content === '<p></p>') { - return createBlock('core/paragraph', { - ...attrs, - content: citation, - }); - } - - return [content, citation].filter(Boolean).map((item) => - createBlock('core/paragraph', { - ...attrs, - content: item, - }), - ); - }, - }, - { - type: 'block', - blocks: ['core/pullquote'], - transform: ({ content, citation }) => - createBlock('core/pullquote', { - value: content, - citation, - }), - }, - ], -}; - -export default transforms; diff --git a/private/src/scripts/editor/blocks/core-mods/button/index.js b/private/src/scripts/editor/blocks/core-mods/button/index.js deleted file mode 100644 index 324a4455..00000000 --- a/private/src/scripts/editor/blocks/core-mods/button/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const { select, subscribe } = wp.data; -const { __ } = wp.i18n; - -subscribe(() => { - const selected = select('core/block-editor').getSelectedBlock(); - - if (!selected || selected.name !== 'core/button') { - return; - } - - // translators: [admin] - const search = __('Border settings'); - const xpath = `//button[contains(@class, 'components-button')][contains(text(),'${search}')]`; - - const { singleNodeValue: button } = document.evaluate( - xpath, - document, - null, - XPathResult.FIRST_ORDERED_NODE_TYPE, - null, - ); - - if (!button) { - return; - } - - const toHide = button.parentElement.parentElement; - toHide.parentElement.style.display = 'none'; -}); diff --git a/private/src/scripts/editor/blocks/core-mods/details/index.js b/private/src/scripts/editor/blocks/core-mods/details/index.js deleted file mode 100644 index e4839776..00000000 --- a/private/src/scripts/editor/blocks/core-mods/details/index.js +++ /dev/null @@ -1,18 +0,0 @@ -const { assign } = lodash; -const { addFilter } = wp.hooks; - -/** - * Remove button styles - */ -addFilter('blocks.registerBlockType', 'amnesty-core', (settings, name) => { - if (name !== 'core/details') { - return settings; - } - - return assign({}, settings, { - supports: { - ...settings.supports, - anchor: true, - }, - }); -}); diff --git a/private/src/scripts/editor/blocks/core-mods/index.js b/private/src/scripts/editor/blocks/core-mods/index.js deleted file mode 100644 index bd630347..00000000 --- a/private/src/scripts/editor/blocks/core-mods/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import './button'; -import './details'; -import './post-title'; -import './query/pagination'; diff --git a/private/src/scripts/editor/blocks/core-mods/post-title/index.js b/private/src/scripts/editor/blocks/core-mods/post-title/index.js deleted file mode 100644 index 382ef3f0..00000000 --- a/private/src/scripts/editor/blocks/core-mods/post-title/index.js +++ /dev/null @@ -1,18 +0,0 @@ -const { assign } = lodash; -const { addFilter } = wp.hooks; - -/** - * Remove button styles - */ -addFilter('blocks.registerBlockType', 'amnesty-core', (settings, name) => { - if (name !== 'core/post-title') { - return settings; - } - - return assign({}, settings, { - supports: { - ...settings.supports, - anchor: true, - }, - }); -}); diff --git a/private/src/scripts/editor/blocks/core-mods/query/pagination/index.js b/private/src/scripts/editor/blocks/core-mods/query/pagination/index.js deleted file mode 100644 index a447b825..00000000 --- a/private/src/scripts/editor/blocks/core-mods/query/pagination/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import QueryPaginationNextEdit from './next.jsx'; -import QueryPaginationPreviousEdit from './previous.jsx'; - -const { assign } = lodash; -const { addFilter } = wp.hooks; - -addFilter('blocks.registerBlockType', 'amnesty-core', (settings, name) => { - if (name === 'core/query-pagination-next') { - return assign({}, settings, { - edit: QueryPaginationNextEdit, - }); - } - - if (name === 'core/query-pagination-previous') { - return assign({}, settings, { - edit: QueryPaginationPreviousEdit, - }); - } - - return settings; -}); diff --git a/private/src/scripts/editor/blocks/countdown-timer/DisplayComponent.jsx b/private/src/scripts/editor/blocks/countdown-timer/DisplayComponent.jsx deleted file mode 100644 index d2a0cbc0..00000000 --- a/private/src/scripts/editor/blocks/countdown-timer/DisplayComponent.jsx +++ /dev/null @@ -1,133 +0,0 @@ -const { Fragment, useEffect, useState } = wp.element; -const { DateTimePicker, TextControl, PanelBody } = wp.components; -const { AlignmentToolbar, BlockControls, InspectorControls } = wp.blockEditor; -const { __, _n, _x, sprintf } = wp.i18n; - -const MINUTE = 60; -const HOUR = 60 * MINUTE; -const DAY = 24 * HOUR; - -const getTimeRemaining = (date) => { - if (!date) { - return {}; - } - - const total = (Date.parse(date) - Date.now()) / 1000; - const seconds = Math.floor(total % 60); - const minutes = Math.floor((total / MINUTE) % 60); - const hours = Math.floor((total / HOUR) % 24); - const days = Math.floor(total / DAY); - - return { - total, - days, - hours, - minutes, - seconds, - }; -}; - -const pad = (value) => `0${value}`.slice(-2); - -const clockTemplate = (state, attributes) => { - if (!attributes.date) { - return <div className="countdownClock">00:00:00</div>; - } - - const { days = 0, hours = 0, minutes = 0, seconds = 0 } = state.date; - // translators: [admin] - const dayPlural = _n('%d day', '%d days', days, 'amnesty'); - - if (days <= 0 && hours <= 0 && minutes <= 0 && seconds <= 0) { - return <div className="countdownClock">{attributes.expiredText}</div>; - } - - if (days >= 3) { - return <div className="countdownClock">{sprintf(dayPlural, days)}</div>; - } - - if (days >= 1) { - return ( - <div className="countdownClock"> - {sprintf( - // translators: [admin] - _x('%1$s, %2$s:%3$s:%4$s', 'format for timer, i.e. "x days, H:m:s"', 'amnesty'), - sprintf(dayPlural, days), - pad(hours), - pad(minutes), - pad(seconds), - )} - </div> - ); - } - - return ( - <div className="countdownClock"> - {sprintf( - // translators: [admin] - _x('%1$s:%2$s:%3$s', 'time format, i.e. "H:m:s"', 'amnesty'), - pad(hours), - pad(minutes), - pad(seconds), - )} - </div> - ); -}; - -const DisplayComponent = ({ attributes, setAttributes }) => { - const [state, setState] = useState({ - date: getTimeRemaining(attributes.date), - alignment: '', - }); - - useEffect(() => { - const date = getTimeRemaining(attributes.date); - - if (date.days >= 3) { - return setState({ date }); - } - - const interval = setInterval(() => { - setState({ - date: getTimeRemaining(attributes.date), - }); - }, 1000); - return () => clearInterval(interval); - }, [attributes.date]); - - return ( - <Fragment> - <BlockControls> - <AlignmentToolbar - value={attributes.alignment} - onChange={(alignment) => setAttributes({ alignment })} - /> - </BlockControls> - <InspectorControls> - <PanelBody> - <DateTimePicker - currentDate={attributes.date} - onChange={(date) => setAttributes({ date })} - is12Hour={true} - /> - <TextControl - // translators: [admin] - label={__('Time Expired Text', 'amnesty')} - className="expiredTextBox" - value={attributes.expiredText} - onChange={(expiredText) => setAttributes({ expiredText })} - // translators: [admin] - placeholder={__('enter text here', 'amnesty')} - /> - </PanelBody> - </InspectorControls> - <div className="countdownContainer"> - <div className="clockdiv" style={{ textAlign: attributes.alignment }}> - {clockTemplate(state, attributes)} - </div> - </div> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/countdown-timer/index.jsx b/private/src/scripts/editor/blocks/countdown-timer/index.jsx deleted file mode 100644 index 066caf4f..00000000 --- a/private/src/scripts/editor/blocks/countdown-timer/index.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/countdown-timer', { - // translators: [admin] - title: __('Countdown Timer', 'amnesty'), - icon: 'clock', - keywords: [ - // translators: [admin] - __('Countdown', 'amnesty'), - // translators: [admin] - __('Timer', 'amnesty'), - ], - category: 'amnesty-core', - attributes: { - date: { - type: 'string', - }, - timeRemaining: { - type: 'string', - }, - expiredText: { - type: 'string', - default: '', - }, - isTimeSet: { - type: 'bool', - default: false, - }, - alignment: { - type: 'string', - default: 'none', - }, - }, - - deprecated, - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/download/DisplayComponent.jsx b/private/src/scripts/editor/blocks/download/DisplayComponent.jsx deleted file mode 100644 index 287f42a4..00000000 --- a/private/src/scripts/editor/blocks/download/DisplayComponent.jsx +++ /dev/null @@ -1,212 +0,0 @@ -import classnames from 'classnames'; - -const { every, pick } = lodash; -const { - BlockAlignmentToolbar, - BlockControls, - InspectorControls, - MediaPlaceholder, - MediaUploadCheck, - RichText, -} = wp.blockEditor; -const { Button, PanelBody, SelectControl } = wp.components; -const { dispatch } = wp.data; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -const MESSAGES = { - // translators: [admin] - uploading: __('Uploading…', 'amnesty'), - // translators: [admin] - uploadError: __('Uploading failed', 'amnesty'), - // translators: [admin] - uploadSuccess: __('Uploading complete', 'amnesty'), -}; - -class DisplayComponent extends Component { - state = { - preupload: 0, - postupload: 0, - locked: false, - type: false, - }; - - onBeforeUpload = (value) => { - if (!this.state.locked) { - this.setState({ locked: true }); - - dispatch('core/editor').lockPostSaving('fileUploadLock'); - - dispatch('core/notices').createWarningNotice(MESSAGES.uploading, { - id: MESSAGES.uploading, - }); - } - - this.setState({ preupload: value.length }); - }; - - static onUploadError = (message) => { - let errorMessage; - - dispatch('core/notices').removeNotice(MESSAGES.uploading); - - if (Array.isArray(message)) { - [, , errorMessage] = message; - } else { - errorMessage = message; - } - - dispatch('core/notices').createErrorNotice(errorMessage, { id: MESSAGES.uploadError }); - dispatch('core/editor').unlockPostSaving('fileUploadLock'); - }; - - onFilesSelect = (media) => { - const { setAttributes } = this.props; - const postupload = media.length; - - dispatch('core/notices').removeNotice(MESSAGES.uploadError); - - setAttributes({ files: media.map((m) => pick(m, ['id', 'title'])) }); - - this.setState({ - postupload, - spinner: true, - type: every(media, 'type'), - }); - - if (this.state.preupload === postupload && this.state.type === true) { - if (this.state.locked) { - this.setState({ locked: false }); - dispatch('core/editor').unlockPostSaving('fileUploadLock'); - } - - this.setState({ preupload: 0, type: false }); - - dispatch('core/notices').removeNotice(MESSAGES.uploading); - dispatch('core/notices').createSuccessNotice(MESSAGES.uploadSuccess, { - id: MESSAGES.uploadSuccess, - }); - - setTimeout(() => dispatch('core/notices').removeNotice(MESSAGES.uploadSuccess), 3000); - } - }; - - uploader() { - return ( - <div style={{ maxHeight: '135px', width: '100%' }}> - <MediaUploadCheck> - <MediaPlaceholder - icon="media-default" - multiple={true} - isAppender={true} - accept="*" - labels={{ - // translators: [admin] - title: __('Select File(s)', 'amnesty'), - // translators: [admin] - instructions: __('Upload media files or pick from your media library.', 'amnesty'), - }} - onFilesPreUpload={this.onBeforeUpload} - onError={DisplayComponent.onUploadError} - onSelect={this.onFilesSelect} - /> - </MediaUploadCheck> - </div> - ); - } - - controls() { - const { attributes, setAttributes } = this.props; - const { style } = attributes; - - return ( - <InspectorControls> - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Button Style', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Dark', 'amnesty'), - value: 'dark', - }, - { - // translators: [admin] - label: __('Light', 'amnesty'), - value: 'white', - }, - ]} - value={style} - onChange={(newStyle) => setAttributes({ style: newStyle })} - /> - </PanelBody> - </InspectorControls> - ); - } - - render() { - const { attributes, setAttributes } = this.props; - const { alignment, buttonText, files, style } = attributes; - - if (!files.length) { - return ( - <Fragment> - {this.controls()} - <div className="download-block">{this.uploader()}</div> - </Fragment> - ); - } - - const blockClasses = classnames('download-block', { - [alignment]: alignment !== 'none', - 'has-multiple': files.length > 1, - }); - - const btnClasses = classnames('btn', 'btn--download', { - [`btn--${style}`]: !!style, - }); - - return ( - <Fragment> - {this.controls()} - - <BlockControls> - <BlockAlignmentToolbar - value={attributes.alignment} - onChange={(newAlign) => setAttributes({ alignment: newAlign })} - /> - </BlockControls> - - <div className={blockClasses}> - {files.length > 1 && ( - <select> - <option key="label"> - {/* translators: [admin] */ __('Select a file to download', 'amnesty')} - </option> - {files.map((file) => ( - <option key={file.id}>{file.title}</option> - ))} - </select> - )} - <span className={btnClasses}> - <RichText - format="string" - tagName="span" - allowedFormats={[]} - // translators: [admin] - placeholder={__('Download', 'amnesty')} - value={buttonText} - onChange={(newText) => setAttributes({ buttonText: newText })} - /> - </span> - <Button isDestructive isLink onClick={() => setAttributes({ files: [] })}> - {/* translators: [admin] */ __('Clear File(s)', 'amnesty')} - </Button> - </div> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/download/index.jsx b/private/src/scripts/editor/blocks/download/index.jsx deleted file mode 100644 index a041dbf4..00000000 --- a/private/src/scripts/editor/blocks/download/index.jsx +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Internal dependencies - */ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { select } = wp.data; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-download', { - // translators: [admin] - title: __('Resource Download', 'amnesty'), - // translators: [admin] - description: __('Add a button to download resource(s)', 'amnesty'), - icon: 'download', - category: 'amnesty-core', - supports: { - className: false, - multiple: true, - }, - - attributes: { - files: { - type: 'array', - default: [], - }, - buttonText: { - type: 'string', - default: 'Download', - }, - style: { - type: 'string', - default: 'dark', - }, - alignment: { - type: 'string', - default: 'none', - }, - }, - - deprecated: [ - { - supports: { - className: false, - multiple: false, - }, - attributes: { - fileId: { - type: 'integer', - source: 'meta', - meta: 'download_id', - }, - downloadButtonText: { - type: 'string', - source: 'meta', - meta: 'download_text', - }, - }, - isEligible: (attributes) => { - const meta = select('core/editor').getCurrentPostAttribute('meta'); - - if (!meta) { - return false; - } - - if (attributes.files && attributes.files.length) { - return false; - } - - const { download_id: fileId } = meta; - - return !!fileId; - }, - migrate: () => { - const meta = select('core/editor').getCurrentPostAttribute('meta'); - - if (!meta) { - return {}; - } - - const { download_id: fileId, download_text: downloadButtonText } = meta; - - return { - files: [fileId], - buttonText: downloadButtonText, - style: 'dark', - }; - }, - save: () => null, - }, - ], - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/embed-flourish/DisplayComponent.jsx b/private/src/scripts/editor/blocks/embed-flourish/DisplayComponent.jsx deleted file mode 100644 index 3ca99071..00000000 --- a/private/src/scripts/editor/blocks/embed-flourish/DisplayComponent.jsx +++ /dev/null @@ -1,51 +0,0 @@ -import { httpsOnly } from '../utils'; - -const { delay } = lodash; -const { Button, TextControl } = wp.components; -const { Fragment, useState } = wp.element; -const { __ } = wp.i18n; - -// load flourish embed script -const loadScript = () => { - if (document.getElementById('flourish-script')) { - return; - } - - const script = document.createElement('script'); - script.id = 'flourish-script'; - script.async = true; - document.body.appendChild(script); - script.src = 'https://public.flourish.studio/resources/embed.js'; -}; - -const DisplayComponent = (props) => { - const { attributes, setAttributes } = props; - - const [isPreviewing, preview] = useState(false); - - if (isPreviewing && attributes.source) { - delay(loadScript, 1000); - return ( - <div style={{ minHeight: '20px', border: '1px dashed' }}> - <div className="flourish-embed" data-src={attributes.source}></div> - </div> - ); - } - - return ( - <Fragment> - <TextControl - value={httpsOnly(attributes.source)} - onChange={(source) => setAttributes({ source })} - // translators: [admin] - label={__('The Flourish embed source (not the full URL).', 'amnesty')} - placeholder="e.g. visualisation/123456" - /> - <Button isPrimary={true} onClick={() => preview(!isPreviewing)}> - {/* translators: [admin] */ __('Preview Embed', 'amnesty')} - </Button> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/embed-flourish/index.jsx b/private/src/scripts/editor/blocks/embed-flourish/index.jsx deleted file mode 100644 index 45994efc..00000000 --- a/private/src/scripts/editor/blocks/embed-flourish/index.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/embed-flourish', { - // translators: [admin] - title: __('Flourish Embed', 'amnesty'), - icon: 'embed-photo', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Flourish', 'amnesty'), - // translators: [admin] - __('Embed', 'amnesty'), - ], - attributes: { - source: { - type: 'string', - default: '', - }, - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/embed-infogram/DisplayComponent.jsx b/private/src/scripts/editor/blocks/embed-infogram/DisplayComponent.jsx deleted file mode 100644 index 3237aa53..00000000 --- a/private/src/scripts/editor/blocks/embed-infogram/DisplayComponent.jsx +++ /dev/null @@ -1,36 +0,0 @@ -const { TextControl } = wp.components; -const { Fragment } = wp.element; -const { __ } = wp.i18n; - -const DisplayComponent = (props) => { - const { attributes, setAttributes } = props; - - return ( - <Fragment> - <TextControl - // translators: [admin] - label={__('The embed code', 'amnesty')} - value={attributes.identifier} - onChange={(identifier) => setAttributes({ identifier })} - placeholder="e.g. 75e11a7d-a5bb-45b2-9764-b5fdbdfdf489" - /> - <TextControl - // translators: [admin] - label={__('The embed type', 'amnesty')} - value={attributes.type} - onChange={(type) => setAttributes({ type })} - placeholder="e.g. 'interactive'" - /> - <TextControl - // translators: [admin] - label={__('The embed title', 'amnesty')} - value={attributes.title} - onChange={(title) => setAttributes({ title })} - // translators: [admin] - placeholder={__('Ending the Death Penalty', 'amnesty')} - /> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/embed-infogram/index.jsx b/private/src/scripts/editor/blocks/embed-infogram/index.jsx deleted file mode 100644 index e40c6ce7..00000000 --- a/private/src/scripts/editor/blocks/embed-infogram/index.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/embed-infogram', { - // translators: [admin] - title: __('Infogram Embed', 'amnesty'), - icon: 'embed-photo', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Infogram', 'amnesty'), - // translators: [admin] - __('Embed', 'amnesty'), - ], - attributes: { - identifier: { - type: 'string', - default: '', - }, - type: { - type: 'string', - default: 'interactive', - }, - title: { - type: 'string', - default: '', - }, - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/embed-sutori/DisplayComponent.jsx b/private/src/scripts/editor/blocks/embed-sutori/DisplayComponent.jsx deleted file mode 100644 index 47a01c55..00000000 --- a/private/src/scripts/editor/blocks/embed-sutori/DisplayComponent.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import { httpsOnly } from '../utils'; - -const { Button, TextControl } = wp.components; -const { Fragment, useState } = wp.element; -const { __ } = wp.i18n; - -const getIframeSrc = (rawValue, props) => { - const { setAttributes } = props; - - const source = rawValue.replace(/^.*<iframe.*?src=(["'])([^\1]*?)\1.*$/, '$2'); - - if (source) { - setAttributes({ source: httpsOnly(source) }); - } -}; - -const DisplayComponent = (props) => { - const { attributes } = props; - - const [isPreviewing, preview] = useState(false); - - if (isPreviewing && httpsOnly(attributes.source)) { - return ( - <div style={{ minHeight: '20px', border: '1px dashed' }}> - <div className="sutori-embed"> - <iframe src={httpsOnly(attributes.source)} height="600px" width="100%"></iframe> - </div> - </div> - ); - } - - return ( - <Fragment> - <TextControl - value={httpsOnly(attributes.source)} - onChange={(source) => getIframeSrc(source, props)} - // translators: [admin] - placeholder={__('The Sutori embed code', 'amnesty')} - /> - <Button isPrimary={true} onClick={() => preview(!isPreviewing)}> - {/* translators: [admin] */ __('Preview Embed', 'amnesty')} - </Button> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/embed-sutori/index.jsx b/private/src/scripts/editor/blocks/embed-sutori/index.jsx deleted file mode 100644 index 7d59f7a0..00000000 --- a/private/src/scripts/editor/blocks/embed-sutori/index.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/embed-sutori', { - // translators: [admin] - title: __('Sutori Embed', 'amnesty'), - icon: 'embed-photo', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Sutori', 'amnesty'), - // translators: [admin] - __('Embed', 'amnesty'), - ], - attributes: { - source: { - type: 'string', - default: '', - }, - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/embed-tickcounter/DisplayComponent.jsx b/private/src/scripts/editor/blocks/embed-tickcounter/DisplayComponent.jsx deleted file mode 100644 index 5c97cba7..00000000 --- a/private/src/scripts/editor/blocks/embed-tickcounter/DisplayComponent.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { httpsOnly } from '../utils'; - -const { BlockAlignmentToolbar, BlockControls } = wp.blockEditor; -const { Placeholder, TextControl } = wp.components; -const { select } = wp.data; -const { Fragment } = wp.element; -const { __, sprintf } = wp.i18n; - -const stripScript = (html) => html.replace(/<script>.+<\/script>/, ''); - -const DisplayComponent = (props) => { - const { attributes, setAttributes } = props; - - return ( - <Fragment> - <BlockControls> - <BlockAlignmentToolbar - value={attributes.alignment} - onChange={(alignment) => setAttributes({ alignment })} - /> - </BlockControls> - <Placeholder - // translators: [admin] - label={__('Tickcounter Embed', 'amnesty')} - instructions={sprintf( - // translators: [admin] - __( - 'This embed cannot be previewed in the editor. Preview the %s itself to see the embed in action', - 'amnesty', - ), - select('core/editor').getCurrentPostType(), - )} - > - <TextControl - value={httpsOnly(attributes.source)} - onChange={(source) => setAttributes({ source: httpsOnly(stripScript(source)) })} - // translators: [admin] - placeholder={__('The Tickcounter embed code', 'amnesty')} - /> - </Placeholder> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/embed-tickcounter/index.jsx b/private/src/scripts/editor/blocks/embed-tickcounter/index.jsx deleted file mode 100644 index 2d537ec0..00000000 --- a/private/src/scripts/editor/blocks/embed-tickcounter/index.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/embed-tickcounter', { - // translators: [admin] - title: __('Tickcounter Embed', 'amnesty'), - icon: 'embed-photo', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Tickcounter', 'amnesty'), - // translators: [admin] - __('Embed', 'amnesty'), - // translators: [admin] - __('Counter', 'amnesty'), - ], - attributes: { - alignment: { - type: 'string', - default: 'center', - }, - source: { - type: 'string', - default: '', - }, - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/hero/DisplayComponent.jsx b/private/src/scripts/editor/blocks/hero/DisplayComponent.jsx deleted file mode 100644 index a52f6913..00000000 --- a/private/src/scripts/editor/blocks/hero/DisplayComponent.jsx +++ /dev/null @@ -1,192 +0,0 @@ -import classnames from 'classnames'; -import BlockImageSelector from './components/BlockImageSelector.jsx'; -import MediaMetadata from '../../components/MediaMetadata.jsx'; -import MediaMetadataVisibilityControls from '../../components/MediaMetadataVisibilityControls.jsx'; -import PostFeaturedVideo from '../../components/PostFeaturedVideo.jsx'; -import { fetchMediaData } from '../utils'; - -const { InnerBlocks, InspectorControls, RichText, URLInputButton } = wp.blockEditor; -const { PanelBody, SelectControl } = wp.components; -const { useEntityRecord } = wp.coreData; -const { useSelect } = wp.data; -const { PostFeaturedImage } = wp.editor; -const { Fragment, useEffect, useRef, useState } = wp.element; -const { __ } = wp.i18n; - -/** - * Retrieve the correct title for the media panel - * - * @param {String} type the media type - * - * @returns {String} - */ -const mediaPanelTitle = (type) => { - if (type === 'video') { - /* translators: [admin] */ - return __('Background Image', 'amnesty'); - } - - /* translators: [admin] */ - return __('Featured Image', 'amnesty'); -}; - -const useHasDonationBlock = (parentClientId) => - useSelect((select) => { - const { innerBlocks } = select('core/block-editor').getBlock(parentClientId); - return innerBlocks.filter((block) => block.name === 'amnesty-wc/donation').length; - }); - -const DisplayComponent = (props) => { - const { - attributes, - className, - clientId, - context: { postId, postType }, - setAttributes, - } = props; - - const [mediaData, setMediaData] = useState({}); - const videoRef = useRef(); - const hasDonationBlock = useHasDonationBlock(clientId); - const object = useEntityRecord('postType', postType, postId); - - useEffect(() => { - if (attributes.type !== 'image') { - return; - } - - // block attribute takes precedence over the featured image - const id = attributes?.imageID || object.editedRecord.featured_media; - fetchMediaData(id, setMediaData, mediaData); - }, [object.editedRecord.featured_media, attributes.imageID, attributes.type]); - - useEffect(() => { - if (attributes.type !== 'video') { - return; - } - - fetchMediaData(attributes.featuredVideoId, setMediaData, mediaData).then(() => { - videoRef?.current?.load?.(); - }); - }, [attributes.featuredVideoId, attributes.type]); - - // Set class names for the content back colours - const classes = classnames(className, { - [`has-${attributes.background}-background`]: attributes.background, - 'has-video': !!attributes.featuredVideoId, - }); - - const blockInlineStyle = {}; - if (attributes.type === 'image' && mediaData?.url) { - blockInlineStyle.backgroundImage = `url("${mediaData.url}")`; - } - - const showMediaCaption = mediaData?.caption && !attributes.hideImageCaption; - const showMediaCopyright = mediaData?.copyright && !attributes.hideImageCopyright; - - const BlockInspectorControls = ( - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')} initialOpen={true}> - <SelectControl - label={/* translators: [admin] */ __('Background Colour', 'amnesty')} - options={[ - { label: /* translators: [admin] */ __('Black', 'amnesty'), value: 'dark' }, - { label: /* translators: [admin] */ __('White', 'amnesty'), value: 'light' }, - ]} - value={attributes.background || 'dark'} - onChange={(background) => setAttributes({ background })} - /> - <SelectControl - label={/* translators: [admin] */ __('Background Type', 'amnesty')} - options={[ - { label: /* translators: [admin] */ __('Image', 'amnesty'), value: 'image' }, - { label: /* translators: [admin] */ __('Video', 'amnesty'), value: 'video' }, - ]} - value={attributes.type || 'image'} - onChange={(type) => setAttributes({ type })} - /> - <MediaMetadataVisibilityControls - type={attributes.type} - hideCaption={attributes.hideImageCaption} - hideCopyright={attributes.hideImageCopyright} - setAttributes={setAttributes} - /> - </PanelBody> - <PanelBody title={mediaPanelTitle(attributes.type)}> - <PostFeaturedImage /> - </PanelBody> - {attributes.type === 'video' && ( - <PanelBody title={/* translators: [admin] */ __('Featured Video', 'amnesty')}> - <PostFeaturedVideo - featuredVideoId={attributes.featuredVideoId} - onUpdate={(featuredVideoId) => setAttributes({ featuredVideoId })} - /> - </PanelBody> - )} - </InspectorControls> - ); - - return ( - <Fragment> - {BlockInspectorControls} - <section className={classes} style={blockInlineStyle}> - {attributes.type === 'image' && ( - <div className="linkList-options"> - <BlockImageSelector imageId={attributes.imageID} setAttributes={setAttributes} /> - </div> - )} - {attributes.type === 'video' && ( - <div className="hero-videoContainer"> - <video className="hero-video" ref={videoRef}> - <source src={mediaData.url} /> - </video> - </div> - )} - <div className={`container ${hasDonationBlock ? 'has-donation-block' : ''}`}> - <div className="hero-contentWrapper"> - <h1 className="hero-title"> - <RichText - tagName="span" - placeholder={/* translators: [admin] */ __('Hero Title', 'amnesty')} - value={attributes.title} - onChange={(title) => setAttributes({ title })} - format="string" - /> - </h1> - <RichText - tagName="p" - className="hero-content" - placeholder={/* translators: [admin] */ __('Hero Content', 'amnesty')} - value={attributes.content} - onChange={(content) => setAttributes({ content })} - format="string" - /> - <div className="hero-cta"> - <div className="btn btn--large"> - <RichText - tagName="span" - placeholder={/* translators: [admin] */ __('Call to action', 'amnesty')} - value={attributes.ctaText} - onChange={(ctaText) => setAttributes({ ctaText })} - format="string" - /> - <URLInputButton - url={attributes.ctaLink} - onChange={(ctaLink) => setAttributes({ ctaLink })} - /> - </div> - </div> - </div> - <InnerBlocks allowedBlocks={['amnesty-wc/donation']} orientation="horizontal" /> - </div> - <MediaMetadata - media={mediaData} - showMediaCaption={showMediaCaption} - showMediaCopyright={showMediaCopyright} - /> - </section> - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/hero/index.jsx b/private/src/scripts/editor/blocks/hero/index.jsx deleted file mode 100644 index 02bb19d4..00000000 --- a/private/src/scripts/editor/blocks/hero/index.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { InnerBlocks } = wp.blockEditor; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/hero', { - // translators: [admin] - title: __('Hero', 'amnesty'), - icon: 'format-image', - category: 'amnesty-core', - supports: { - align: true, - className: true, - }, - keywords: [ - // translators: [admin] - __('Hero', 'amnesty'), - // translators: [admin] - __('Header', 'amnesty'), - // translators: [admin] - __('Banner', 'amnesty'), - ], - attributes: { - background: { - type: 'string', - default: 'dark', - }, - content: { - type: 'string', - }, - ctaLink: { - type: 'string', - }, - ctaText: { - type: 'string', - }, - featuredVideoId: { - type: 'number', - }, - hideImageCaption: { - type: 'boolean', - default: true, - }, - hideImageCopyright: { - type: 'boolean', - default: false, - }, - imageID: { - type: 'number', - default: 0, - }, - title: { - type: 'string', - }, - type: { - type: 'string', - default: 'image', - }, - }, - usesContext: ['postId', 'postType'], - - edit: DisplayComponent, - - save() { - return <InnerBlocks.Content />; - }, -}); diff --git a/private/src/scripts/editor/blocks/iframe-button/DisplayComponent.jsx b/private/src/scripts/editor/blocks/iframe-button/DisplayComponent.jsx deleted file mode 100644 index 1ac5405b..00000000 --- a/private/src/scripts/editor/blocks/iframe-button/DisplayComponent.jsx +++ /dev/null @@ -1,102 +0,0 @@ -import classnames from 'classnames'; -import { httpsOnly } from '../utils'; - -const { BlockAlignmentToolbar, BlockControls, InspectorControls, RichText } = wp.blockEditor; -const { Button, PanelBody, TextControl } = wp.components; -const { createRef, Fragment, useEffect, useState } = wp.element; -const { __ } = wp.i18n; - -const DisplayComponent = (props) => { - const { attributes, className, setAttributes } = props; - const [previewing, setIsPreviewing] = useState(false); - const [embedUrl, setEmbedUrl] = useState(''); - const mounted = createRef(); - const inputRef = createRef(); - - const classes = classnames('iframeButton wp-block-button', className, { - [`is-${attributes.alignment}-aligned`]: attributes.alignment !== 'none', - }); - - useEffect(() => { - if (!mounted.current) { - mounted.current = true; - setEmbedUrl(attributes.iframeUrl); - } - }, [attributes.iframeUrl]); - - const embed = () => { - setAttributes({ iframeUrl: httpsOnly(embedUrl) }); - setIsPreviewing(true); - }; - - return ( - <Fragment> - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <TextControl - // translators: [admin] - label={__('Iframe Height', 'amnesty')} - value={attributes.iframeHeight} - type="number" - step={50} - onChange={(iframeHeight) => setAttributes({ iframeHeight })} - /> - <TextControl - // translators: [admin] - label={__('Iframe Title', 'amnesty')} - // translators: [admin] - help={__('Set the text alternative for the iframe', 'amnesty')} - value={attributes.title} - onChange={(title) => setAttributes({ title })} - /> - </PanelBody> - </InspectorControls> - <BlockControls> - <BlockAlignmentToolbar - value={attributes.alignment} - onChange={(alignment) => setAttributes({ alignment })} - /> - </BlockControls> - <div className={classes}> - <RichText - className="wp-block-button__link" - value={attributes.buttonText} - // translators: [admin] - placeholder={__('Act Now', 'amnesty')} - identifier="text" - allowedFormats={[]} - withoutInteractiveFormatting={true} - onChange={(buttonText) => setAttributes({ buttonText })} - /> - </div> - <div className="iframeButton-inputWrapper"> - <input - ref={inputRef} - type="url" - className="components-placeholder__input" - // translators: [admin] - aria-label={__('Iframe URL', 'amnesty')} - // translators: [admin] - placeholder={__('Enter URL to embed here…', 'amnesty')} - value={embedUrl} - onChange={() => setEmbedUrl(inputRef.current.value)} - /> - <Button isLarge isPrimary onClick={embed}> - {/* translators: [admin] */ __('Embed', 'amnesty')} - </Button> - <Button isLarge onClick={() => setIsPreviewing(!previewing)}> - {previewing - ? /* translators: [admin] */ __('Hide Preview', 'amnesty') - : /* translators: [admin] */ __('Preview', 'amnesty')} - </Button> - </div> - {previewing && httpsOnly(attributes.iframeUrl) && ( - <div className="iframeButton-iframeWrapper"> - <iframe src={httpsOnly(attributes.iframeUrl)} height={attributes.iframeHeight}></iframe> - </div> - )} - </Fragment> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/iframe-button/index.jsx b/private/src/scripts/editor/blocks/iframe-button/index.jsx deleted file mode 100644 index 786a32c3..00000000 --- a/private/src/scripts/editor/blocks/iframe-button/index.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/iframe-button', { - // translators: [admin] - title: __('Iframe Button', 'amnesty'), - // translators: [admin] - description: __('A button which, when clicked, will toggle visibility of an iframe', 'amnesty'), - icon: 'shortcode', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Iframe', 'amnesty'), - // translators: [admin] - __('Button', 'amnesty'), - ], - attributes: { - alignment: { - type: 'string', - default: 'none', - }, - iframeUrl: { - type: 'string', - }, - iframeHeight: { - type: 'number', - default: 760, - }, - buttonText: { - type: 'string', - }, - title: { - type: 'string', - }, - }, - supports: { - className: false, - defaultStylePicker: false, - }, - styles: [ - { - name: 'default', - // translators: [admin] - label: __('Primary', 'amnesty'), - isDefault: true, - }, - { - name: 'dark', - // translators: [admin] - label: __('Dark', 'amnesty'), - }, - ], - - edit: DisplayComponent, - - // Returns null due to the component being rendered server side - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/iframe/DisplayComponent.jsx b/private/src/scripts/editor/blocks/iframe/DisplayComponent.jsx deleted file mode 100644 index 3ef44dca..00000000 --- a/private/src/scripts/editor/blocks/iframe/DisplayComponent.jsx +++ /dev/null @@ -1,195 +0,0 @@ -import { httpsOnly } from '../utils'; - -const { InspectorControls, RichText, BlockControls, AlignmentToolbar } = wp.blockEditor; -const { Button, PanelBody, Placeholder, TextControl } = wp.components; -const { Component, Fragment, createRef } = wp.element; -const { __ } = wp.i18n; - -class DisplayComponent extends Component { - constructor(...args) { - super(...args); - this.inputRef = createRef(); - this.updateEmbedUrl = this.createUpdateAttribute('embedUrl'); - } - - /** - * Higher order component that takes the attribute key, - * this then returns a function which takes a value, - * when called it updates the attribute with the key. - * @param key - * @returns {function(*): *} - */ - createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - onSubmit = (event) => { - event.preventDefault(); - this.updateEmbedUrl(httpsOnly(this.inputRef.current.value)); - }; - - doReset = (event) => { - event.preventDefault(); - this.updateEmbedUrl(''); - }; - - placeholder = () => { - // translators: [admin] - const label = __('Iframe URL', 'amnesty'); - - return ( - <Placeholder label={label} className="wp-block-embed"> - <form onSubmit={this.onSubmit}> - <input - ref={this.inputRef} - type="url" - className="components-placeholder__input" - aria-label={label} - // translators: [admin] - placeholder={__('Enter URL to embed here…', 'amnesty')} - /> - <Button isLarge type="submit"> - {/* translators: [admin] */ __('Embed', 'amnesty')} - </Button> - </form> - </Placeholder> - ); - }; - - embedContainer = () => { - const { attributes, isSelected } = this.props; - const width = parseInt(attributes.width, 10) || 0; - const height = parseInt(attributes.height, 10) || 0; - let minHeight = parseInt(attributes.minHeight, 10) || height; - let minWidth = parseInt(attributes.minWidth, 10) || width; - - if (!width && !height) { - minHeight = Math.max(minHeight, 350); - } - - if (!width) { - minWidth = `100%`; - } else { - minWidth = `${width}px`; - } - - return ( - <figure className="wp-block-embed"> - <div - className={`fluid-iframe ${attributes.alignment ? attributes.alignment : ''}`} - style={{ - minHeight, - }} - > - <iframe - src={httpsOnly(attributes.embedUrl)} - style={{ - height: `${minHeight}px`, - width: minWidth, - }} - /> - </div> - <div className={`iframe-caption ${attributes.alignment ? attributes.alignment : ''}`}> - {(attributes.caption || isSelected) && ( - <RichText - tagName="figcaption" - // translators: [admin] - placeholder={__('Write caption…', 'amnesty')} - value={attributes.caption} - onChange={this.createUpdateAttribute('caption')} - inlineToolbar - format="string" - /> - )} - </div> - </figure> - ); - }; - - render() { - const { attributes, setAttributes } = this.props; - - const { alignment } = attributes; - - const controls = ( - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <TextControl - // translators: [admin] - label={__('Width', 'amnesty')} - value={attributes.width} - type="number" - step={10} - help={ - !attributes.width && attributes.height - ? // translators: [admin] - __('Required when specifying a height', 'amnesty') - : '' - } - onChange={this.createUpdateAttribute('width')} - /> - <TextControl - // translators: [admin] - label={__('Height', 'amnesty')} - value={attributes.height} - type="number" - step={10} - help={ - !attributes.height && attributes.width - ? // translators: [admin] - __('Required when specifying a width', 'amnesty') - : '' - } - onChange={this.createUpdateAttribute('height')} - /> - <TextControl - // translators: [admin] - label={__('Minimum Height', 'amnesty')} - value={attributes.minHeight} - type="number" - step={10} - min={0} - max={1000} - help={ - !attributes.height && !attributes.width - ? // translators: [admin] - __('Required if not using width/height, optional otherwise', 'amnesty') - : '' - } - onChange={this.createUpdateAttribute('minHeight')} - /> - <hr /> - <TextControl - // translators: [admin] - label={__('Iframe Title', 'amnesty')} - // translators: [admin] - help={__('Set the text alternative for the iframe', 'amnesty')} - value={attributes.title} - onChange={this.createUpdateAttribute('title')} - /> - <hr /> - {attributes.embedUrl && ( - <Button onClick={this.doReset} isPrimary> - {/* translators: [admin] */ __('Reset Embed Url', 'amnesty')} - </Button> - )} - </PanelBody> - </InspectorControls> - ); - - return ( - <Fragment> - {controls} - <BlockControls> - <AlignmentToolbar - value={alignment} - onChange={(newAlignments) => setAttributes({ alignment: newAlignments })} - /> - </BlockControls> - <div style={{ padding: '1px' }}> - {attributes.embedUrl ? this.embedContainer() : this.placeholder()} - </div> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/iframe/index.jsx b/private/src/scripts/editor/blocks/iframe/index.jsx deleted file mode 100644 index 5a0fe48a..00000000 --- a/private/src/scripts/editor/blocks/iframe/index.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-responsive-iframe', { - // translators: [admin] - title: __('Responsive Iframe', 'amnesty'), - icon: 'welcome-widgets-menus', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Iframe', 'amnesty'), - // translators: [admin] - __('Responsive', 'amnesty'), - // translators: [admin] - __('Fluid', 'amnesty'), - ], - attributes: { - embedUrl: { - type: 'string', - }, - height: { - type: 'string', - }, - minHeight: { - type: 'string', - }, - width: { - type: 'string', - }, - caption: { - type: 'string', - }, - alignment: { - type: 'string', - }, - title: { - type: 'string', - }, - }, - - edit: DisplayComponent, - - // Returns null due to the component being rendered server side - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/key-facts/fact.jsx b/private/src/scripts/editor/blocks/key-facts/fact.jsx deleted file mode 100644 index e5013270..00000000 --- a/private/src/scripts/editor/blocks/key-facts/fact.jsx +++ /dev/null @@ -1,59 +0,0 @@ -const { RichText } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/key-fact', { - title: 'Key Fact', - parent: ['amnesty-core/key-facts'], - category: 'layout', - supports: { - className: false, - }, - - attributes: { - title: { - type: 'string', - }, - content: { - type: 'string', - }, - }, - - edit({ attributes, setAttributes }) { - const { title, content } = attributes; - - return ( - <div className="factBlock-item"> - <RichText - className="factBlock-itemTitle" - tagName="h3" - // translators: [admin] - placeholder={__('(Insert Title)', 'amnesty')} - value={title} - allowedFormats={[]} - onChange={(newTitle) => setAttributes({ title: newTitle })} - /> - <RichText - className="factBlock-itemContent" - tagName="p" - // translators: [admin] - placeholder={__('(Insert Content)', 'amnesty')} - value={content} - allowedFormats={[]} - onChange={(newContent) => setAttributes({ content: newContent })} - /> - </div> - ); - }, - - save({ attributes }) { - const { title, content } = attributes; - - return ( - <li className="factBlock-item"> - <h3 className="factBlock-itemTitle">{title}</h3> - <p className="factBlock-itemContent">{content}</p> - </li> - ); - }, -}); diff --git a/private/src/scripts/editor/blocks/key-facts/index.jsx b/private/src/scripts/editor/blocks/key-facts/index.jsx deleted file mode 100644 index b9cb24fd..00000000 --- a/private/src/scripts/editor/blocks/key-facts/index.jsx +++ /dev/null @@ -1,113 +0,0 @@ -import classnames from 'classnames'; -import memoize from 'memize'; -import './fact.jsx'; - -const { times } = lodash; -const { InnerBlocks, InspectorControls, RichText } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { PanelBody, RangeControl, SelectControl } = wp.components; -const { Fragment } = wp.element; -const { __ } = wp.i18n; - -const ALLOWED_BLOCKS = ['amnesty-core/key-fact']; -const getLayoutTemplate = memoize((blocks) => times(blocks, () => ALLOWED_BLOCKS)); - -registerBlockType('amnesty-core/key-facts', { - // translators: [admin] - title: __('Key Facts', 'amnesty'), - // translators: [admin] - description: __('Add a key facts block', 'amnesty'), - icon: 'lightbulb', - category: 'amnesty-core', - supports: { - className: false, - inserter: false, - }, - attributes: { - title: { - type: 'string', - }, - quantity: { - type: 'number', - }, - background: { - type: 'string', - }, - }, - edit({ attributes, setAttributes }) { - const { title, quantity = 2, background = '' } = attributes; - - const classes = classnames('factBlock', { - 'has-background': !!background, - [`has-${background}-background-color`]: !!background, - }); - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <RangeControl - // translators: [admin] - label={__('Quantity', 'amnesty')} - value={quantity} - onChange={(newQuantity) => setAttributes({ quantity: newQuantity })} - min={1} - max={4} - /> - <SelectControl - // translators: [admin] - label={__('Background Colour', 'amnesty')} - value={background} - onChange={(newBgColor) => setAttributes({ background: newBgColor })} - options={[ - // translators: [admin] - { value: '', label: __('None', 'amnesty') }, - // translators: [admin] - { value: 'very-light-gray', label: __('Grey', 'amnesty') }, - ]} - /> - </PanelBody> - </InspectorControls> - <div className={classes}> - <RichText - className="factBlock-title" - tagName="h2" - // translators: [admin] - placeholder={__('(Insert Title)', 'amnesty')} - value={title} - allowedFormats={[]} - onChange={(newTitle) => setAttributes({ title: newTitle })} - format="string" - /> - <InnerBlocks - template={getLayoutTemplate(quantity)} - templateLock="insert" - allowedBlocks={ALLOWED_BLOCKS} - /> - </div> - </Fragment> - ); - }, - - save({ attributes }) { - const { title = '', background = '' } = attributes; - - const classes = classnames('factBlock', { - 'has-background': !!background, - [`has-${background}-background-color`]: !!background, - }); - - const label = title.replace(' ', '-').toLowerCase(); - - return ( - <aside className={classes} aria-labelledby={label}> - <h2 id={label} className="factBlock-title" aria-hidden="true"> - {title} - </h2> - <ol> - <InnerBlocks.Content /> - </ol> - </aside> - ); - }, -}); diff --git a/private/src/scripts/editor/blocks/link-group/DisplayComponent.jsx b/private/src/scripts/editor/blocks/link-group/DisplayComponent.jsx deleted file mode 100644 index f1e12190..00000000 --- a/private/src/scripts/editor/blocks/link-group/DisplayComponent.jsx +++ /dev/null @@ -1,191 +0,0 @@ -import classnames from 'classnames'; - -const { isEqual, isObject } = lodash; -const { BlockAlignmentToolbar, BlockControls, RichText, URLInputButton } = wp.blockEditor; -const { Button, CheckboxControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -/** - * Generate random string key for iterators - */ -const randId = () => - Math.random() - .toString(36) - .replace(/[^a-z]+/g, '') - .substr(2, 10); - -class DisplayComponent extends Component { - state = {}; - - /** - * Save state to props when required - * - * @param {object} prevProps previous component props - * @param {object} prevState previous component state - */ - componentDidUpdate(prevProps, prevState) { - if (isEqual(prevState, this.state)) { - return; - } - - Object.keys(this.state).forEach((key) => { - if (!key.match(/^link-\d+$/)) { - return; - } - - const index = key.replace(/^link-(\d+)$/, '$1'); - this.updateItemProp(index, 'link', this.state[key]); - }); - } - - /** - * Create a new item - * - * @param {object} data any props to assign to new item - */ - static newItem = (data = {}) => ({ - ...{ - key: randId(), - text: '', - link: '', - blank: false, - }, - ...data, - }); - - /** - * Add a link item to the collection - */ - addItem = (data = {}) => { - const { attributes, setAttributes } = this.props; - const { items } = attributes; - - setAttributes({ items: [...items, DisplayComponent.newItem(data)] }); - }; - - /** - * Update a link item property - * - * @param {number} index the current item in the collection - * @param {string} prop the item prop to update - * @param {mixed} value the item prop value to update - */ - updateItemProp = (index, prop, value) => { - const { attributes, setAttributes } = this.props; - const { items } = attributes; - - if (!isObject(items[index])) { - items[index] = DisplayComponent.newItem(); - } - - if (prop !== 'text' || value.indexOf('\n') === -1) { - items[index][prop] = value; - setAttributes({ items: [...items] }); - return; - } - - const texts = value.split('\n'); - items[index][prop] = texts[0]; // eslint-disable-line - setAttributes({ items: [...items] }); - - texts.slice(1).forEach((text) => this.addItem({ text })); - }; - - /** - * Update a link item's link property - * - * @param {number} index the current item in the collection - * @param {string} value the item value to update - */ - updateItemLink = (index, value) => { - this.setState({ [`link-${index}`]: value }); - }; - - /** - * Remote a link item from the collection - * - * @param {number} index the current item in the collection - */ - removeItem = (index) => { - const { attributes, setAttributes } = this.props; - const { items: oldItems } = attributes; - - const items = [...oldItems]; - items.splice(index, 1); - - setAttributes({ items }); - }; - - /** - * Render the component - */ - render() { - const { attributes, className, setAttributes } = this.props; - const classes = classnames(className, { - [`align${attributes.align}`]: attributes.align, - }); - - return ( - <Fragment> - <BlockControls> - <BlockAlignmentToolbar - value={attributes.align} - onChange={(align) => setAttributes({ align })} - /> - </BlockControls> - <aside className={classes}> - <RichText - tagName="h2" - format="string" - // translators: [admin] - placeholder={__('Further Reading', 'amnesty')} - value={attributes.title} - onChange={(title) => setAttributes({ title })} - multiline={false} - withoutInteractiveFormatting={true} - /> - <ul> - {attributes.items.map((item, index) => ( - <li key={item.key}> - <RichText - tagName="span" - format="string" - // translators: [admin] - placeholder={__('Type link', 'amnesty')} - value={item.text} - onChange={(text) => this.updateItemProp(index, 'text', text)} - onRemove={() => this.removeItem(index)} - multiline={false} - preserveWhiteSpace={true} - withoutInteractiveFormatting={true} - /> - <URLInputButton - url={this.state[`link-${index}`]} - onChange={(link) => this.updateItemLink(index, link)} - /> - <CheckboxControl - className="newtab" - // translators: [admin] - label={__('Open in new tab', 'amnesty')} - onChange={(blank) => this.updateItemProp(index, 'blank', blank)} - checked={item.blank} - /> - </li> - ))} - <li> - <Button - label={/* translators: [admin] */ __('Add a link', 'amnesty')} - onClick={() => this.addItem()} - > - {/* translators: [admin] */ __('Add a link', 'amnesty')} - </Button> - </li> - </ul> - </aside> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/link-group/index.jsx b/private/src/scripts/editor/blocks/link-group/index.jsx deleted file mode 100644 index 48e86c1f..00000000 --- a/private/src/scripts/editor/blocks/link-group/index.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/link-group', { - // translators: [admin] - title: __('Link Block', 'amnesty'), - // translators: [admin] - description: __( - 'A collection of links, used for things such as further reading suggestions.', - 'amnesty', - ), - icon: 'list-view', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Links', 'amnesty'), - // translators: [admin] - __('Further Reading', 'amnesty'), - ], - - attributes: { - align: { - type: 'string', - default: '', - }, - title: { - type: 'string', - default: '', - }, - items: { - type: 'array', - default: [], - }, - }, - - deprecated, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/menu/DisplayComponent.jsx b/private/src/scripts/editor/blocks/menu/DisplayComponent.jsx deleted file mode 100644 index 3127f3c5..00000000 --- a/private/src/scripts/editor/blocks/menu/DisplayComponent.jsx +++ /dev/null @@ -1,206 +0,0 @@ -import classnames from 'classnames'; - -const { InspectorControls } = wp.blockEditor; -const { PanelBody, SelectControl } = wp.components; -const { Component, Fragment } = wp.element; -const { compose } = wp.compose; -const { withSelect } = wp.data; -const { __ } = wp.i18n; - -class DisplayComponent extends Component { - static colours = [ - // translators: [admin] - { label: __('White', 'amnesty'), value: '' }, - // translators: [admin] - { label: __('Grey', 'amnesty'), value: 'dark' }, - ]; - - state = { - loadingMenu: false, - errorMenu: false, - loadingList: false, - errorList: false, - // translators: [admin] - list: [{ label: __('Select a menu…', 'amnesty'), value: '' }], - menus: {}, - }; - - componentDidMount() { - if (this.props.attributes.menuId) { - this.fetchMenu(); - } - - if (this.props.attributes.type === 'standard-menu') { - this.fetchList(); - } - } - - componentDidUpdate(prevProps) { - if (prevProps.attributes.type !== this.props.attributes.type) { - if (this.props.attributes.type === 'standard-menu') { - this.fetchList(); - } - } - - if (prevProps.attributes.menuId !== this.props.attributes.menuId) { - this.fetchMenu(); - } - } - - fetchMenu() { - const { menuId } = this.props.attributes; - if (this.state.menus[menuId]) { - return; - } - - this.setState({ loadingMenu: true }); - - wp.apiRequest({ - path: `/amnesty/v1/menu/${menuId}`, - }).then((response) => { - this.setState({ - loadingMenu: false, - menus: { - ...this.state.menus, - [menuId]: response, - }, - }); - }); - } - - fetchList() { - this.setState({ loadingList: true }); - - wp.apiRequest({ - path: '/amnesty/v1/menu', - }).then((response) => { - this.setState({ - loadingList: false, - list: [ - ...this.state.list, - ...response.map((resp) => ({ - label: resp.name, - value: resp.term_id, - })), - ], - }); - }); - } - - renderStandardMenu() { - const { attributes } = this.props; - const { color, menuId } = attributes; - const { loadingMenu, menus = [] } = this.state; - - const containerClasses = classnames('postlist-categoriesContainer', { - [`section--${color}`]: !!color, - }); - - return ( - <Fragment> - {!menuId && ( - <p>{/* translators: [admin] */ __('Select a menu in the sidebar', 'amnesty')}</p> - )} - {menuId && loadingMenu && ( - <p>{/* translators: [admin] */ __('Loading Menu…', 'amnesty')}</p> - )} - {menuId && !loadingMenu && this.state.menus[menuId] && ( - <div className={containerClasses}> - <ul - className="postlist-categories" - dangerouslySetInnerHTML={{ __html: menus[menuId].rendered }} - /> - </div> - )} - </Fragment> - ); - } - - renderInPageMenu() { - const { attributes, sectionAttributes } = this.props; - const { color } = attributes; - - return ( - <Fragment> - <div - className={classnames('postlist-categoriesContainer', { - [`section--${color}`]: !!color, - })} - > - <ul className="postlist-categories"> - {sectionAttributes.map((value, index) => ( - <li key={index}> - <a className="btn btn--white" href={`#${value.sectionId}`}> - {value.sectionName} - </a> - </li> - ))} - </ul> - </div> - </Fragment> - ); - } - - render() { - const { attributes, setAttributes } = this.props; - - return ( - <Fragment> - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - {this.state.loadingList && ( - <p>{/* translators: [admin] */ __('Loading Menus…', 'amnesty')}</p> - )} - <SelectControl - // translators: [admin] - label={__('Menu', 'amnesty')} - // translators: [admin] - help={__('Which type of menu you would like to add to the page', 'amnesty')} - value={attributes.type} - options={[ - // translators: [admin] - { label: __('Standard Menu', 'amnesty'), value: 'standard-menu' }, - // translators: [admin] - { label: __('In-page Menu', 'amnesty'), value: 'inpage-menu' }, - ]} - onChange={(option) => setAttributes({ type: option })} - /> - {attributes.type === 'standard-menu' && ( - <SelectControl - // translators: [admin] - label={__('Menu', 'amnesty')} - options={this.state.list} - disabled={this.state.loadingList} - value={attributes.menuId} - onChange={(menuId) => setAttributes({ menuId: parseInt(menuId, 10) })} - /> - )} - <SelectControl - // translators: [admin] - label={__('Background Colour', 'amnesty')} - options={DisplayComponent.colours} - value={attributes.color} - onChange={(color) => setAttributes({ color })} - /> - </PanelBody> - </InspectorControls> - {attributes.type === 'standard-menu' && this.renderStandardMenu()} - {attributes.type === 'inpage-menu' && this.renderInPageMenu()} - </Fragment> - ); - } -} - -const applyWithSelect = withSelect((select) => { - const allBlocks = select('core/block-editor').getBlocks(); - const sectionBlocksWithIds = allBlocks.filter((block) => block.attributes.sectionId); - const sectionAttributes = sectionBlocksWithIds.map((a) => a.attributes); - - return { - allBlocks, - sectionBlocksWithIds, - sectionAttributes, - }; -}); - -export default compose(applyWithSelect)(DisplayComponent); diff --git a/private/src/scripts/editor/blocks/menu/index.jsx b/private/src/scripts/editor/blocks/menu/index.jsx deleted file mode 100644 index 9ecd06b8..00000000 --- a/private/src/scripts/editor/blocks/menu/index.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-menu', { - // translators: [admin] - title: __('Menu', 'amnesty'), - icon: 'welcome-widgets-menus', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Menu', 'amnesty'), - // translators: [admin] - __('Navigation', 'amnesty'), - ], - attributes: { - menuId: { - type: 'integer', - }, - color: { - type: 'string', - }, - type: { - type: 'string', - default: 'standard-menu', - }, - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/petition-list/PetitionEdit.jsx b/private/src/scripts/editor/blocks/petition-list/PetitionEdit.jsx deleted file mode 100644 index 04595da8..00000000 --- a/private/src/scripts/editor/blocks/petition-list/PetitionEdit.jsx +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable react/display-name */ - -const { InspectorControls } = wp.blockEditor; -const { PanelBody } = wp.components; -const { Component, Fragment } = wp.element; -const { addFilter } = wp.hooks; -const { __ } = wp.i18n; - -class PetitionEdit extends Component { - render() { - addFilter('amnesty-post-list-quantity', 'amnesty/petition-list', (quantity, { style }) => { - if (style === 'petition') { - return 100; - } - - return quantity; - }); - - const { attributes } = this.props; - const { style } = attributes; - return ( - <Fragment> - <InspectorControls> - <PanelBody title={__('Petition Settings', 'amnesty')}>{style}</PanelBody> - </InspectorControls> - </Fragment> - ); - } -} - -export default PetitionEdit; diff --git a/private/src/scripts/editor/blocks/petition-list/index.jsx b/private/src/scripts/editor/blocks/petition-list/index.jsx deleted file mode 100644 index ee23fa2b..00000000 --- a/private/src/scripts/editor/blocks/petition-list/index.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import PetitionEdit from './PetitionEdit.jsx'; -import PostsWrapper from '../post-list/PostsWrapper.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -const postListConfig = { - style: 'petition', -}; - -const PetitionEditCompose = PostsWrapper(PetitionEdit, postListConfig); - -const petitionSlug = window?.postTypes?.petition; - -// the extra attributes are used by the post list HOC - -const blockAttributes = { - type: { - type: 'string', - default: 'category', - }, - style: { - type: 'string', - default: 'petition', - }, - category: { - type: 'string', - }, - categoryRelated: { - type: 'boolean', - }, - amount: { - type: 'int', - }, - custom: { - type: 'array', - }, - selectedPosts: { - type: 'array', - }, - extraStyleOptions: { - type: 'array', - default: [ - { - // translators: [admin] - label: __('Petitions', 'amnesty'), - value: 'petition', - }, - ], - }, - postTypes: { - type: 'object', - default: { - [petitionSlug]: { - // translators: [admin] - name: __('Petitions', 'amnesty'), - rest_base: petitionSlug, - }, - }, - }, - displayTypes: { - type: 'array', - default: [ - { - // translators: [admin] - label: __('Object Selection', 'amnesty'), - value: 'select', - }, - { - // translators: [admin] - label: __('Feed', 'amnesty'), - value: 'feed', - }, - ], - }, -}; - -registerBlockType('amnesty-core/petition-list', { - // translators: [admin] - title: __('Petition List', 'amnesty'), - // translators: [admin] - description: __('Petition list', 'amnesty'), - // translators: [admin] - keywords: [__('Petition', 'amnesty')], - category: 'amnesty-core', - - attributes: blockAttributes, - - edit: PetitionEditCompose, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/post-list/components/DisplayAuthor.jsx b/private/src/scripts/editor/blocks/post-list/components/DisplayAuthor.jsx deleted file mode 100644 index 825159f7..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/DisplayAuthor.jsx +++ /dev/null @@ -1,273 +0,0 @@ -import LinkList from './display/LinkList.jsx'; -import GridItem from './display/GridItem.jsx'; -import * as api from './post-selector/api'; - -const { difference, isString } = lodash; -const { Component } = wp.element; -const { __ } = wp.i18n; - -class DisplayAuthor extends Component { - constructor(...args) { - super(...args); - this.state = { - results: [], - loading: false, - }; - } - - static normaliseAuthor = (author = '[]') => { - let normal = author; - - if (isString(normal)) { - normal = JSON.parse(normal); - } - - if (!Array.isArray(normal)) { - normal = [normal]; - } - - normal = normal.map((val) => { - if (isString(val)) { - return JSON.parse(val); - } - - return val; - }); - - return normal.filter(Boolean); - }; - - componentDidMount() { - if (this.props.authors) { - this.fetchPostsByAuthor(); - } - } - - componentDidUpdate(prevProps) { - if (!prevProps.author && !this.props.authors) { - return; - } - - const prev = DisplayAuthor.normaliseAuthor(prevProps.authors); - const next = DisplayAuthor.normaliseAuthor(this.props.authors); - - if (prev.length !== next.length) { - this.fetchPostsByAuthor(); - return; - } - - let propsAreEquivalent = true; - - next.forEach((a, i) => { - const b = prev[i]; - const aKeys = Object.keys(a); - const bKeys = Object.keys(b); - - if (difference(aKeys, bKeys).length > 0) { - propsAreEquivalent = false; - return; - } - - aKeys.forEach((k) => { - if (a[k] === b[k]) { - return; - } - - propsAreEquivalent = false; - }); - }); - - if (!propsAreEquivalent) { - this.fetchPostsByAuthor(); - } - } - - fetchPostsByAuthor() { - const { authors } = this.props; - - const defaultArgs = { - per_page: 10, - type: 'post', - }; - - const requestArguments = { - ...defaultArgs, - }; - - let value = DisplayAuthor.normaliseAuthor(authors); - - if (!value.length) { - this.setState({ - results: [], - category: [], - }); - return; - } - - this.setState({ - loading: true, - }); - - // We store category as string of an array of objects - // to retain the label for the select box. - value = value.map((v) => v.value).join(','); - - api - .getPostsFromAuthors(requestArguments, value) - .then((data = [], i, xhr) => { // eslint-disable-line - const posts = data.map((p) => { - if (!p.featured_media || p.featured_media < 1) { - return { - ...p, - featured_image: false, - }; - } - - return { - ...p, - // eslint-disable-next-line no-underscore-dangle - featured_image: p._embedded['wp:featuredmedia'][0].source_url || false, - }; - }); - - return { - xhr, - data: posts, - }; - }) - .then(({ data = [] }) => { - this.setState({ - results: DisplayAuthor.alterResults(data), - loading: false, - }); - }); - } - - static strip = (html) => { - const doc = new DOMParser().parseFromString(html, 'text/html'); - return doc.body.textContent || ''; - }; - - static alterResults = (response) => - response.map((resp) => { - // eslint-disable-next-line no-underscore-dangle - const tags = resp._embedded['wp:term'] - .reduce((prev, curr) => [...prev, ...curr], []) - .map((tag) => ({ - title: tag.name, - link: tag.link, - })); - - let featuredImage = false; - - if (resp.featured_media || resp.featured_media > 0) { - // eslint-disable-next-line no-underscore-dangle - featuredImage = resp._embedded['wp:featuredmedia'][0].source_url || false; - } - - let excerpt = DisplayAuthor.strip(resp.excerpt.rendered); - excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; - - return { - id: resp.id, - title: resp.title.rendered, - link: resp.link, - tag: tags.shift(), - excerpt, - featured_image: featuredImage, - date: resp.datePosted, - authorName: resp.authorName, - }; - }); - - render() { - const { style, prefix, showAuthor, showPostDate } = this.props; - const { loading, results } = this.state; - // const category = this.normaliseCategory(this.props.category); - const { authors } = this.props; - const isList = style === 'list'; - const isGrid = style === 'grid'; - const hasResults = results.length > 0; - - if (loading) { - return ( - <div> - <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> - </div> - ); - } - - if (!authors) { - return ( - <div> - <p className="linklist-container"> - {/* translators: [admin] */ __('Select an author.', 'amnesty')} - </p> - </div> - ); - } - - if (!hasResults) { - return ( - <div> - <p className="linklist-container"> - {/* translators: [admin] */ __('No Items found', 'amnesty')} - </p> - </div> - ); - } - - if (isList) { - return ( - <div> - <ul className="linkList linklist-container"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <LinkList - key={`${prefix}-${result.id}`} - {...result} - showAuthor={showAuthor} - showPostDate={showPostDate} - /> - ))} - </ul> - </div> - ); - } - - const hasMany = this.props.amount % 4 === 0 || this.props.amount > 8; - - if (isGrid) { - if (hasMany) { - return ( - <div> - <div className={`grid grid-many`}> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return ( - <div> - <div className={`grid grid-${this.props.amount}`}> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return <div></div>; - } -} - -export default DisplayAuthor; diff --git a/private/src/scripts/editor/blocks/post-list/components/DisplayCategories.jsx b/private/src/scripts/editor/blocks/post-list/components/DisplayCategories.jsx deleted file mode 100644 index 8994c55d..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/DisplayCategories.jsx +++ /dev/null @@ -1,288 +0,0 @@ -import LinkList from './display/LinkList.jsx'; -import GridItem from './display/GridItem.jsx'; -import PetitionItem from './display/PetitionItem.jsx'; - -const { difference, isString } = lodash; -const { Component } = wp.element; -const { __ } = wp.i18n; - -class DisplayCategories extends Component { - constructor(...args) { - super(...args); - this.state = { - results: [], - loading: false, - }; - } - - static normaliseCategory = (category = '[]') => { - let normal = category; - - if (isString(normal)) { - normal = JSON.parse(normal); - } - - if (!Array.isArray(normal)) { - normal = [normal]; - } - - normal = normal.map((val) => { - if (isString(val)) { - return JSON.parse(val); - } - - return val; - }); - - return normal.filter(Boolean); - }; - - componentDidMount() { - this.fetchPostsByCategory(); - } - - componentDidUpdate(prevProps) { - if (!prevProps.category && !this.props.category) { - return; - } - - const prev = DisplayCategories.normaliseCategory(prevProps.category); - const next = DisplayCategories.normaliseCategory(this.props.category); - - if (prev.length !== next.length) { - this.fetchPostsByCategory(); - return; - } - - let propsAreEquivalent = true; - - next.forEach((a, i) => { - const b = prev[i]; - const aKeys = Object.keys(a); - const bKeys = Object.keys(b); - - if (difference(aKeys, bKeys).length > 0) { - propsAreEquivalent = false; - return; - } - - aKeys.forEach((k) => { - if (a[k] === b[k]) { - return; - } - - propsAreEquivalent = false; - }); - }); - - if (!propsAreEquivalent) { - this.fetchPostsByCategory(); - } - } - - fetchPostsByCategory() { - const { category, overrideTypes } = this.props; - - let value = DisplayCategories.normaliseCategory(category); - - if (!value.length) { - this.setState({ - results: [], - category: [], - }); - return; - } - - this.setState({ - loading: true, - }); - - // We store category as string of an array of objects - // to retain the label for the select box. - value = value.map((v) => v.value).join(','); - - let restPath = `/wp/v2/posts?category=${value}&per_page=${this.props.amount}&_embed`; - - if (overrideTypes) { - const overrideBase = `${overrideTypes[Object.keys(overrideTypes)[0]].rest_base}`; - restPath = `/wp/v2/${overrideBase}?category=${value}&per_page=${this.props.amount}&_embed`; - } - - // /posts?filter[category_name]=MyCategory - wp.apiRequest({ - path: restPath, - }).then((results) => { - this.setState({ - results: DisplayCategories.alterResults(results), - loading: false, - }); - }); - } - - static strip = (html) => { - const doc = new DOMParser().parseFromString(html, 'text/html'); - return doc.body.textContent || ''; - }; - - static alterResults = (response) => - response.map((resp) => { - // eslint-disable-next-line no-underscore-dangle - let tags = []; - // eslint-disable-next-line no-underscore-dangle - if (resp._embedded['wp:term']) { - // eslint-disable-next-line no-underscore-dangle - tags = resp._embedded['wp:term'] - .reduce((prev, curr) => [...prev, ...curr], []) - .map((tag) => ({ - title: tag.name, - link: tag.link, - })); - } - - let featuredImage = false; - - if (resp.featured_media || resp.featured_media > 0) { - const { get } = lodash; - featuredImage = - get( - resp, - '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', - ) || get(resp, '_embedded["wp:featuredmedia"][0].source_url', false); - } - - let excerpt = DisplayCategories.strip(resp.excerpt.rendered); - excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; - - return { - id: resp.id, - title: resp.title.rendered, - link: resp.link, - tag: tags.shift(), - excerpt, - featured_image: featuredImage, - date: resp.datePosted, - authorName: resp.authorName, - }; - }); - - render() { - const { style, prefix, showAuthor, showPostDate } = this.props; - const { loading, results } = this.state; - const category = DisplayCategories.normaliseCategory(this.props.category); - - const isList = style === 'list'; - const isGrid = style === 'grid'; - const isPetition = style === 'petition'; - const hasCategory = category.length > 0; - const hasResults = results.length > 0; - - if (loading) { - return ( - <div> - <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> - </div> - ); - } - - if (!hasCategory) { - return ( - <div> - <p className="linklist-container"> - {/* translators: [admin] */ __('Select a category.', 'amnesty')} - </p> - </div> - ); - } - - if (!hasResults) { - return ( - <div> - <p className="linklist-container"> - {/* translators: [admin] */ __('No Items found', 'amnesty')} - </p> - </div> - ); - } - - if (isList) { - return ( - <div> - <ul className="linkList linklist-container"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <LinkList - key={`${prefix}-${result.id}`} - {...result} - showAuthor={showAuthor} - showPostDate={showPostDate} - /> - ))} - </ul> - </div> - ); - } - - const hasMany = this.props.amount % 4 === 0 || this.props.amount > 8; - - if (isGrid) { - if (hasMany) { - return ( - <div> - <div className="grid grid-many"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return ( - <div> - <div className={`grid grid-${this.props.amount}`}> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - if (isPetition) { - if (hasMany) { - return ( - <div> - <div className="grid grid-many petition-grid"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <PetitionItem key={`${this.props.prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return ( - <div> - <div className={`grid grid-${this.props.amount} petition-grid`}> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <PetitionItem key={`${this.props.prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return <div></div>; - } -} - -export default DisplayCategories; diff --git a/private/src/scripts/editor/blocks/post-list/components/DisplayCustom.jsx b/private/src/scripts/editor/blocks/post-list/components/DisplayCustom.jsx deleted file mode 100644 index 2532663d..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/DisplayCustom.jsx +++ /dev/null @@ -1,179 +0,0 @@ -/* eslint-disable camelcase */ -import LinkList from './editable/LinkList.jsx'; -import GridItem from './editable/GridItem.jsx'; -import Appender from './Appender.jsx'; - -const { Component } = wp.element; - -class DisplayCustom extends Component { - static defaultObject = { - excerpt: '', - featured_image_id: '', - featured_image: '', - tag: '', - tagLink: '', - title: '', - titleLink: '', - date: null, - authorName: '', - }; - - // eslint-disable-next-line camelcase - createUpdateMediaAttribute = - (index) => - ({ featured_image_id, featured_image }) => { - if (this.props.custom[index]) { - return this.props.setAttributes({ - custom: [ - ...this.props.custom.map((item, i) => - index === i - ? { - ...item, - featured_image, - featured_image_id, - } - : item, - ), - ], - }); - } - - return this.props.setAttributes({ - custom: [ - ...this.props.custom, - { - ...DisplayCustom.defaultObject, - featured_image, - featured_image_id, - }, - ], - }); - }; - - /** - * Creates a higher order function that takes the current item index - * from there the returned function takes a parameter of key, - * this could be title or any other key from the object - * the final function takes a parameter of value, this changes - * the value of the desired key and in the desired item - * @param index - * @returns {function(*=): Function} - */ - createUpdateAttribute = (index) => (key) => (value) => { - // If the index already exists just update the value for that specific key - // This should always be the case however there was an occasion where - // the default object wasnt created so this is a safe guard - if (this.props.custom[index]) { - return this.props.setAttributes({ - custom: [ - ...this.props.custom.map((item, i) => - index === i - ? { - ...item, - [key]: value, - } - : item, - ), - ], - }); - } - - return this.props.setAttributes({ - custom: [ - ...this.props.custom, - { - ...DisplayCustom.defaultObject, - [key]: value, - }, - ], - }); - }; - - addItem = () => - this.props.setAttributes({ - custom: [...this.props.custom, { ...DisplayCustom.defaultObject }], - }); - - createRemoveItem = (index) => () => - this.props.setAttributes({ - custom: [...this.props.custom.filter((item, i) => i !== index)], - }); - - render() { - let { custom = [] } = this.props; - const { style, prefix } = this.props; - - if (style === 'petition') { - return null; - } - - if (!custom.length) { - custom = [{ ...DisplayCustom.defaultObject }]; - } - - let appender = null; - if (custom.length < 8) { - appender = <Appender onClick={this.addItem} />; - } - - if (style !== 'grid') { - return ( - <div> - <ul className="linkList"> - {custom.map((item, index) => ( - <LinkList - key={`${prefix}-${index}`} - {...item} - showAuthor={this.props.showAuthor} - showPostDate={this.props.showPostDate} - createUpdate={this.createUpdateAttribute(index)} - createRemove={this.createRemoveItem(index)} - /> - ))} - </ul> - {appender} - </div> - ); - } - - const hasMany = custom.length % 4 === 0 || custom.length > 8; - - if (hasMany) { - return ( - <div> - <div className="grid grid-many"> - {custom.map((item, index) => ( - <GridItem - key={`${prefix}-${index}`} - {...item} - createUpdate={this.createUpdateAttribute(index)} - createRemove={this.createRemoveItem(index)} - updateMedia={this.createUpdateMediaAttribute(index)} - /> - ))} - </div> - {appender} - </div> - ); - } - - return ( - <div> - <div className={`grid grid-${custom.length}`}> - {custom.map((item, index) => ( - <GridItem - key={`${prefix}-${index}`} - {...item} - createUpdate={this.createUpdateAttribute(index)} - createRemove={this.createRemoveItem(index)} - updateMedia={this.createUpdateMediaAttribute(index)} - /> - ))} - </div> - {appender} - </div> - ); - } -} - -export default DisplayCustom; diff --git a/private/src/scripts/editor/blocks/post-list/components/DisplayFeed.jsx b/private/src/scripts/editor/blocks/post-list/components/DisplayFeed.jsx deleted file mode 100644 index 6fe1b8c1..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/DisplayFeed.jsx +++ /dev/null @@ -1,218 +0,0 @@ -import LinkList from './display/LinkList.jsx'; -import GridItem from './display/GridItem.jsx'; -import PetitionItem from './display/PetitionItem.jsx'; - -const { get, isString } = lodash; -const { Component } = wp.element; -const { __ } = wp.i18n; - -class DisplayFeed extends Component { - constructor(...args) { - super(...args); - this.state = { - results: [], - loading: false, - }; - } - - static normaliseCategory = (category = '[]') => { - let normal = category; - - if (isString(normal)) { - normal = JSON.parse(normal); - } - - if (!Array.isArray(normal)) { - normal = [normal]; - } - - normal = normal.map((val) => { - if (isString(val)) { - return JSON.parse(val); - } - - return val; - }); - - return normal.filter(Boolean); - }; - - componentDidMount() { - this.fetchPostsByPostType(); - } - - fetchPostsByPostType() { - const { amount, overrideTypes } = this.props; - - const postTypes = []; - - Object.keys(overrideTypes).map((key) => { - postTypes.push(key); - return postTypes; - }); - - if (!postTypes.length) { - this.setState({ - results: [], - types: [], - }); - return; - } - - this.setState({ - loading: true, - }); - - const postString = postTypes.join(', '); - - wp.apiRequest({ - path: `/wp/v2/${postString}?_embed&per_page=${amount}`, - }).then((results) => { - this.setState({ - results: DisplayFeed.alterResults(results), - loading: false, - }); - }); - } - - static strip = (html) => { - const doc = new DOMParser().parseFromString(html, 'text/html'); - return doc.body.textContent || ''; - }; - - static alterResults = (response) => - response.map((resp) => { - const tags = []; - const sources = [ - '_links["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', - '_links["wp:featuredmedia"][0].source_url', - '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', - '_embedded["wp:featuredmedia"][0].source_url', - ]; - - let featuredImage = false; - - sources.forEach((source) => { - featuredImage = featuredImage || get(resp, source, false); - }); - - let excerpt = DisplayFeed.strip(resp.excerpt.rendered); - excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; - - return { - id: resp.id, - title: resp.title.rendered, - link: resp.link, - tag: tags.shift(), - excerpt, - featured_image: featuredImage, - date: resp.datePosted, - authorName: resp.authorName, - }; - }); - - render() { - const { style, prefix, showAuthor, showPostDate } = this.props; - const { loading, results } = this.state; - - const isList = style === 'list'; - const isGrid = style === 'grid'; - const isPetition = style === 'petition'; - const hasResults = results.length > 0; - - if (loading) { - return ( - <div> - <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> - </div> - ); - } - - if (!hasResults) { - return ( - <div> - <p className="linklist-container"> - {/* translators: [admin] */ __('No Items found', 'amnesty')} - </p> - </div> - ); - } - - if (isList) { - return ( - <div> - <ul className="linkList linklist-container"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <LinkList - key={`${prefix}-${result.id}`} - {...result} - showAuthor={showAuthor} - showPostDate={showPostDate} - /> - ))} - </ul> - </div> - ); - } - - const hasMany = this.props.amount % 4 === 0 || this.props.amount > 8; - - if (isGrid) { - if (hasMany) { - return ( - <div> - <div className="grid grid-many"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return ( - <div> - <div className={`grid grid-${this.props.amount}`}> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - if (isPetition) { - if (hasMany) { - return ( - <div> - <div className="grid grid-many petition-grid"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <PetitionItem key={`${this.props.prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return ( - <div className={`grid grid-${results.length} petition-grid`}> - {results.map((result) => ( - <PetitionItem key={`${this.props.prefix}-${result.id}`} {...result} /> - ))} - </div> - ); - } - - return <div></div>; - } -} - -export default DisplayFeed; diff --git a/private/src/scripts/editor/blocks/post-list/components/DisplaySelect.jsx b/private/src/scripts/editor/blocks/post-list/components/DisplaySelect.jsx deleted file mode 100644 index d800dfc8..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/DisplaySelect.jsx +++ /dev/null @@ -1,537 +0,0 @@ -import SelectPreview from './SelectPreview.jsx'; -import PostSelect from './post-selector/PostSelector.jsx'; -import * as api from './post-selector/api'; - -const { Component } = wp.element; - -/** - * Returns a unique array of objects based on a desired key. - * @param {array} arr - array of objects. - * @param {string|int} key - key to filter objects by - */ -export const uniqueBy = (arr, key) => { - const keys = []; - return arr.filter((item) => { - if (keys.indexOf(item[key]) !== -1) { - return false; - } - - return keys.push(item[key]); - }); -}; - -/** - * Returns a unique array of objects based on the id property. - * @param {array} arr - array of objects to filter. - * @returns {*} - */ -export const uniqueById = (arr) => uniqueBy(arr, 'id'); - -/** - * Debounce a function by limiting how often it can run. - * @param {function} func - callback function - * @param {Integer} wait - Time in milliseconds how long it should wait. - * @returns {Function} - */ -export const debounce = (func, wait) => { - let timeout = null; - - return () => { - const context = this; - // eslint-disable-next-line - const args = arguments; - - const later = () => { - func.apply(context, args); - }; - - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; -}; - -/** - * PostSelector Component - */ -class DisplaySelect extends Component { - /** - * Constructor for PostSelector Component. - * Sets up state, and creates bindings for functions. - * @param array args - All arguments. - */ - constructor(...args) { - super(...args); - - this.state = { - filter: '', - filterLoading: false, - filterPosts: [], - initialLoading: false, - loading: false, - pages: {}, - pagesTotal: {}, - paging: false, - posts: [], - type: 'post', - types: [], - taxonomies: [], - taxonomy: '', - terms: [], - term: [], - }; - } - - /** - * When the component mounts it calls this function. - * Fetches posts types, selected posts then makes first call for posts - */ - componentDidMount() { - this.setState({ - loading: true, - initialLoading: true, - }); - - let defaultType; - - if (this.props.overrideTypes) { - Object.keys(this.props.overrideTypes).map((key, index) => { - if (index === 0) { - // this.setState({ type: this.props.overrideTypes[key].rest_base }); - defaultType = key; - } - return key; - }); - - this.setState( - { - types: this.props.overrideTypes, - type: defaultType !== null ? defaultType : 'post', - }, - () => { - this.retrieveSelectedPosts().then(() => { - this.setState({ - initialLoading: false, - }); - this.getPosts().then(() => { - this.setState({ loading: false }); - }); - }); - }, - ); - } else { - api.getPostTypes().then((data) => { - const types = data; - delete types.attachment; - delete types.wp_block; - delete types.sidebar; - - this.setState( - { - types, - }, - () => { - this.retrieveSelectedPosts().then(() => { - this.setState({ - initialLoading: false, - }); - this.getPosts().then(() => { - this.setState({ loading: false }); - }); - }); - }, - ); - }); - } - - // get taxonomies to filter by - api.getTaxonomies().then((items) => { - this.setState({ - taxonomies: items, - }); - }); - } - - /** - * GetPosts wrapper, builds the request argument based state and parameters passed/ - * @param {object} args - desired arguments (can be empty). - * @returns {Promise<T>} - */ - getPosts = (args = {}) => { - const pageKey = this.state.filter ? false : this.state.type; - const { get } = lodash; - const defaultArgs = { - per_page: 10, - type: this.state.type, - search: this.state.filter, - page: this.state.pages[pageKey] || 1, - show_hidden: true, - }; - - const requestArguments = { - ...defaultArgs, - ...args, - }; - - Object.keys(this.state.types).filter((key) => { - if (key === this.state.type) { - requestArguments.restBase = this.state.types[key].rest_base; - } - return this.state.types; - }); - - return api - .getPosts(requestArguments, this.state.taxonomy, this.state.term) - .then((data = [], i, xhr) => { // eslint-disable-line - const posts = data.map((p) => { - if (!p.featured_media || p.featured_media < 1) { - return { - ...p, - featured_image: false, - }; - } - - return { - ...p, - featured_image: - get( - p, - '_embedded["wp:featuredmedia"][0].media_details.sizes["logomark@2x"].source_url', - ) || get(p, '_embedded["wp:featuredmedia"][0].source_url', false), - }; - }); - - return { - xhr, - data: posts, - }; - }) - .then(({ data = [], xhr }) => { - if (requestArguments.search) { - this.setState({ - filterPosts: - requestArguments.page > 1 ? uniqueById([...this.state.filterPosts, ...data]) : data, - pages: { - ...this.state.pages, - filter: requestArguments.page, - }, - pagesTotal: { - ...this.state.pagesTotal, - filter: xhr.getResponseHeader('x-wp-totalpages'), - }, - }); - - return { data, xhr }; - } - - this.setState({ - // was posts: data but causes issue with pagination on the post list, - posts: uniqueById([...this.state.posts, ...data]), - pages: { - ...this.state.pages, - [pageKey]: requestArguments.page, - }, - pagesTotal: { - ...this.state.pagesTotal, - [pageKey]: xhr.getResponseHeader('x-wp-totalpages'), - }, - }); - - // return response to continue the chain - return { data, xhr }; - }); - }; - - /** - * Gets the selected posts by id from the `posts` state object and - * sorts them by their position in the selected array. - * - * @returns Array of objects. - */ - getSelectedPosts = () => { - const { selectedPosts } = this.props; - - const items = this.state.posts - .filter(({ id }) => selectedPosts.indexOf(id) !== -1) - .sort((a, b) => { - const aIndex = this.props.selectedPosts.indexOf(a.id); - const bIndex = this.props.selectedPosts.indexOf(b.id); - - if (aIndex > bIndex) { - return 1; - } - - if (aIndex < bIndex) { - return -1; - } - - return 0; - }); - - return items; - }; - - /** - * Makes the necessary api calls to fetch the selected posts and returns a promise. - * @returns {*} - */ - retrieveSelectedPosts = () => { - const selected = this.props.selectedPosts; - const { types } = this.state; - - if (!selected.length > 0) { - // return a fake promise that auto resolves. - // this possibly needs refactoring. - // eslint-disable-next-line no-promise-executor-return - return new Promise((resolve) => resolve()); - } - - return Promise.all( - Object.keys(types).map((type) => - this.getPosts({ - include: this.props.selectedPosts.join(','), - per_page: 100, - type, - }), - ), - ); - }; - - /** - * Adds desired post id to the selectedPosts List - * @param {Integer} post_id - */ - addPost = (postId) => { - if (this.state.filter) { - const post = this.state.filterPosts.filter((p) => p.id === postId); - const posts = uniqueById([...this.state.posts, ...post]); - - this.setState({ - posts, - }); - } - - this.updateSelectedPosts([...this.props.selectedPosts, postId]); - }; - - /** - * Removes desired post id to the selectedPosts List - * @param {Integer} postId - */ - removePost = (postId) => { - this.updateSelectedPosts([...this.props.selectedPosts].filter((id) => id !== postId)); - }; - - reorderPosts = (posts) => { - const items = Array.from(this.props.selectedPosts); - const [reorderedItem] = items.splice(posts.source.index, 1); - items.splice(posts.destination.index, 0, reorderedItem); - - this.updateSelectedPosts(items); - }; - - /** - * Update the selected posts attributes. - * @param posts - * @returns {*} - */ - updateSelectedPosts = (posts) => { - const uniq = [...new Set(posts)]; - - this.props.setAttributes({ - selectedPosts: [...uniq], - }); - }; - - /** - * Event handler for when the post type select box changes in value. - * @param string type - comes from the event object target. - */ - handlePostTypeChange = ({ target: { value: type = '' } = {} } = {}) => { - this.setState({ type, loading: true }, () => { - // fetch posts, then set loading = false - this.getPosts().then(() => this.setState({ loading: false })); - }); - }; - - /** - * Event handler for when the post type select box changes in value. - * @param string type - comes from the event object target. - */ - handleTaxonomyChange = ({ target: { value: taxonomy = '' } = {} } = {}) => { - const allTerms = api.getTerms(taxonomy); - - allTerms - .then((data) => { - this.setState({ terms: data }); - }) - .then(() => { - this.setState({ taxonomy, loading: true }, () => { - this.getPosts().then(() => this.setState({ loading: false })); - }); - }); - - // this.setState({ taxonomy, loading: true }, () => { - // this.getPosts().then(() => this.setState({ loading: false })); - // }); - }; - - handleTermChange = ({ target: { value: term = '' } = {} } = {}) => { - this.setState({ term, loading: true }, () => { - this.getPosts().then(() => this.setState({ loading: false })); - }); - }; - - /** - * Handles the search box input value - * @param string type - comes from the event object target. - */ - handleInputFilterChange = ({ target: { value: filter = '' } = {} } = {}) => - this.setState( - { - filter, - }, - () => { - if (!filter) { - // remove filtered posts - return this.setState({ filteredPosts: [], filtering: false }); - } - - return this.doPostFilter(); - }, - ); - - /** - * Actual api call for searching for query, this function is debounced in constructor. - */ - doPostFilter = () => { - const { filter = '' } = this.state; - - if (!filter) { - return; - } - - this.setState({ - filtering: true, - filterLoading: true, - }); - - this.getPosts().then(() => { - this.setState({ - filterLoading: false, - }); - }); - }; - - /** - * Handles the pagination of post types. - */ - doPagination = () => { - this.setState({ - paging: true, - }); - - const pageKey = this.state.filter ? 'filter' : this.state.type; - const page = parseInt(this.state.pages[pageKey], 10) + 1 || 2; - - this.getPosts({ page }).then(() => - this.setState({ - paging: false, - }), - ); - }; - - /** - * Strip html tag from the content - * @param {string} html - Current html content - * @returns {string} - */ - static strip = (html) => { - const doc = new DOMParser().parseFromString(html, 'text/html'); - return doc.body.textContent || ''; - }; - - getPreviewPosts() { - const selectedPosts = this.getSelectedPosts(); - - if (!selectedPosts) { - return []; - } - - let tags = []; - const results = selectedPosts.map((resp) => { - // eslint-disable-next-line no-underscore-dangle - if (resp._embedded) { - // eslint-disable-next-line no-underscore-dangle - tags = (resp._embedded['wp:term'] || []) - .reduce((prev, curr) => [...prev, ...curr], []) - .map((tag) => ({ - title: tag.name, - link: tag.link, - })); - } - - let featuredImage = false; - - if (resp.featured_media || resp.featured_media > 0) { - const { get } = lodash; - featuredImage = - get( - resp, - '_embedded["wp:featuredmedia"][0].media_details.sizes["post-half@2x"].source_url', - ) || get(resp, '_embedded["wp:featuredmedia"][0].source_url', false); - } - - let excerpt = DisplaySelect.strip(resp.excerpt.rendered); - - excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : excerpt; - - return { - id: resp.id, - title: resp.title.rendered, - link: resp.link, - tag: tags.shift(), - excerpt, - featured_image: featuredImage, - authorName: resp.authorName, - date: resp.datePosted, - }; - }); - return results; - } - - /** - * Renders the PostSelector component. - */ - render() { - return ( - <div> - {this.props.preview && ( - <SelectPreview - posts={this.getPreviewPosts()} - loading={this.state.initialLoading} - style={this.props.style} - prefix={this.props.prefix} - showAuthor={this.props.showAuthor} - showPostDate={this.props.showPostDate} - /> - )} - {!this.props.preview && ( - <PostSelect - state={this.state} - handleInputFilterChange={this.handleInputFilterChange} - handlePostTypeChange={this.handlePostTypeChange} - getSelectedPosts={this.getSelectedPosts} - removePost={this.removePost} - addPost={this.addPost} - doPagination={this.doPagination} - handleTaxonomyChange={this.handleTaxonomyChange} - handleTermChange={this.handleTermChange} - reorderPosts={this.reorderPosts} - /> - )} - </div> - ); - } -} - -export default DisplaySelect; diff --git a/private/src/scripts/editor/blocks/post-list/components/DisplayTaxonomies.jsx b/private/src/scripts/editor/blocks/post-list/components/DisplayTaxonomies.jsx deleted file mode 100644 index 178aad2d..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/DisplayTaxonomies.jsx +++ /dev/null @@ -1,313 +0,0 @@ -import LinkList from './display/LinkList.jsx'; -import GridItem from './display/GridItem.jsx'; -import * as api from './post-selector/api'; - -const { difference, isString, isEqual } = lodash; -const { Component } = wp.element; -const { __ } = wp.i18n; - -class DisplayTaxonomies extends Component { - constructor(...args) { - super(...args); - this.state = { - results: [], - loading: false, - }; - } - - static normaliseCategory = (category = '[]') => { - let normal = category; - - if (isString(normal)) { - normal = JSON.parse(normal); - } - - if (!Array.isArray(normal)) { - normal = [normal]; - } - - normal = normal.map((val) => { - if (isString(val)) { - return JSON.parse(val); - } - - return val; - }); - - return normal.filter(Boolean); - }; - - componentDidMount() { - if (this.props.taxonomy) { - this.fetchPostsByTaxonomy(); - } - } - - componentDidUpdate(prevProps) { - if (!prevProps.taxonomy && !this.props.taxonomy) { - return; - } - - if (!prevProps.terms && !this.props.terms) { - return; - } - - const prevTaxonomy = prevProps.taxonomy; - const nextTaxonomy = this.props.taxonomy; - - if (!isEqual(prevTaxonomy, nextTaxonomy)) { - this.fetchPostsByTaxonomy(); - } - - const prev = prevProps.terms; - const next = this.props.terms; - - if (!next) { - this.fetchPostsByTaxonomy(); - return; - } - - if (!prev) { - this.fetchPostsByTaxonomy(); - return; - } - - if (prev.length !== next.length || next === null) { - this.fetchPostsByTaxonomy(); - return; - } - - let propsAreEquivalent = true; - - next.forEach((a, i) => { - const b = prev[i]; - const aKeys = Object.keys(a); - const bKeys = Object.keys(b); - - if (difference(aKeys, bKeys).length > 0) { - propsAreEquivalent = false; - return; - } - - aKeys.forEach((k) => { - if (a[k] === b[k]) { - return; - } - - propsAreEquivalent = false; - }); - }); - - if (!propsAreEquivalent) { - this.fetchPostsByTaxonomy(); - } - } - - fetchPostsByTaxonomy() { - const { taxonomy, terms } = this.props; - - const defaultArgs = { - per_page: 10, - type: 'post', - }; - - const requestArguments = { - ...defaultArgs, - }; - - api - .getPostsFromTerms(requestArguments, taxonomy, terms) - // eslint-disable-next-line default-param-last - .then((data = [], i, xhr) => { - const posts = data.map((p) => { - if (!p.featured_media || p.featured_media < 1) { - return { - ...p, - featured_image: false, - }; - } - - return { - ...p, - // eslint-disable-next-line no-underscore-dangle - featured_image: p._embedded['wp:featuredmedia'][0].source_url || false, - }; - }); - - return { - xhr, - data: posts, - }; - }) - .then(({ data = [] }) => { - this.setState({ - results: DisplayTaxonomies.alterResults(data), - loading: false, - }); - }) - .catch(() => { - this.setState({ - results: [], - loading: false, - }); - }); - } - - fetchPostsByCategory() { - const { category } = this.props; - - let value = DisplayTaxonomies.normaliseCategory(category); - - if (!value.length) { - this.setState({ - results: [], - category: [], - }); - return; - } - - this.setState({ - loading: true, - }); - - // We store category as string of an array of objects - // to retain the label for the select box. - value = value.map((v) => v.value).join(','); - - wp.apiRequest({ - path: `/wp/v2/posts/?categories=${value}&_embed`, - }).then((results) => - this.setState({ - results: DisplayTaxonomies.alterResults(results), - loading: false, - }), - ); - } - - static strip = (html) => { - const doc = new DOMParser().parseFromString(html, 'text/html'); - return doc.body.textContent || ''; - }; - - static alterResults = (response) => - response.map((resp) => { - // eslint-disable-next-line no-underscore-dangle - const tags = resp._embedded['wp:term'] - .reduce((prev, curr) => [...prev, ...curr], []) - .map((tag) => ({ - title: tag.name, - link: tag.link, - })); - - let featuredImage = false; - - if (resp.featured_media || resp.featured_media > 0) { - // eslint-disable-next-line no-underscore-dangle - featuredImage = resp._embedded['wp:featuredmedia'][0].source_url || false; - } - - let excerpt = DisplayTaxonomies.strip(resp.excerpt.rendered); - excerpt = excerpt.length > 250 ? `${excerpt.slice(0, 250)}...` : ''; - - return { - id: resp.id, - title: resp.title.rendered, - link: resp.link, - tag: tags.shift(), - excerpt, - featured_image: featuredImage, - authorName: resp.authorName, - date: resp.datePosted, - }; - }); - - render() { - const { style, prefix, showAuthor, showPostDate } = this.props; - const { loading, results } = this.state; - const { taxonomy } = this.props; - const isList = style === 'list'; - const isGrid = style === 'grid'; - const hasResults = results.length > 0; - - if (loading) { - return ( - <div> - <p>{/* translators: [admin] */ __('Loading…', 'amnesty')}</p> - </div> - ); - } - - if (!taxonomy) { - return ( - <div> - <p className="linklist-container"> - {/* translators: [admin] */ __('Select a taxonomy.', 'amnesty')} - </p> - </div> - ); - } - - if (!hasResults) { - return ( - <div> - <p className="linklist-container"> - {/* translators: [admin] */ __('No Items found', 'amnesty')} - </p> - </div> - ); - } - - if (isList) { - return ( - <div> - <ul className="linkList linklist-container"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <LinkList - key={`${prefix}-${result.id}`} - {...result} - showAuthor={showAuthor} - showPostDate={showPostDate} - /> - ))} - </ul> - </div> - ); - } - - const hasMany = this.props.amount % 4 === 0 || this.props.amount > 8; - - if (isGrid) { - if (hasMany) { - return ( - <div> - <div className="grid grid-many"> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return ( - <div> - <div className={`grid grid-${this.props.amount}`}> - {results - .filter((item, i) => i < this.props.amount) - .map((result) => ( - <GridItem key={`${prefix}-${result.id}`} {...result} /> - ))} - </div> - </div> - ); - } - - return <div></div>; - } -} - -export default DisplayTaxonomies; diff --git a/private/src/scripts/editor/blocks/post-list/components/SelectPreview.jsx b/private/src/scripts/editor/blocks/post-list/components/SelectPreview.jsx deleted file mode 100644 index 8c592660..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/SelectPreview.jsx +++ /dev/null @@ -1,74 +0,0 @@ -import LinkList from './display/LinkList.jsx'; -import GridItem from './display/GridItem.jsx'; -import PetitionItem from './display/PetitionItem.jsx'; - -const { __ } = wp.i18n; - -const SelectPreview = ({ loading, posts = [], ...props }) => { - if (loading) { - // translators: [admin] - return <p>{__('Loading…', 'amnesty')}</p>; - } - - if (!posts.length > 0) { - // translators: [admin] - return <p>{__('No Posts.', 'amnesty')}</p>; - } - - const hasMany = posts.length % 4 === 0 || posts.length > 8; - - if (props.style === 'grid') { - if (hasMany) { - return ( - <div className="grid grid-many"> - {posts.map((result) => ( - <GridItem key={`${props.prefix}-${result.id}`} {...result} /> - ))} - </div> - ); - } - - return ( - <div className={`grid grid-${posts.length}`}> - {posts.map((result) => ( - <GridItem key={`${props.prefix}-${result.id}`} {...result} /> - ))} - </div> - ); - } - - if (props.style === 'petition') { - if (hasMany) { - return ( - <div className="grid grid-many petition-grid"> - {posts.map((result) => ( - <PetitionItem key={`${props.prefix}-${result.id}`} {...result} /> - ))} - </div> - ); - } - - return ( - <div className={`grid grid-${posts.length} petition-grid`}> - {posts.map((result) => ( - <PetitionItem key={`${props.prefix}-${result.id}`} {...result} /> - ))} - </div> - ); - } - - return ( - <ul className="linkList"> - {posts.map((result) => ( - <LinkList - key={`${props.prefix}-${result.id}`} - {...result} - showAuthor={props.showAuthor} - showPostDate={props.showPostDate} - /> - ))} - </ul> - ); -}; - -export default SelectPreview; diff --git a/private/src/scripts/editor/blocks/post-list/components/editable/GridItem.jsx b/private/src/scripts/editor/blocks/post-list/components/editable/GridItem.jsx deleted file mode 100644 index f7d703b7..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/editable/GridItem.jsx +++ /dev/null @@ -1,64 +0,0 @@ -const { RichText, URLInputButton, MediaUpload } = wp.blockEditor; -const { IconButton } = wp.components; -const { __ } = wp.i18n; -const { get } = lodash; - -const GridItem = (props) => ( - <article className="grid-item" style={{ backgroundImage: `url(${props.featured_image})` }}> - <div className="grid-itemContent"> - <span className="grid-itemMeta"> - <RichText - tagName="span" - onChange={props.createUpdate('tagText')} - value={props.tagText} - // translators: [admin] - placeholder={__('(Insert Tag)', 'amnesty')} - allowedFormats={[]} - format="string" - /> - <URLInputButton url={props.tagLink} onChange={props.createUpdate('tagLink')} /> - </span> - <h3 className="grid-itemTitle"> - <RichText - tagName="span" - onChange={props.createUpdate('title')} - value={props.title} - // translators: [admin] - placeholder={__('(Insert Title)', 'amnesty')} - allowedFormats={[]} - format="string" - /> - <URLInputButton url={props.titleLink} onChange={props.createUpdate('titleLink')} /> - </h3> - </div> - <div className="linkList-options"> - {props.featured_image_id && props.featured_image_id !== -1 && ( - <IconButton - icon="no-alt" - onClick={() => - props.updateMedia({ - featured_image_id: '', - featured_image: '', - }) - } - > - {/* translators: [admin] */ __('Remove Image', 'amnesty')} - </IconButton> - )} - <MediaUpload - onSelect={({ id, sizes, url }) => - props.updateMedia({ - featured_image_id: id, - featured_image: get(sizes, "['post-half@2x'].url", url), - }) - } - value={props.featured_image_id} - allowedTypes={['image']} - render={({ open }) => <IconButton icon="format-image" onClick={open} />} - /> - <IconButton onClick={props.createRemove} icon="trash" /> - </div> - </article> -); - -export default GridItem; diff --git a/private/src/scripts/editor/blocks/post-list/components/editable/LinkList.jsx b/private/src/scripts/editor/blocks/post-list/components/editable/LinkList.jsx deleted file mode 100644 index 537bfd1f..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/editable/LinkList.jsx +++ /dev/null @@ -1,107 +0,0 @@ -const { RichText, URLInputButton } = wp.blockEditor; -const { Button, DatePicker } = wp.components; -const { useState } = wp.element; -const { __ } = wp.i18n; - -const LinkItem = (props) => { - const [datePickerIsVisible, showDatePicker] = useState(false); - const setDate = props.createUpdate('date'); - - const chooseDate = (value) => { - setDate(value); - showDatePicker(false); - }; - - return ( - <li> - <article className="linkList-item"> - <span className="linkList-itemMeta"> - <RichText - tagName="a" - onChange={props.createUpdate('tagText')} - value={props.tagText} - // translators: [admin] - placeholder={__('Tag Name', 'amnesty')} - allowedFormats={[]} - format="string" - /> - <URLInputButton - url={props.tagLink} - onChange={props.createUpdate('tagLink')} - isPressed={false} - /> - </span> - <h3 className="linkList-itemTitle"> - <RichText - tagName="a" - onChange={props.createUpdate('title')} - value={props.title} - // translators: [admin] - placeholder={__('Insert Title', 'amnesty')} - allowedFormats={[]} - format="string" - /> - <URLInputButton - url={props.titleLink} - onChange={props.createUpdate('titleLink')} - isPressed={false} - /> - </h3> - - <div className="postInfo-container"> - {props.showPostDate && ( - <div className="linkList-itemDate"> - {/* translators: [admin/front] */} - <span className="dateTerm">{__('Date:', 'amnesty')}</span> - {props.date && ( - <span className="dateDescription">{new Date(props.date).toLocaleDateString()}</span> - )} - <Button - icon="calendar-alt" - isPressed={false} - onClick={() => showDatePicker(!datePickerIsVisible)} - /> - <br /> - {/* translators: [admin] */} - <small className="linkList-itemDateData"> - <em>{__('Date may render differently on the site frontend', 'amnesty')}</em> - </small> - {datePickerIsVisible && ( - <div className="linkList-datePicker"> - <DatePicker - className="dateDescription" - currentDate={props.date} - onChange={chooseDate} - /> - </div> - )} - </div> - )} - {props.showAuthor && ( - <p className="linkList-itemAuthor"> - {/* translators: [admin/front] */} - <span className="authorTerm">{__('Author:', 'amnesty')}</span> - <RichText - tagName="span" - className="authorDescription" - value={props.authorName} - onChange={props.createUpdate('authorName')} - multiline={false} - allowedFormats={[]} - format="string" - // translators: [admin] - placeholder={__('Author Name', 'amnesty')} - /> - </p> - )} - </div> - - <div className="linkList-options"> - <Button onClick={props.createRemove} icon="trash" /> - </div> - </article> - </li> - ); -}; - -export default LinkItem; diff --git a/private/src/scripts/editor/blocks/post-list/components/post-selector/Post.jsx b/private/src/scripts/editor/blocks/post-list/components/post-selector/Post.jsx deleted file mode 100755 index f473b383..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/post-selector/Post.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Draggable } from 'react-beautiful-dnd'; -/** - * Post Component. - * - * @param {string} postTitle - Current post title. - * @param {function} clickHandler - this is the handling function for the add/remove function - * @param {Integer} postId - Current post ID - * @param {string|boolean} featured_image - Posts featured image - * @param icon - * - * @returns {*} Post HTML. - */ -export const Post = ({ - title: { rendered: postTitle } = {}, - clickHandler, - id: postId, - featured_image: featuredImage = false, - icon, - index, -}) => { - const style = {}; - if (featuredImage) { - style.backgroundImage = `url("${featuredImage}")`; - } - - const postIdString = postId.toString(); - - return ( - <Draggable key={postId} draggableId={postIdString} index={index}> - {(provided) => ( - <article - ref={provided.innerRef} - {...provided.draggableProps} - {...provided.dragHandleProps} - className="post" - > - <figure className="post-figure" style={style}></figure> - <div className="post-body"> - <h3 className="post-title">{postTitle}</h3> - </div> - {icon && <button onClick={() => clickHandler(postId)}>{icon}</button>} - </article> - )} - </Draggable> - ); -}; - -export default Post; diff --git a/private/src/scripts/editor/blocks/post-list/components/post-selector/PostList.jsx b/private/src/scripts/editor/blocks/post-list/components/post-selector/PostList.jsx deleted file mode 100755 index 28a363cd..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/post-selector/PostList.jsx +++ /dev/null @@ -1,71 +0,0 @@ -import { DragDropContext, Droppable } from 'react-beautiful-dnd'; -import { Post } from './Post.jsx'; - -const { __ } = wp.i18n; - -/** - * PostList Component - * - * @param object props - Component props. - * - * @returns {*} - */ -export const PostList = (props) => { - const { filtered = false, loading = false, posts = [], action = () => {}, icon = null } = props; - - if (loading) { - // translators: [admin] - return <p>{__('Loading Posts…', 'amnesty')}</p>; - } - - if (filtered && posts.length < 1) { - return ( - <div className="post-list"> - <p> - { - /* translators: [admin] */ __( - 'Your query yielded no results, please try again.', - 'amnesty', - ) - } - </p> - </div> - ); - } - - if (!posts || posts.length < 1) { - return <p>{/* translators: [admin] */ __('No Posts.', 'amnesty')}</p>; - } - - function handleOnDragEnd(result) { - props.reorderPosts(result); - } - - return ( - <div className="post-list"> - <DragDropContext onDragEnd={handleOnDragEnd}> - <Droppable droppableId="posts"> - {(provided) => ( - <div {...provided.droppableProps} ref={provided.innerRef}> - {posts.map((post, index) => ( - <Post key={post.id} {...post} index={index} clickHandler={action} icon={icon} /> - ))} - {provided.placeholder} - </div> - )} - </Droppable> - </DragDropContext> - {props.canPaginate ? ( - <button onClick={props.doPagination} disabled={props.paging}> - {props.paging - ? // translators: [admin] - __('Loading…', 'amnesty') - : // translators: [admin] - __('Load More', 'amnesty')} - </button> - ) : null} - </div> - ); -}; - -export default PostList; diff --git a/private/src/scripts/editor/blocks/post-list/components/post-selector/PostSelector.jsx b/private/src/scripts/editor/blocks/post-list/components/post-selector/PostSelector.jsx deleted file mode 100644 index 7348a03d..00000000 --- a/private/src/scripts/editor/blocks/post-list/components/post-selector/PostSelector.jsx +++ /dev/null @@ -1,135 +0,0 @@ -import { PostList } from './PostList.jsx'; - -const { BlockIcon } = wp.blockEditor; -const { __ } = wp.i18n; - -const PostSelector = (props) => { - const isFiltered = props.state.filtering; - - const postList = - isFiltered && !props.state.filterLoading - ? props.state.filterPosts - : props.state.posts.filter((post) => post.type === props.state.type); - - const pageKey = props.state.filter ? 'filter' : props.state.type; - const canPaginate = (props.state.pages[pageKey] || 1) < props.state.pagesTotal[pageKey]; - - const addIcon = props.getSelectedPosts().length >= 100 ? null : <BlockIcon icon="plus" />; - const removeIcon = <BlockIcon icon="minus" />; - - return ( - <div className="wp-block-bigbite-postlist"> - <div className="post-selector"> - <div className="post-selectorHeader"> - <div className="searchbox"> - <label htmlFor="searchinput"> - <BlockIcon icon="search" /> - <input - id="searchinput" - type="search" - // translators: [admin] - placeholder={__('Please enter your search query…', 'amnesty')} - value={props.state.filter} - onChange={props.handleInputFilterChange} - /> - </label> - </div> - <div className="filter"> - <label htmlFor="options"> - {/* translators: [admin] */ __('Post Type:', 'amnesty')}{' '} - </label> - <select name="options" id="options" onChange={props.handlePostTypeChange}> - {props.state.types.length < 1 ? ( - // translators: [admin] - <option value="">{__('Loading…', 'amnesty')}</option> - ) : ( - Object.keys(props.state.types).map((key) => ( - <option key={key} value={key}> - {props.state.types[key].name} - </option> - )) - )} - </select> - <label htmlFor="options"> - {/* translators: [admin] */ __('Taxonomy:', 'amnesty')}{' '} - </label> - <select name="options" id="options" onChange={props.handleTaxonomyChange}> - {props.state.taxonomies.length < 1 ? ( - // translators: [admin] - <option value="">{__('Loading…', 'amnesty')}</option> - ) : ( - Object.keys(props.state.taxonomies).map((key, index) => { - if (index === 0) { - return ( - <> - <option value=""> - {/* translators: [admin] */ __('Select Taxonomy', 'amnesty')} - </option> - <option key={key} value={props.state.taxonomies[key].rest_base}> - {props.state.taxonomies[key].name} - </option> - </> - ); - } - return ( - <option key={key} value={props.state.taxonomies[key].rest_base}> - {props.state.taxonomies[key].name} - </option> - ); - }) - )} - </select> - <label htmlFor="options">{/* translators: [admin] */ __('Terms:', 'amnesty')} </label> - <select name="options" id="options" onChange={props.handleTermChange}> - {props.state.terms.length < 1 ? ( - // translators: [admin] - <option value="">{__('No taxonomy selected', 'amnesty')}</option> - ) : ( - Object.keys(props.state.terms).map((key, index) => { - if (index === 0) { - return ( - <> - <option value=""> - {/* translators: [admin] */ __('Select Term', 'amnesty')} - </option> - <option key={key} value={props.state.terms[key].id}> - {props.state.terms[key].name} - </option> - </> - ); - } - return ( - <option key={key} value={props.state.terms[key].id}> - {props.state.terms[key].name} - </option> - ); - }) - )} - </select> - </div> - </div> - <div className="post-selectorContainer"> - <PostList - posts={postList} - loading={props.state.initialLoading || props.state.loading || props.state.filterLoading} - filtered={isFiltered} - action={props.addPost} - paging={props.state.paging} - canPaginate={canPaginate} - doPagination={props.doPagination} - icon={addIcon} - /> - <PostList - posts={props.getSelectedPosts()} - loading={props.state.initialLoading} - action={props.removePost} - icon={removeIcon} - reorderPosts={props.reorderPosts} - /> - </div> - </div> - </div> - ); -}; - -export default PostSelector; diff --git a/private/src/scripts/editor/blocks/post-list/index.jsx b/private/src/scripts/editor/blocks/post-list/index.jsx deleted file mode 100644 index e2c5ff31..00000000 --- a/private/src/scripts/editor/blocks/post-list/index.jsx +++ /dev/null @@ -1,99 +0,0 @@ -import PostListEdit from './PostListEdit.jsx'; -import PostsWrapper from './PostsWrapper.jsx'; - -const { assign } = lodash; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -const postListConfig = {}; - -const PostsEditCompose = PostsWrapper(PostListEdit, postListConfig); - -const blockAttributes = { - type: { - type: 'string', - default: 'category', - }, - style: { - type: 'string', - default: 'list', - }, - category: { - type: 'string', - }, - categoryRelated: { - type: 'boolean', - }, - amount: { - type: 'int', - }, - custom: { - type: 'array', - }, - selectedPosts: { - type: 'array', - }, - taxonomyFilters: { - type: 'array', - }, - taxonomy: { - type: 'object', - }, - terms: { - type: 'array', - default: [], - }, - authors: { - type: 'string', - }, - displayAuthor: { - type: 'boolean', - default: false, - }, - displayPostDate: { - type: 'boolean', - default: false, - }, -}; - -registerBlockType('amnesty-core/block-list', { - // translators: [admin] - title: __('Post List', 'amnesty'), - icon: 'admin-post', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('List', 'amnesty'), - // translators: [admin] - __('post-list', 'amnesty'), - // translators: [admin] - __('Posts', 'amnesty'), - ], - supports: { - multiple: true, - }, - attributes: blockAttributes, - - deprecated: [ - { - attributes: blockAttributes, - save: () => null, - migrate(attributes) { - if (!attributes.category) { - return attributes; - } - - let { category } = attributes; - - category = JSON.stringify([JSON.parse(category)]); - - return assign({}, attributes, { category }); - }, - }, - ], - - edit: PostsEditCompose, - - // Returns null due to the component being rendered server side - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/post-meta/DisplayComponent.jsx b/private/src/scripts/editor/blocks/post-meta/DisplayComponent.jsx deleted file mode 100644 index e1611f50..00000000 --- a/private/src/scripts/editor/blocks/post-meta/DisplayComponent.jsx +++ /dev/null @@ -1,114 +0,0 @@ -/* eslint-disable @wordpress/i18n-text-domain */ -/** - * External dependencies - */ -import classnames from 'classnames'; - -/** - * WordPress dependencies - */ -const { useEntityProp, store: coreStore } = wp.coreData; -const { AlignmentControl, BlockControls, InspectorControls, useBlockProps } = wp.blockEditor; -const { PanelBody, SelectControl, ToggleControl } = wp.components; -const { useSelect } = wp.data; -const { useMemo } = wp.element; -const { applyFilters } = wp.hooks; -const { __, sprintf } = wp.i18n; - -/** - * Format meta keys for selection - * - * @param {Object} rawMeta the meta for a post - * - * @returns {Array<Object>} - */ -function formatMetaKeys(rawMeta) { - const formatted = []; - - Object.keys(rawMeta).forEach((key) => { - const label = key - .replace(/[_-]/g, ' ') - .trim() - .split(' ') - .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - - formatted.push({ label, value: key }); - }); - - return formatted.sort((a, b) => a.label.charCodeAt(0) - b.label.charCodeAt(0)); -} - -export default function DisplayComponent({ attributes, context, setAttributes }) { - const { isLink, isSingle } = attributes; - const { postId, postType: postTypeSlug } = context; - - const blockProps = useBlockProps({ - className: classnames({ [`has-text-align-${attributes.textAlign}`]: attributes.textAlign }), - }); - - const [meta] = useEntityProp('postType', postTypeSlug, 'meta', postId); - const metaKeys = useMemo(() => formatMetaKeys(meta), [meta]); - const postType = useSelect( - (select) => (postTypeSlug ? select(coreStore).getPostType(postTypeSlug) : null), - [postTypeSlug], - ); - - let metaValue = `<${__('Select a meta key', 'amnesty')}>`; - if (attributes.metaKey && Object.hasOwnProperty.call(meta, attributes.metaKey)) { - metaValue = Array.isArray(meta[attributes.metaKey]) - ? meta[attributes.metaKey].join(', ') - : meta[attributes.metaKey]; - } - - metaValue = applyFilters( - 'amnesty-core/post-meta/meta-value', - metaValue, - postId, - postTypeSlug, - attributes.metaKey, - ); - - return ( - <> - <BlockControls group="block"> - <AlignmentControl - value={attributes.textAlign} - onChange={(textAlign) => setAttributes({ textAlign })} - /> - </BlockControls> - - <InspectorControls> - <PanelBody title={__('Settings', 'default')}> - <SelectControl - label={__('Choose a meta key', 'amnesty')} - value={attributes.metaKey} - options={[{ label: __('None', 'default'), value: '' }, ...metaKeys]} - onChange={(metaKey) => setAttributes({ metaKey })} - /> - <ToggleControl - label={__('Does this meta key have a single value?', 'amnesty')} - checked={isSingle} - onChange={() => setAttributes({ isSingle: !isSingle })} - /> - <ToggleControl - __nextHasNoMarginBottom - label={ - postType?.labels.singular_name - ? sprintf( - // translators: %s: Name of the post type e.g: "post". - __('Link to %s', 'default'), - postType.labels.singular_name.toLowerCase(), - ) - : __('Link to post', 'default') - } - onChange={() => setAttributes({ isLink: !isLink })} - checked={isLink} - /> - </PanelBody> - </InspectorControls> - - <div {...blockProps}>{metaValue}</div> - </> - ); -} diff --git a/private/src/scripts/editor/blocks/post-meta/block.json b/private/src/scripts/editor/blocks/post-meta/block.json deleted file mode 100644 index e373e2d1..00000000 --- a/private/src/scripts/editor/blocks/post-meta/block.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 3, - "name": "amnesty-core/post-meta", - "title": "Meta", - "category": "theme", - "description": "Display post meta for an entry such as a post or page.", - "textdomain": "amnesty", - "ancestor": ["core/query"], - "attributes": { - "textAlign": { - "type": "string" - }, - "format": { - "type": "string" - }, - "isLink": { - "type": "boolean", - "default": false - }, - "displayType": { - "type": "string" - }, - "metaKey": { - "type": "string" - }, - "isSingle": { - "type": "boolean", - "default": true - } - }, - "usesContext": ["postId", "postType"], - "example": { - "viewportWidth": 350 - }, - "supports": { - "inserter": true, - "html": false, - "color": { - "gradients": true, - "link": true, - "__experimentalDefaultControls": { - "background": true, - "text": true, - "link": true - } - }, - "spacing": { - "margin": true, - "padding": true - }, - "typography": { - "fontSize": true, - "lineHeight": true, - "__experimentalFontFamily": true, - "__experimentalFontWeight": true, - "__experimentalFontStyle": true, - "__experimentalTextTransform": true, - "__experimentalTextDecoration": true, - "__experimentalLetterSpacing": true, - "__experimentalDefaultControls": { - "fontSize": true - } - }, - "interactivity": { - "clientNavigation": true - }, - "__experimentalBorder": { - "radius": true, - "color": true, - "width": true, - "style": true, - "__experimentalDefaultControls": { - "radius": true, - "color": true, - "width": true, - "style": true - } - } - } -} diff --git a/private/src/scripts/editor/blocks/post-meta/index.jsx b/private/src/scripts/editor/blocks/post-meta/index.jsx deleted file mode 100644 index 03368ca0..00000000 --- a/private/src/scripts/editor/blocks/post-meta/index.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import metadata from './block.json'; - -const { registerBlockType } = wp.blocks; - -registerBlockType(metadata.name, { - ...metadata, - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/raw-code/DisplayComponent.jsx b/private/src/scripts/editor/blocks/raw-code/DisplayComponent.jsx deleted file mode 100644 index 455aa45f..00000000 --- a/private/src/scripts/editor/blocks/raw-code/DisplayComponent.jsx +++ /dev/null @@ -1,100 +0,0 @@ -const { PlainText, BlockControls, transformStyles } = wp.blockEditor; -const { Component } = wp.element; -const { __ } = wp.i18n; -const { withSelect } = wp.data; -const { ToolbarButton, Disabled, SandBox, ToolbarGroup } = wp.components; - -class DisplayComponent extends Component { - state = { - isPreview: false, - styles: [], - }; - - componentDidMount() { - const { styles } = this.props; - - // Default styles used to unset some of the styles - // that might be inherited from the editor style. - const defaultStyles = ` - html,body,:root { - margin: 0 !important; - padding: 0 !important; - overflow: visible !important; - min-height: auto !important; - } - `; - - this.setState({ - styles: [defaultStyles, ...transformStyles(styles)], - }); - } - - switchToPreview = () => { - this.setState({ isPreview: true }); - }; - - switchToHTML = () => { - this.setState({ isPreview: false }); - }; - - render() { - const { attributes, setAttributes } = this.props; - const { isPreview, styles } = this.state; - - return ( - <div className="wp-block-html"> - <BlockControls> - <ToolbarGroup> - <ToolbarButton - className="components-tab-button" - isPressed={!isPreview} - onClick={this.switchToHTML} - > - <span>HTML</span> - </ToolbarButton> - <ToolbarButton - className="components-tab-button" - isPressed={isPreview} - onClick={this.switchToPreview} - > - <span>{/* translators: [admin] */ __('Preview', 'amnesty')}</span> - </ToolbarButton> - </ToolbarGroup> - </BlockControls> - <Disabled.Consumer> - {() => - isPreview ? ( - <> - <SandBox html={attributes.content} styles={styles} /> - {/* - An overlay is added when the block is not selected in order to register click events. - Some browsers do not bubble up the clicks from the sandboxed iframe, which makes it - difficult to reselect the block. - */} - {!this.props.isSelected && ( - <div className="block-library-html__preview-overlay"></div> - )} - </> - ) : ( - <PlainText - style={{ fontFamily: 'monospace' }} - value={attributes.content} - onChange={(content) => setAttributes({ content })} - // translators: [admin] - placeholder={__('Write HTML…', 'amnesty')} - // translators: [admin] - aria-label={__('HTML', 'amnesty')} - /> - ) - } - </Disabled.Consumer> - </div> - ); - } -} -export default withSelect((select) => { - const { getSettings } = select('core/block-editor'); - return { - styles: getSettings().styles, - }; -})(DisplayComponent); diff --git a/private/src/scripts/editor/blocks/raw-code/index.jsx b/private/src/scripts/editor/blocks/raw-code/index.jsx deleted file mode 100644 index b944d9b8..00000000 --- a/private/src/scripts/editor/blocks/raw-code/index.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { RawHTML } = wp.element; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/code', { - // translators: [admin] - title: __('Raw Code', 'amnesty'), - category: 'amnesty-core', - supports: { - className: false, - html: false, - }, - attributes: { - content: { - type: 'string', - source: 'html', - }, - }, - edit: DisplayComponent, - save({ attributes }) { - const { content } = attributes; - - return <RawHTML>{content}</RawHTML>; - }, -}); diff --git a/private/src/scripts/editor/blocks/regions/DisplayComponent.jsx b/private/src/scripts/editor/blocks/regions/DisplayComponent.jsx deleted file mode 100644 index 1c3172e6..00000000 --- a/private/src/scripts/editor/blocks/regions/DisplayComponent.jsx +++ /dev/null @@ -1,244 +0,0 @@ -import classnames from 'classnames'; - -const { each, filter, head, isEmpty, map } = lodash; -const { apiFetch } = wp; -const { BlockAlignmentToolbar, BlockControls, InspectorControls, RichText } = wp.blockEditor; -const { PanelBody, RangeControl, SelectControl, ToggleControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; -const { addQueryArgs } = wp.url; - -const List = ({ terms = [], depth = 0, maxDepth }) => ( - <ul className={depth === 0 ? 'listItems' : 'children'}> - {Array.from(terms).map((term) => ( - <li key={term.id} className={term.children ? 'has-children' : null}> - <span>{term.name}</span> - {depth < maxDepth && <List terms={term.children} depth={depth + 1} maxDepth={maxDepth} />} - </li> - ))} - </ul> -); - -const unflatten = (list, parent = { id: 0 }, tree = []) => { - const children = filter(list, (item) => item.parent === parent.id); - - if (!isEmpty(children)) { - if (parent.id === 0) { - // eslint-disable-next-line no-param-reassign - tree = children; - } else { - // eslint-disable-next-line no-param-reassign - parent.children = children; - } - - each(children, (item) => unflatten(list, item)); - } - - return tree; -}; - -export default class DisplayComponent extends Component { - state = { - taxonomies: [], - options: [], - current: {}, - terms: [], - cache: {}, - }; - - componentDidMount() { - const { taxonomy } = this.props.attributes; - - apiFetch({ path: '/wp/v2/taxonomies/' }).then((rawTaxonomies) => { - const taxonomies = filter(rawTaxonomies, (t) => t.amnesty); - const current = head(filter(taxonomies, (t) => t.slug === taxonomy)); - const options = map(taxonomies, (tax) => ({ label: tax.name, value: tax.slug })); - this.setState({ current, options, taxonomies }); - }); - } - - componentDidUpdate(prevProps, prevState) { - const prevDepth = prevProps.attributes.depth; - const prevTax = prevProps.attributes.taxonomy; - const nextTax = this.props.attributes.taxonomy; - const prevRegionsOnly = prevProps.attributes.regionsOnly; - const { regionsOnly, depth } = this.props.attributes; - const { current, taxonomies } = this.state; - - if (!nextTax) { - return; - } - - if (prevTax !== nextTax) { - const currentTax = head(filter(taxonomies, (t) => t.slug === nextTax)); - this.setState({ current: currentTax }); - if (currentTax.hierarchical === false) { - this.props.setAttributes({ depth: 0 }); - } - } - - if (prevState.current !== current || prevRegionsOnly !== regionsOnly || prevDepth !== depth) { - this.fetchTerms(prevRegionsOnly !== regionsOnly); - } - } - - fetchTerms = (bypassCache = false) => { - const { regionsOnly, depth } = this.props.attributes; - const { cache, current } = this.state; - - if (cache[current.rest_base] && !bypassCache) { - this.setState({ terms: cache[current.rest_base] }); - return; - } - - let path = addQueryArgs(`/wp/v2/${current.rest_base}`, { - hide_empty: 'false', - per_page: '1', - }); - - if (depth < 1) { - path = addQueryArgs(path, { - parent: '0', - }); - } - - const allTerms = []; - - wp.apiRequest({ path }) - .then((data, status, response) => response.getResponseHeader('X-WP-TotalPages')) - .then((termCount) => { - const pages = Math.ceil(termCount / 100); - const requests = []; - - for (let i = 1; i <= pages; i += 1) { - const pagePath = addQueryArgs(path, { - page: i, - per_page: 100, - }); - requests.push(apiFetch({ path: pagePath, parse: true })); - } - - return Promise.all(requests); - }) - .then((termPages) => { - termPages.forEach((items) => { - // items is [ {termx}, {termy} ] - allTerms.push(...items); - }); - return allTerms; - }) - .then((terms) => { - let filteredTerms = terms; - - if (regionsOnly) { - filteredTerms = filteredTerms.filter( - (term) => ['region', 'subregion'].indexOf(term.type) !== -1, - ); - } - - if (depth > 0) { - filteredTerms = unflatten(filteredTerms); - } - - return filteredTerms; - }) - .then((terms) => - this.setState({ - terms, - cache: { - ...cache, - [current.rest_base]: terms, - }, - }), - ); - }; - - renderInspectorControls() { - const { attributes, setAttributes } = this.props; - const { options, current } = this.state; - const hierarchical = current && current.hierarchical; - - return ( - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Display Options', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Background Colour', 'amnesty')} - options={[ - // translators: [admin] - { label: __('White', 'amnesty'), value: '' }, - // translators: [admin] - { label: __('Grey', 'amnesty'), value: 'very-light-gray' }, - ]} - value={attributes.background} - onChange={(background) => setAttributes({ background })} - /> - <SelectControl - // translators: [admin] - label={__('Choose taxonomy to display', 'amnesty')} - options={options} - value={attributes.taxonomy} - onChange={(taxonomy) => setAttributes({ taxonomy })} - /> - {hierarchical && ( - <RangeControl - // translators: [admin] - label={__('Max depth', 'amnesty')} - min={0} - max={3} - value={attributes.depth} - onChange={(depth) => setAttributes({ depth })} - /> - )} - <ToggleControl - // translators: [admin] - label={__('Show only Regions/Subregions', 'amnesty')} - checked={attributes.regionsOnly} - onChange={(regionsOnly) => setAttributes({ regionsOnly })} - /> - </PanelBody> - </InspectorControls> - ); - } - - renderBlockControls() { - const { attributes, setAttributes } = this.props; - - return ( - <BlockControls> - <BlockAlignmentToolbar - value={attributes.alignment} - onChange={(alignment) => setAttributes({ alignment })} - /> - </BlockControls> - ); - } - - render() { - const { attributes, className, setAttributes } = this.props; - const { terms } = this.state; - const classes = classnames(className, { - [`has-${attributes.background}-background-color`]: !!attributes.background, - }); - - return ( - <Fragment> - {this.renderInspectorControls()} - {this.renderBlockControls()} - <aside className={classes}> - <RichText - tagName="h2" - format="string" - className={attributes.alignment ? `is-${attributes.alignment}-aligned` : null} - value={attributes.title} - onChange={(title) => setAttributes({ title })} - // translators: [admin] - placeholder={__('Explore by Region', 'amnesty')} - withoutInteractiveFormatting={true} - /> - <List terms={terms} depth={0} maxDepth={attributes.depth} /> - </aside> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks/regions/index.jsx b/private/src/scripts/editor/blocks/regions/index.jsx deleted file mode 100644 index f89e9504..00000000 --- a/private/src/scripts/editor/blocks/regions/index.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/regions', { - // translators: [admin] - title: __('Terms List', 'amnesty'), - // translators: [admin] - keywords: [__('Terms', 'amnesty')], - category: 'amnesty-core', - - attributes: { - title: { - type: 'string', - default: '', - }, - taxonomy: { - type: 'string', - default: '', - }, - background: { - type: 'string', - default: '', - }, - alignment: { - type: 'string', - default: '', - }, - depth: { - type: 'number', - default: 1, - }, - regionsOnly: { - type: 'boolean', - default: false, - }, - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/related-content/DisplayComponent.jsx b/private/src/scripts/editor/blocks/related-content/DisplayComponent.jsx deleted file mode 100644 index 32435b0a..00000000 --- a/private/src/scripts/editor/blocks/related-content/DisplayComponent.jsx +++ /dev/null @@ -1,172 +0,0 @@ -import { getFeaturedImage } from './utils'; -import pin from './icon.jsx'; - -const { Placeholder, Spinner } = wp.components; -const { compose, withInstanceId } = wp.compose; -const { withDispatch, withSelect } = wp.data; -const { __ } = wp.i18n; -const { addQueryArgs } = wp.url; - -/** - * Render a loading area - * - * @returns {React.Component} - */ -const Loading = () => ( - <div> - <Placeholder icon={pin} label={__('Related Content', 'amnesty')}> - <Spinner /> - </Placeholder> - </div> -); - -/** - * Render a no-posts-found error area - * - * @returns {React.component} - */ -const NoPosts = () => ( - <div> - <Placeholder icon={pin} label={__('Related Content', 'amnesty')}> - {__('No posts found.')} - </Placeholder> - </div> -); - -/** - * Render an item within the block - * - * @param {Object} param0 the props passed in - * - * @returns {wp.element.Component} - */ -const GridItem = ({ item, onClick }) => { - const image = getFeaturedImage(item, 'post-half@2x'); - const style = {}; - - if (image) { - style.backgroundImage = `url('${image}')`; - } - - return ( - <article id={`${item.type}-id-${item.id}`} className="grid-item" style={style}> - {item.tagText && item.tagLink && ( - <span className="grid-itemMeta"> - <a href={item.tagLink} rel="noopener noreferer" onClick={onClick}> - {item.tagText} - </a> - </span> - )} - {item.title && ( - <h3 className="grid-itemTitle"> - <a href={item.titleLink || '#'} rel="noopener noreferer" onClick={onClick}> - {item.title} - </a> - </h3> - )} - </article> - ); -}; - -class DisplayComponent extends wp.element.Component { - state = { - posts: null, - }; - - fetchRelated = () => { - const { post, taxonomies } = this.props; - - const path = addQueryArgs(`amnesty/v1/related/${post}`, taxonomies); - - wp.apiFetch({ path }).then((posts) => { - this.setState({ posts }); - }); - }; - - componentDidMount() { - this.fetchRelated(); - } - - componentDidUpdate(prevProps) { - if (lodash.isEqual(prevProps.taxonomies, this.props.taxonomies)) { - return; - } - - this.fetchRelated(); - } - - render() { - const { createRedirectionPreventionNoticeCallback, instanceId } = this.props; - const { posts } = this.state; - - const showRedirectionPreventedNotice = createRedirectionPreventionNoticeCallback(instanceId); - - if (!Array.isArray(posts)) { - return <Loading />; - } - - if (!posts.length) { - return <NoPosts />; - } - - return ( - <div> - <div className="grid grid-5"> - {posts.map((item) => ( - <GridItem key={item.id} item={item} onClick={showRedirectionPreventedNotice} /> - ))} - </div> - </div> - ); - } -} - -export default compose([ - // provide means of creating/dismissing notices - withDispatch((dispatch) => { - const { createWarningNotice, removeNotice } = dispatch('core/notices'); - - const createRedirectionPreventionNoticeCallback = (instanceId) => { - let noticeId; - - return (event) => { - event.preventDefault(); - - // remove previous, if any - removeNotice(instanceId); - - noticeId = `block-library/amnesty-core/related-content/redirection-prevented/${instanceId}`; - - createWarningNotice(__('Links are disabled in the editor.'), { - id: noticeId, - type: 'snackbar', - }); - }; - }; - - return { createRedirectionPreventionNoticeCallback }; - }), - // provide the current post's taxonomy terms to the Component - withSelect((select) => { - const { getCurrentPostId, getEditedPostAttribute } = select('core/editor'); - const windowTaxonomies = window?.aiSettings?.taxonomies; - const post = getCurrentPostId(); - const taxonomies = {}; - - if (!windowTaxonomies) { - return { post, taxonomies }; - } - - Object.keys(windowTaxonomies).forEach((tax) => { - const taxObject = windowTaxonomies[tax]; - const slug = taxObject?.rest_base || taxObject.name; - const terms = getEditedPostAttribute(slug); - - if (Array.isArray(terms) && terms.length) { - taxonomies[slug] = terms; - } - }); - - return { post, taxonomies }; - }), -])(withInstanceId(DisplayComponent)); diff --git a/private/src/scripts/editor/blocks/related-content/icon.jsx b/private/src/scripts/editor/blocks/related-content/icon.jsx deleted file mode 100644 index 0f19cac9..00000000 --- a/private/src/scripts/editor/blocks/related-content/icon.jsx +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Pin icon - */ -const pin = ( - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> - <path d="m21.5 9.1-6.6-6.6-4.2 5.6c-1.2-.1-2.4.1-3.6.7-.1 0-.1.1-.2.1-.5.3-.9.6-1.2.9l3.7 3.7-5.7 5.7v1.1h1.1l5.7-5.7 3.7 3.7c.4-.4.7-.8.9-1.2.1-.1.1-.2.2-.3.6-1.1.8-2.4.6-3.6l5.6-4.1zm-7.3 3.5.1.9c.1.9 0 1.8-.4 2.6l-6-6c.8-.4 1.7-.5 2.6-.4l.9.1L15 4.9 19.1 9l-4.9 3.6z" /> - </svg> -); - -export default pin; diff --git a/private/src/scripts/editor/blocks/related-content/index.jsx b/private/src/scripts/editor/blocks/related-content/index.jsx deleted file mode 100644 index e313dd7e..00000000 --- a/private/src/scripts/editor/blocks/related-content/index.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/related-content', { - // translators: [admin] - title: __('Related Content', 'amnesty'), - // translators: [admin] - description: __('Add a grid of posts that are related to the current post', 'amnesty'), - category: 'amnesty-core', - attributes: {}, - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/related-content/utils.js b/private/src/scripts/editor/blocks/related-content/utils.js deleted file mode 100644 index d323f67b..00000000 --- a/private/src/scripts/editor/blocks/related-content/utils.js +++ /dev/null @@ -1,57 +0,0 @@ -const { __ } = wp.i18n; - -/** - * Retrieve featured image info from a post object - * - * @param {Object} post the post object - * @param {String} size the image size - * - * @returns {(String|null)} the image URI, or null - */ -export const getFeaturedImage = (item, size) => { - const image = item?.featuredImage; - return image?.sizes?.[size]?.url ?? image?.url; -}; - -/** - * Retrieve the first location term that has the type "default" - * - * @param {Object} terms the post's terms - * - * @returns {(Object|null)} the found term, or null - */ -export const getCountryTerm = (terms) => { - let country = null; - - terms.forEach((term) => { - if (term.type !== 'default') { - return; - } - - if (country) { - return; - } - - country = term; - }); - - if (!country) { - return country; - } - - // mock a post response so that {getProminentTerm()} can find it - return { - ...country, - _embedded: { - 'wp:term': [ - [ - { - // translators: [admin] - name: __('Country', 'amnesty'), - link: '#', - }, - ], - ], - }, - }; -}; diff --git a/private/src/scripts/editor/blocks/section/DisplayComponent.jsx b/private/src/scripts/editor/blocks/section/DisplayComponent.jsx deleted file mode 100644 index b0b3aeac..00000000 --- a/private/src/scripts/editor/blocks/section/DisplayComponent.jsx +++ /dev/null @@ -1,359 +0,0 @@ -import classNames from 'classnames'; - -const { apiFetch } = wp; -const { InspectorControls, InnerBlocks, MediaUpload, MediaUploadCheck } = wp.blockEditor; -const { Button, PanelBody, RangeControl, SelectControl, TextControl, ToggleControl } = - wp.components; -const { compose } = wp.compose; -const { withDispatch } = wp.data; -const { Component, Fragment } = wp.element; -const { __, sprintf } = wp.i18n; - -const findImage = async (basename, year, month) => { - let found = false; - - const results = await apiFetch({ - path: sprintf('wp/v2/media?search=%s', encodeURIComponent(basename)), - }); - - if (results.length === 0) { - return found; - } - - if (results.length === 0) { - return results[0]; - } - - found = results.filter((result) => { - const guid = result.guid.rendered; - const fileYear = guid.replace(/^.*\/(\d{4})\/\d{2}\/.*\.[a-z]{3,4}$/, '$1'); - const fileMonth = guid.replace(/^.*\/\d{4}\/(\d{2})\/.*\.[a-z]{3,4}$/, '$1'); - - if (fileYear !== year) { - return false; - } - - if (fileMonth !== month) { - return false; - } - - return true; - }); - - return found[0]; -}; - -class DisplayComponent extends Component { - state = { - imageData: null, - }; - - createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - fetchImageData = (imageId) => { - wp.apiRequest({ - path: `/wp/v2/media/${imageId}?_fields=description,caption&context=edit`, - }).then((resp) => { - this.setState({ - imageData: { - caption: resp.caption.raw, - description: resp.description.raw, - }, - }); - }); - }; - - async componentDidMount() { - const { attributes, setAttributes } = this.props; - const { backgroundImageId = 0, backgroundImage } = attributes; - - // have the id already - nothing to do - if (backgroundImageId) { - this.fetchImageData(backgroundImageId); - return; - } - - // no background image - nothing to do - if (!backgroundImage) { - return; - } - - const parts = backgroundImage.split(/[\\/]/); - const basename = parts.pop().replace(/\.[a-z]{3,4}/, ''); - const month = parts.pop(); - const year = parts.pop(); - - const image = await findImage(basename, year, month); - - if (!image) { - return; - } - - setAttributes({ backgroundImageId: image.id }); - this.fetchImageData(backgroundImageId); - } - - componentDidUpdate(prevProps) { - const { backgroundImageId } = this.props.attributes; - - if (backgroundImageId === prevProps.attributes.backgroundImageId) { - return; - } - - this.fetchImageData(backgroundImageId); - } - - handleSave = (val) => { - const newVal = val.replace(/\s/g, '').toLowerCase(); - - this.props.setAttributes({ - sectionId: newVal, - sectionName: val, - }); - }; - - selectImage = (value) => { - const { setAttributes } = this.props; - setAttributes({ - backgroundImageId: value.id, - backgroundImage: value.sizes.full.url, - backgroundImageHeight: value.sizes.full.height, - }); - }; - - removeImage = () => { - const { setAttributes } = this.props; - setAttributes({ - backgroundImageId: 0, - backgroundImage: '', - backgroundImageHeight: 0, - minHeight: 0, - }); - }; - - controls() { - const { attributes, setAttributes } = this.props; - - return ( - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <TextControl - // translators: [admin] - label={__('Section Name', 'amnesty')} - value={attributes.sectionName} - onChange={this.handleSave} - /> - <SelectControl - // translators: [admin] - label={__('Text Colour', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Black', 'amnesty'), - value: 'black', - }, - { - // translators: [admin] - label: __('White', 'amnesty'), - value: 'white', - }, - ]} - value={attributes.textColour} - onChange={(value) => setAttributes({ textColour: value })} - /> - </PanelBody> - <PanelBody title={/* translators: [admin] */ __('Background Options', 'amnesty')}> - <div className="components-base-control"> - <MediaUploadCheck> - <MediaUpload - onSelect={this.selectImage} - allowedTypes={['image']} - value={attributes.backgroundImage} - render={({ open }) => ( - <Fragment> - {attributes.backgroundImage !== '' ? ( - <Fragment> - <Button isPrimary onClick={open}> - {/* translators: [admin] */ __('Edit image', 'amnesty')} - </Button> - <Button - isDestructive - isDefault - onClick={this.removeImage} - style={{ - marginLeft: '6px', - }} - > - {/* translators: [admin] */ __('Remove image', 'amnesty')} - </Button> - </Fragment> - ) : ( - <Button isPrimary onClick={open}> - {/* translators: [admin] */ __('Select background image', 'amnesty')} - </Button> - )} - </Fragment> - )} - /> - </MediaUploadCheck> - </div> - <RangeControl - // translators: [admin] - label={__('Min image height as viewport percentage', 'amnesty')} - onChange={(value) => setAttributes({ minHeight: !value ? 0 : value })} - value={attributes.minHeight} - intialPostition={attributes.minHeight} - min={0} - max={100} - allowReset - /> - <ToggleControl - // translators: [admin] - label={__('Toggle Background Overlay', 'amnesty')} - checked={attributes.enableBackgroundGradient} - onChange={(enableBackgroundGradient) => setAttributes({ enableBackgroundGradient })} - /> - <ToggleControl - // translators: [admin] - label={__('Hide Image Caption', 'amnesty')} - checked={attributes.hideImageCaption} - onChange={() => setAttributes({ hideImageCaption: !attributes.hideImageCaption })} - /> - <ToggleControl - // translators: [admin] - label={__('Hide Image Credit', 'amnesty')} - checked={attributes.hideImageCopyright} - onChange={() => setAttributes({ hideImageCopyright: !attributes.hideImageCopyright })} - /> - <SelectControl - // translators: [admin] - label={__('Background Image Origin', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('Top', 'amnesty'), - value: 'top', - }, - { - // translators: [admin] - label: __('Right', 'amnesty'), - value: 'right', - }, - { - // translators: [admin] - label: __('Bottom', 'amnesty'), - value: 'bottom', - }, - { - // translators: [admin] - label: __('Left', 'amnesty'), - value: 'left', - }, - { - // translators: [admin] - label: __('Centre', 'amnesty'), - value: 'center', - }, - { - // translators: [admin] - label: __('Initial', 'amnesty'), - value: '', - }, - ]} - value={attributes.backgroundImageOrigin} - onChange={(value) => setAttributes({ backgroundImageOrigin: value })} - /> - <SelectControl - // translators: [admin] - label={__('Background Colour', 'amnesty')} - options={[ - { - // translators: [admin] - label: __('White', 'amnesty'), - value: '', - }, - { - // translators: [admin] - label: __('Grey', 'amnesty'), - value: 'grey', - }, - ]} - value={attributes.background} - onChange={this.createUpdateAttribute('background')} - /> - </PanelBody> - </InspectorControls> - ); - } - - render() { - const { attributes } = this.props; - - const styles = (h) => { - if (!attributes.backgroundImage) { - return {}; - } - - if (h > 0) { - return { - backgroundImage: `url(${attributes.backgroundImage})`, - minHeight: `${attributes.minHeight}vw`, - maxHeight: `${attributes.backgroundImageHeight}px`, - }; - } - return { - backgroundImage: `url(${attributes.backgroundImage})`, - height: 'auto', - }; - }; - - const shouldShowImageCaption = - this.state.imageData?.caption && - !attributes.hideImageCaption && - this.state.imageData?.caption !== this.state.imageData?.description; - - const shouldShowImageCredit = - this.state.imageData?.description && !attributes.hideImageCopyright; - - return ( - <Fragment> - {this.controls()} - <section - className={classNames({ - section: true, - 'section--tinted': attributes.background === 'grey', - [`section--${attributes.padding}`]: !!attributes.padding, - 'section--textWhite': attributes.textColour === 'white', - 'section--has-bg-image': attributes.backgroundImage, - 'section--has-bg-overlay': !!attributes.enableBackgroundGradient, - [`section--bgOrigin-${attributes.backgroundImageOrigin}`]: - !!attributes.backgroundImageOrigin, - })} - style={styles(attributes.minHeight)} - > - <div id={attributes.sectionId} className="container"> - <InnerBlocks templateLock={false} /> - </div> - {this.state.imageData && ( - <div className="image-metadata"> - {shouldShowImageCaption && ( - <span className="image-metadataItem image-caption"> - {this.state.imageData.caption} - </span> - )} - {shouldShowImageCredit && ( - <span className="image-metadataItem image-copyright"> - {this.state.imageData.description} - </span> - )} - </div> - )} - </section> - </Fragment> - ); - } -} - -export default compose( - withDispatch((dispatch) => dispatch('core/block-editor').setTemplateValidity(true)), -)(DisplayComponent); diff --git a/private/src/scripts/editor/blocks/section/deprecated.jsx b/private/src/scripts/editor/blocks/section/deprecated.jsx deleted file mode 100644 index cf886d52..00000000 --- a/private/src/scripts/editor/blocks/section/deprecated.jsx +++ /dev/null @@ -1,172 +0,0 @@ -import classnames from 'classnames'; - -const { assign } = lodash; -const { InnerBlocks } = wp.blockEditor; - -const v3 = { - attributes: { - background: { - type: 'string', - }, - padding: { - type: 'string', - }, - sectionId: { - type: 'string', - }, - sectionName: { - type: 'string', - }, - backgroundImage: { - type: 'string', - default: '', - }, - backgroundImageHeight: { - type: 'number', - default: 0, - }, - backgroundImageOrigin: { - type: 'string', - default: '', - }, - enableBackgroundGradient: { - type: 'boolean', - default: false, - }, - minHeight: { - type: 'number', - default: 0, - }, - textColour: { - type: 'string', - default: 'black', - }, - backgroundImageId: { - type: 'number', - default: 0, - }, - hideImageCaption: { - type: 'boolean', - default: true, - }, - hideImageCopyright: { - type: 'boolean', - default: false, - }, - }, -}; - -const v2 = { - attributes: { - background: { - type: 'string', - }, - padding: { - type: 'string', - }, - sectionId: { - type: 'string', - }, - sectionName: { - type: 'string', - }, - backgroundImage: { - type: 'string', - default: '', - }, - backgroundImageHeight: { - type: 'number', - default: 0, - }, - backgroundImageOrigin: { - type: 'string', - default: '', - }, - enableBackgroundGradient: { - type: 'boolean', - default: false, - }, - minHeight: { - type: 'number', - default: 0, - }, - textColour: { - type: 'string', - default: 'black', - }, - }, - save: assign( - ({ attributes }) => { - const { minHeight, backgroundImage, backgroundImageHeight } = attributes; - - const styles = (h) => { - if (!backgroundImage) { - return {}; - } - - if (h > 0) { - return { - backgroundImage: `url(${backgroundImage})`, - minHeight: `${minHeight}vw`, - maxHeight: `${backgroundImageHeight}px`, - }; - } - - return { - backgroundImage: `url(${backgroundImage})`, - height: 'auto', - }; - }; - - const classes = classnames('section', { - 'section--tinted': attributes.background === 'grey', - [`section--${attributes.padding}`]: !!attributes.padding, - 'section--textWhite': attributes.textColour === 'white', - 'section--has-bg-image': backgroundImage, - 'section--has-bg-gradient': !!attributes.enableBackgroundGradient, - [`section--bgOrigin-${attributes.backgroundImageOrigin}`]: - !!attributes.backgroundImageOrigin, - }); - - return ( - <section className={classes} style={styles(minHeight)}> - <div id={attributes.sectionId} className="container"> - <InnerBlocks.Content /> - </div> - </section> - ); - }, - { displayName: 'SectionBlockSave' }, - ), -}; - -const v1 = { - attributes: { - background: { - type: 'string', - }, - padding: { - type: 'string', - }, - }, - save: assign( - ({ attributes }) => ( - <section - className={classnames({ - section: true, - 'section--tinted': attributes.background === 'grey', - [`section--${attributes.padding}`]: !!attributes.padding, - })} - > - <div className="container"> - <InnerBlocks.Content /> - </div> - </section> - ), - { displayName: 'SectionBlockSave' }, - ), -}; - -const deprecated = [v3, v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks/section/index.jsx b/private/src/scripts/editor/blocks/section/index.jsx deleted file mode 100644 index dfb26da3..00000000 --- a/private/src/scripts/editor/blocks/section/index.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { assign } = lodash; -const { InnerBlocks } = wp.blockEditor; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-section', { - // translators: [admin] - title: __('Section', 'amnesty'), - icon: 'editor-table', - category: 'amnesty-core', - // translators: [admin] - keywords: [__('Section', 'amnesty')], - attributes: { - background: { - type: 'string', - }, - sectionId: { - type: 'string', - }, - sectionName: { - type: 'string', - }, - backgroundImage: { - type: 'string', - default: '', - }, - backgroundImageHeight: { - type: 'number', - default: 0, - }, - backgroundImageOrigin: { - type: 'string', - default: '', - }, - enableBackgroundGradient: { - type: 'boolean', - default: false, - }, - minHeight: { - type: 'number', - default: 0, - }, - textColour: { - type: 'string', - default: 'black', - }, - backgroundImageId: { - type: 'number', - default: 0, - }, - hideImageCaption: { - type: 'boolean', - default: true, - }, - hideImageCopyright: { - type: 'boolean', - default: false, - }, - }, - - deprecated, - - edit: DisplayComponent, - save: assign(() => <InnerBlocks.Content />, { displayName: 'SectionBlockSave' }), -}); diff --git a/private/src/scripts/editor/blocks/slider/DisplayComponent.jsx b/private/src/scripts/editor/blocks/slider/DisplayComponent.jsx deleted file mode 100644 index 53e49776..00000000 --- a/private/src/scripts/editor/blocks/slider/DisplayComponent.jsx +++ /dev/null @@ -1,517 +0,0 @@ -import classnames from 'classnames'; -import PostMediaSelector from '../../components/PostMediaSelector.jsx'; -import { randId } from '../utils'; - -const { map, omit } = lodash; -const { InspectorControls, RichText, URLInputButton } = wp.blockEditor; -const { Button, PanelBody, SelectControl, TextControl, ToggleControl, TextareaControl } = - wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -class DisplayComponent extends Component { - static emptySlide = { - alignment: '', - background: '', - callToActionLink: '', - callToActionText: '', - content: '', - heading: '', - hideContent: false, - id: '', - imageId: '', - imageUrl: '', - subheading: '', - timelineContent: '', - title: '', - }; - - static alignmentOptions = [ - /* translators: [admin] text alignment. for RTL languages, localise as 'Right' */ - { label: __('Left', 'amnesty'), value: '' }, - /* translators: [admin] text alignment. */ - { label: __('Centre', 'amnesty'), value: 'center' }, - /* translators: [admin] text alignment. for RTL languages, localise as 'Left' */ - { label: __('Right', 'amnesty'), value: 'right' }, - ]; - - static timelineStyleOptions = [ - // translators: [admin] - { label: __('Dark', 'amnesty'), value: 'dark' }, - // translators: [admin] - { label: __('Light', 'amnesty'), value: 'light' }, - ]; - - static backgroundOptions = [ - // translators: [admin] - { label: __('Opaque', 'amnesty'), value: '' }, - // translators: [admin] - { label: __('Translucent', 'amnesty'), value: 'opaque' }, - // translators: [admin] - { label: __('Transparent', 'amnesty'), value: 'transparent' }, - ]; - - state = { - selectedSlide: 0, - sizes: {}, - }; - - static shouldShowSliderTitle = (attributes) => { - if (attributes.sliderTitle) { - return true; - } - return false; - }; - - componentDidMount() { - const { attributes, setAttributes } = this.props; - - if (!attributes.sliderId) { - setAttributes({ - sliderId: randId(), - }); - } - - attributes.slides.forEach((slide, index) => { - if (!slide.id) { - this.createUpdateSlideAttribute(index)('id')(randId()); - } - - if (slide.imageId && !this.state.sizes[slide.imageId]) { - this.requestSizes(index); - } - }); - } - - requestSizes(index) { - const { attributes } = this.props; - const { slides } = attributes; - const { imageId } = slides[index]; - - const update = (sizes) => this.setState({ sizes: { ...this.state.sizes, [imageId]: sizes } }); - - wp.apiRequest({ path: `/wp/v2/media/${imageId}` }).then((resp) => - update(resp.media_details.sizes), - ); - } - - /** - * Higher order component that takes the attribute key, - * this then returns a function which takes a value, - * when called it updates the attribute with the key. - * @param key - * @returns {function(*): *} - */ - createUpdateAttribute = (key) => (value) => this.props.setAttributes({ [key]: value }); - - createUpdateSlideAttribute = (index) => (key) => (value) => - this.props.setAttributes({ - slides: [ - ...this.props.attributes.slides.slice(0, Math.max(0, index)), - { - ...this.props.attributes.slides[index], - [key]: value, - }, - ...this.props.attributes.slides.slice(index + 1, this.props.attributes.slides.length), - ], - }); - - createUpdateImage = - (index) => - ({ id: imageId = false, source_url: imageUrl = false, media_details: { sizes } = {} } = {}) => { - this.setState({ sizes: { ...this.state.sizes, [imageId]: sizes } }); - const removeSizes = (obj) => omit(obj, 'sizes'); - this.props.setAttributes({ - slides: map( - [ - ...this.props.attributes.slides.slice(0, Math.max(0, index)), - { - ...this.props.attributes.slides[index], - imageId, - imageUrl, - }, - ...this.props.attributes.slides.slice(index + 1, this.props.attributes.slides.length), - ], - removeSizes, - ), - }); - }; - - deleteSlide = (index) => { - if (index === this.props.attributes.slides.length - 1) { - this.setState({ - selectedSlide: index - 1, - }); - } - - this.props.setAttributes({ - slides: [ - ...this.props.attributes.slides.slice(0, Math.max(0, index)), - ...this.props.attributes.slides.slice(index + 1, this.props.attributes.slides.length), - ], - }); - }; - - addSlide = () => { - this.setState({ - selectedSlide: this.props.attributes.slides.length, - }); - - this.props.setAttributes({ - slides: [ - ...this.props.attributes.slides, - { - ...DisplayComponent.emptySlide, - id: randId(), - }, - ], - }); - }; - - createDeleteSlide = (index) => () => this.deleteSlide(index); - - selectSlide = (index) => - this.setState({ - selectedSlide: index, - }); - - createSelectSlide = (index) => () => this.selectSlide(index); - - initiateDelete = () => { - if ( - // eslint-disable-next-line no-restricted-globals, no-alert - confirm( - /* translators: [admin] */ __( - 'Do you wish to delete this slide? This action is irreversible', - 'amnesty', - ), - ) - ) { - this.deleteSlide(this.state.selectedSlide); - } - }; - - nextSlide = () => - this.setState({ - selectedSlide: - this.state.selectedSlide === this.props.attributes.slides.length - 1 - ? 0 - : this.state.selectedSlide + 1, - }); - - prevSlide = () => - this.setState({ - selectedSlide: - this.state.selectedSlide === 0 - ? this.props.attributes.slides.length - 1 - : this.state.selectedSlide - 1, - }); - - render() { - const { attributes } = this.props; - const { selectedSlide } = this.state; - - const currentSlide = attributes.slides[selectedSlide]; - const updateSlide = this.createUpdateSlideAttribute(selectedSlide); - - const controls = ( - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Options', 'amnesty')}> - <ToggleControl - // translators: [admin] - label={__('Show Arrows', 'amnesty')} - checked={attributes.hasArrows} - onChange={this.createUpdateAttribute('hasArrows')} - /> - - <ToggleControl - // translators: [admin] - label={__('Has Content', 'amnesty')} - checked={attributes.hasContent} - onChange={this.createUpdateAttribute('hasContent')} - help={ - <span> - { - /* translators: [admin] */ __( - 'By disabling this you will hide the content in *ALL* slides. To disable this on only one slide, select the desired slide and toggle the "Hide Content" field in the "Slide Options" panel.', - 'amnesty', - ) - } - </span> - } // eslint-disable-line max-len - /> - - <ToggleControl - // translators: [admin] - label={__('Show Tabs', 'amnesty')} - checked={attributes.showTabs} - onChange={this.createUpdateAttribute('showTabs')} - help={ - <span> - { - /* translators: [admin] */ __( - 'Hide the tabs on the front end, these will still show in the panel to allow you to navigate through each slide.', - 'amnesty', - ) - } - </span> - } // eslint-disable-line max-len - /> - </PanelBody> - - <PanelBody title={/* translators: [admin] */ __('Timeline Options', 'amnesty')}> - <TextControl - // translators: [admin] - label={__('Slider Title', 'amnesty')} - onChange={this.createUpdateAttribute('sliderTitle')} - value={attributes.sliderTitle} - /> - <SelectControl - // translators: [admin] - label={__('Timeline Style', 'amnesty')} - value={attributes.timelineCaptionStyle} - options={DisplayComponent.timelineStyleOptions} - onChange={this.createUpdateAttribute('timelineCaptionStyle')} - /> - </PanelBody> - - {attributes.slides.length > 0 && ( - <PanelBody title={/* translators: [admin] */ __('Slide Options', 'amnesty')}> - <TextControl - // translators: [admin] - label={__('Slide Title', 'amnesty')} - onChange={updateSlide('title')} - value={currentSlide.title} - /> - <TextareaControl - // translators: [admin] - label={__('Slide Timeline Text', 'amnesty')} - onChange={updateSlide('timelineContent')} - value={currentSlide.timelineContent} - /> - <label - style={{ - display: 'block', - marginBottom: '5px', - }} - > - {/* translators: [admin] */ __('Slide Background', 'amnesty')} - </label> - <PostMediaSelector - mediaId={currentSlide.imageId} - onUpdate={this.createUpdateImage(selectedSlide)} - /> - <hr /> - <SelectControl - // translators: [admin] - label={__('Content Alignment', 'amnesty')} - value={currentSlide.alignment} - options={DisplayComponent.alignmentOptions} - onChange={updateSlide('alignment')} - /> - <SelectControl - // translators: [admin] - label={__('Background Style', 'amnesty')} - value={currentSlide.background} - options={DisplayComponent.backgroundOptions} - onChange={updateSlide('background')} - /> - <ToggleControl - // translators: [admin] - label={__('Hide Content', 'amnesty')} - checked={currentSlide.hideContent} - onChange={updateSlide('hideContent')} - help={ - <span> - { - /* translators: [admin] */ __( - 'By enabling this you will hide the content on *THIS* slide. To disable content on all slides go to the "Options" and toggle the "Has Content" field.', - 'amnesty', - ) - } - </span> - } // eslint-disable-line max-len - /> - - <hr /> - <Button isDestructive isLink onClick={this.initiateDelete}> - {/* translators: [admin] */ __('Remove Slide', 'amnesty')} - </Button> - <p> - <em> - <small>{/* translators: [admin] */ __('This is irreversible.', 'amnesty')}</small> - </em> - </p> - </PanelBody> - )} - </InspectorControls> - ); - - return ( - <Fragment> - {controls} - <div> - <div className={`slider timeline-${attributes.timelineCaptionStyle}`}> - {DisplayComponent.shouldShowSliderTitle(attributes) && ( - <div className="slider-title"> - <RichText - tagname="span" - // translators: [admin] - placeholder={__('(Slider Title)', 'amnesty')} - onChange={this.createUpdateAttribute('sliderTitle')} - value={attributes.sliderTitle} - allowedFormats={[]} - format="string" - /> - </div> - )} - <div className="slides-container"> - {attributes.hasArrows && ( - <Fragment> - <button onClick={this.nextSlide} className="slides-arrow slides-arrow--next"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button onClick={this.prevSlide} className="slides-arrow slides-arrow--previous"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - <div className="slides"> - {attributes.slides.length === 0 && ( - <div className="slide"> - <div className="slide-contentContainer"> - <h1 className="slide-title"> - {/* translators: [admin] */ __('Add a slide below.', 'amnesty')} - </h1> - <button className="btn btn--dark" onClick={this.addSlide}> - {/* translators: [admin] */ __('Add Slide', 'amnesty')} - </button> - </div> - </div> - )} - - {currentSlide && ( - <div - className={classnames({ - slide: true, - [`is-${currentSlide.alignment}-aligned`]: !!currentSlide.alignment, - [`has-${currentSlide.background}-background`]: !!currentSlide.background, - })} - style={{ - backgroundImage: `url(${currentSlide.imageUrl || ''})`, - }} - > - {currentSlide.timelineContent && ( - <div className="slide-timelineContent"> - <div className="slide-timelineContent-inner"> - <RichText - tagname="span" - // translators: [admin] - placeholder={__('(TimeLine Content)', 'amnesty')} - value={currentSlide.timelineContent} - onChange={updateSlide('timelineContent')} - allowedFormats={[]} - format="string" - /> - </div> - </div> - )} - {!currentSlide.hideContent && attributes.hasContent && ( - <div className="slide-contentContainer"> - <h1 className="slide-title"> - <RichText - tagname="span" - // translators: [admin] - placeholder={__('(Heading)', 'amnesty')} - value={currentSlide.heading} - onChange={updateSlide('heading')} - allowedFormats={[]} - format="string" - /> - </h1> - <h2 className="slide-subtitle"> - <RichText - tagname="span" - // translators: [admin] - placeholder={__('(Sub-Heading)', 'amnesty')} - value={currentSlide.subheading} - onChange={updateSlide('subheading')} - allowedFormats={[]} - format="string" - /> - </h2> - <div className="slide-content"> - <RichText - tagname="p" - // translators: [admin] - placeholder={__('(Content)', 'amnesty')} - value={currentSlide.content} - onChange={updateSlide('content')} - allowedFormats={[]} - /> - </div> - <div className="slide-callToAction"> - <div className="btn"> - <RichText - tagname="span" - // translators: [admin] - placeholder={__('(Button Text)', 'amnesty')} - value={currentSlide.callToActionText} - onChange={updateSlide('callToActionText')} - allowedFormats={[]} - format="string" - /> - </div> - <URLInputButton - url={currentSlide.callToActionLink} - onChange={updateSlide('callToActionLink')} - /> - </div> - </div> - )} - </div> - )} - </div> - </div> - <nav className="slider-nav"> - {attributes.slides.length > 0 && - attributes.slides.map((slide, index) => { - const slideTitle = slide.title && slide.title !== ''; - - if (selectedSlide === index) { - return ( - <div key={slide.title} className="slider-navButton is-active"> - <span> - {slideTitle - ? slide.title - : /* translators: [admin] */ __('(No Title)', 'amnesty')} - </span> - </div> - ); - } - - return ( - <button - key={slide.title} - className="slider-navButton" - onClick={this.createSelectSlide(index)} - > - {slideTitle - ? slide.title - : /* translators: [admin] */ __('(No Title)', 'amnesty')} - </button> - ); - })} - - <button className="slider-navButton" onClick={this.addSlide}> - {/* translators: [admin] */ __('Add Slide', 'amnesty')} - </button> - </nav> - </div> - </div> - </Fragment> - ); - } -} - -export default DisplayComponent; diff --git a/private/src/scripts/editor/blocks/slider/attributes.js b/private/src/scripts/editor/blocks/slider/attributes.js deleted file mode 100644 index 23247d2a..00000000 --- a/private/src/scripts/editor/blocks/slider/attributes.js +++ /dev/null @@ -1,31 +0,0 @@ -const blockAttributes = { - sliderId: { - type: 'string', - }, - slides: { - type: 'array', - default: [], - }, - hasArrows: { - type: 'boolean', - default: true, - }, - showTabs: { - type: 'boolean', - default: true, - }, - hasContent: { - type: 'boolean', - default: true, - }, - sliderTitle: { - type: 'string', - default: '', - }, - timelineCaptionStyle: { - type: 'string', - default: 'dark', - }, -}; - -export default blockAttributes; diff --git a/private/src/scripts/editor/blocks/slider/build-slide-deprecated.jsx b/private/src/scripts/editor/blocks/slider/build-slide-deprecated.jsx deleted file mode 100644 index ccae2529..00000000 --- a/private/src/scripts/editor/blocks/slider/build-slide-deprecated.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import classnames from 'classnames'; -import { brToP, trimBr } from '../utils'; - -const { __ } = wp.i18n; - -export default function buildSlideDeprecated(slide, hasContent, sliderId) { - const shouldShowContent = () => !slide.hideContent && hasContent; - const shouldShowButton = () => slide.callToActionText && slide.callToActionLink; - const shouldShowToggle = () => - slide.content || (slide.callToActionText && slide.callToActionLink); - - const getUrl = (size) => { - const obj = slide.sizes[size] || slide.sizes.full || { source_url: '' }; - return encodeURI(obj.source_url); - }; - - const style = - sliderId && slide.sizes && Object.keys(slide.sizes).length > 0 - ? {} - : { - backgroundImage: `url(${slide.imageUrl || ''})`, - }; - - let cssBlock = ''; - if (sliderId && slide.sizes && Object.keys(slide.sizes).length > 0) { - const selector = `#slider-${sliderId} #slide-${slide.id}`; - - cssBlock = ` - ${selector}{background-image: url("${getUrl('hero-sm')}")} - @media screen and (min-width:770px){${selector}{background-image: url("${getUrl( - 'hero-md', - )}")}} - @media screen and (min-width:1444px){${selector}{background-image: url("${getUrl( - 'hero-lg', - )}")}} - `; - } - - const slideClasses = classnames('slide', { - [`is-${slide.alignment}-aligned`]: !!slide.alignment, - [`has-${slide.background}-background`]: !!slide.background, - }); - - const content = { __html: brToP(slide.content) }; - - return ( - <div id={`slide-${slide.id}`} className={slideClasses} style={style}> - <style>{cssBlock}</style> - {shouldShowContent() && ( - <div - className="slide-contentWrapper" - // translators: [admin] - data-tooltip={__('Tap here to return to gallery', 'amnesty')} - > - <div className="slide-contentContainer"> - {slide.heading && <h1 className="slide-title">{trimBr(slide.heading)}</h1>} - {slide.subheading && <h2 className="slide-subtitle">{trimBr(slide.subheading)}</h2>} - <div className="slide-content"> - {slide.content && <div dangerouslySetInnerHTML={content}></div>} - {shouldShowButton() && ( - <a className="btn" href={slide.callToActionLink}> - {trimBr(slide.callToActionText)} - </a> - )} - {shouldShowToggle() && ( - // translators: [admin] - <button className="slider-toggleContent">{__('Toggle Content', 'amnesty')}</button> - )} - </div> - </div> - </div> - )} - </div> - ); -} diff --git a/private/src/scripts/editor/blocks/slider/build-slide.jsx b/private/src/scripts/editor/blocks/slider/build-slide.jsx deleted file mode 100644 index 63d113f6..00000000 --- a/private/src/scripts/editor/blocks/slider/build-slide.jsx +++ /dev/null @@ -1,243 +0,0 @@ -import classnames from 'classnames'; -import { brToP, trimBr } from '../utils'; - -const { __ } = wp.i18n; - -export default class SlideBuilder { - build(slide, hasContent, sliderId) { - this.slide = slide; - this.hasContent = hasContent; - this.sliderId = sliderId; - - return this.render(); - } - - shouldShowContent() { - return !this.slide.hideContent && this.hasContent; - } - - shouldShowButton() { - return !!(this.slide.callToActionText && this.slide.callToActionLink); - } - - shouldShowToggle() { - return !!brToP(this.slide.content) || this.shouldShowButton(); - } - - hasInnerContent() { - return this.shouldShowButton() || this.shouldShowToggle(); - } - - getUrl(size) { - const obj = this.slide.sizes[size] || this.slide.sizes.full || { source_url: '' }; - return encodeURI(obj.source_url); - } - - hasImageSizes() { - const { sizes } = this.slide; - - return this.sliderId && sizes && Object.keys(sizes).length > 0; - } - - getBackground() { - const { imageUrl } = this.slide; - - if (!this.hasImageSizes() || !imageUrl) { - return {}; - } - - return { - backgroundImage: `url("${imageUrl}")`, - }; - } - - getCssBlock() { - if (!this.hasImageSizes()) { - return ''; - } - - const selector = `#slider-${this.sliderId} #slide-${this.slide.id}`; - - // concating template strings to avoid unsightly whitespace. - return ( - `${selector}{background-image: url("${this.getUrl('hero-sm')}")}` + - `@media screen and (min-width:770px){${selector}{background-image: url("${this.getUrl( - 'hero-md', - )}")}}` + - `@media screen and (min-width:1444px){${selector}{background-image: url("${this.getUrl( - 'hero-lg', - )}")}}` - ); - } - - getSlideClasses() { - const { alignment, background } = this.slide; - - return classnames('slide', { - [`is-${alignment}-aligned`]: !!alignment, - [`has-${background}-background`]: !!background, - }); - } - - getHtmlContent() { - return { - __html: brToP(this.slide.content), - }; - } - - render() { - const { id, heading, subheading, callToActionLink, callToActionText, timelineContent } = - this.slide; - - const content = this.getHtmlContent(); - - return ( - <div id={`slide-${id}`} className={this.getSlideClasses()}> - <style>{this.getCssBlock()}</style> - {timelineContent && ( - <div className="slide-timelineContent"> - <div className="slide-timelineContent-inner">{timelineContent}</div> - </div> - )} - {this.shouldShowContent() && ( - <div - className="slide-contentWrapper" - // translators: [admin] - data-tooltip={__('Tap here to return to gallery', 'amnesty')} - > - <div className="slide-contentContainer"> - {heading && <h1 className="slide-title">{trimBr(heading)}</h1>} - {subheading && <h2 className="slide-subtitle">{trimBr(subheading)}</h2>} - {this.hasInnerContent() && ( - <div className="slide-content"> - {/* eslint-disable-next-line no-underscore-dangle */} - {content.__html && <div dangerouslySetInnerHTML={content}></div>} - {this.shouldShowButton() && ( - <a className="btn" href={callToActionLink}> - {trimBr(callToActionText)} - </a> - )} - {this.shouldShowToggle() && ( - <button className="slider-toggleContent"> - {/* translators: [admin] */ __('Toggle Content', 'amnesty')} - </button> - )} - </div> - )} - </div> - </div> - )} - </div> - ); - } - - buildDeprecated(slide, hasContent, sliderId) { - this.slide = slide; - this.hasContent = hasContent; - this.sliderId = sliderId; - - return this.renderDeprecated(); - } - - buildVersionTwoDeprecated(slide, hasContent, sliderId) { - this.slide = slide; - this.hasContent = hasContent; - this.sliderId = sliderId; - - return this.renderVersionTwoDeprecated(); - } - - buildTimelineItem(slide, hasContent, sliderId) { - this.slide = slide; - this.hasContent = hasContent; - this.sliderId = sliderId; - - return this.renderTimelineItem(); - } - - renderTimelineItem() { - const { timelineContent } = this.slide; - - return <div>{timelineContent}</div>; - } - - renderVersionTwoDeprecated() { - const { id, heading, subheading, callToActionLink, callToActionText } = this.slide; - - const content = this.getHtmlContent(); - - return ( - <div id={`slide-${id}`} className={this.getSlideClasses()}> - <style>{this.getCssBlock()}</style> - {this.shouldShowContent() && ( - <div - className="slide-contentWrapper" - // translators: [admin] - data-tooltip={__('Tap here to return to gallery', 'amnesty')} - > - <div className="slide-contentContainer"> - {heading && <h1 className="slide-title">{trimBr(heading)}</h1>} - {subheading && <h2 className="slide-subtitle">{trimBr(subheading)}</h2>} - {this.hasInnerContent() && ( - <div className="slide-content"> - {/* eslint-disable-next-line no-underscore-dangle */} - {content.__html && <div dangerouslySetInnerHTML={content}></div>} - {this.shouldShowButton() && ( - <a className="btn" href={callToActionLink}> - {trimBr(callToActionText)} - </a> - )} - {this.shouldShowToggle() && ( - <button className="slider-toggleContent"> - {/* translators: [admin] */ __('Toggle Content', 'amnesty')} - </button> - )} - </div> - )} - </div> - </div> - )} - </div> - ); - } - - renderDeprecated() { - const { id, heading, subheading, callToActionLink, callToActionText } = this.slide; - - const content = this.getHtmlContent(); - - return ( - <div id={`slide-${id}`} className={this.getSlideClasses()} style={this.getBackground()}> - <style>{this.getCssBlock()}</style> - {this.shouldShowContent() && ( - <div - className="slide-contentWrapper" - // translators: [admin] - data-tooltip={__('Tap here to return to gallery', 'amnesty')} - > - <div className="slide-contentContainer"> - {heading && <h1 className="slide-title">{trimBr(heading)}</h1>} - {subheading && <h2 className="slide-subtitle">{trimBr(subheading)}</h2>} - {this.hasInnerContent() && ( - <div className="slide-content"> - {/* eslint-disable-next-line no-underscore-dangle */} - {content.__html && <div dangerouslySetInnerHTML={content}></div>} - {this.shouldShowButton() && ( - <a className="btn" href={callToActionLink}> - {trimBr(callToActionText)} - </a> - )} - {this.shouldShowToggle() && ( - <button className="slider-toggleContent"> - {/* translators: [admin] */ __('Toggle Content', 'amnesty')} - </button> - )} - </div> - )} - </div> - </div> - )} - </div> - ); - } -} diff --git a/private/src/scripts/editor/blocks/slider/deprecated.jsx b/private/src/scripts/editor/blocks/slider/deprecated.jsx deleted file mode 100644 index ac883531..00000000 --- a/private/src/scripts/editor/blocks/slider/deprecated.jsx +++ /dev/null @@ -1,599 +0,0 @@ -import classnames from 'classnames'; -import blockAttributes from './attributes'; -import { trimBr } from '../utils'; -import SlideBuilder from './build-slide.jsx'; -import buildSlideDeprecated from './build-slide-deprecated.jsx'; - -const { Fragment } = wp.element; -const { __ } = wp.i18n; - -const Builder = new SlideBuilder(); - -const v7 = { - attributes: { - sliderId: { - type: 'string', - }, - slides: { - type: 'array', - default: [], - }, - hasArrows: { - type: 'boolean', - default: true, - }, - showTabs: { - type: 'boolean', - default: true, - }, - hasContent: { - type: 'boolean', - default: true, - }, - }, - save: Object.assign( - ({ attributes }) => { - const { slides, hasContent, sliderId } = attributes; - - if (slides.length < 1) { - return null; - } - - return ( - <div id={`slider-${sliderId}`} className="slider"> - <div className="slides-container"> - <div className="slides"> - {slides.map((slide) => - Builder.buildVersionTwoDeprecated(slide, hasContent, sliderId), - )} - </div> - {attributes.hasArrows && ( - <Fragment> - <button className="slides-arrow slides-arrow--next" aria-hidden="true"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button className="slides-arrow slides-arrow--previous" aria-hidden="true"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - </div> - {attributes.showTabs && ( - <div className="slider-navContainer" aria-hidden="true"> - <nav className="slider-nav"> - {slides.map((slide, index) => ( - <button key={slide.title} className="slider-navButton" data-slide-index={index}> - {slide.title} - </button> - ))} - </nav> - </div> - )} - </div> - ); - }, - { displayName: 'SliderBlockSave' }, - ), -}; - -const v6 = { - attributes: { - slides: { - type: 'array', - default: [], - }, - hasArrows: { - type: 'boolean', - default: true, - }, - showTabs: { - type: 'boolean', - default: true, - }, - hasContent: { - type: 'boolean', - default: true, - }, - }, - save: Object.assign( - ({ attributes }) => { - const { slides } = attributes; - if (slides.length < 1) { - return null; - } - - return ( - <div className="slider"> - <div className="slides-container"> - <div className="slides"> - {slides.map((slide) => ( - <div - key={slide.heading} - className={classnames('slide', { - [`is-${slide.alignment}-aligned`]: !!slide.alignment, - [`has-${slide.background}-background`]: !!slide.background, - })} - style={{ backgroundImage: `url(${slide.imageUrl || ''})` }} - > - {!slide.hideContent && attributes.hasContent && ( - <div className="slide-contentContainer"> - {slide.heading && <h1 className="slide-title">{trimBr(slide.heading)}</h1>} - {slide.subheading && ( - <h2 className="slide-subtitle">{trimBr(slide.subheading)}</h2> - )} - <div className="slide-content"> - {slide.content && <p>{slide.content}</p>} - {slide.callToActionText && slide.callToActionLink && ( - <a className="btn btn--outline btn--ghost" href={slide.callToActionLink}> - {trimBr(slide.callToActionText)} - </a> - )} - <button className="slider-toggleContent"> - {/* translators: [admin] */ __('Toggle Content', 'amnesty')} - </button> - </div> - </div> - )} - </div> - ))} - </div> - {attributes.hasArrows && ( - <Fragment> - <button className="slides-arrow slides-arrow--next" aria-hidden="true"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button className="slides-arrow slides-arrow--previous" aria-hidden="true"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - </div> - {attributes.showTabs && ( - <div className="slider-navContainer" aria-hidden="true"> - <nav className="slider-nav"> - {slides.map((slide, index) => ( - <button key={slide.title} className="slider-navButton" data-slide-index={index}> - {slide.title} - </button> - ))} - </nav> - </div> - )} - </div> - ); - }, - { displayName: 'SliderBlockSaveDeprecation1' }, - ), -}; - -const v5 = { - attributes: blockAttributes, - save: Object.assign( - ({ attributes }) => { - const { slides, sliderId } = attributes; - if (slides.length < 1) { - return null; - } - - return ( - <div id={`slider-${sliderId}`} className="slider"> - <div className="slides-container"> - <div className="slides"> - {slides.map((slide) => { - const style = - sliderId && slide.sizes && Object.keys(slide.sizes).length > 0 - ? {} - : { - backgroundImage: `url(${slide.imageUrl || ''})`, - }; - - let cssBlock = ''; - if (sliderId && slide.sizes && Object.keys(slide.sizes).length > 0) { - cssBlock = ` - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-sm'] || slide.sizes.full || {}).source_url - }); - } - - @media screen and (min-width: 770px) { - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-md'] || slide.sizes.full || {}).source_url - }); - } - } - - @media screen and (min-width: 1444px) { - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-lg'] || slide.sizes.full || {}).source_url - }); - } - } - `; - } - - return ( - <div - key={slide.id} - id={`slide-${slide.id}`} - className={classnames('slide', { - [`is-${slide.alignment}-aligned`]: !!slide.alignment, - [`has-${slide.background}-background`]: !!slide.background, - })} - style={style} - > - <style>{cssBlock}</style> - {!slide.hideContent && attributes.hasContent && ( - <div className="slide-contentContainer"> - {slide.heading && <h1 className="slide-title">{trimBr(slide.heading)}</h1>} - {slide.subheading && ( - <h2 className="slide-subtitle">{trimBr(slide.subheading)}</h2> - )} - <div className="slide-content"> - {slide.content && <p>{slide.content}</p>} - {slide.callToActionText && slide.callToActionLink && ( - <a - className="btn btn--outline btn--ghost" - href={slide.callToActionLink} - > - {trimBr(slide.callToActionText)} - </a> - )} - <button className="slider-toggleContent"> - {/* translators: [admin] */ __('Toggle Content', 'amnesty')} - </button> - </div> - </div> - )} - </div> - ); - })} - </div> - {attributes.hasArrows && ( - <Fragment> - <button className="slides-arrow slides-arrow--next" aria-hidden="true"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button className="slides-arrow slides-arrow--previous" aria-hidden="true"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - </div> - {attributes.showTabs && ( - <div className="slider-navContainer" aria-hidden="true"> - <nav className="slider-nav"> - {slides.map((slide, index) => ( - <button key={slide.title} className="slider-navButton" data-slide-index={index}> - {slide.title} - </button> - ))} - </nav> - </div> - )} - </div> - ); - }, - { displayName: 'SliderBlockSaveDeprecation2' }, - ), -}; - -const v4 = { - attributes: blockAttributes, - save: Object.assign( - ({ attributes }) => { - const { slides, sliderId } = attributes; - if (slides.length < 1) { - return null; - } - - return ( - <div id={`slider-${sliderId}`} className="slider"> - <div className="slides-container"> - <div className="slides"> - {slides.map((slide) => { - const style = - sliderId && slide.sizes && Object.keys(slide.sizes).length > 0 - ? {} - : { - backgroundImage: `url(${slide.imageUrl || ''})`, - }; - - let cssBlock = ''; - if (sliderId && slide.sizes && Object.keys(slide.sizes).length > 0) { - cssBlock = ` - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-sm'] || slide.sizes.full || {}).source_url - }); - } - - @media screen and (min-width: 770px) { - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-md'] || slide.sizes.full || {}).source_url - }); - } - } - - @media screen and (min-width: 1444px) { - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-lg'] || slide.sizes.full || {}).source_url - }); - } - } - `; - } - - return ( - <div - id={`slide-${slide.id}`} - key={slide.id} - className={classnames('slide', { - [`is-${slide.alignment}-aligned`]: !!slide.alignment, - [`has-${slide.background}-background`]: !!slide.background, - })} - style={style} - > - <style>{cssBlock}</style> - {!slide.hideContent && attributes.hasContent && ( - <div className="slide-contentContainer"> - {slide.heading && <h1 className="slide-title">{trimBr(slide.heading)}</h1>} - {slide.subheading && ( - <h2 className="slide-subtitle">{trimBr(slide.subheading)}</h2> - )} - <div className="slide-content"> - {slide.content && <p>{slide.content}</p>} - {slide.callToActionText && slide.callToActionLink && ( - <a className="btn btn--dark" href={slide.callToActionLink}> - {trimBr(slide.callToActionText)} - </a> - )} - <button className="slider-toggleContent"> - {/* translators: [admin] */ __('Toggle Content', 'amnesty')} - </button> - </div> - </div> - )} - </div> - ); - })} - </div> - {attributes.hasArrows && ( - <Fragment> - <button className="slides-arrow slides-arrow--next" aria-hidden="true"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button className="slides-arrow slides-arrow--previous" aria-hidden="true"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - </div> - {attributes.showTabs && ( - <div className="slider-navContainer" aria-hidden="true"> - <nav className="slider-nav"> - {slides.map((slide, index) => ( - <button key={slide.title} className="slider-navButton" data-slide-index={index}> - {slide.title} - </button> - ))} - </nav> - </div> - )} - </div> - ); - }, - { displayName: 'SliderBlockSaveDeprecation3' }, - ), -}; - -const v3 = { - attributes: blockAttributes, - save: Object.assign( - ({ attributes }) => { - const { slides, sliderId } = attributes; - if (slides.length < 1) { - return null; - } - - return ( - <div id={`slider-${sliderId}`} className="slider"> - <div className="slides-container"> - <div className="slides"> - {slides.map((slide) => { - const style = - sliderId && slide.sizes && Object.keys(slide.sizes).length > 0 - ? {} - : { - backgroundImage: `url(${slide.imageUrl || ''})`, - }; - - let cssBlock = ''; - if (sliderId && slide.sizes && Object.keys(slide.sizes).length > 0) { - cssBlock = ` - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-sm'] || slide.sizes.full || {}).source_url - }); - } - - @media screen and (min-width: 770px) { - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-md'] || slide.sizes.full || {}).source_url - }); - } - } - - @media screen and (min-width: 1444px) { - #slider-${sliderId} #slide-${slide.id} { - background-image: url(${ - (slide.sizes['hero-lg'] || slide.sizes.full || {}).source_url - }); - } - } - `; - } - - return ( - <div - id={`slide-${slide.id}`} - key={slide.id} - className={classnames('slide', { - [`is-${slide.alignment}-aligned`]: !!slide.alignment, - [`has-${slide.background}-background`]: !!slide.background, - })} - style={style} - > - <style>{cssBlock}</style> - {!slide.hideContent && attributes.hasContent && ( - <div className="slide-contentContainer"> - {slide.heading && <h1 className="slide-title">{trimBr(slide.heading)}</h1>} - {slide.subheading && ( - <h2 className="slide-subtitle">{trimBr(slide.subheading)}</h2> - )} - <div className="slide-content"> - {slide.content && <p>{slide.content}</p>} - {slide.callToActionText && slide.callToActionLink && ( - <a className="btn btn--dark" href={slide.callToActionLink}> - {trimBr(slide.callToActionText)} - </a> - )} - {slide.content && ( - <button className="slider-toggleContent"> - {/* translators: [admin] */ __('Toggle Content', 'amnesty')} - </button> - )} - </div> - </div> - )} - </div> - ); - })} - </div> - {attributes.hasArrows && ( - <Fragment> - <button className="slides-arrow slides-arrow--next" aria-hidden="true"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button className="slides-arrow slides-arrow--previous" aria-hidden="true"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - </div> - {attributes.showTabs && ( - <div className="slider-navContainer" aria-hidden="true"> - <nav className="slider-nav"> - {slides.map((slide, index) => ( - <button key={slide.title} className="slider-navButton" data-slide-index={index}> - {slide.title} - </button> - ))} - </nav> - </div> - )} - </div> - ); - }, - { displayName: 'SliderBlockSaveDeprecation4' }, - ), -}; - -const v2 = { - attributes: blockAttributes, - save: Object.assign( - ({ attributes }) => { - const { slides, sliderId } = attributes; - - if (slides.length < 1) { - return null; - } - - return ( - <div id={`slider-${sliderId}`} className="slider"> - <div className="slides-container"> - <div className="slides"> - {slides.map((slide) => buildSlideDeprecated(slide, attributes.hasContent, sliderId))} - </div> - {attributes.hasArrows && ( - <Fragment> - <button className="slides-arrow slides-arrow--next" aria-hidden="true"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button className="slides-arrow slides-arrow--previous" aria-hidden="true"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - </div> - {attributes.showTabs && ( - <div className="slider-navContainer" aria-hidden="true"> - <nav className="slider-nav"> - {slides.map((slide, index) => ( - <button key={slide.title} className="slider-navButton" data-slide-index={index}> - {slide.title} - </button> - ))} - </nav> - </div> - )} - </div> - ); - }, - { displayName: 'SliderBlockSaveDeprecation5' }, - ), -}; - -const v1 = { - attributes: blockAttributes, - save: Object.assign( - ({ attributes }) => { - const { slides, hasContent, sliderId } = attributes; - - if (slides.length < 1) { - return null; - } - - return ( - <div id={`slider-${sliderId}`} className="slider"> - <div className="slides-container"> - <div className="slides"> - {slides.map((slide) => Builder.buildDeprecated(slide, hasContent, sliderId))} - </div> - {attributes.hasArrows && ( - <Fragment> - <button className="slides-arrow slides-arrow--next" aria-hidden="true"> - {/* translators: [admin] */ __('Next', 'amnesty')} - </button> - <button className="slides-arrow slides-arrow--previous" aria-hidden="true"> - {/* translators: [admin] */ __('Previous', 'amnesty')} - </button> - </Fragment> - )} - </div> - {attributes.showTabs && ( - <div className="slider-navContainer" aria-hidden="true"> - <nav className="slider-nav"> - {slides.map((slide, index) => ( - <button key={slide.title} className="slider-navButton" data-slide-index={index}> - {slide.title} - </button> - ))} - </nav> - </div> - )} - </div> - ); - }, - { displayName: 'SliderBlockSaveDeprecation6' }, - ), -}; - -const deprecated = [v7, v6, v5, v4, v3, v2, v1]; - -export default deprecated; diff --git a/private/src/scripts/editor/blocks/slider/index.jsx b/private/src/scripts/editor/blocks/slider/index.jsx deleted file mode 100644 index 402ede78..00000000 --- a/private/src/scripts/editor/blocks/slider/index.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; -import attributes from './attributes'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/block-slider', { - // translators: [admin] - title: __('Slider', 'amnesty'), - icon: 'welcome-widgets-menus', - category: 'amnesty-core', - keywords: [ - // translators: [admin] - __('Slider', 'amnesty'), - // translators: [admin] - __('Carousel', 'amnesty'), - // translators: [admin] - __('Scroller', 'amnesty'), - ], - attributes, - deprecated, - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/stat-counter/DisplayComponent.jsx b/private/src/scripts/editor/blocks/stat-counter/DisplayComponent.jsx deleted file mode 100644 index 1cf6c86a..00000000 --- a/private/src/scripts/editor/blocks/stat-counter/DisplayComponent.jsx +++ /dev/null @@ -1,153 +0,0 @@ -import classnames from 'classnames'; - -const { isInteger } = lodash; -const { BlockAlignmentToolbar, BlockControls, InspectorControls } = wp.blockEditor; -const { Button, RangeControl, TextControl, ToolbarGroup, PanelBody } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; -const { currentLocale = 'en-GB', enforceGroupingSeparators } = window.amnestyCoreI18n; - -const toRawNumber = (value = '0') => { - if (isInteger(value)) { - return value; - } - - const trimmed = value.replace(/[^\d]/g, ''); - const inted = parseInt(trimmed, 10); - - return inted; -}; - -// format a value as a locale-aware number -const toFormattedString = (value) => { - if (!value) { - return ''; - } - - const options = {}; - - if (enforceGroupingSeparators) { - options.useGrouping = true; - } - - const formatted = toRawNumber(value).toLocaleString(currentLocale.replace('_', '-'), options); - - return formatted; -}; - -export default class DisplayComponent extends Component { - state = { - preview: false, - current: 0, - progress: 0, - }; - - componentDidMount() { - const { value } = this.props.attributes; - const number = toRawNumber(value); - - if (number > 0) { - this.setState({ preview: true }); - this.countUp(); - } - } - - togglePreview = () => { - this.setState( - { - preview: !this.state.preview, - current: 0, - progress: 0, - }, - () => { - if (this.state.preview) { - this.countUp(); - } - }, - ); - }; - - countUp = () => { - const duration = Math.abs(this.props.attributes.duration * 1000); - const end = toRawNumber(this.props.attributes.value); - let startTime = null; - - const step = (timestamp) => { - if (!startTime) { - startTime = timestamp; - } - - const progress = Math.min((timestamp - startTime) / duration, 1); - const current = Math.floor(progress * end); - - this.setState({ current, progress }); - - if (progress < 1) { - requestAnimationFrame(step); - } - }; - - requestAnimationFrame(step); - }; - - render() { - const { current, preview, progress } = this.state; - const { attributes, className, setAttributes } = this.props; - - const blockClasses = classnames(className, { - [`align${attributes.alignment}`]: !!attributes.alignment, - }); - - // translators: [admin] - const buttonLabel = preview ? __('Edit Counter', 'amnesty') : __('Preview Counter', 'amnesty'); - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <RangeControl - // translators: [admin] - label={__('Duration', 'amnesty')} - // translators: [admin] - help={__('How long it should take the counter to count up', 'amnesty')} - min={1} - max={5} - step={0.5} - value={attributes.duration} - onChange={(duration) => setAttributes({ duration })} - /> - </PanelBody> - </InspectorControls> - <BlockControls> - <BlockAlignmentToolbar - value={attributes.alignment} - onChange={(alignment) => setAttributes({ alignment })} - /> - <ToolbarGroup> - <Button label={buttonLabel} onClick={this.togglePreview}> - {preview - ? /* translators: [admin] */ __('Edit', 'amnesty') - : /* translators: [admin] */ __('Preview', 'amnesty')} - </Button> - </ToolbarGroup> - </BlockControls> - <div className={blockClasses}> - {!preview && ( - <TextControl - // translators: [admin] - label={__('Enter the value to which this field should count', 'amnesty')} - value={toFormattedString(attributes.value)} - onChange={(value) => setAttributes({ value: toFormattedString(value) })} - placeholder={0} - /> - )} - {preview && ( - <div className="preview" style={{ opacity: progress }}> - {toFormattedString(current)} - </div> - )} - </div> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks/stat-counter/icon.jsx b/private/src/scripts/editor/blocks/stat-counter/icon.jsx deleted file mode 100644 index 6f20721c..00000000 --- a/private/src/scripts/editor/blocks/stat-counter/icon.jsx +++ /dev/null @@ -1,12 +0,0 @@ -const numberIcon = ( - <svg width="61px" height="25px" viewBox="0 0 61 25" xmlns="http://www.w3.org/2000/svg"> - <path - fill="#000000" - fillRule="even-odd" - strokeWidth="1" - d="M17.476,24 L17.476,19.716 L12.292,19.716 L12.292,1.14 L8.404,1.14 C7.972,1.404 7.534,1.638 7.09,1.842 C6.646,2.046 6.172,2.232 5.668,2.4 C5.164,2.568 4.606,2.718 3.994,2.85 C3.382,2.982 2.692,3.108 1.924,3.228 L1.924,3.228 L1.924,6.504 L7,6.504 L7,19.716 L0.844,19.716 L0.844,24 L17.476,24 Z M38.86,24 L38.86,19.536 L33.424,19.536 C32.824,19.536 32.146,19.566 31.39,19.626 C30.634,19.686 29.932,19.752 29.284,19.824 C30.388,18.864 31.444,17.886 32.452,16.89 C33.46,15.894 34.354,14.898 35.134,13.902 C35.914,12.906 36.532,11.91 36.988,10.914 C37.444,9.918 37.672,8.94 37.672,7.98 C37.672,6.876 37.474,5.88 37.078,4.992 C36.682,4.104 36.13,3.342 35.422,2.706 C34.714,2.07 33.868,1.578 32.884,1.23 C31.9,0.882 30.808,0.708 29.608,0.708 C28.72,0.708 27.91,0.786 27.178,0.942 C26.446,1.098 25.75,1.326 25.09,1.626 C24.43,1.926 23.806,2.304 23.218,2.76 C22.63,3.216 22.036,3.744 21.436,4.344 L21.436,4.344 L24.28,7.188 C24.928,6.564 25.63,6.018 26.386,5.55 C27.142,5.082 27.976,4.848 28.888,4.848 C30.088,4.848 31.012,5.142 31.66,5.73 C32.308,6.318 32.632,7.176 32.632,8.304 C32.632,9.12 32.368,9.984 31.84,10.896 C31.312,11.808 30.568,12.78 29.608,13.812 C28.648,14.844 27.496,15.954 26.152,17.142 C24.808,18.33 23.32,19.608 21.688,20.976 L21.688,20.976 L21.688,24 L38.86,24 Z M51.244,24.432 C52.444,24.432 53.596,24.282 54.7,23.982 C55.804,23.682 56.77,23.25 57.598,22.686 C58.426,22.122 59.086,21.426 59.578,20.598 C60.07,19.77 60.316,18.828 60.316,17.772 C60.316,16.284 59.824,15.078 58.84,14.154 C57.856,13.23 56.644,12.576 55.204,12.192 L55.204,12.192 L55.204,12.048 C56.572,11.52 57.64,10.842 58.408,10.014 C59.176,9.186 59.56,8.172 59.56,6.972 C59.56,5.964 59.356,5.076 58.948,4.308 C58.54,3.54 57.964,2.886 57.22,2.346 C56.476,1.806 55.588,1.398 54.556,1.122 C53.524,0.846 52.384,0.708 51.136,0.708 C49.648,0.708 48.262,0.966 46.978,1.482 C45.694,1.998 44.488,2.712 43.36,3.624 L43.36,3.624 L46.024,6.864 C46.816,6.24 47.596,5.748 48.364,5.388 C49.132,5.028 49.972,4.848 50.884,4.848 C51.94,4.848 52.768,5.07 53.368,5.514 C53.968,5.958 54.268,6.576 54.268,7.368 C54.268,8.28 53.806,9.018 52.882,9.582 C51.958,10.146 50.368,10.428 48.112,10.428 L48.112,10.428 L48.112,14.172 C49.456,14.172 50.572,14.25 51.46,14.406 C52.348,14.562 53.056,14.778 53.584,15.054 C54.112,15.33 54.484,15.672 54.7,16.08 C54.916,16.488 55.024,16.944 55.024,17.448 C55.024,18.312 54.622,18.978 53.818,19.446 C53.014,19.914 51.988,20.148 50.74,20.148 C49.684,20.148 48.682,19.932 47.734,19.5 C46.786,19.068 45.928,18.516 45.16,17.844 L45.16,17.844 L42.712,21.192 C43.6,22.176 44.752,22.962 46.168,23.55 C47.584,24.138 49.276,24.432 51.244,24.432 Z" - /> - </svg> -); - -export default numberIcon; diff --git a/private/src/scripts/editor/blocks/stat-counter/index.jsx b/private/src/scripts/editor/blocks/stat-counter/index.jsx deleted file mode 100644 index 179bc07c..00000000 --- a/private/src/scripts/editor/blocks/stat-counter/index.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import blockIcon from './icon.jsx'; -import DisplayComponent from './DisplayComponent.jsx'; -import deprecated from './deprecated.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/counter', { - // translators: [admin] - title: __('Counter', 'amnesty'), - // translators: [admin] - description: __( - 'Add a numeric field which, when scrolled into view, will count up from zero', - 'amnesty', - ), - keywords: [ - // translators: [admin] - __('Stat', 'amnesty'), - // translators: [admin] - __('Counter', 'amnesty'), - ], - icon: blockIcon, - category: 'amnesty-core', - - attributes: { - alignment: { - type: 'string', - }, - duration: { - type: 'number', - default: 2, - }, - value: { - type: 'string', - }, - }, - - deprecated, - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/term-list/DisplayComponent.jsx b/private/src/scripts/editor/blocks/term-list/DisplayComponent.jsx deleted file mode 100644 index eef2828c..00000000 --- a/private/src/scripts/editor/blocks/term-list/DisplayComponent.jsx +++ /dev/null @@ -1,184 +0,0 @@ -const { filter, has, head, map } = lodash; -const { apiFetch } = wp; -const { BlockAlignmentToolbar, BlockControls, InspectorControls, RichText } = wp.blockEditor; -const { PanelBody, SelectControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; -const { addQueryArgs } = wp.url; - -const groupTerms = (terms) => { - const grouped = {}; - - terms - .filter(({ hidden, type }) => type === 'default' && !hidden) - .forEach((term) => { - const char = term.name.charAt(0).toUpperCase(); - if (!has(grouped, char)) { - grouped[char] = []; - } - grouped[char].push(term); - }); - - return Object.keys(grouped) - .sort() - .reduce((object, key) => { - // eslint-disable-next-line no-param-reassign - object[key] = grouped[key]; - return object; - }, {}); -}; - -export default class DisplayComponent extends Component { - state = { - taxonomies: [], - options: [], - current: {}, - terms: [], - cache: {}, - activeLetter: '', - }; - - componentDidMount() { - const { taxonomy } = this.props.attributes; - - apiFetch({ path: '/wp/v2/taxonomies/' }).then((rawTaxonomies) => { - const taxonomies = filter(rawTaxonomies, (t) => t.amnesty); - const current = head(filter(taxonomies, (t) => t.slug === taxonomy)); - const options = map(taxonomies, (tax) => ({ label: tax.name, value: tax.slug })); - - this.setState({ current, options, taxonomies }); - }); - } - - componentDidUpdate(prevProps, prevState) { - const prevTax = prevProps.attributes.taxonomy; - const nextTax = this.props.attributes.taxonomy; - const { current, taxonomies } = this.state; - - if (!nextTax) { - return; - } - - if (prevTax !== nextTax) { - this.setState({ current: head(filter(taxonomies, (t) => t.slug === nextTax)) }); - } - - if (prevState.current !== current) { - this.fetchTerms(); - } - } - - fetchTerms = () => { - const { cache, current } = this.state; - - const path = addQueryArgs(`/wp/v2/${current.rest_base}/`, { - hide_empty: 'false', - per_page: '250', - }); - - if (cache[path]) { - this.setState({ terms: cache[path] }); - return; - } - - apiFetch({ path }).then((data) => { - const terms = groupTerms(data); - - this.setState({ - terms, - activeLetter: Object.keys(terms)[0], - cache: { - ...cache, - [path]: terms, - }, - }); - }); - }; - - setActiveLetter(letter) { - const { terms } = this.state; - - if (terms[letter]) { - this.setState({ activeLetter: letter }); - } - } - - renderInspectorControls() { - const { attributes, setAttributes } = this.props; - const { options } = this.state; - - return ( - <InspectorControls> - <PanelBody title={/* translators: [admin] */ __('Display Options', 'amnesty')}> - <SelectControl - // translators: [admin] - label={__('Choose taxonomy to display', 'amnesty')} - options={options} - value={attributes.taxonomy} - onChange={(taxonomy) => setAttributes({ taxonomy })} - /> - </PanelBody> - </InspectorControls> - ); - } - - renderBlockControls() { - const { attributes, setAttributes } = this.props; - - return ( - <BlockControls> - <BlockAlignmentToolbar - value={attributes.alignment} - onChange={(alignment) => setAttributes({ alignment })} - /> - </BlockControls> - ); - } - - render() { - const { attributes, className, setAttributes } = this.props; - const { activeLetter, terms } = this.state; - const letterItems = Array.from(terms[activeLetter] || []); - - return ( - <Fragment> - {this.renderInspectorControls()} - {this.renderBlockControls()} - <aside className={className}> - <RichText - tagName="h2" - format="string" - className={attributes.alignment ? `is-${attributes.alignment}-aligned` : null} - value={attributes.title} - onChange={(title) => setAttributes({ title })} - // translators: [admin] - placeholder={__('A-Z of Countries and Regions', 'amnesty')} - withoutInteractiveFormatting={true} - /> - <div className="navigation"> - {Object.keys(this.state.terms).map((letter) => ( - <button - key={letter} - className={letter === activeLetter ? 'is-active' : null} - onClick={() => this.setActiveLetter(letter)} - disabled={(terms[letter] || []).length === 0} - > - {letter} - </button> - ))} - </div> - <div className="listContainer"> - <div className="activeLetter">{activeLetter}</div> - <ul className="listItems"> - {letterItems.map((item) => ( - <li className="listItem" key={item.id}> - <a href={item.link}>{item.name}</a> - </li> - ))} - </ul> - </div> - </aside> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks/term-list/index.jsx b/private/src/scripts/editor/blocks/term-list/index.jsx deleted file mode 100644 index 4c64d6f6..00000000 --- a/private/src/scripts/editor/blocks/term-list/index.jsx +++ /dev/null @@ -1,39 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/term-list', { - // translators: [admin] - title: __('Term A-Z', 'amnesty'), - // translators: [admin] - description: __('List all visible terms in a taxonomy, grouped by first letter', 'amnesty'), - keywords: [ - // translators: [admin] - __('Term List', 'amnesty'), - // translators: [admin] - __('A-Z Terms', 'amnesty'), - // translators: [admin] - __('Countries', 'amnesty'), - ], - icon: 'editor-textcolor', - category: 'amnesty-core', - - attributes: { - title: { - type: 'string', - // translators: [admin] - default: __('A-Z of Countries and Regions', 'amnesty'), - }, - taxonomy: { - type: 'string', - }, - alignment: { - type: 'string', - }, - }, - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/tweet/DisplayComponent.jsx b/private/src/scripts/editor/blocks/tweet/DisplayComponent.jsx deleted file mode 100644 index d2fb4d46..00000000 --- a/private/src/scripts/editor/blocks/tweet/DisplayComponent.jsx +++ /dev/null @@ -1,125 +0,0 @@ -import classnames from 'classnames'; - -const { InspectorControls, PlainText, BlockAlignmentToolbar, BlockControls } = wp.blockEditor; -const { PanelBody, SelectControl, ToggleControl } = wp.components; -const { Component, Fragment } = wp.element; -const { __ } = wp.i18n; - -// https://developer.twitter.com/en/docs/twitter-api/v1/developer-utilities/configuration/api-reference/get-help-configuration -const TCO_LENGTH = 23; - -export default class DisplayComponent extends Component { - updateContent = (newContent) => { - const { setAttributes } = this.props; - let content = newContent; - let { length } = content; - let cropAt = 280; - - if (length <= cropAt) { - return setAttributes({ content }); - } - - content.match(/https?:\/\/[^\s]+/g).forEach((link) => { - length -= link.length; - cropAt += link.length; - - length += Math.min(link.length, TCO_LENGTH); - cropAt -= Math.min(link.length, TCO_LENGTH); - }); - - // limit to maximum tweet length - if (length > 280) { - content = content.substring(0, cropAt); - } - - return setAttributes({ content }); - }; - - render() { - const { attributes, setAttributes } = this.props; - const { title = '', content = '', size = '', alignment, embedLink } = attributes; - - const blockClasses = classnames('tweetAction', this.props.className, { - 'tweetAction--narrow': size === 'narrow', - }); - - const buttonClasses = classnames(['btn', 'btn--fill', 'btn--large']); - - return ( - <Fragment> - <InspectorControls> - <PanelBody> - <SelectControl - // translators: [admin] - label={__('Size', 'amnesty')} - value={size} - onChange={(newSize) => setAttributes({ size: newSize })} - options={[ - // translators: [admin] - { value: '', label: __('Default', 'amnesty') }, - // translators: [admin] - { value: 'narrow', label: __('Narrow', 'amnesty') }, - ]} - /> - <ToggleControl - // translators: [admin] - label={__('Embed Link', 'amnesty')} - // translators: [admin] - help={__('Includes a link to current post/page in tweet', 'amnesty')} - checked={embedLink} - onChange={(enableEmbed) => setAttributes({ embedLink: enableEmbed })} - /> - </PanelBody> - </InspectorControls> - <BlockControls> - <BlockAlignmentToolbar - value={alignment} - onChange={(newAlignments) => setAttributes({ alignment: newAlignments })} - /> - </BlockControls> - <div className={`tweetBlock align-${alignment}`}> - <div className={blockClasses}> - <div className="tweetAction-header"> - <span className="dashicons dashicons-twitter" aria-label="Twitter Logo"></span> - <PlainText - className="tweetAction-title" - // translators: [admin] - placeholder={__('(Action Title)', 'amnesty')} - value={title} - onChange={(newTitle) => setAttributes({ title: newTitle })} - /> - </div> - <div className="tweetAction-textBox"> - <PlainText - className="tweetAction-content" - rows="8" - // translators: [admin] - placeholder={__('(Place Tweet text proforma here)', 'amnesty')} - value={content} - onChange={(newContent) => this.updateContent(newContent)} - /> - {embedLink && ( - <p className="embedLink-placeholder"> - { - /* translators: [admin] */ __( - 'A link to the current page/post will now appear below the Tweet content when published/updated.', - 'amnesty', - ) - } - </p> - )} - </div> - <div> - <button - className={buttonClasses} - aria-label={/* translators: [admin] */ __('Send this Tweet', 'amnesty')} - > - {/* translators: [admin] */ __('Send this Tweet', 'amnesty')} - </button> - </div> - </div> - </div> - </Fragment> - ); - } -} diff --git a/private/src/scripts/editor/blocks/tweet/index.jsx b/private/src/scripts/editor/blocks/tweet/index.jsx deleted file mode 100644 index 788916bf..00000000 --- a/private/src/scripts/editor/blocks/tweet/index.jsx +++ /dev/null @@ -1,138 +0,0 @@ -import classnames from 'classnames'; -import DisplayComponent from './DisplayComponent.jsx'; - -const { assign } = lodash; -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -const blockAttributes = { - title: { - type: 'string', - }, - content: { - type: 'string', - }, - size: { - type: 'string', - }, - alignment: { - type: 'string', - }, -}; - -registerBlockType('amnesty-core/tweet-block', { - // translators: [admin] - title: __('Tweet Action', 'amnesty'), - // translators: [admin] - description: __('Add a Tweet Action block', 'amnesty'), - icon: 'twitter', - category: 'amnesty-core', - supports: { - className: true, - }, - attributes: assign({}, blockAttributes, { - alignment: { - type: 'string', - default: 'center', - }, - embedLink: { - type: 'bool', - default: false, - }, - }), - styles: [ - // translators: [admin] - { name: 'default', label: __('Default', 'amnesty'), isDefault: true }, - // translators: [admin] - { name: 'alternative-style', label: __('Alternative', 'amnesty') }, - ], - deprecated: [ - { - supports: { - className: true, - }, - attributes: blockAttributes, - save({ attributes }) { - const { content = '', size = '', title = '', alignment = 'center', className } = attributes; - - const shareBase = 'https://twitter.com/intent/tweet'; - const fullUrl = `${shareBase}?text=${encodeURIComponent(content)}`; - - const blockClasses = classnames(className, 'tweetAction', { - 'tweetAction--narrow': size === 'narrow', - }); - - const buttonClasses = classnames(['btn', 'btn--fill', 'btn--large']); - - return ( - <div className={`tweetBlock align-${alignment}`}> - <div className={blockClasses}> - <div className="tweetAction-header"> - <span className="dashicons dashicons-twitter" aria-label="Twitter Logo"></span> - <h3 className="tweetAction-title">{title}</h3> - </div> - <div className="tweetAction-content">{content}</div> - <div className="tweetButton"> - <a - className={buttonClasses} - href={fullUrl} - target="_blank" - rel="noopener noreferrer" - // translators: [admin] - aria-label={__('Send this Tweet', 'amnesty')} - > - {/* translators: [admin] */ __('Send this Tweet', 'amnesty')} - </a> - </div> - </div> - </div> - ); - }, - }, - { - supports: { - className: false, - }, - attributes: blockAttributes, - save({ attributes }) { - const { centred = false, content = '', size = '', title = '' } = attributes; - - const shareBase = 'https://twitter.com/intent/tweet'; - const fullUrl = `${shareBase}?text=${encodeURIComponent(content)}`; - - const blockClasses = classnames('tweetAction', { - 'tweetAction--narrow': size === 'narrow', - aligncentre: centred === true, - }); - - const buttonClasses = classnames(['btn', 'btn--fill', 'btn--large']); - - return ( - <div className={blockClasses}> - <div className="tweetAction-header"> - <span className="dashicons dashicons-twitter" aria-label="Twitter Logo"></span> - <h3 className="tweetAction-title">{title}</h3> - </div> - <div className="tweetAction-content">{content}</div> - <div> - <a - className={buttonClasses} - href={fullUrl} - target="_blank" - rel="noopener noreferrer" - // translators: [admin] - aria-label={__('Send this Tweet', 'amnesty')} - > - {/* translators: [admin] */ __('Send this Tweet', 'amnesty')} - </a> - </div> - </div> - ); - }, - }, - ], - - edit: DisplayComponent, - - save: () => null, -}); diff --git a/private/src/scripts/editor/blocks/utils.js b/private/src/scripts/editor/blocks/utils.js deleted file mode 100644 index 011f2700..00000000 --- a/private/src/scripts/editor/blocks/utils.js +++ /dev/null @@ -1,207 +0,0 @@ -import { sanitizeUrl } from '@braintree/sanitize-url'; - -const { isUndefined } = lodash; - -/** - * Simply compares two string version values. - * - * Example: - * versionCompare('1.1', '1.2') => -1 - * versionCompare('1.1', '1.1') => 0 - * versionCompare('1.2', '1.1') => 1 - * versionCompare('2.23.3', '2.22.3') => 1 - * - * Returns: - * -1 = left is LOWER than right - * 0 = they are equal - * 1 = left is GREATER = right is LOWER - * And FALSE if one of input versions are not valid - * - * @function - * @param {String} left Version #1 - * @param {String} right Version #2 - * @return {Integer|Boolean} - * @author Alexey Bass (albass) - * @since 2011-07-14 - */ -export const versionCompare = (left, right) => { - if (typeof left + typeof right !== 'stringstring') return false; - - const a = left.split('.'); - const b = right.split('.'); - let i = 0; - const len = Math.max(a.length, b.length); - - // eslint-disable-next-line no-plusplus - for (; i < len; i++) { - if ((a[i] && !b[i] && parseInt(a[i], 10) > 0) || parseInt(a[i], 10) > parseInt(b[i], 10)) { - return 1; - } - if ((b[i] && !a[i] && parseInt(b[i], 10) > 0) || parseInt(a[i], 10) < parseInt(b[i], 10)) { - return -1; - } - } - - return 0; -}; - -/** - * Validate whether a value is a boolean type - * - * @param {Mixed} val the value to validate - * - * @return {Boolean} - */ -export const validateBool = (val) => { - if (isUndefined(val)) { - return false; - } - - if (val === true || val === false) { - return val; - } - - if (['1', 'true', 'yes', 'on', 'y'].indexOf(`${val}`.toLowerCase()) !== -1) { - return true; - } - - if (['0', 'false', 'no', 'off', 'n'].indexOf(`${val}`.toLowerCase()) !== -1) { - return false; - } - - return !!val; -}; - -/** - * Generate a random alphanumeric key of {length} length - * - * @param {Integer} length the length of key to generate - * - * @return {String} - */ -export const key = (length) => { - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - const charLength = characters.length; - let result = ''; - - for (let i = 0; i < length; i += 1) { - result += characters.charAt(Math.floor(Math.random() * charLength)); - } - - return result; -}; - -/** - * Convert the first character of a string to uppercase - * - * @param {String} str the string to texturise - * - * @returns {String} - */ -export const ucfirst = (str = '') => str.charAt(0).toUpperCase() + str.slice(1); - -/** - * Check whether a variable is of the type specified - * - * @param {Mixed} val the value to test - * @param {String} type the type to check - * - * @returns {Boolean} - */ -export const isType = (val, type) => - Object.prototype.toString.call(val) === `[object ${ucfirst(type)}]`; - -/** - * Convert an array to a string - * - * @param {Array|String} val the value to stringify - * - * @returns {String} - */ -export const stringify = (val) => (isType(val, 'array') ? val.join('') : val); - -/** - * Trim line breaks from a string - * - * @param {String} str the string to trim - * - * @returns {String} - */ -export const trimBr = (str = '') => str.replace(/\u003cbr\/\u003e/gi, ' ').trim(); - -/** - * Convert line breaks to paragraphs - * - * @param {String} str the string to texturise - * - * @returns {String} - */ -export const brToP = (str = '') => - stringify(str) - .replace(/((<|&lt;|\u003c)br[^>]*?>)+$/, '') // trim trailing <br>s - .split(/(?:(?:(?:<|&lt;|\u003c)br[^>]*?>)+)/) // split on one or more embedded <br>s - .map((p) => `<p>${p}</p>`) // make paragraphs - .join(''); // make a string - -/** - * Generate a random identifier - * - * @returns {String} - */ -export const randId = () => - Math.random() - .toString(36) - .replace(/[^a-z]+/g, '') - .substring(2, 10); - -/** - * Ensure a URI uses HTTPS proto. Fails to an empty string. - * - * @param {String} string the string to force HTTPS for - * - * @returns {String} - */ -export const httpsOnly = (string) => { - try { - const url = new URL(string.replace(/^http:/, 'https:')); - - url.protocol = 'https:'; - - return sanitizeUrl(url.toString()); - } catch (e) { - // not a proper url yet - return string; - } -}; - -/** - * Retrieve media data and pass response to a callback - * - * @param {Number} id the media to fetch - * @param {Function} callback the callback to execute - * @param {Object} state previous data, if any - * - * @return {Promise} - */ -export const fetchMediaData = (id, callback, state = {}) => { - if (!id) { - return Promise.resolve(callback({})); - } - - if (state?.id === id) { - return Promise.resolve(callback(state)); - } - - return wp - .apiFetch({ - path: `/wp/v2/media/${id}?_fields=id,source_url,caption,description&context=edit`, - }) - .then((media) => - callback({ - id: media.id, - url: media.source_url, - caption: media.caption.raw, - copyright: media.description.raw, - }), - ); -}; diff --git a/private/src/scripts/editor/components/MediaMetadataVisibilityControls.jsx b/private/src/scripts/editor/components/MediaMetadataVisibilityControls.jsx deleted file mode 100644 index d3e3de04..00000000 --- a/private/src/scripts/editor/components/MediaMetadataVisibilityControls.jsx +++ /dev/null @@ -1,33 +0,0 @@ -const { ToggleControl } = wp.components; -const { __ } = wp.i18n; - -const MediaMetadataVisibilityControls = ({ type, hideCaption, hideCopyright, setAttributes }) => { - // translators: [admin] - let captionLabel = __('Hide Image Caption', 'amnesty'); - // translators: [admin] - let copyrightLabel = __('Hide Image Credit', 'amnesty'); - - if (type === 'video') { - // translators: [admin] - captionLabel = __('Hide Video Caption', 'amnesty'); - // translators: [admin] - copyrightLabel = __('Hide Video Credit', 'amnesty'); - } - - return ( - <> - <ToggleControl - label={captionLabel} - checked={hideCaption} - onChange={() => setAttributes({ hideImageCaption: !hideCaption })} - /> - <ToggleControl - label={copyrightLabel} - checked={hideCopyright} - onChange={() => setAttributes({ hideImageCopyright: !hideCopyright })} - /> - </> - ); -}; - -export default MediaMetadataVisibilityControls; diff --git a/private/src/scripts/editor/components/PostFeaturedVideo.jsx b/private/src/scripts/editor/components/PostFeaturedVideo.jsx deleted file mode 100644 index d35d0cc2..00000000 --- a/private/src/scripts/editor/components/PostFeaturedVideo.jsx +++ /dev/null @@ -1,111 +0,0 @@ -const { MediaUpload } = wp.blockEditor; -const { Button } = wp.components; -const { Component } = wp.element; -const { __ } = wp.i18n; - -// translators: [admin] -const DEFAULT_SET_FEATURE_VIDEO_LABEL = __('Set featured video', 'amnesty'); -// translators: [admin] -const DEFAULT_REMOVE_FEATURE_VIDEO_LABEL = __('Remove featured video', 'amnesty'); - -class PostFeaturedVideo extends Component { - constructor(...args) { - super(...args); - - this.state = { - media: false, - }; - } - - componentDidMount() { - if (this.props.featuredVideoId && !this.state.media) { - this.fetchMediaObject(); - } - } - - fetchMediaObject() { - const { featuredVideoId } = this.props; - wp.apiRequest({ - path: `/wp/v2/media/${featuredVideoId}`, - }).then((resp) => { - this.setState({ - media: { ...resp }, - }); - }); - } - - onUpdateVideo = (media) => { - if (!media) { - this.setState({ media: false }); - - this.props.onUpdate(''); - return; - } - - this.setState({ media }); - this.props.onUpdate(media.id); - }; - - onRemoveVideo = () => this.onUpdateVideo(false); - - render() { - const { featuredVideoId } = this.props; - const { media } = this.state; - - return ( - <div className="editor-post-featured-image"> - {!!featuredVideoId && ( - <MediaUpload - title={DEFAULT_SET_FEATURE_VIDEO_LABEL} - onSelect={this.onUpdateVideo} - allowedTypes={['video']} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <Button className="editor-post-featured-image__preview" onClick={open} /> - )} - /> - )} - {!!featuredVideoId && media && !media.isLoading && ( - <MediaUpload - title={DEFAULT_SET_FEATURE_VIDEO_LABEL} - onSelect={this.onUpdateVideo} - allowedTypes={['video']} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <div> - <video> - <source src={media.source_url || media.url} /> - </video> - <Button onClick={open} isSecondary isLarge> - {/* translators: [admin] */ __('Replace Video', 'amnesty')} - </Button> - </div> - )} - /> - )} - {!featuredVideoId && ( - <div> - <MediaUpload - title={DEFAULT_SET_FEATURE_VIDEO_LABEL} - onSelect={this.onUpdateVideo} - allowedTypes={['video']} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <Button className="editor-post-featured-image__toggle" onClick={open}> - {DEFAULT_SET_FEATURE_VIDEO_LABEL} - </Button> - )} - /> - </div> - )} - {!!featuredVideoId && ( - <Button onClick={this.onRemoveVideo} isLink isDestructive> - {DEFAULT_REMOVE_FEATURE_VIDEO_LABEL} - </Button> - )} - </div> - ); - } -} - -export default PostFeaturedVideo; diff --git a/private/src/scripts/editor/components/PostMediaSelector.jsx b/private/src/scripts/editor/components/PostMediaSelector.jsx deleted file mode 100644 index cade531d..00000000 --- a/private/src/scripts/editor/components/PostMediaSelector.jsx +++ /dev/null @@ -1,147 +0,0 @@ -const { MediaUpload } = wp.blockEditor; -const { Button, Spinner } = wp.components; -const { Component } = wp.element; -const { __ } = wp.i18n; - -// translators: [admin] -const DEFAULT_SET_MEDIA_LABEL = __('Set Image', 'amnesty'); -// translators: [admin] -const DEFAULT_REPLACE_MEDIA_LABEL = __('Replace Image', 'amnesty'); -// translators: [admin] -const DEFAULT_REMOVE_MEDIA_LABEL = __('Remove Image', 'amnesty'); - -class PostMediaSelector extends Component { - constructor(...args) { - super(...args); - - this.state = { - media: false, - loading: false, - }; - } - - componentDidMount() { - if (this.props.mediaId && !this.state.media) { - this.fetchMediaObject(); - } - } - - componentDidUpdate(prevProps) { - if (this.props.mediaId !== prevProps.mediaId) { - this.fetchMediaObject(); - } - } - - static getMediaObjectPromise = (mediaId) => - wp.apiRequest({ - path: `/wp/v2/media/${mediaId}`, - }); - - fetchMediaObject() { - const { mediaId } = this.props; - - if (!mediaId) { - return; - } - - this.setState({ loading: true }); - - wp.apiRequest({ - path: `/wp/v2/media/${mediaId}`, - }).then((resp) => { - this.setState({ - media: { ...resp }, - loading: false, - }); - }); - } - - onUpdate = async (media) => { - if (!media) { - this.setState({ media: false }); - this.props.onUpdate(); - return; - } - - const response = await PostMediaSelector.getMediaObjectPromise(media.id); - - this.setState({ response }); - this.props.onUpdate({ ...response }); - }; - - onRemove = () => this.onUpdate(); - - render() { - const { - mediaId, - labels: { - set: setMediaLabel = DEFAULT_SET_MEDIA_LABEL, - remove: removeMediaLabel = DEFAULT_REMOVE_MEDIA_LABEL, - replace: replaceMediaLabel = DEFAULT_REPLACE_MEDIA_LABEL, - } = {}, - type: mediaType = 'image', - } = this.props; - const { media, loading } = this.state; - - return ( - <div className="editor-post-featured-image"> - {!!mediaId && ( - <MediaUpload - title={setMediaLabel} - onSelect={this.onUpdate} - allowedTypes={[mediaType]} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <Button className="editor-post-featured-image__preview" onClick={open} /> - )} - /> - )} - {!!mediaId && media && !media.isLoading && ( - <MediaUpload - title={setMediaLabel} - onSelect={this.onUpdate} - allowedTypes={[mediaType]} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <div> - {!loading && mediaType === 'video' && ( - <video> - <source src={media.source_url || media.url} /> - </video> - )} - {!loading && mediaType === 'image' && <img src={media.source_url || media.url} />} - - {loading && <Spinner />} - <Button onClick={open} isSecondary isLarge> - {replaceMediaLabel} - </Button> - </div> - )} - /> - )} - {!mediaId && ( - <div> - <MediaUpload - title={setMediaLabel} - onSelect={this.onUpdate} - allowedTypes={[mediaType]} - modalClass="editor-post-featured-image__media-modal" - render={({ open }) => ( - <Button className="editor-post-featured-image__toggle" onClick={open}> - {setMediaLabel} - </Button> - )} - /> - </div> - )} - {!!mediaId && ( - <Button onClick={this.onRemove} isLink isDestructive> - {removeMediaLabel} - </Button> - )} - </div> - ); - } -} - -export default PostMediaSelector; diff --git a/private/src/scripts/editor/components/PostSelect.jsx b/private/src/scripts/editor/components/PostSelect.jsx deleted file mode 100644 index ee290715..00000000 --- a/private/src/scripts/editor/components/PostSelect.jsx +++ /dev/null @@ -1,151 +0,0 @@ -import Select from 'react-select'; - -const { Component } = wp.element; -const { __ } = wp.i18n; - -class PostSelect extends Component { - constructor(...args) { - super(...args); - - this.state = { - loading: false, - paging: false, - currentPage: 1, - maxPages: 1, - options: [ - { - label: 'Global Default', - value: '0', - }, - ], - selected: '', - }; - } - - componentDidMount() { - this.fetchSelectedSidebar(); - } - - /** - * If the current value is present it will fetch that single result, - * before fetching the remaining posts. - * @returns {*} - */ - fetchSelectedSidebar = () => { - if (!this.props.value) { - return this.fetchSidebars(); - } - - return wp.apiRequest({ path: `/wp/v2/sidebar/${this.props.value}` }).then((item) => { - this.setState( - { - selected: { - label: item.title.rendered, - value: item.id, - }, - options: [ - { - label: item.title.rendered, - value: item.id, - }, - ...this.state.options, - ], - }, - () => this.fetchSidebars(), - ); - }); - }; - - /** - * Processes the the api response into an array of objects to be consumed by 'react-select', - * in addition to this, we also set the current page and max number of pages - * - * @param {Object[]} sidebars - Api data response. - * @param status - the response status - * @param {Object} xhr - current xhr response object. - */ - handleApiResult = (sidebars, status, xhr) => { - const ids = []; - this.setState({ - options: [ - ...this.state.options, - ...sidebars.map((sidebar) => ({ - label: sidebar.title.rendered, - value: sidebar.id, - })), - ].filter((option) => { - if (ids.indexOf(option.value) !== -1) { - return false; - } - - ids.push(option.value); - return true; - }), - maxPages: xhr.getResponseHeader('x-wp-totalpages'), - loading: false, - paging: false, - }); - }; - - fetchSidebars() { - wp.apiRequest({ path: '/wp/v2/sidebar' }).then(this.handleApiResult); - } - - /** - * Paginate the sidebar selector when the select box hits the bottom. - */ - fetchSidebarPage = () => { - if (this.state.loading || this.state.paging || this.state.currentPage >= this.state.maxPages) { - return; - } - - const currentPage = this.state.currentPage + 1; - - this.setState({ - paging: true, - currentPage, - }); - - wp.apiRequest({ path: `/wp/v2/sidebar/?page=${currentPage}` }).then(this.handleApiResult); - }; - - /** - * Fire the onchange method thats passed down in props, - * Also sets the state for the selected value. - * - * @param {Object} value - current selected item in the select box. - */ - handleInputChange = (value) => { - this.props.onChange(value.value); - this.setState({ selected: value }); - }; - - render() { - return ( - <Select - options={this.state.options} - styles={{ - menu: (base) => ({ - ...base, - position: 'relative', - }), - }} - isLoading={this.state.loading || this.state.paging} - isDisabled={this.state.loading} - placeholder={ - this.state.loading - ? // translators: [admin] - __('Loading', 'amnesty') - : // translators: [admin] - __('Select a sidebar', 'amnesty') - } - onMenuScrollToBottom={this.fetchSidebarPage} - onChange={this.handleInputChange} - isClearable={false} - value={this.state.selected || null} - /> - ); - } -} - -export default PostSelect; diff --git a/private/src/scripts/editor/fse-blocks/archive-filters/DisplayComponent.jsx b/private/src/scripts/editor/fse-blocks/archive-filters/DisplayComponent.jsx deleted file mode 100644 index 3f8c33f8..00000000 --- a/private/src/scripts/editor/fse-blocks/archive-filters/DisplayComponent.jsx +++ /dev/null @@ -1,5 +0,0 @@ -const { serverSideRender: ServerSideRender } = wp; - -const ArchiveFilters = () => <ServerSideRender block="amnesty-core/archive-filters" />; - -export default ArchiveFilters; diff --git a/private/src/scripts/editor/fse-blocks/archive-filters/index.jsx b/private/src/scripts/editor/fse-blocks/archive-filters/index.jsx deleted file mode 100644 index f37ae7e1..00000000 --- a/private/src/scripts/editor/fse-blocks/archive-filters/index.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/archive-filters', { - title: __('Archive Filters', 'amnesty'), - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/fse-blocks/archive-header/DisplayComponent.jsx b/private/src/scripts/editor/fse-blocks/archive-header/DisplayComponent.jsx deleted file mode 100644 index 5ec286d4..00000000 --- a/private/src/scripts/editor/fse-blocks/archive-header/DisplayComponent.jsx +++ /dev/null @@ -1,7 +0,0 @@ -const { serverSideRender: ServerSideRender } = wp; - -const ArchiveHeader = () => ( - <ServerSideRender block="amnesty-core/archive-header" className="archive-header" /> -); - -export default ArchiveHeader; diff --git a/private/src/scripts/editor/fse-blocks/archive-header/index.jsx b/private/src/scripts/editor/fse-blocks/archive-header/index.jsx deleted file mode 100644 index 70b2822f..00000000 --- a/private/src/scripts/editor/fse-blocks/archive-header/index.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; - -registerBlockType('amnesty-core/archive-header', { - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/fse-blocks/pop-in/DisplayComponent.jsx b/private/src/scripts/editor/fse-blocks/pop-in/DisplayComponent.jsx deleted file mode 100644 index e00135dd..00000000 --- a/private/src/scripts/editor/fse-blocks/pop-in/DisplayComponent.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const { InnerBlocks } = wp.blockEditor; - -const PopIn = () => ( - <aside id="pop-in" className="u-textCenter pop-in"> - <div className="section section--small"> - <div className="container container--small"> - <InnerBlocks /> - </div> - </div> - </aside> -); - -export default PopIn; diff --git a/private/src/scripts/editor/fse-blocks/pop-in/index.jsx b/private/src/scripts/editor/fse-blocks/pop-in/index.jsx deleted file mode 100644 index d56ae610..00000000 --- a/private/src/scripts/editor/fse-blocks/pop-in/index.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; - -registerBlockType('amnesty-core/pop-in', { - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/fse-blocks/query-count/DisplayComponent.jsx b/private/src/scripts/editor/fse-blocks/query-count/DisplayComponent.jsx deleted file mode 100644 index 05979f70..00000000 --- a/private/src/scripts/editor/fse-blocks/query-count/DisplayComponent.jsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function DisplayComponent() { - return null; -} diff --git a/private/src/scripts/editor/fse-blocks/query-count/index.jsx b/private/src/scripts/editor/fse-blocks/query-count/index.jsx deleted file mode 100644 index d5c50cdb..00000000 --- a/private/src/scripts/editor/fse-blocks/query-count/index.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; -const { __ } = wp.i18n; - -registerBlockType('amnesty-core/query-count', { - title: __('Query Count', 'amnesty'), - description: __('Display the query results count', 'amnesty'), - category: 'theme', - icon: 'info', - usesContext: ['queryId', 'query'], - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/fse-blocks/search-form/DisplayComponent.jsx b/private/src/scripts/editor/fse-blocks/search-form/DisplayComponent.jsx deleted file mode 100644 index 02bf06cd..00000000 --- a/private/src/scripts/editor/fse-blocks/search-form/DisplayComponent.jsx +++ /dev/null @@ -1,7 +0,0 @@ -const { serverSideRender: ServerSideRender } = wp; - -const SearchForm = () => ( - <ServerSideRender block="amnesty-core/search-form" className="horizontal-search" /> -); - -export default SearchForm; diff --git a/private/src/scripts/editor/fse-blocks/search-form/index.jsx b/private/src/scripts/editor/fse-blocks/search-form/index.jsx deleted file mode 100644 index 49cbb536..00000000 --- a/private/src/scripts/editor/fse-blocks/search-form/index.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; - -registerBlockType('amnesty-core/search-form', { - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/fse-blocks/search-header/DisplayComponent.jsx b/private/src/scripts/editor/fse-blocks/search-header/DisplayComponent.jsx deleted file mode 100644 index 857363fe..00000000 --- a/private/src/scripts/editor/fse-blocks/search-header/DisplayComponent.jsx +++ /dev/null @@ -1,5 +0,0 @@ -const { serverSideRender: ServerSideRender } = wp; - -const SearchHeader = () => <ServerSideRender block="amnesty-core/search-header" />; - -export default SearchHeader; diff --git a/private/src/scripts/editor/fse-blocks/search-header/index.jsx b/private/src/scripts/editor/fse-blocks/search-header/index.jsx deleted file mode 100644 index 7999d87d..00000000 --- a/private/src/scripts/editor/fse-blocks/search-header/index.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; - -registerBlockType('amnesty-core/search-header', { - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/fse-blocks/sidebar/DisplayComponent.jsx b/private/src/scripts/editor/fse-blocks/sidebar/DisplayComponent.jsx deleted file mode 100644 index c5af954b..00000000 --- a/private/src/scripts/editor/fse-blocks/sidebar/DisplayComponent.jsx +++ /dev/null @@ -1,47 +0,0 @@ -const { defaultSidebars } = window.aiSettings; -const { useBlockProps } = wp.blockEditor; -const { useEntityRecord } = wp.coreData; -const { useSelect } = wp.data; -const { store: editorStore } = wp.editor; -const { RawHTML } = wp.element; - -const DisplayComponent = () => { - const postMeta = useSelect((select) => { - const meta = select(editorStore).getEditedPostAttribute('meta'); - const type = select(editorStore).getEditedPostAttribute('type'); - - /* eslint-disable-next-line no-underscore-dangle */ - const sidebarId = parseInt(meta?._sidebar_id, 10) || (defaultSidebars?.[type]?.[0] ?? 0); - - return { - /* eslint-disable no-underscore-dangle */ - contentMaximised: meta?._maximize_post_content, - sidebarDisabled: meta?._disable_sidebar, - /* eslint-enable no-underscore-dangle */ - sidebarId, - }; - }, []); - - const currentSidebar = useEntityRecord('postType', 'sidebar', postMeta.sidebarId); - const sidebarContent = currentSidebar?.isResolving ? '' : currentSidebar?.record?.content?.raw; - - const blockProps = useBlockProps(); - - if (postMeta.contentMaximised) { - return null; - } - - // an empty sidebar node is required when the sidebar is disabled, - // but the content is not set to maximised, for legacy reasons. - if (postMeta.sidebarDisabled || !sidebarContent) { - return <div {...blockProps}></div>; - } - - return ( - <div {...blockProps}> - <RawHTML>{sidebarContent}</RawHTML> - </div> - ); -}; - -export default DisplayComponent; diff --git a/private/src/scripts/editor/fse-blocks/sidebar/index.jsx b/private/src/scripts/editor/fse-blocks/sidebar/index.jsx deleted file mode 100644 index a33b30d5..00000000 --- a/private/src/scripts/editor/fse-blocks/sidebar/index.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import DisplayComponent from './DisplayComponent.jsx'; - -const { registerBlockType } = wp.blocks; - -registerBlockType('amnesty-core/sidebar', { - edit: DisplayComponent, - save: () => null, -}); diff --git a/private/src/scripts/editor/plugins/appearance-options/components/Sidebar.jsx b/private/src/scripts/editor/plugins/appearance-options/components/Sidebar.jsx deleted file mode 100644 index 3c4e30de..00000000 --- a/private/src/scripts/editor/plugins/appearance-options/components/Sidebar.jsx +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable no-underscore-dangle */ -import PostSelect from '../../../components/PostSelect.jsx'; - -const { PanelBody, ToggleControl } = wp.components; -const { __ } = wp.i18n; -/** - * Render the Sidebar options - * - * @param {Function} createMetaUpdate creates an update function - * @param {Object} props the plugin props - * - * @returns {wp.element.Component|null} - */ -const Sidebar = ({ createMetaUpdate, props }) => { - if (!['page', 'post'].includes(props.type)) { - return null; - } - - return ( - <PanelBody title={/* translators: [admin] */ __('Sidebar', 'amnesty')} initialOpen={false}> - <ToggleControl - // translators: [admin] - label={__('Maximize Content', 'amnesty')} - help={ - // translators: [admin] - __( - 'Remove the sidebar and the sidebar area on posts and pages. Generally used to create pages with a full-width page design.', - 'amnesty', - ) - } - checked={props.meta._maximize_post_content} - onChange={() => - createMetaUpdate( - '_maximize_post_content', - !props.meta._maximize_post_content, - props.meta, - props.oldMeta, - ) - } - /> - <ToggleControl - // translators: [admin] - label={__('Disable Sidebar', 'amnesty')} - help={ - // translators: [admin] - __( - 'Remove the sidebar, but not the sidebar area; this keeps an empty space to the side of the content. Generally used for text heavy pages.', - 'amnesty', - ) - } - checked={props.meta._disable_sidebar} - onChange={() => - createMetaUpdate( - '_disable_sidebar', - !props.meta._disable_sidebar, - props.meta, - props.oldMeta, - ) - } - /> - <PostSelect - onChange={(sidebarId) => - createMetaUpdate('_sidebar_id', sidebarId, props.meta, props.oldMeta) - } - value={props.meta._sidebar_id} - /> - </PanelBody> - ); -}; - -export default Sidebar; diff --git a/private/src/scripts/editor/plugins/appearance-options/index.jsx b/private/src/scripts/editor/plugins/appearance-options/index.jsx deleted file mode 100644 index ef29abdb..00000000 --- a/private/src/scripts/editor/plugins/appearance-options/index.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import reviseData from '../../../utils/reviseData'; -import AppearanceOptions from './AppearanceOptions.jsx'; - -const { compose, ifCondition } = wp.compose; -const { withSelect, withDispatch } = wp.data; -const { registerPlugin } = wp.plugins; - -const plugin = compose([ - withSelect((select) => { - // Grab the post meta that has been edited. - const postMeta = select('core/editor').getEditedPostAttribute('meta') || {}; - // Grab the post meta that was present on load. - const oldPostMeta = select('core/editor').getCurrentPostAttribute('meta') || {}; - - const template = (select('core/editor').getEditedPostAttribute('template') || '') - .replace('templates/', '') - .replace('.php', ''); - - return { - template, - meta: { ...oldPostMeta, ...postMeta }, - oldMeta: oldPostMeta, - type: select('core/editor').getEditedPostAttribute('type'), - }; - }), - withDispatch((dispatch) => ({ - createMetaUpdate(key, value, newMeta = {}, oldMeta = {}) { - const meta = { - ...reviseData(oldMeta, newMeta), - [key]: value, - }; - - dispatch('core/editor').editPost({ meta }); - }, - })), - ifCondition(() => - ['post', 'page'].includes(wp.data.select('core/editor').getEditedPostAttribute('type')), - ), -])(AppearanceOptions); - -registerPlugin('amnesty-appearance', { - icon: 'admin-appearance', - render: plugin, -}); diff --git a/private/src/scripts/editor/plugins/pop-in/index.jsx b/private/src/scripts/editor/plugins/pop-in/index.jsx deleted file mode 100644 index 068872cc..00000000 --- a/private/src/scripts/editor/plugins/pop-in/index.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import './block-restrictions'; - -import { validateBool } from '../../blocks/utils'; - -const { ToggleControl } = wp.components; -const { compose, ifCondition } = wp.compose; -const { select, useDispatch, useSelect } = wp.data; -const { Fragment, useCallback } = wp.element; -const { PluginDocumentSettingPanel } = wp.editPost; -const { __ } = wp.i18n; -const { registerPlugin } = wp.plugins; - -const useRenderTitle = (props) => { - const { renderTitle } = useSelect( - (store) => { - const meta = store('core/editor').getEditedPostAttribute('meta'); - return { - renderTitle: validateBool(meta?.renderTitle) ? 'yes' : 'no', - }; - }, - [props], - ); - - const { editPost } = useDispatch('core/editor'); - const onRenderTitleToggle = useCallback( - (value) => { - editPost({ - meta: { - renderTitle: validateBool(value) ? 'yes' : 'no', - }, - }); - }, - [editPost], - ); - - return { renderTitle, onRenderTitleToggle }; -}; - -const PopInSettings = (props) => { - const { renderTitle, onRenderTitleToggle } = useRenderTitle(props); - - return ( - <Fragment> - <PluginDocumentSettingPanel - name="pop-in" - title={/* translators: [admin] */ __('Pop-in Settings', 'amnesty')} - > - <ToggleControl - // translators: [admin] - label={__('Render Title', 'amnesty')} - // translators: [admin] - help={__('Should the title be rendered when showing this pop-in to the user?', 'amnesty')} - checked={validateBool(renderTitle)} - onChange={(value) => onRenderTitleToggle(value)} - /> - </PluginDocumentSettingPanel> - </Fragment> - ); -}; - -registerPlugin('amnesty-core-pop-in', { - render: compose([ - ifCondition(() => select('core/editor').getEditedPostAttribute('type') === 'pop-in'), - ])(PopInSettings), -}); diff --git a/private/src/scripts/modules/Expose.js b/private/src/scripts/modules/Expose.js deleted file mode 100755 index 84eda0d4..00000000 --- a/private/src/scripts/modules/Expose.js +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable no-console */ -/** - * Expose functions/modules to be used with the `.using()` method on App - * to conditionally run functions/modules if they are page dependant. - * - * @param {Object} fns - Exposed functions - */ -function expose(fns = {}) { - function using(fnName, ...args) { - if (Array.isArray(fnName)) { - fnName.map((fn) => { - let fnArgs = args; - let func = fn; - - if (Array.isArray(func)) { - [func, ...fnArgs] = func; - } - - return using(func, ...fnArgs); - }); - - return { using }; - } - - if (fns[fnName]) { - fns[fnName](...args); - } else { - throw new Error(`The module \`${fnName}\` does not exist, or is not exposed for using.`); - } - - return this; - } - - return using; -} - -export default expose; diff --git a/private/src/scripts/modules/browser-detector.js b/private/src/scripts/modules/browser-detector.js deleted file mode 100644 index 92f08628..00000000 --- a/private/src/scripts/modules/browser-detector.js +++ /dev/null @@ -1,40 +0,0 @@ -export default function browserDetector() { - // Firefox 1.0+ - const isFirefox = typeof InstallTrigger !== 'undefined'; - - // Safari 3.0+ "[object HTMLElementConstructor]" - const isSafari = - window.navigator.userAgent.indexOf('Safari') > -1 && - window.navigator.userAgent.indexOf('Chrome') === -1; - - // Internet Explorer 6-11 - const isIE = false || !!document.documentMode; - - // Edge 20+ - const isEdge = window.navigator.userAgent.indexOf('Edge/') > -1; - - // Chrome 1 - 71 - const isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime); - - const { body } = document; - - if (isFirefox) { - body.classList.add('firefox'); - } - - if (isSafari) { - body.classList.add('safari'); - } - - if (isIE) { - body.classList.add('ie'); - } - - if (isEdge) { - body.classList.add('edge'); - } - - if (isChrome) { - body.classList.add('chrome'); - } -} diff --git a/private/src/scripts/modules/checkbox-group.js b/private/src/scripts/modules/checkbox-group.js deleted file mode 100644 index 92c1af22..00000000 --- a/private/src/scripts/modules/checkbox-group.js +++ /dev/null @@ -1,279 +0,0 @@ -import keyboard from '../utils/keyboard'; -import searchList from '../utils/list-search'; - -const groupCache = new Map(); -const siblingGroupsCache = new Map(); -const groupsItemsCache = new Map(); - -/** - * Close a group - * - * @param {DOMNode} group the group to close - * @param {DOMNode} button the group's button - * - * @returns {Void} - */ -const closeGroup = (group, button) => { - button.classList.remove('is-active'); - button.setAttribute('aria-expanded', false); -}; - -/** - * Close all open groups - * - * @returns {Void} - */ -const closeGroups = () => { - groupCache.forEach(closeGroup); -}; - -/** - * Toggle a group's visibility - * - * @param {DOMNode} button the group's button - * - * @returns {Void} - */ -const toggleGroup = (button) => { - if (!button.classList.contains('is-active')) { - closeGroups(); - } - - button.classList.toggle('is-active'); - button.setAttribute('aria-expanded', button.classList.contains('is-active')); -}; - -/** - * Perform a search through the items in a group - * - * @param {Event} event the event object - * @param {DOMNode} parent the parent group - * - * @returns {Void} - */ -const search = searchList({ - groupSelector: '.checkboxGroup-list', - textFilter: (o, term) => o.nextElementSibling.textContent.toLowerCase().indexOf(term) === 0, -}); - -/** - * Fire a change event on an input - * - * @param {DOMNode} input the input to fire the event on - * @param {Object} data any data to pass along with the event - * - * @returns {Void} - */ -const fireChangeEvent = (input, data = {}) => { - const event = new Event('change', { bubbles: true }); - event.data = data; - input.dispatchEvent(event); -}; - -/** - * Toggle visibility of groups on keyboard events - * - * @param {Event} event the event object - * - * @returns {Void} - */ -const handleKeyboardEvents = (event) => { - const { target } = event; - - if (keyboard.isEscape(event)) { - closeGroups(); - return; - } - - // perform a search of items if the user is typing - if (keyboard.isLetter(event) && !keyboard.hasModifier(event)) { - const parent = target.closest('.checkboxGroup'); - const options = groupsItemsCache.get(parent); - if (parent && options) { - search(event, options); - } - return; - } - - // submit if the user is selecting a radio button - if (keyboard.isEnter(event) || keyboard.isSpace(event)) { - const parent = target.closest('.checkboxGroup'); - - if (target.matches('.checkboxGroup-button')) { - // clicking a group button; toggle active state - toggleGroup(target); - return; - } - - if (parent?.matches('.is-nav') && target?.matches('input[type="radio"]')) { - const { value } = target.parentElement.dataset; - - // if the item's data-value attribute is empty, no-op. - if (!value) { - return; - } - - // use the item's data-value attribute to perform the navigation. - const url = new URL(value); - window.location.href = url.href; - - return; - } - - // a radio has been clicked; trigger its action by submitting the form - if (parent?.matches('.is-form') && target?.matches('input[type="radio"]')) { - parent.submit(); - } - - if (parent?.matches('.is-control') && target?.matches('input[type="radio"]')) { - toggleGroup(parent.querySelector('.checkboxGroup-button')); - fireChangeEvent(target, { input: target }); - } - - return; - } - - // would normally return-early, but we may add to this later - if (keyboard.isDirectional(event)) { - const parent = target.closest('.checkboxGroup'); - - // we only care about checkbox group events - if (!parent) { - return; - } - - // with modifiers, assume the user is doing something we don't want to interfere with - if (keyboard.hasModifier(event)) { - return; - } - - if (keyboard.isArrowDown(event)) { - // group will have a value if target is the button - const group = groupCache.get(target); - - if (!group) { - return; - } - - // if the event is on the button, select the first item in the list - event.preventDefault(); - group.querySelector('.checkboxGroup-item input').focus(); - - return; - } - - if (keyboard.isArrowUp(event)) { - const group = groupCache.get(target); - - if (!group) { - return; - } - - // if the event is on the button, select the last item in the list - event.preventDefault(); - group.querySelector('.checkboxGroup-item:last-child').focus(); - - return; - } - - if (keyboard.isArrowLeft(event) || keyboard.isArrowRight(event)) { - event.preventDefault(); - } - } -}; - -/** - * Toggle visibility of groups on mouse events - * - * @param {Event} event the event object - * - * @returns {Void} - */ -const handleMouseEvents = (event) => { - if (!(event instanceof MouseEvent)) { - return; - } - - const { target } = event; - // get the group itself - const parent = target.closest('.checkboxGroup'); - - // close open groups on outside clicks - if (!parent) { - closeGroups(); - return; - } - - if (target.matches('.checkboxGroup-button')) { - // clicking a group button; toggle active state - toggleGroup(target); - return; - } - - if (parent?.matches('.is-nav') && target?.matches('.checkboxGroup-item label')) { - const { value } = target.dataset; - - // if the item's data-value attribute is empty, no-op. - if (!value) { - return; - } - - // use the item's data-value attribute to perform the navigation. - const url = new URL(value); - window.location.href = url.href; - - return; - } - - if (parent?.matches('.is-form') && target?.matches('.checkboxGroup-item label')) { - target.previousElementSibling.checked = true; - parent.submit(); - return; - } - - if (parent?.matches('.is-control') && target?.matches('.checkboxGroup-item label')) { - target.previousElementSibling.checked = true; - - const button = parent.querySelector('.checkboxGroup-button'); - button.textContent = target.textContent; - - toggleGroup(button); - fireChangeEvent(target, { input: target.previousElementSibling }); - return; - } - - // cache siblings for faster access later - if (!siblingGroupsCache.has(parent)) { - const { children } = parent.parentElement; - const siblings = Array.from(children).filter((child) => child.matches('.checkboxGroup')); - - siblingGroupsCache.set(parent, siblings); - } - - // close other groups - siblingGroupsCache - .get(parent) - .filter((child) => child !== parent) - .forEach((sibling) => { - closeGroup(sibling, sibling.querySelector('.checkboxGroup-button')); - }); -}; - -export default () => { - const groups = Array.from(document.querySelectorAll('.checkboxGroup')); - - if (!groups.length) { - return; - } - - groups.forEach((group) => { - const button = group.querySelector('.checkboxGroup-button'); - groupCache.set(button, group); - - const items = group.querySelectorAll('.checkboxGroup-item input'); - groupsItemsCache.set(group, Array.from(items)); - }); - - document.addEventListener('keyup', handleKeyboardEvents); - document.addEventListener('mouseup', handleMouseEvents); -}; diff --git a/private/src/scripts/modules/collapsable-block.js b/private/src/scripts/modules/collapsable-block.js deleted file mode 100644 index 1efcd2ec..00000000 --- a/private/src/scripts/modules/collapsable-block.js +++ /dev/null @@ -1,12 +0,0 @@ -const init = (block) => (event) => { - if (event.target.matches('.btn--blank')) { - block.classList.toggle('is-collapsed'); - } -}; - -const collapsableBlock = () => { - const blocks = Array.from(document.getElementsByClassName('wp-block-amnesty-core-collapsable')); - blocks.forEach((block) => block.addEventListener('click', init(block))); -}; - -export default collapsableBlock; diff --git a/private/src/scripts/modules/countdownTimer.js b/private/src/scripts/modules/countdownTimer.js deleted file mode 100755 index 68ad495e..00000000 --- a/private/src/scripts/modules/countdownTimer.js +++ /dev/null @@ -1,87 +0,0 @@ -import { _n, _x, sprintf } from '@wordpress/i18n'; - -const MINUTE = 60; -const HOUR = 60 * MINUTE; -const DAY = 24 * HOUR; - -const getTimeRemaining = (date) => { - if (!date) { - return {}; - } - - const total = (Date.parse(date) - Date.now()) / 1000; - const seconds = Math.floor(total % 60); - const minutes = Math.floor((total / MINUTE) % 60); - const hours = Math.floor((total / HOUR) % 24); - const days = Math.floor(total / DAY); - - return { - total, - days, - hours, - minutes, - seconds, - }; -}; - -const pad = (value) => `0${value}`.slice(-2); - -const clockTemplate = (data, attributes) => { - if (!attributes.date) { - return '00:00:00'; - } - - const { days = 0, hours = 0, minutes = 0, seconds = 0 } = data; - // translators: [front] https://wordpresstheme.amnesty.org/blocks/b021-countdown-timer/ - const dayPlural = _n('%d day', '%d days', days, 'amnesty'); - - if (days <= 0 && hours <= 0 && minutes <= 0 && seconds <= 0) { - return attributes.expiredText; - } - - if (days >= 3) { - return sprintf(dayPlural, days); - } - - if (days >= 1) { - return sprintf( - // translators: [front] https://wordpresstheme.amnesty.org/blocks/b021-countdown-timer/ - _x( - '%1$s, %2$s:%3$s:%4$s', - 'time format(prefix translated separately) i.e. "x, H:i:s"', - 'amnesty', - ), - sprintf(dayPlural, days), - pad(hours), - pad(minutes), - pad(seconds), - ); - } - - return sprintf( - // translators: [front] https://wordpresstheme.amnesty.org/blocks/b021-countdown-timer/ - _x('%1$s:%2$s:%3$s', 'time format, H:i:s', 'amnesty'), - pad(hours), - pad(minutes), - pad(seconds), - ); -}; - -const renderClock = (endTime) => { - const { expiredtext, timestamp } = endTime.dataset; - const data = getTimeRemaining(timestamp); - - /* eslint-disable no-param-reassign */ - endTime.textContent = clockTemplate(data, { - expiredText: expiredtext, - date: timestamp, - }); -}; - -export default () => { - const endTimes = document.querySelectorAll('.countdownClock'); - - Array.from(endTimes).forEach((endTime) => { - setInterval(() => renderClock(endTime), 1000); - }); -}; diff --git a/private/src/scripts/modules/counter.js b/private/src/scripts/modules/counter.js deleted file mode 100644 index afeba252..00000000 --- a/private/src/scripts/modules/counter.js +++ /dev/null @@ -1,95 +0,0 @@ -const { isInteger } = lodash; -const { currentLocale = 'en-GB', enforceGroupingSeparators } = window.amnestyCoreI18n; - -// ensure value is an int -const toRawNumber = (value = '0') => { - if (isInteger(value)) { - return value; - } - - const trimmed = value.replace(/[^\d]/g, ''); - const inted = parseInt(trimmed, 10); - - return inted; -}; - -// format a value as a locale-aware number -const toFormattedString = (value) => { - if (!value) { - return ''; - } - - const options = {}; - - if (enforceGroupingSeparators) { - options.useGrouping = true; - } - - const formatted = toRawNumber(value).toLocaleString(currentLocale.replace('_', '-'), options); - - return formatted; -}; - -// animate an element's value from 0 to its end result -// eslint-disable-next-line default-param-last -const countUp = (target, end, duration = 2000, observerObj) => { - let current = 0; - let progress = 0; - let startTime = 0; - - const step = (timestamp) => { - if (!startTime) { - startTime = timestamp; - } - progress = Math.min((timestamp - startTime) / duration, 1); - current = Math.floor(progress * end); - // eslint-disable-next-line no-param-reassign - target.textContent = toFormattedString(current); - target.setAttribute('style', `opacity: ${progress}`); - - if (progress < 1) { - requestAnimationFrame(step); - } - - // this one's done now. - if (progress === 1) { - observerObj.unobserve(target); - } - }; - - requestAnimationFrame(step); -}; - -// animate once the element's well into view -const observer = new IntersectionObserver( - (entries, observerObj) => { - entries.forEach((entry) => { - if (!entry.isIntersecting) { - return; - } - - if (entry.intersectionRatio < 1) { - return; - } - - const { target } = entry; - const { duration } = target.dataset; - const end = toRawNumber(target.dataset.value); - countUp(target, end, duration * 1000, observerObj); - }); - }, - { - rootMargin: '0px 0px -200px 0px', - threshold: [1], - }, -); - -export default () => { - const elems = document.querySelectorAll('.wp-block-amnesty-core-counter'); - - Array.from(elems).forEach((elem) => { - // doing this in JS so that it's still visible if the JS doesn't work - elem.setAttribute('style', 'opacity: 0'); - observer.observe(elem); - }); -}; diff --git a/private/src/scripts/modules/download-block.js b/private/src/scripts/modules/download-block.js deleted file mode 100644 index 3ee93237..00000000 --- a/private/src/scripts/modules/download-block.js +++ /dev/null @@ -1,33 +0,0 @@ -const setupFormControl = (block) => { - const choices = block.querySelector('.checkboxGroup'); - const download = block.querySelector('.btn--download'); - - if (!choices || !download) { - return; - } - - choices.addEventListener('change', (event) => { - const { target } = event; - const { - dataset: { value }, - } = target; - - // make sure that the URI is for the current origin - const path = new URL(value).pathname; - const href = new URL(path, window.location.origin); - - download.setAttribute('href', href.toString()); - download.setAttribute('download', href.toString().split('/').pop()); - }); -}; - -export default () => { - const blocks = Array.from(document.querySelectorAll('.download-block')); - - if (!blocks.length) { - return; - } - - const multiple = blocks.filter(({ classList }) => classList.contains('is-multiple')); - multiple.forEach(setupFormControl); -}; diff --git a/private/src/scripts/modules/fluid-iframe.js b/private/src/scripts/modules/fluid-iframe.js deleted file mode 100644 index f152938b..00000000 --- a/private/src/scripts/modules/fluid-iframe.js +++ /dev/null @@ -1,17 +0,0 @@ -const init = () => { - Array.from( - document.querySelectorAll('.wp-block-embed.is-type-video:not(.responsive-iframe)'), - ).forEach((embed) => { - if (embed.parentElement.classList.contains('wp-embed-responsive')) { - return; - } - - const wrapper = document.createElement('div'); - wrapper.classList.add('wp-embed-responsive'); - wrapper.appendChild(embed.cloneNode(true)); - - embed.replaceWith(wrapper); - }); -}; - -export default init; diff --git a/private/src/scripts/modules/iframe-button.js b/private/src/scripts/modules/iframe-button.js deleted file mode 100644 index 9b6c5cfb..00000000 --- a/private/src/scripts/modules/iframe-button.js +++ /dev/null @@ -1,11 +0,0 @@ -const toggle = (event) => { - event.target.parentElement.classList.toggle('is-visible'); -}; - -const init = (button) => { - button.addEventListener('click', toggle); -}; - -export default () => { - Array.from(document.querySelectorAll('.iframeButton')).forEach(init); -}; diff --git a/private/src/scripts/modules/pop-in.js b/private/src/scripts/modules/pop-in.js deleted file mode 100644 index 036e55bc..00000000 --- a/private/src/scripts/modules/pop-in.js +++ /dev/null @@ -1,47 +0,0 @@ -import Cookies from 'js-cookie'; - -const { delay } = lodash; - -let globalData; - -const hidePopIn = (element) => { - const parent = element.parentElement; - parent.parentElement.removeChild(parent); -}; - -const showPopIn = (element) => { - element.parentElement.setAttribute('aria-hidden', 'false'); - element.parentElement.classList.remove('is-closed'); -}; - -const closePopIn = (event) => { - event.preventDefault(); - - hidePopIn(event.target); - - Cookies.set('amnesty_pop_in_dismissed', '1', { - domain: globalData.domain, - expires: parseInt(globalData.pop_in_timeout, 10) || 30, - sameSite: 'strict', - secure: true, - }); -}; - -export default function popIn() { - const close = document.getElementById('pop-in-close'); - if (!close) { - return; - } - - globalData = window.amnesty_data; - - if (Cookies.get('amnesty_pop_in_dismissed') === '1') { - hidePopIn(close); - return; - } - - delay(showPopIn, 100, close); - - close.addEventListener('click', closePopIn); - close.addEventListener('touchend', closePopIn); -} diff --git a/private/src/scripts/modules/slider-block.js b/private/src/scripts/modules/slider-block.js deleted file mode 100644 index 232b2e1c..00000000 --- a/private/src/scripts/modules/slider-block.js +++ /dev/null @@ -1,182 +0,0 @@ -import Flickity from 'flickity'; -import 'flickity-as-nav-for'; - -const { debounce } = lodash; - -const createArrowButton = (modifier) => { - const button = document.createElement('button'); - button.setAttribute(`data-slider-${modifier}`, 1); - return button; -}; - -const handleSlideArrowNavigationEvents = (slider, prevArrow, nextArrow) => { - // Grab first slide child - const firstSlide = slider.querySelector('.slides-container .flickity-slider .slide:first-child'); - // Grab last slide child - const lastSlide = slider.querySelector('.slides-container .flickity-slider .slide:last-child'); - - const handleClicks = () => { - // Hide previous arrow if on the last image in the slider - if (firstSlide.classList.contains('is-selected')) { - // eslint-disable-next-line no-param-reassign - prevArrow.style.display = 'none'; - } else { - // eslint-disable-next-line no-param-reassign - prevArrow.style.display = 'block'; - } - - // Hide next arrow if on the last image in the slider - if (lastSlide.classList.contains('is-selected')) { - // eslint-disable-next-line no-param-reassign - nextArrow.style.display = 'none'; - } else { - // eslint-disable-next-line no-param-reassign - nextArrow.style.display = 'block'; - } - }; - - nextArrow?.addEventListener('click', handleClicks); - prevArrow?.addEventListener('click', handleClicks); -}; - -const createSlider = (slider) => { - const slides = slider.querySelector('.slides'); - - if (!slides) { - return; - } - - const isRightToLeft = document.documentElement.getAttribute('dir') === 'rtl'; - - const prevArrow = slider.querySelector('.slides-arrow--previous'); - const nextArrow = slider.querySelector('.slides-arrow--next'); - - const slidesWithContent = Array.from(slider.querySelectorAll('.slide-contentWrapper')); - - slidesWithContent.forEach((wrapper) => { - wrapper.addEventListener('click', (event) => { - const isToggle = event.target.matches('.slider-toggleContent'); - const isOverlay = event.target.matches('.slide-contentWrapper.is-open'); - - if (!isToggle && !isOverlay) { - return; - } - - event.preventDefault(); - - wrapper.classList.toggle('is-open'); - - if (wrapper.classList.contains('is-open')) { - prevArrow.style.display = 'none'; - nextArrow.style.display = 'none'; - } else { - prevArrow.style.display = 'block'; - nextArrow.style.display = 'block'; - } - }); - }); - - const slidesInstance = new Flickity(slides, { - rightToLeft: isRightToLeft, - prevNextButtons: false, - pageDots: false, - }); - - const lastSlideInSlider = slidesInstance.slides.length - 1; - const numberOfSlides = slidesInstance.slides.length; - - slidesInstance.on('change', (slideNo) => { - if (slideNo > 0) { - prevArrow.style.display = 'block'; - } else { - prevArrow.style.display = 'none'; - } - if (slideNo === lastSlideInSlider) { - nextArrow.style.display = 'none'; - } else { - nextArrow.style.display = 'block'; - } - }); - - if (nextArrow && prevArrow) { - prevArrow.addEventListener('click', () => slidesInstance.previous()); - nextArrow.addEventListener('click', () => slidesInstance.next()); - } - - const sliderNavigation = slider.querySelector('.slider-nav'); - - if (!sliderNavigation) { - return; - } - - const slideNavContainer = slider.querySelector('.slider-navContainer'); - let arrowsVisible = false; - const hideArrows = () => slideNavContainer.classList.remove('has-arrows'); - const showArrows = () => slideNavContainer.classList.add('has-arrows'); - - const workoutArrows = (instance) => { - if (instance.slides.length > 1 && !arrowsVisible) { - showArrows(); - arrowsVisible = true; - return; - } - - if (instance.slides.length > 1 && arrowsVisible) { - return; - } - - if (arrowsVisible) { - arrowsVisible = false; - hideArrows(); - } - }; - - const prevNavArrow = createArrowButton('prev'); - const nextNavArrow = createArrowButton('next'); - - const navigationSlider = new Flickity(sliderNavigation, { - asNavFor: slides, - contain: true, - pageDots: false, - prevNextButtons: false, - draggable: false, - groupCells: true, - rightToLeft: isRightToLeft, - on: { - ready() { - if (!slideNavContainer) { - return; - } - - slideNavContainer.appendChild(prevNavArrow); - slideNavContainer.appendChild(nextNavArrow); - - prevNavArrow.addEventListener('click', () => this.previous()); - nextNavArrow.addEventListener('click', () => this.next()); - - workoutArrows(this); - }, - }, - }); - - navigationSlider.on('change', () => workoutArrows(navigationSlider)); - window.addEventListener( - 'resize', - debounce(() => workoutArrows(navigationSlider), 150), - ); - - // we process arrow logic only if the arrows are available - if (numberOfSlides > 1) { - handleSlideArrowNavigationEvents(slider, prevArrow, nextArrow); - if (nextArrow) { - nextArrow.style.display = 'block'; - } - } -}; - -const init = () => { - const sliders = Array.from(document.querySelectorAll('.slider')); - sliders.forEach(createSlider); -}; - -export default init; diff --git a/private/src/scripts/modules/term-list.js b/private/src/scripts/modules/term-list.js deleted file mode 100644 index 8f10448f..00000000 --- a/private/src/scripts/modules/term-list.js +++ /dev/null @@ -1,46 +0,0 @@ -const showCorrectList = (target) => { - const letter = target.textContent; - const block = target.parentElement.parentElement; // block container - const lists = block.querySelectorAll('.listItems'); - const activeLetter = block.querySelector('.activeLetter'); - - activeLetter.innerText = letter; - - Array.from(lists).forEach((list) => { - const display = list.dataset.key === letter ? 'flex' : 'none'; - list.setAttribute('style', `display:${display}`); - }); -}; - -const handleBlockClickEvents = (event) => { - const { target } = event; - const { nodeName } = target; - - if (nodeName !== 'BUTTON') { - return; - } - - if (target.getAttribute('disabled')) { - return; - } - - const buttons = target.parentElement.getElementsByTagName('button'); - Array.from(buttons).forEach((button) => { - button.setAttribute('class', ''); - }); - - target.setAttribute('class', 'is-active'); - showCorrectList(target); -}; - -export default function init() { - const elements = document.querySelectorAll('.wp-block-amnesty-core-term-list'); - - if (!elements) { - return; - } - - Array.from(elements).forEach((item) => { - item.addEventListener('click', handleBlockClickEvents); - }); -} diff --git a/private/src/scripts/modules/tweet-action.js b/private/src/scripts/modules/tweet-action.js deleted file mode 100644 index 642666d5..00000000 --- a/private/src/scripts/modules/tweet-action.js +++ /dev/null @@ -1,26 +0,0 @@ -const shareBase = 'https://twitter.com/intent/tweet'; - -const handleTweetAction = (e) => { - if (!e.target.classList.contains('btn')) { - return; - } - - e.preventDefault(); - - const container = e.target.parentNode.parentNode; - const content = container.querySelector('.tweetAction-content').innerText; - - const fullUrl = `${shareBase}?text=${encodeURIComponent(content)}`; - - window.open(fullUrl); -}; - -export default () => { - const blocks = document.getElementsByClassName('tweetAction'); - - if (!blocks.length) { - return; - } - - Array.from(blocks).forEach((block) => block.addEventListener('click', handleTweetAction)); -}; diff --git a/private/src/scripts/polyfills/index.js b/private/src/scripts/polyfills/index.js deleted file mode 100755 index ca2a547c..00000000 --- a/private/src/scripts/polyfills/index.js +++ /dev/null @@ -1 +0,0 @@ -import 'intersection-observer'; diff --git a/private/src/styles/blocks/core-blocks/_details.scss b/private/src/shared/_details.scss similarity index 87% rename from private/src/styles/blocks/core-blocks/_details.scss rename to private/src/shared/_details.scss index 2cd533eb..b51e8ea0 100644 --- a/private/src/styles/blocks/core-blocks/_details.scss +++ b/private/src/shared/_details.scss @@ -1,3 +1,5 @@ +@use "../utils/mixins/icon" as i; + .wp-block-details summary { display: flex; align-items: center; @@ -11,7 +13,7 @@ line-height: 1.12; &::after { - @include icon-scaled(271px, 215px, 16px, 16px, 1.5); + @include i.icon-scaled(271px, 215px, 16px, 16px, 1.5); position: relative; content: ""; transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; diff --git a/private/src/shared/_group-styles.scss b/private/src/shared/_group-styles.scss new file mode 100644 index 00000000..e18e612c --- /dev/null +++ b/private/src/shared/_group-styles.scss @@ -0,0 +1,88 @@ +.wp-block-group.custom-card { + width:100%; + + .wp-block-buttons { + padding-left: 8px; + padding-right: 8px; + } + + .wp-block-buttons, + .wp-block-button, + .wp-block-button__link { + width: 100%; + } + + .wp-block-heading { + text-transform: uppercase; + font-size: 1.5rem; + } + + p { + font-size: 1rem; + padding: 10px 10px 0 10px; + } + + h2 { + padding: 10px 10px 0 10px; + } + + .wp-element-caption { + padding: 0 10px; + } +} + +.wp-block-group.is-style-light { + background-color: var(--wp--preset--color--grey-lighter); + color: var(--wp--preset--color--black); +} + +.wp-block-group.is-style-dark { + background-color: var(--wp--preset--color--grey-dark); + color: var(--wp--preset--color--white); + + .wp-block-heading, + .wp-element-caption { + color: var(--wp--preset--color--white); + } +} + +.wp-block-group.call-to-action { + margin-top: 40px; + padding: 20px; + text-align: center; + + @media all and (min-width: 760px) { + padding: 36px 32px; + } +} + +.wp-block-group.is-style-top-and-bottom-border { + border-top: 7px solid var(--wp--preset--color--black); + border-bottom: 7px solid var(--wp--preset--color--black); +} + +.wp-block-group.custom-card .wp-block-image, +.wp-block-group.custom-card .wp-block-buttons, +.wp-block-group.custom-card p, +.wp-block-group.custom-card h2 { + box-sizing: border-box; + max-width: 100%; +} + +.wp-block-group.custom-card img { + width: 100%; +} + +.wp-block-group.custom-card .wp-block-button { + min-width: 100%; +} + +.wp-block-group.custom-card .wp-block-image > div { + width: 100%; +} + +.wp-block-group.is-style-square-border { + border: 1px solid #000; + padding: var(--wp--preset--spacing--single); + height: 100%; +} diff --git a/private/src/styles/blocks/list-block/_main.scss b/private/src/shared/_lists.scss similarity index 100% rename from private/src/styles/blocks/list-block/_main.scss rename to private/src/shared/_lists.scss diff --git a/private/src/styles/blocks/core-blocks/post-title/_main.scss b/private/src/shared/_post-title.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/post-title/_main.scss rename to private/src/shared/_post-title.scss diff --git a/private/src/shared/_post.scss b/private/src/shared/_post.scss new file mode 100644 index 00000000..c5faf0cd --- /dev/null +++ b/private/src/shared/_post.scss @@ -0,0 +1,115 @@ +@use '../utils/mixins/states' as s; + +.wp-block-post { + min-height: 460px; + background: var(--wp--preset--color--white); +} + +.wp-block-post > .wp-block-group:not(.post--result) { + display: flex; + flex-direction: column; + min-height: 460px; + background: var(--wp--preset--color--white); +} + +.search-results .wp-block-post, +.search-results .wp-block-post > .wp-block-group { + min-height: unset; +} + +.wp-block-post .post-content { + display: flex; + flex-direction: column; + flex: 1 1 auto; + align-items: flex-start; +} + +.wp-block-post .post-header > * { + margin-top: spacing(half); +} + +.wp-block-post.has-post-thumbnail .post-content { + position: relative; +} + +.wp-block-post:not(.has-post-thumbnail) .post-content::after { + content: ""; + display: block; + height: 8px; + width: 75%; + margin-top: 12px; + background-color: var(--wp--preset--color--black); + + @media all and (min-width: 540px) { + margin-top: auto; + } +} + +.wp-block-post.has-post-thumbnail > *:not(.post--result) .wp-block-post-terms.post-category { + position: absolute; + bottom: 100%; + left: 12px; + + .rtl & { + right: 12px; + left: unset; + } +} + +.post-header { + max-width: 100%; +} + +.post-content { + width: 100%; + padding: 12px; +} + +.wp-block-post-terms.post-category { + @include s.state-background(var(--wp--preset--color--grey-dark)); + display: inline-block; + padding: 4px 8px; + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + font-size: 18px; + text-transform: uppercase; + background-color: var(--wp--preset--color--black); +} + +.wp-block-post-terms.post-category a { + color: var(--wp--preset--color--white); + text-decoration: none; +} + +.post-meta { + display: block; + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + font-size: 14px; + color: var(--wp--preset--color--grey-dark); + background-color: var(--wp--preset--color--white); +} + +.post-figure { + position: relative; + background-color: var(--wp--preset--color--grey-darkest); + overflow: hidden; + max-height: 200px; + height: 100%; +} + +.post-figure img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} + +.post-content a { + position: relative; + z-index: 1; +} + +:lang(fa-IR) .wp-block-post-terms.post-category { + display: none; +} diff --git a/private/src/shared/_quote.scss b/private/src/shared/_quote.scss new file mode 100644 index 00000000..89eef772 --- /dev/null +++ b/private/src/shared/_quote.scss @@ -0,0 +1,222 @@ +.ltr .wp-block-quote, +.ltr .wp-block-quote.is-style-default { + &:not(.alignleft):not(.alignright):not(.aligncenter) { + border-left: 8px solid; + padding-left: 35px; + } +} + +.rtl .wp-block-quote, +.rtl .wp-block-quote.is-style-default { + &:not(.alignleft):not(.alignright):not(.aligncenter) { + border-right: 8px solid; + padding-right: 35px; + } +} + +.wp-block-quote:has(.has-text-align-center)::before { + content: open-quote; +} +.wp-block-quote:has(.has-text-align-center)::before { + position: absolute; + left: 48%; + font-family: var(--wp--preset--font-family--secondary) !important; + font-weight: bold; + font-size: 3.75rem !important; + line-height: 1px; + + @media all and (min-width: 540px) { + font-size: 4.375rem !important; + } + + @media all and (min-width: 940px) { + font-size: 5rem !important; + } +} + +.wp-block-quote p, +.wp-block-quote cite { + font-family: var(--wp--preset--font-family--secondary); + margin-bottom: 0; +} + +.wp-block-quote p { + font-size: var(--wp--preset--font-size--large) !important; +} + +.wp-block-quote .has-small-font-size { + font-size: var(--wp--preset--font-size--small) !important; +} + +.wp-block-quote .has-medium-font-size { + font-size: var(--wp--preset--font-size--medium) !important; +} + +.wp-block-quote .has-large-font-size { + font-size: var(--wp--preset--font-size--large) !important; +} + +.wp-block-quote cite { + text-transform: none !important; + display: inline-block; + font-style: normal; + font-size: 1.125rem !important; + font-weight: bold !important; + line-height: 40px !important; + padding-bottom: 24px; + + @media all and (min-width: 540px) { + font-size: 1.25rem !important; + } + + @media all and (min-width: 940px) { + font-size: 1.5rem !important; + } +} + +.wp-block-quote.has-large-font-size cite { + @media all and (min-width: 540px) { + font-size: 1.25rem !important; + } + + @media all and (min-width: 940px) { + font-size: 1.5rem !important; + } +} + +.wp-block-quote.has-medium-font-size cite { + font-size: 1rem !important; + + @media all and (min-width: 540px) { + font-size: 1.25rem !important; + } + + @media all and (min-width: 940px) { + font-size: 1.375rem !important; + } +} + +.wp-block-quote.has-small-font-size cite { + font-size: 0.875rem !important; + + @media all and (min-width: 540px) { + font-size: 1.125rem !important; + } + + @media all and (min-width: 940px) { + font-size: 1.25rem !important; + } +} + +.wp-block-quote cite::after { + content: none; +} + +.wp-block-quote.is-style-default.alignleft, +.rtl .wp-block-quote.is-style-default.alignright { + border-left: 8px solid; + margin-block-start: var(--wp--preset--spacing--single); + padding-left: 35px; +} + +.wp-block-quote.is-style-default.alignright, +.rtl .wp-block-quote.is-style-default.alignleft { + border-right: 8px solid; + margin-block-start: var(--wp--preset--spacing--single); + padding-right: 35px; +} + +.wp-block-quote.is-style-default p { + margin-block-start: 0; +} + +.wp-block-quote.is-style-default p + p { + margin-block-start: var(--wp--preset--spacing--half); +} + +.wp-block-quote.is-style-default cite { + padding-bottom: 0; +} + +.wp-block-quote.is-style-default.has-text-align-center { + position: relative; + margin-top: 40px; +} + +.wp-block-quote.is-style-default.has-text-align-center::before { + content: open-quote; + position: absolute; + top: -30px; + left: calc(50% - 16px); + width: 32px; + font-family: var(--wp--preset--font-family--secondary); + font-size: 40px; + font-weight: 700; + line-height: 55px; +} + +.wp-block-quote.has-text-align-left { + border-left: 8px solid var(--wp--preset--color--black); + padding-left: 35px; +} + +.wp-block-quote.has-text-align-left.has-white-color { + border-left-color: var(--wp--preset--color--white); +} + +.wp-block-quote.has-text-align-left.has-amnesty-grey-brand-color { + border-left-color: var(--wp--preset--color--grey-light); +} + +.wp-block-quote.has-text-align-right { + border-right: 8px solid var(--wp--preset--color--black); + padding-right: 35px; +} + +.wp-block-quote.has-text-align-right.has-white-color { + border-right-color: var(--wp--preset--color--white); +} + +.wp-block-quote.has-text-align-right.has-amnesty-grey-brand-color { + border-right-color: var(--wp--preset--color--grey-light); +} + +.wp-block-quote.has-text-align-left p::before, +.wp-block-quote.has-text-align-right p::before { + content: open-quote; + display: inline-block; +} + +.wp-block-quote.has-text-align-left p::before { + text-indent: -7px; + + @media all and (min-width: 940px) { + text-indent: -15px; + } +} + +.wp-block-quote.has-text-align-right p::after { + position: absolute; +} + +.wp-block-quote.has-text-align-left p::after, +.wp-block-quote.has-text-align-right p::after { + content: close-quote; + display: inline-block; +} + +.rtl .wp-block-quote.has-text-align-left { + text-align: right; + border-right: 8px solid var(--wp--preset--color--black); + border-left: none; + padding-right: 35px; + padding-left: 0; +} + +.rtl .wp-block-quote.has-text-align-right { + text-align: left; + border-left: 8px solid var(--wp--preset--color--black); + border-right: none; + padding-left: 35px; + padding-right: 0; +} diff --git a/private/src/styles/blocks/button/_button.scss b/private/src/shared/buttons/_button.scss similarity index 100% rename from private/src/styles/blocks/button/_button.scss rename to private/src/shared/buttons/_button.scss diff --git a/private/src/styles/blocks/button/_fill.scss b/private/src/shared/buttons/_fill.scss similarity index 100% rename from private/src/styles/blocks/button/_fill.scss rename to private/src/shared/buttons/_fill.scss diff --git a/private/src/shared/buttons/_index.scss b/private/src/shared/buttons/_index.scss new file mode 100644 index 00000000..cd6850b8 --- /dev/null +++ b/private/src/shared/buttons/_index.scss @@ -0,0 +1,8 @@ +@use './button'; +@use './no-style'; +@use './sizes'; +@use './fill'; +@use './spacing'; +@use './styles/default'; +@use './styles/dark'; +@use './styles/link'; diff --git a/private/src/styles/blocks/button/_no-style.scss b/private/src/shared/buttons/_no-style.scss similarity index 100% rename from private/src/styles/blocks/button/_no-style.scss rename to private/src/shared/buttons/_no-style.scss diff --git a/private/src/styles/blocks/button/_sizes.scss b/private/src/shared/buttons/_sizes.scss similarity index 100% rename from private/src/styles/blocks/button/_sizes.scss rename to private/src/shared/buttons/_sizes.scss diff --git a/private/src/shared/buttons/_spacing.scss b/private/src/shared/buttons/_spacing.scss new file mode 100644 index 00000000..9e40702b --- /dev/null +++ b/private/src/shared/buttons/_spacing.scss @@ -0,0 +1,11 @@ +.btn--topSpacing { + margin-top: 16px; +} + +.rtl .wp-block-buttons .wp-block-button:first-child { + margin-right: 0; +} + +.rtl .wp-block-buttons .wp-block-button:last-child { + margin-right: 8px; +} diff --git a/private/src/styles/blocks/button/styles/_dark.scss b/private/src/shared/buttons/styles/_dark.scss similarity index 100% rename from private/src/styles/blocks/button/styles/_dark.scss rename to private/src/shared/buttons/styles/_dark.scss diff --git a/private/src/shared/buttons/styles/_default.scss b/private/src/shared/buttons/styles/_default.scss new file mode 100644 index 00000000..dd47b935 --- /dev/null +++ b/private/src/shared/buttons/styles/_default.scss @@ -0,0 +1,57 @@ +.wp-block-file a.wp-block-file__button, +.wp-block-button .wp-block-button__link, +.woocommerce a.button, +.woocommerce button.button, +.woocommerce input.button, +.btn { + appearance: none; + box-sizing: border-box; + overflow: visible; + user-select: none; + white-space: normal; + margin: 0; + padding: 12px 24px; + display: inline-block; + border: 1px solid var(--wp--preset--color--primary-state); + border-radius: 0; + color: var(--wp--preset--color--black); + background-color: var(--wp--preset--color--primary); + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + font-size: var(--wp--preset--font-size--small); + text-align: center; + text-decoration: none; + text-transform: uppercase; + line-height: normal; + cursor: pointer; + transition: background-color .3s ease-in-out, border-color .3s ease-in-out, color .3s ease-in-out; + + &:hover, + &:active, + &:focus { + border-color: var(--wp--preset--color--primary-state); + background-color: var(--wp--preset--color--primary-state); + color: var(--wp--preset--color--white); + text-decoration: none; + } + + &.disabled, + &[disabled] { + cursor: not-allowed; + } +} + +.woocommerce a.button, +.btn--white, +.btn.is-style-light { + border: 1px solid var(--wp--preset--color--black); + background-color: var(--wp--preset--color--white); + color: var(--wp--preset--color--black); + + &:hover, + &:focus { + background-color: var(--wp--preset--color--grey-light); + border-color: var(--wp--preset--color--grey-light); + color: var(--wp--preset--color--black) + } +} diff --git a/private/src/styles/blocks/button/styles/_link.scss b/private/src/shared/buttons/styles/_link.scss similarity index 84% rename from private/src/styles/blocks/button/styles/_link.scss rename to private/src/shared/buttons/styles/_link.scss index 17361d1a..a5a6becd 100644 --- a/private/src/styles/blocks/button/styles/_link.scss +++ b/private/src/shared/buttons/styles/_link.scss @@ -1,3 +1,5 @@ +@use '../../../utils/mixins/icon' as i; + .wp-block-button.is-style-link .wp-block-button__link { color: inherit; border: none; @@ -14,7 +16,7 @@ } .wp-block-button.is-style-link .wp-block-button__link::before { - @include icon(290px, 200px, 17px, 11px); + @include i.icon(290px, 200px, 17px, 11px); content: " "; display: inline-block; vertical-align: middle; @@ -25,7 +27,7 @@ } .section--textWhite .wp-block-button.is-style-link .wp-block-button__link::before { - @include icon(250px, 238px, 17px, 11px); + @include i.icon(250px, 238px, 17px, 11px); content: " "; display: inline-block; vertical-align: middle; diff --git a/private/src/shared/index.js b/private/src/shared/index.js new file mode 100644 index 00000000..67aac616 --- /dev/null +++ b/private/src/shared/index.js @@ -0,0 +1 @@ +import './index.scss'; diff --git a/private/src/shared/index.scss b/private/src/shared/index.scss new file mode 100644 index 00000000..2b5d1106 --- /dev/null +++ b/private/src/shared/index.scss @@ -0,0 +1,8 @@ +@use "./buttons"; +@use "./details"; +@use "./group-styles"; +@use "./lists"; +@use "./post"; +@use "./post-title"; +@use "./query-pagination"; +@use "./quote"; diff --git a/private/src/shared/query-pagination/_container.scss b/private/src/shared/query-pagination/_container.scss new file mode 100644 index 00000000..3f5ab849 --- /dev/null +++ b/private/src/shared/query-pagination/_container.scss @@ -0,0 +1,21 @@ +.wp-block-query-pagination { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + margin: 0 auto; + width: 100%; + font-size: 24px; + font-family: var(--wp--preset--font-family--secondary); + font-weight: bold; + line-height: 1.25; + text-transform: uppercase; + + @media all and (min-width: 1110px) { + width: 75%; + } + + @media all and (min-width: 1200px) { + width: 50%; + } +} diff --git a/private/src/styles/blocks/core-blocks/query-pagination/_next.scss b/private/src/shared/query-pagination/_next.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/query-pagination/_next.scss rename to private/src/shared/query-pagination/_next.scss diff --git a/private/src/styles/blocks/core-blocks/query-pagination/_numbers.scss b/private/src/shared/query-pagination/_numbers.scss similarity index 83% rename from private/src/styles/blocks/core-blocks/query-pagination/_numbers.scss rename to private/src/shared/query-pagination/_numbers.scss index a97c7c60..86036a2c 100644 --- a/private/src/styles/blocks/core-blocks/query-pagination/_numbers.scss +++ b/private/src/shared/query-pagination/_numbers.scss @@ -1,3 +1,5 @@ +@use '../../utils/mixins/states' as s; + .wp-block-query-pagination-numbers { display: none; flex-basis: 100%; @@ -5,7 +7,7 @@ list-style: none; color: var(--wp--preset--color--black); - @include mq(small) { + @media all and (min-width: 760px) { display: flex; flex-basis: auto; } @@ -20,7 +22,7 @@ } .wp-block-query-pagination-numbers a.page-numbers { - @include state-background(var(--wp--preset--color--grey--lighter)); + @include s.state-background(var(--wp--preset--color--grey--lighter)); text-decoration: underline; text-decoration-skip-ink: auto; } diff --git a/private/src/styles/blocks/core-blocks/query-pagination/_previous.scss b/private/src/shared/query-pagination/_previous.scss similarity index 100% rename from private/src/styles/blocks/core-blocks/query-pagination/_previous.scss rename to private/src/shared/query-pagination/_previous.scss diff --git a/private/src/shared/query-pagination/index.scss b/private/src/shared/query-pagination/index.scss new file mode 100644 index 00000000..2b90bef4 --- /dev/null +++ b/private/src/shared/query-pagination/index.scss @@ -0,0 +1,10 @@ +@use "./container"; +@use "./next"; +@use "./previous"; +@use "./numbers"; + +.wp-block-query-pagination > .wp-block-query-pagination-previous, +.wp-block-query-pagination > .wp-block-query-pagination-next, +.wp-block-query-pagination > .wp-block-query-pagination-numbers { + margin: 0; +} diff --git a/private/src/static/images/icon-cart.svg b/private/src/static/images/icon-cart.svg deleted file mode 100644 index 6b2feae7..00000000 --- a/private/src/static/images/icon-cart.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg fill="#000000" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" x="0px" y="0px" viewBox="0 0 100 100"> - <g transform="translate(0,-952.36218)"> - <path style="text-indent:0;text-transform:none;direction:ltr;block-progression:tb;baseline-shift:baseline;color:#000000;enable-background:accumulate;" d="m 9.9999999,965.36226 c -1.1046,0 -2,0.8954 -2,2 0,1.1046 0.8954,2 2,2 l 10.3750001,0 10.5312,49.74994 c 0.2555,1.2291 1.0765,2.2629 2.0938,2.25 l 50,0 c 1.0566,0.015 2.0312,-0.9433 2.0312,-2 0,-1.0567 -0.9746,-2.015 -2.0312,-2 l -48.375,0 -10.6562,-50.43744 c -0.1983,-0.884 -1.0629,-1.5702 -1.9688,-1.5625 z m 20.0000001,12 6,30.00004 49,0 7,-30.00004 z m 13,47.99994 c -3.8659,0 -7,3.134 -7,7 0,3.866 3.1341,7 7,7 3.866,0 7,-3.134 7,-7 0,-3.866 -3.134,-7 -7,-7 z m 30,0 c -3.8659,0 -7,3.134 -7,7 0,3.866 3.1341,7 7,7 3.866,0 7,-3.134 7,-7 0,-3.866 -3.134,-7 -7,-7 z" fill="#000000" fill-opacity="1" stroke="none" marker="none" visibility="visible" display="inline" overflow="visible"/> - </g> -</svg> diff --git a/private/src/static/images/sprite.svg b/private/src/static/images/sprite.svg deleted file mode 100644 index 7a1ad174..00000000 --- a/private/src/static/images/sprite.svg +++ /dev/null @@ -1,452 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" height="300" viewBox="0 0 313 300" width="313"> - <svg height="46" viewBox="0 0 50 46" width="50" x="184" y="82"> - <path fill="#FFFFFF" d="M23.9,13.6l1.5,1.5L17.6,23l7.9,7.9l-1.6,1.5L14.5,23L23.9,13.6z"/> - <path fill="#FFFFFF" d="M33.9,13.6l1.5,1.5L27.6,23l7.9,7.9l-1.6,1.5L24.5,23L33.9,13.6z"/> - </svg> - <svg height="46" viewBox="0 0 50 46" width="50" x="5" y="159"> - <path fill="#FFFFFF" d="M15.6,24.1l1.5-1.5l7.9,7.8l7.9-7.9l1.5,1.6L25,33.5L15.6,24.1z"/> - <path fill="#FFFFFF" d="M15.6,14.1l1.5-1.5l7.9,7.8l7.9-7.9l1.5,1.6L25,23.5L15.6,14.1z"/> - </svg> - <svg height="46" viewBox="0 0 50 46" width="50" x="60" y="159"> - <path fill="#FFFFFF" d="M26.1,32.4l-1.5-1.5l7.8-7.9l-7.9-7.9l1.6-1.5l9.4,9.4L26.1,32.4z"/> - <path fill="#FFFFFF" d="M16.1,32.4l-1.5-1.5l7.8-7.9l-7.9-7.9l1.6-1.5l9.4,9.4L16.1,32.4z"/> - </svg> - <svg height="17.2" viewBox="0 0 32 18" width="31.3" x="184" y="133"> - <circle fill="#FFFFFF" cx="15.6" cy="8.6" r="2.1"/> - <path fill="#FFFFFF" d="M30.7,8.1c-3.1-4.5-8.7-7.4-14.8-7.4c-0.1,0-0.2,0-0.3,0s-0.2,0-0.3,0C9.3,0.7,3.6,3.6,0.6,8.1L0.2,8.6 l0.4,0.5c3.1,4.5,8.7,7.4,14.8,7.4c0.1,0,0.2,0,0.3,0s0.2,0,0.3,0c6.1-0.1,11.7-2.9,14.8-7.4L31,8.6L30.7,8.1z M15.6,14.6 c-3.4,0-6.2-2.7-6.2-6s2.8-6,6.2-6s6.2,2.7,6.2,6S19,14.6,15.6,14.6z M2.5,8.6c1.6-2.1,3.9-3.8,6.6-4.8C8,5.1,7.4,6.8,7.4,8.6 s0.7,3.5,1.7,4.8C6.4,12.4,4.1,10.8,2.5,8.6z M22.1,13.5c1.1-1.3,1.7-3,1.7-4.8s-0.7-3.5-1.7-4.8c2.6,1,4.9,2.7,6.6,4.8 C27.1,10.8,24.8,12.4,22.1,13.5z"/> - </svg> - <svg height="17.2" viewBox="0 0 32 18" width="31.3" x="115" y="159"> - <circle fill="#000000" cx="15.6" cy="8.6" r="2.1"/> - <path fill="#000000" d="M30.7,8.1c-3.1-4.5-8.7-7.4-14.8-7.4c-0.1,0-0.2,0-0.3,0s-0.2,0-0.3,0C9.3,0.7,3.6,3.6,0.6,8.1L0.2,8.6 l0.4,0.5c3.1,4.5,8.7,7.4,14.8,7.4c0.1,0,0.2,0,0.3,0s0.2,0,0.3,0c6.1-0.1,11.7-2.9,14.8-7.4L31,8.6L30.7,8.1z M15.6,14.6 c-3.4,0-6.2-2.7-6.2-6s2.8-6,6.2-6s6.2,2.7,6.2,6S19,14.6,15.6,14.6z M2.5,8.6c1.6-2.1,3.9-3.8,6.6-4.8C8,5.1,7.4,6.8,7.4,8.6 s0.7,3.5,1.7,4.8C6.4,12.4,4.1,10.8,2.5,8.6z M22.1,13.5c1.1-1.3,1.7-3,1.7-4.8s-0.7-3.5-1.7-4.8c2.6,1,4.9,2.7,6.6,4.8 C27.1,10.8,24.8,12.4,22.1,13.5z"/> - </svg> - <svg height="25" viewBox="0 0 31 25" width="31" x="5" y="210"> - <g> - <path fill="#ffffff" d="M12.4,12.2L5.4,24.6H0.1L5,12.2H0.5V0.4h11.8V12.2z M30.9,12.2L24,24.6h-5.3l4.9-12.4h-4.5V0.4h11.8V12.2z"/> - </g> - </svg> - <svg height="25" viewBox="0 0 31 25" width="31" x="41" y="210"> - <g> - <path d="M0.1,12.8L7,0.4h5.3L7.4,12.8h4.5v11.8H0.1V12.8z M18.7,12.8l6.9-12.4h5.3L26,12.8h4.5v11.8H18.7V12.8z"/> - </g> - </svg> - <svg height="25" viewBox="0 0 31 25" width="31" x="77" y="210"> - <g> - <path fill="#ffffff" d="M0.1,12.8L7,0.4h5.3L7.4,12.8h4.5v11.8H0.1V12.8z M18.7,12.8l6.9-12.4h5.3L26,12.8h4.5v11.8H18.7V12.8z"/> - </g> - </svg> - <svg height="25" viewBox="0 0 31 25" width="31" x="113" y="210"> - <g> - <path d="M12.4,12.2L5.4,24.6H0.1L5,12.2H0.5V0.4h11.8V12.2z M30.9,12.2L24,24.6h-5.3l4.9-12.4h-4.5V0.4h11.8V12.2z"/> - </g> - </svg> - <svg height="21" viewBox="0 0 30 21" width="30" x="115" y="182"> - <!-- Generator: Sketch 44 (41411) - http://www.bohemiancoding.com/sketch --> - <title>youtube-play-dark</title> - <desc>Created with Sketch.</desc> - <defs/> - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="youtube-play-dark" fill-rule="nonzero"> - <polygon id="Shape" fill="#FFFFFF" points="11.6665665 14.1560367 19.6126029 10.0390685 11.6665665 5.89331037"/> - <polygon id="Shape" fill="#000000" opacity="0.12" points="11.6665665 5.89331037 18.6337434 10.546636 19.6126029 10.0390685"/> - <path d="M29.1132987,4.46187221 C29.1132987,4.46187221 28.8253988,2.43534501 27.945001,1.54314331 C26.8267979,0.371678734 25.5721303,0.365632837 24.9983458,0.297400567 C20.8831051,0 14.7102439,0 14.7102439,0 L14.6975763,0 C14.6975763,0 8.5247152,0 4.40947443,0.297400567 C3.83568999,0.365632837 2.58159815,0.371678734 1.46281925,1.54314331 C0.58242144,2.43534501 0.294521569,4.46187221 0.294521569,4.46187221 C0.294521569,4.46187221 0,6.84165255 0,9.22143289 L0,11.452369 C0,13.8321493 0.294521569,16.2119297 0.294521569,16.2119297 C0.294521569,16.2119297 0.58242144,18.2384569 1.46281925,19.1309465 C2.58159815,20.3021231 4.05103909,20.265272 4.7054355,20.3879173 C7.05815325,20.6136308 14.7039101,20.6833026 14.7039101,20.6833026 C14.7039101,20.6833026 20.8831051,20.6740898 24.9983458,20.3764013 C25.5741456,20.3078811 26.82651,20.3021231 27.945001,19.1306586 C28.8253988,18.2384569 29.1132987,16.2119297 29.1132987,16.2119297 C29.1132987,16.2119297 29.4069566,13.8321493 29.4069566,11.452369 L29.4069566,9.22143289 C29.4075324,6.84165255 29.1132987,4.46187221 29.1132987,4.46187221 Z M11.6665665,14.1560367 L11.6665665,5.89331037 L19.6126029,10.0390685 L11.6665665,14.1560367 Z" id="Shape" fill="#282928"/> - </g> - </g> - </svg> - <svg height="20" viewBox="0 0 29 20" width="29" x="150" y="182"> - <!-- Generator: Sketch 44 (41411) - http://www.bohemiancoding.com/sketch --> - <title>youtube-play-red</title> - <desc>Created with Sketch.</desc> - <defs> - <linearGradient x1="50.0014671%" y1="0%" x2="50.0014671%" y2="100%" id="linearGradient-1"> - <stop stop-color="#E52D27" offset="0%"/> - <stop stop-color="#BF171D" offset="100%"/> - </linearGradient> - </defs> - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="youtube-play-red"> - <polygon id="Shape" fill="#FFFFFF" fill-rule="nonzero" points="11.2720445 13.6773296 18.9493741 9.69958275 11.2720445 5.69401947"/> - <polygon id="Shape" fill="#420000" opacity="0.12" points="11.2720445 5.69401947 18.0036161 10.1899861 18.9493741 9.69958275"/> - <path d="M28.12879,4.31098748 C28.12879,4.31098748 27.8506259,2.35299026 27,1.49095967 C25.9196106,0.359109875 24.7073713,0.353268428 24.1529903,0.287343533 C20.1769124,0 14.2127955,0 14.2127955,0 L14.2005563,0 C14.2005563,0 8.2364395,0 4.26036161,0.287343533 C3.70598053,0.353268428 2.49429764,0.359109875 1.41335188,1.49095967 C0.562726008,2.35299026 0.284561892,4.31098748 0.284561892,4.31098748 C0.284561892,4.31098748 0,6.61029207 0,8.90959666 L0,11.0650904 C0,13.364395 0.284561892,15.6636996 0.284561892,15.6636996 C0.284561892,15.6636996 0.562726008,17.6216968 1.41335188,18.4840056 C2.49429764,19.6155772 3.91404729,19.5799722 4.54631433,19.6984701 C6.81947149,19.9165508 14.2066759,19.9838665 14.2066759,19.9838665 C14.2066759,19.9838665 20.1769124,19.9749652 24.1529903,19.6873435 C24.7093185,19.6211405 25.9193324,19.6155772 27,18.4837274 C27.8506259,17.6216968 28.12879,15.6636996 28.12879,15.6636996 C28.12879,15.6636996 28.4125174,13.364395 28.4125174,11.0650904 L28.4125174,8.90959666 C28.4130737,6.61029207 28.12879,4.31098748 28.12879,4.31098748 Z M11.2720445,13.6773296 L11.2720445,5.69401947 L18.9493741,9.69958275 L11.2720445,13.6773296 Z" id="Shape" fill="url(#linearGradient-1)" fill-rule="nonzero"/> - </g> - </g> - </svg> - <svg height="25" viewBox="0 0 25 25" width="25" x="149" y="210"> - <defs id="defs3348"/> - <g transform="matrix(0.27121977,0,0,0.27121977,-0.88977756,-1.016128)" id="g3338"> - <path id="path3340" d="m 21.207,39.091 c 0,0.174 0,0.336 0,0.511 0.395,0.278 1.323,0.186 1.161,-0.511 -0.221,-0.187 -0.952,-0.187 -1.161,0 z"/> - <path id="path3342" d="m 82.124,64.929 c 0.012,-0.371 0.186,-0.545 0.104,-0.998 0.674,-0.487 0.615,-1.068 0.882,-2.078 0.396,-1.485 2.183,-4.016 0.662,-5.153 -0.558,0.511 -0.162,0.917 -0.441,1.428 -0.452,0.848 -1.694,0.952 -2.193,1.648 -0.546,0.766 -0.72,2.159 -0.325,2.855 -0.801,0.894 -1.288,2.274 -0.558,3.609 1.011,-0.046 1.312,-0.812 1.869,-1.311 z"/> - <path id="path3344" d="M 92.037,33.937 C 89.75,27.948 86.233,22.565 81.776,18.125 73.731,10.109 62.67,5.123 50.436,5.002 c -0.151,0 -0.29,-0.006 -0.43,-0.006 -8.091,0 -15.671,2.147 -22.229,5.873 -9.542,5.438 -16.901,14.257 -20.441,24.832 -1.497,4.457 -2.321,9.228 -2.333,14.185 0,0.046 0,0.069 0,0.115 0,2.658 0.244,5.271 0.685,7.812 0.615,3.517 1.637,6.883 3.019,10.075 6.87,15.822 22.553,26.919 40.857,27.105 0.151,0 0.29,0.011 0.441,0.011 8.067,0 15.624,-2.136 22.171,-5.85 13.627,-7.73 22.82,-22.368 22.82,-39.153 C 94.997,44.337 93.94,38.928 92.037,33.937 Z M 63.761,85.822 c -0.673,-0.081 -0.882,-0.429 -1.474,-0.104 0.022,-0.58 -1.011,-0.104 -1.057,-0.638 -1.672,0.221 -3.238,0.395 -4.504,1.056 -0.464,0.244 -0.801,0.743 -1.266,0.848 -0.312,0.058 -0.754,-0.15 -1.056,-0.104 -0.929,0.116 -2.473,1.393 -3.563,1.579 -0.499,0.069 -1.01,-0.07 -1.591,0 -0.127,0.058 -0.278,0.104 -0.418,0.162 -3.354,-0.104 -6.593,-0.627 -9.669,-1.532 0.081,-0.128 0.174,-0.255 0.116,-0.534 -1.66,-0.998 -2.832,-2.483 -4.411,-3.575 -0.034,-0.801 0.639,-0.894 1.266,-1.044 -0.418,-0.999 -2.612,-0.569 -2.519,0.835 0.022,0.477 0.359,0.441 0.417,1.057 -0.476,-0.221 -0.545,-0.859 -1.16,-0.94 0.29,-0.197 0.243,-0.72 -0.209,-0.743 -0.487,-0.093 -0.197,0.581 -0.418,0.743 -0.522,0 -0.511,-0.116 -0.94,0 0.047,0.65 0.905,0.871 1.358,0.522 0.221,0.371 0.221,0.569 0,0.952 0.395,0.58 1.369,0.522 1.996,0.406 0.209,0.034 -0.022,-0.29 -0.104,-0.313 0.221,-0.278 0.465,0.302 0.522,0.534 -0.313,0.139 -0.639,0.209 -0.951,0.243 -1.104,-0.499 -2.171,-1.045 -3.216,-1.637 -0.116,-0.255 -0.395,-0.359 -0.708,-0.418 l 0,0 c -0.221,-0.116 -0.43,-0.255 -0.639,-0.383 0,0 0,0 0,-0.012 -0.012,0 -0.012,0 -0.034,-0.012 -2.821,-1.764 -5.387,-3.877 -7.661,-6.291 -0.07,-0.14 -0.175,-0.255 -0.302,-0.313 C 15.228,69.283 11.363,60.09 11.363,50.002 c 0,-3.842 0.557,-7.544 1.602,-11.05 0.15,0.441 0.128,1.057 0.487,1.288 0.639,-0.383 -0.081,-1.462 -0.186,-2.217 0,-0.023 0.012,-0.058 0.023,-0.081 0.243,0.673 0.812,1.276 0.998,1.984 0.104,0.406 -0.14,0.686 -0.104,1.045 0.128,1.254 1.103,1.394 2.205,2.217 0.522,0.128 0.441,-0.324 0.836,-0.312 0.302,1.404 2.356,1.079 2.426,2.716 0.209,0.348 0.697,0.418 0.72,0.951 0.558,-0.104 0.499,0.406 1.161,0.43 0.197,-0.162 0.023,-0.685 0.418,-0.639 0.534,0.453 0.568,1.405 0.522,2.415 -0.384,0.963 -1.684,2.345 -0.731,3.366 -0.812,0.836 0.046,2.193 0.731,2.519 0.406,1.532 1.01,2.844 1.892,3.877 0.883,0.186 1.23,0.882 1.684,1.475 0.012,2.229 0.302,4.155 0.522,6.094 0.139,1.057 -0.244,2.112 -0.197,3.146 0.058,1.428 1.114,2.356 0.939,3.889 -0.174,0.012 -0.406,-0.047 -0.418,0.104 -0.174,0.639 0.406,0.499 0.522,0.848 0.453,1.497 0.767,3.146 2.206,3.668 0.325,0.046 0.081,-0.488 0.325,-0.511 0.104,-0.279 0.034,0.894 -0.313,0.836 0.452,0.661 1.856,1.032 2.728,0.73 -0.929,-0.673 -1.788,-1.428 -2.311,-2.519 0.303,-0.464 0.569,-0.975 0.836,-1.463 -0.058,-0.511 -0.592,-0.522 -0.836,-0.847 -0.093,-0.441 0.465,-0.232 0.627,-0.418 -0.162,-0.151 -0.093,-0.534 -0.104,-0.848 0.128,-0.14 0.511,-0.035 0.522,-0.313 0.047,-0.522 -0.836,-0.14 -0.731,-0.731 0.268,0.093 0.558,0.14 0.94,0.104 0.174,-0.359 0,-0.696 0,-1.044 1.556,0.533 2.438,-0.639 1.684,-1.788 0.302,0.012 0.685,-0.058 0.847,0.104 1.23,-0.72 1.637,-2.275 2.52,-3.366 0.034,-0.487 -0.197,-0.72 -0.104,-1.254 0.395,-0.649 1.242,-0.847 1.775,-1.369 0.477,-0.047 0.895,0.15 1.266,0 0.963,-0.384 1.358,-3.354 1.161,-5.038 0.395,-0.313 2.414,-2.391 1.984,-3.575 -0.464,-1.3 -3.319,-2.635 -5.246,-2.414 -0.488,-1.126 -1.765,-0.976 -2.729,-1.475 -0.359,-1.88 -1.138,-3.343 -3.575,-3.146 -0.476,-1.045 -1.961,-1.463 -2.101,-2.519 -0.674,-0.081 -1.138,0.047 -1.358,0.418 -0.395,-0.256 -0.592,-0.14 -1.16,-0.104 -0.187,-0.383 -0.593,-0.522 -0.731,-0.94 -0.487,0 -0.441,0.349 -0.639,-0.116 -0.87,0.395 -1.741,0.778 -1.996,1.787 -0.384,-0.197 -1.23,-0.464 -1.881,0 -1.126,-0.916 0.696,-4.085 -1.996,-3.261 0.197,-0.871 0.568,-1.591 0.73,-2.508 -0.127,-0.093 -0.255,-0.139 -0.359,-0.186 0.302,-0.383 0.801,-0.557 1.556,-0.487 0,-1.451 -1.567,-1.475 -2.705,-1.149 -0.186,-0.337 -0.627,-0.731 -1.149,-1.079 0.256,-0.418 0.604,-0.731 1.08,-0.883 0.511,-0.046 0.522,0.395 0.952,0.418 0.278,-0.104 0.348,-0.43 0.312,-0.847 0.802,-0.163 0.895,0.186 1.579,0 0.093,0.882 0.278,1.694 0.627,2.31 1.184,-1.045 -0.163,-2.855 0.627,-4.086 0.58,-0.894 1.671,-0.894 1.996,-1.996 0.059,-0.349 -0.069,-0.488 -0.104,-0.731 0.627,-0.395 0.812,-1.23 1.161,-1.904 0.673,-0.231 0.858,-0.951 1.566,-1.148 0.14,-0.418 -0.336,-0.209 -0.209,-0.627 0.302,-0.674 1.22,-0.755 1.684,-1.254 0.14,0.162 -0.093,0.615 0.209,0.836 0.673,-0.476 1.567,-0.743 2.205,-1.266 0.093,-0.464 -0.186,-0.58 -0.522,-0.627 0.012,-0.302 0.441,-0.186 0.418,-0.521 -0.069,-0.372 -0.801,-0.116 -1.044,-0.313 0.081,-0.932 0.975,-0.418 1.566,-0.836 0.104,-0.525 -0.661,-0.183 -0.836,-0.427 0.65,-0.36 1.8,-0.232 1.893,-1.161 0.94,-0.139 1.428,-0.736 1.671,-1.572 -0.046,-0.54 -0.812,-0.36 -0.73,-1.051 -0.384,0.035 -0.686,-0.018 -0.94,-0.099 -0.244,-1.021 -0.511,-2.014 -0.848,-2.948 -0.302,0.041 -0.487,0.191 -0.639,0.383 -0.022,-0.012 -0.034,-0.029 -0.058,-0.035 -0.104,0.14 -0.349,0.094 -0.546,-0.028 2.275,-1.358 4.701,-2.49 7.255,-3.366 0.116,0.15 0.244,0.296 0.499,0.319 -0.197,0.435 -0.209,0.615 0.104,0.939 0.43,0.082 0.604,-0.099 0.952,-0.099 0.209,0.14 0.267,0.436 0.522,0.522 0.801,-0.493 1.903,-1.213 1.578,-2.205 0.256,-0.128 0.396,-0.383 0.511,-0.662 2.717,-0.604 5.525,-0.923 8.416,-0.923 4.353,0 8.531,0.731 12.443,2.061 -0.349,1.01 0.069,2.728 0.998,2.885 0.72,0.122 0.894,-0.447 1.684,-0.627 0.162,0.737 0.627,1.189 1.044,1.678 0.023,0.517 -0.777,0.203 -0.626,0.841 0.209,0.645 1.647,0.662 2.101,0.418 0.128,-0.923 0.081,-2.014 0.848,-2.31 0.012,-0.093 0.012,-0.174 0,-0.238 0.731,0.4 1.439,0.824 2.136,1.271 0.116,0.342 0.476,0.568 0.487,1.073 -0.499,0.029 -0.325,-0.598 -0.848,-0.528 -0.685,0.215 -0.499,1.312 -0.836,1.893 -1.265,-0.465 -2.402,0.54 -3.459,-0.424 0.325,-0.708 -0.464,-0.667 -0.742,-1.051 0.278,-0.754 0.313,-1.103 0,-1.886 -1.405,0.075 -1.219,1.59 -0.731,2.519 -0.465,0.041 -1.23,0.012 -1.788,0.215 -0.359,0.412 -0.418,1.126 -1.265,1.051 -0.325,-0.29 0.359,-0.522 0,-0.848 -0.151,-0.203 -0.534,-0.156 -0.731,-0.313 -0.023,-0.72 -0.43,-1.045 -0.952,-1.265 0.081,-0.39 0.14,-0.743 -0.418,-0.731 -0.069,-0.447 0.337,-0.424 0.313,-0.842 -0.069,-0.267 -0.336,-0.365 -0.731,-0.313 -0.093,-0.296 0.151,-0.272 0.104,-0.522 -0.174,-0.18 -0.615,-0.087 -0.951,-0.11 -0.499,0.308 -0.418,1.185 -0.836,1.579 -0.047,0.331 0.511,0.034 0.418,0.418 0.069,0.418 -0.499,0.133 -0.522,0 -0.685,0.272 -0.859,0.853 -1.684,0.736 0.094,0.401 0.14,0.848 0.104,1.364 0.268,0.267 0.743,0.313 0.94,0.633 0.627,-0.128 1.08,-0.389 1.37,-0.848 0,-0.313 0,-0.627 0,-0.94 0.255,-0.093 0.464,-0.249 0.848,-0.209 -0.104,0.412 0.312,0.313 0.208,0.726 -0.255,-0.006 -0.511,-0.012 -0.626,0.11 -0.082,0.395 0.174,0.447 0.104,0.842 -0.268,-0.018 -0.511,-0.018 -0.627,0.11 0.022,0.272 0.243,0.371 0.627,0.313 -0.047,0.436 -0.5,0.481 -0.627,0.836 0.731,0.249 1.973,0.093 2.623,-0.104 -0.209,0.522 0.337,0.278 0.313,0.627 -1.033,-0.528 -1.068,0.423 -2.31,0.214 -0.151,0.134 -0.104,0.453 -0.104,0.737 0.928,0.482 2.298,1.033 1.671,2.72 -1.474,0.243 -3.122,-0.812 -3.981,0.115 0.615,1.277 -0.139,2.543 0.104,3.784 0.627,0.163 1.532,0.059 1.881,0.511 -0.313,0.291 -0.627,0.569 -0.627,1.161 -1.544,0.349 -1.335,2.461 -2.31,3.366 -1.893,0.708 -2.392,2.798 -3.471,4.295 0.905,0.917 0.476,2.972 -0.104,3.9 0.162,0.359 0.44,0.604 0.313,1.253 0.312,0.5 0.858,0.755 1.369,1.057 0.731,1.66 1.556,3.784 3.354,3.981 0.79,0.093 1.196,-0.592 1.893,-0.627 0.673,-0.023 0.87,0.476 1.578,0.522 1.08,-0.29 2.066,-1.23 3.157,-1.045 0.905,0.162 1.532,1.741 2.624,0.94 0.383,0.731 0.231,2.205 -0.116,2.832 0.406,1.358 1.428,2.09 1.683,3.575 1.985,1.404 -0.29,3.506 -0.104,5.363 0.093,0.928 0.929,1.625 1.057,2.623 0.232,1.95 0.824,3.378 1.787,4.828 0.012,0.303 -0.359,0.209 -0.209,0.627 0.406,1.637 2.136,-0.081 3.146,0.313 1.01,-0.638 2.182,-1.103 2.519,-2.414 1.347,-0.511 1.416,-2.299 2.101,-3.471 0.175,0 0.349,0 0.522,0 0.383,-0.558 0.418,-1.741 0,-2.299 0.477,-0.998 1.382,-1.566 2.206,-2.205 0.046,-1.323 0.557,-2.136 0.209,-3.157 -0.163,-0.487 -0.778,-0.731 -0.836,-1.161 -0.256,-1.659 1.927,-2.089 2.101,-3.877 0.278,-0.069 0.395,-0.302 0.627,-0.418 0.337,-1.845 1.637,-3.272 1.475,-5.258 -0.79,0.383 -1.765,0.477 -2.52,0.639 -0.278,-0.337 0.186,-0.592 0.313,-0.848 -0.858,-1.312 -2.611,-2.739 -2.31,-4.515 -0.696,-0.917 -1.475,-2.311 -1.579,-3.46 0.65,-0.139 0.859,1.011 1.057,1.672 0.093,0.43 0.557,0.499 0.731,0.848 0.093,1.938 1.578,2.473 1.671,4.411 0.418,0.324 0.36,1.114 0.952,1.253 0.418,0.07 0.302,-0.395 0.313,-0.731 1.126,-0.766 2.496,-1.276 3.459,-2.205 0,-0.777 0.487,-0.859 0.43,-1.475 -0.069,-0.673 -0.952,-0.917 -0.952,-1.671 0.546,0.046 0.917,0.267 1.416,0.371 1.138,3.634 1.741,7.487 1.741,11.479 0,15.59 -9.251,29.031 -22.554,35.125 -1.007,-0.046 -1.843,0.047 -2.33,0.696 z M 28.996,23.861 c -0.29,-0.093 0.093,-0.369 0.093,-0.525 0.406,0.053 0.522,-0.191 0.952,-0.104 -0.059,0.501 -0.767,0.354 -1.045,0.629 z m 0.523,1.254 c 0.243,0.034 0.43,0.127 0.627,0.22 -0.094,0.221 -0.767,0.14 -0.627,-0.22 z m -5.364,-1.779 c -0.359,-0.558 -0.127,-1.271 0,-1.892 0.012,-0.07 -0.023,-0.094 -0.069,-0.104 0.661,-0.599 1.347,-1.161 2.043,-1.719 -0.128,0.993 -0.894,1.353 -1.451,1.928 0.267,0.574 0.313,1.74 -0.523,1.787 z m -0.836,3.996 c -0.452,-0.406 -0.557,0.221 -0.626,0.522 -0.104,-0.313 -0.256,-0.592 -0.325,-0.952 0.325,0.151 0.383,-0.046 0.847,0 -0.011,0.198 0.128,0.221 0.104,0.43 z M 21.01,26.38 c 0.151,-0.197 0.441,-0.255 0.522,-0.522 0.337,0.093 0.546,0.29 0.522,0.731 -0.36,-0.081 -0.395,0.163 -0.731,0.104 0.116,-0.325 0.105,-0.337 -0.313,-0.313 z m -0.314,0.43 c -0.186,-0.081 -0.012,-0.197 0,-0.325 0.186,0.08 0.012,0.185 0,0.325 z m -2.449,11.63 c -0.023,0.244 0.151,0.29 0.128,0.522 -0.36,-0.023 -0.696,-0.012 -0.639,0.383 0.232,0.615 0.848,0.325 1.3,0.569 -0.812,0.104 -0.685,1.973 -2.02,1.706 -0.104,-0.313 -0.197,-0.662 -0.255,-1.01 0.116,-0.023 0.267,-0.047 0.464,-0.104 -0.116,-0.65 -0.371,-0.812 -0.592,-0.755 -0.023,-0.302 -0.012,-0.615 0.012,-0.917 0.697,0.036 1.08,-0.254 1.602,-0.394 z m 6.547,6.628 c -0.012,-0.255 0.162,-0.313 0.209,-0.522 0.383,0.081 0.128,0.569 -0.209,0.522 z m 60.383,-7.765 c -0.336,0.511 -0.464,1.207 -1.369,1.161 -0.232,-0.29 -0.302,-0.755 -0.313,-1.266 -0.197,-0.197 -0.384,-0.034 -0.627,0 -0.174,-0.673 -0.604,-1.079 -0.639,-1.892 1.138,0.313 0.894,1.973 2.008,2.31 0.452,0.035 0.534,-0.302 0.94,-0.313 z m -2.844,-8.474 c 0,0.023 0,0.047 0.012,0.07 0.081,0.115 0.174,0.231 0.256,0.348 0.046,0.069 0.081,0.14 0.115,0.197 0.256,0.395 0.453,0.836 0.465,1.451 -1.591,0.069 -2.206,-1.161 -1.672,-2.623 -0.673,-0.674 -1.3,-1.684 -1.566,-2.693 0.846,1.033 1.647,2.124 2.39,3.25 z m -11.225,4.794 c -1.66,-0.58 -2.6,-1.88 -4.202,-2.519 0.244,-0.859 -0.487,-1.01 -0.209,-1.579 -0.313,-0.116 -0.615,-0.22 -0.847,-0.418 -0.313,0.035 -0.465,0.232 -0.731,0.325 -1.312,-0.162 -2.473,-0.278 -3.68,0 -1.126,0.244 -2.264,1.149 -3.354,0.209 1.357,-0.081 2.321,-0.43 3.041,-1.16 -0.232,-1.776 1.335,-1.753 1.578,-3.053 0.999,0.371 1.765,0.104 2.52,-0.313 0.848,1.323 2.763,1.578 3.146,3.366 -0.546,0.093 -1.021,0.267 -1.567,-0.104 -0.197,0.615 0.488,1.172 0.836,1.578 0.325,0.081 0.383,-0.116 0.627,-0.104 0.047,-0.371 -0.035,-0.592 -0.104,-0.848 0.313,0 0.534,0.313 0.743,0.116 0.058,-0.324 0.29,-0.487 0.627,-0.533 0.069,-0.384 -0.232,-0.406 -0.209,-0.731 0.348,0 0.511,0.499 0.835,0.209 0.035,-0.94 -0.998,-0.824 -1.148,-1.579 0.627,-0.186 0.824,0.081 1.253,0.325 0.256,1.729 0.895,3.088 2.311,3.668 0.174,0.081 0.174,-0.487 0,-0.418 0.104,-0.325 0.29,0.116 0.418,0.104 0.255,0.035 -0.059,-0.476 0.324,-0.313 -0.267,-0.836 -0.429,-1.138 -0.429,-2.205 0.824,0 0.754,1.276 0.742,1.787 0.488,0.674 1.208,1.625 2.415,1.254 0.371,-0.023 0.336,0.359 0.627,0.418 0.452,0 0.673,-0.244 1.16,-0.209 -0.116,0.998 -0.023,1.787 -0.209,2.832 -2.055,-0.162 -4.062,-0.325 -5.142,-1.671 -0.313,0.312 -1.207,0.058 -1.475,0.406 -0.082,0.511 0.162,0.684 0.103,1.16 z m -9.982,-13.02 c 0.325,-0.151 0.15,0.609 -0.104,0.522 -0.047,-0.25 0.185,-0.227 0.104,-0.522 z m 13.546,6.729 c -0.197,-0.256 -0.359,-0.546 -0.627,-0.743 0.337,-0.534 0.558,-1.184 0.94,-1.683 0.499,-0.035 0.476,0.429 1.057,0.313 -0.128,0.312 -0.035,0.359 0.093,0.638 0.464,-0.231 0.94,0.012 1.381,0.104 0.082,-0.406 -0.231,-0.406 -0.429,-0.533 0.162,-0.209 0.742,-0.023 0.951,-0.209 -0.034,0.243 0.023,0.406 0.209,0.429 0.012,0.221 -0.371,0.047 -0.522,0.093 0.07,0.221 0.197,0.372 0.337,0.522 -0.151,0.012 -0.302,0.035 -0.441,0.104 -0.058,0.755 0.372,0.999 0.778,1.277 0.255,-0.209 0.708,-0.221 0.963,-0.441 0.268,0.209 0.477,0.465 0.558,0.859 -1.882,0.047 -2.961,-1.369 -5.248,-0.73 z"/> - </g> - </svg> - <svg height="24" viewBox="0 0 24 24" width="24" x="179" y="210"> - <g> - <path fill="#FFFFFF" d="M24,2.5L14.5,12l9.5,9.5L21.5,24L12,14.5L2.5,24L0,21.5L9.5,12L0,2.5L2.5,0L12,9.5L21.5,0L24,2.5z"/> - </g> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="184" y="182"> - <path fill="#000000" d="M17.1,0c0.8,0,1.5,0.3,2.1,0.9C19.7,1.4,20,2.1,20,2.9v14.2c0,0.8-0.3,1.5-0.9,2.1c-0.6,0.6-1.3,0.9-2.1,0.9 H2.9c-0.8,0-1.5-0.3-2.1-0.9S0,17.9,0,17.1V2.9c0-0.8,0.3-1.5,0.9-2.1S2.1,0,2.9,0C2.9,0,17.1,0,17.1,0z M10,6.2 c-1,0-1.9,0.4-2.7,1.1S6.3,9,6.3,10s0.4,1.9,1.1,2.7c0.7,0.7,1.6,1.1,2.7,1.1c1,0,1.9-0.4,2.7-1.1c0.7-0.7,1.1-1.6,1.1-2.7 s-0.4-1.9-1.1-2.7C11.9,6.6,11,6.2,10,6.2z M17.9,17.5V8.7h-2.2c0.1,0.4,0.1,0.8,0.1,1.2c0,1.1-0.3,2-0.8,2.9s-1.2,1.6-2.1,2.1 c-0.9,0.5-1.9,0.8-2.9,0.8S8,15.6,7.1,15c-0.9-0.5-1.6-1.2-2.1-2.1C4.4,12,4.2,11.1,4.2,10c0-0.4,0-0.9,0.1-1.2H2.1v8.7 c0,0.1,0,0.2,0.1,0.3s0.2,0.1,0.3,0.1h15c0.1,0,0.2,0,0.3-0.1C17.9,17.7,17.9,17.6,17.9,17.5L17.9,17.5z M17.9,5V2.5 c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.2-0.1-0.3-0.1H15c-0.1,0-0.2,0-0.3,0.1c-0.1,0.1-0.1,0.2-0.1,0.3V5c0,0.1,0,0.2,0.1,0.3 c0.1,0.1,0.2,0.1,0.3,0.1h2.5c0.1,0,0.2,0,0.3-0.1C17.9,5.2,17.9,5.1,17.9,5z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="209" y="182"> - <g> - <path fill="#ffffff" d="M11.4,7.3c-0.2-0.2-0.5-0.3-0.8-0.3C10,6.9,9.5,7.3,9,8.1c-0.5,0.8-0.7,1.5-0.7,2.3c0,0.4,0.1,0.8,0.3,1.1 c0.2,0.3,0.5,0.4,0.9,0.4c0.6,0,1.2-0.5,1.6-1.5c0.4-1,0.6-1.7,0.6-2.3C11.7,7.8,11.6,7.5,11.4,7.3z"/> - <path fill="#ffffff" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M10.8,12.5 c-0.5,0.5-1.1,0.7-1.8,0.7c-0.7,0-1.3-0.3-1.8-0.8c-0.5-0.5-0.7-1.3-0.7-2.2c0-1.1,0.4-2.1,1.1-3.1c0.7-1,1.7-1.4,2.7-1.4 c0.6,0,1.1,0.2,1.5,0.5c0.3,0.3,0.4,0.6,0.5,0.9L12.5,6h1.7l-1.2,3.9c-0.1,0.3-0.2,0.6-0.2,0.7c0,0.2-0.1,0.3-0.1,0.4 c0,0.2,0.1,0.4,0.2,0.5c0.1,0.2,0.3,0.2,0.6,0.2c0.5,0,1-0.3,1.6-1c0.5-0.7,0.8-1.6,0.8-2.7c0-1.7-0.7-2.8-2.1-3.6 c-0.9-0.5-1.9-0.7-3-0.7c-2,0-3.7,0.6-4.9,1.9C4.7,6.9,4.2,8.2,4.2,9.8c0,1.8,0.7,3.2,2,4.2c1.2,0.9,2.6,1.4,4.3,1.4 c1.1,0,2.2-0.2,3.2-0.6c0.5-0.2,1.1-0.5,1.7-0.9l0.2-0.2l0.7,1c-0.9,0.7-1.8,1.2-2.8,1.5c-1,0.3-2,0.5-3.1,0.5 c-2.5,0-4.4-0.8-5.8-2.3C3.3,13,2.8,11.5,2.8,9.7c0-2,0.7-3.7,2.1-5c1.5-1.5,3.4-2.2,5.7-2.2c1.9,0,3.5,0.5,4.7,1.5 c1.3,1,2,2.4,2,4.2c0,1.4-0.4,2.5-1.2,3.5c-0.8,1-1.8,1.5-2.8,1.5c-0.6,0-1-0.2-1.3-0.5c-0.3-0.3-0.4-0.6-0.4-1c0,0,0-0.1,0-0.1 c0-0.1,0-0.1,0-0.2C11.3,11.9,11.1,12.2,10.8,12.5z"/> - </g> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="208" y="210"> - <g> - <path fill="#000000" d="M11.4,7.3c-0.2-0.2-0.5-0.3-0.8-0.3C10,6.9,9.5,7.3,9,8.1c-0.5,0.8-0.7,1.5-0.7,2.3c0,0.4,0.1,0.8,0.3,1.1 c0.2,0.3,0.5,0.4,0.9,0.4c0.6,0,1.2-0.5,1.6-1.5c0.4-1,0.6-1.7,0.6-2.3C11.7,7.8,11.6,7.5,11.4,7.3z"/> - <path fill="#000000" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M10.8,12.5 c-0.5,0.5-1.1,0.7-1.8,0.7c-0.7,0-1.3-0.3-1.8-0.8c-0.5-0.5-0.7-1.3-0.7-2.2c0-1.1,0.4-2.1,1.1-3.1c0.7-1,1.7-1.4,2.7-1.4 c0.6,0,1.1,0.2,1.5,0.5c0.3,0.3,0.4,0.6,0.5,0.9L12.5,6h1.7l-1.2,3.9c-0.1,0.3-0.2,0.6-0.2,0.7c0,0.2-0.1,0.3-0.1,0.4 c0,0.2,0.1,0.4,0.2,0.5c0.1,0.2,0.3,0.2,0.6,0.2c0.5,0,1-0.3,1.6-1c0.5-0.7,0.8-1.6,0.8-2.7c0-1.7-0.7-2.8-2.1-3.6 c-0.9-0.5-1.9-0.7-3-0.7c-2,0-3.7,0.6-4.9,1.9C4.7,6.9,4.2,8.2,4.2,9.8c0,1.8,0.7,3.2,2,4.2c1.2,0.9,2.6,1.4,4.3,1.4 c1.1,0,2.2-0.2,3.2-0.6c0.5-0.2,1.1-0.5,1.7-0.9l0.2-0.2l0.7,1c-0.9,0.7-1.8,1.2-2.8,1.5c-1,0.3-2,0.5-3.1,0.5 c-2.5,0-4.4-0.8-5.8-2.3C3.3,13,2.8,11.5,2.8,9.7c0-2,0.7-3.7,2.1-5c1.5-1.5,3.4-2.2,5.7-2.2c1.9,0,3.5,0.5,4.7,1.5 c1.3,1,2,2.4,2,4.2c0,1.4-0.4,2.5-1.2,3.5c-0.8,1-1.8,1.5-2.8,1.5c-0.6,0-1-0.2-1.3-0.5c-0.3-0.3-0.4-0.6-0.4-1c0,0,0-0.1,0-0.1 c0-0.1,0-0.1,0-0.2C11.3,11.9,11.1,12.2,10.8,12.5z"/> - </g> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="5"> - <path fill="#FFFFFF" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M15,5h-1.4c-1.1,0-1.1,0.9-1.1,1.6 v2.1h2.4l-0.3,2.5h-2.1v6.2H10v-6.2H7.5V8.8H10V6.4c0-2.2,1.2-3.4,3.2-3.4C14.1,2.9,15,3,15,3V5z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="30"> - <path fill="#000000" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M15,5h-1.4c-1.1,0-1.1,0.9-1.1,1.6 v2.1h2.4l-0.3,2.5h-2.1v6.2H10v-6.2H7.5V8.8H10V6.4c0-2.2,1.2-3.4,3.2-3.4C14.1,2.9,15,3,15,3V5z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="55"> - <path fill="#FFFFFF" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="80"> - <path fill="#000000" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="105"> - <path fill="#27346A" d="M15.8 1.7C14.9.7 13.3.2 11.2.2H5.1c-.4.1-.8.4-.8.8L1.8 17c-.1.3.2.6.5.6H6l.9-6v.2c.1-.4.4-.7.9-.7h1.8c3.5 0 6.2-1.4 7-5.5 0-.1 0-.2.1-.4-.1-.1-.1-.1 0 0 .2-1.5-.1-2.5-.9-3.5"/> - <path fill="#27346A" d="M8.4 4.7c.1 0 .2-.1.3-.1h4.7c.6 0 1.1 0 1.6.1.1 0 .3 0 .4.1.2 0 .4.1.6.2.2.1.5.2.7.3.2-1.5 0-2.5-.8-3.5C15 .8 13.4.3 11.3.3H5.1c-.4 0-.8.3-.8.7L1.8 17c-.1.3.2.6.5.6H6L8 5.2c0-.2.1-.4.4-.5z"/> - <path fill="#2790C3" d="M16.6 5.6c-.8 4.1-3.5 5.5-7 5.5H7.8c-.4 0-.8.3-.9.7l-1.2 7.4c0 .3.2.5.4.5h3.1c.4 0 .7-.3.7-.6v-.2l.6-3.8v-.2c.1-.4.4-.6.7-.6h.8c3.1 0 5.4-1.2 6.1-4.8.3-1.5.1-2.7-.6-3.6-.2-.3-.5-.5-.9-.7v.4z"/> - <path fill="#1F264F" d="M15.8 4.9c-.1 0-.2-.1-.4-.1-.1 0-.3-.1-.4-.1-.5-.1-1-.1-1.6-.1H8.7c-.1 0-.2 0-.3.1-.3.1-.4.3-.4.5l-1 6.4v.2c.1-.4.4-.7.9-.7h1.8c3.5 0 6.2-1.4 7-5.5 0-.1 0-.2.1-.4-.4-.1-.6-.2-.8-.3h-.2"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="130"> - <path fill="#55acee" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="155"> - <g> - <path fill="#FFF" d="M9.2,3.1c-0.3-0.3-0.6-0.4-1-0.4c-0.5,0-1,0.2-1.3,0.6c-0.4,0.5-0.5,1-0.5,1.5C6.4,5.5,6.6,6.2,7,7 c0.2,0.4,0.5,0.7,0.8,0.9c0.3,0.3,0.7,0.4,1.1,0.4c0.5,0,0.9-0.2,1.3-0.6c0.2-0.2,0.3-0.5,0.3-0.8c0-0.3,0-0.5,0-0.7 c0-0.8-0.2-1.6-0.6-2.3C9.8,3.6,9.5,3.3,9.2,3.1z"/> - <path fill="#FFF" d="M9.1,11.4c-0.1,0-0.4,0-0.8,0c-0.4,0.1-0.8,0.1-1.2,0.3c-0.1,0-0.2,0.1-0.4,0.2c-0.2,0.1-0.4,0.2-0.6,0.4 c-0.2,0.2-0.3,0.4-0.5,0.6c-0.1,0.2-0.2,0.5-0.2,0.9c0,0.7,0.3,1.3,0.9,1.7c0.6,0.4,1.4,0.7,2.4,0.7c0.9,0,1.6-0.2,2.1-0.6 c0.6-0.4,0.8-0.9,0.8-1.6c0-0.5-0.2-0.9-0.5-1.3c-0.3-0.4-0.9-0.8-1.6-1.3C9.4,11.4,9.2,11.4,9.1,11.4z"/> - <path fill="#FFF" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M11.3,3.3 c0.1,0.2,0.3,0.2,0.4,0.4C11.9,4,12,4.2,12.1,4.5c0.1,0.3,0.1,0.6,0.1,1c0,0.7-0.2,1.2-0.5,1.7c-0.1,0.2-0.3,0.4-0.5,0.6 s-0.4,0.3-0.6,0.5c-0.1,0.1-0.2,0.3-0.3,0.4c-0.1,0.2-0.2,0.3-0.2,0.6c0,0.2,0.1,0.4,0.2,0.5c0.1,0.1,0.2,0.2,0.3,0.3l0.7,0.5 c0.4,0.3,0.8,0.7,1.1,1.1c0.3,0.4,0.4,1,0.5,1.6c0,1-0.4,1.8-1.3,2.5C10.8,16.6,9.5,17,7.9,17c-1.4,0-2.4-0.3-3.1-0.9 c-0.7-0.5-1-1.2-1-1.9c0-0.4,0.1-0.8,0.3-1.2c0.2-0.4,0.6-0.8,1.2-1.2c0.6-0.4,1.3-0.6,2-0.7C8,11,8.5,10.9,9,10.9 c-0.1-0.2-0.3-0.4-0.4-0.6c-0.1-0.2-0.2-0.5-0.2-0.7s0-0.3,0.1-0.4c0-0.1,0.1-0.2,0.1-0.3c-0.2,0-0.4,0-0.6,0c-1,0-1.8-0.3-2.4-1 C5,7.2,4.7,6.5,4.7,5.8c0-1,0.4-1.8,1.2-2.6C6.5,2.7,7,2.4,7.6,2.3C8.3,2.1,8.9,2,9.4,2h3.9l-1.2,1.2h-1.2 C11,3.2,11.2,3.2,11.3,3.3z M18.8,5.2h-1.8v0.5V6v1h-1.3V6.1V5.7V5.2H15h-0.3h-1V3.8h0.9H15h0.5V2h1.3v1.8h1.8V5.2z"/> - </g> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="180"> - <path fill="#FFFFFF" d="M17.1,0c0.8,0,1.5,0.3,2.1,0.9C19.7,1.4,20,2.1,20,2.9v14.2c0,0.8-0.3,1.5-0.9,2.1c-0.6,0.6-1.3,0.9-2.1,0.9 H2.9c-0.8,0-1.5-0.3-2.1-0.9S0,17.9,0,17.1V2.9c0-0.8,0.3-1.5,0.9-2.1S2.1,0,2.9,0C2.9,0,17.1,0,17.1,0z M10,6.2 c-1,0-1.9,0.4-2.7,1.1S6.3,9,6.3,10s0.4,1.9,1.1,2.7c0.7,0.7,1.6,1.1,2.7,1.1c1,0,1.9-0.4,2.7-1.1c0.7-0.7,1.1-1.6,1.1-2.7 s-0.4-1.9-1.1-2.7C11.9,6.6,11,6.2,10,6.2z M17.9,17.5V8.7h-2.2c0.1,0.4,0.1,0.8,0.1,1.2c0,1.1-0.3,2-0.8,2.9s-1.2,1.6-2.1,2.1 c-0.9,0.5-1.9,0.8-2.9,0.8S8,15.6,7.1,15c-0.9-0.5-1.6-1.2-2.1-2.1C4.4,12,4.2,11.1,4.2,10c0-0.4,0-0.9,0.1-1.2H2.1v8.7 c0,0.1,0,0.2,0.1,0.3s0.2,0.1,0.3,0.1h15c0.1,0,0.2,0,0.3-0.1C17.9,17.7,17.9,17.6,17.9,17.5L17.9,17.5z M17.9,5V2.5 c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.2-0.1-0.3-0.1H15c-0.1,0-0.2,0-0.3,0.1c-0.1,0.1-0.1,0.2-0.1,0.3V5c0,0.1,0,0.2,0.1,0.3 c0.1,0.1,0.2,0.1,0.3,0.1h2.5c0.1,0,0.2,0,0.3-0.1C17.9,5.2,17.9,5.1,17.9,5z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="205"> - <path fill="#FFFFFF" d="M10,2.9c3,0,5,0,6,0.1c1.4,0.1,2.3,0.4,2.9,0.8c0.5,0.4,0.8,1.1,1,2C19.9,6.5,20,7.8,20,9.7V10 c0,2,0,3.3-0.1,3.9c-0.1,1-0.4,1.7-0.9,2.1c-0.5,0.5-1.4,0.8-2.7,0.9c-1,0.1-2.9,0.2-5.8,0.2H10c-3,0-5,0-6-0.1 c-1.4-0.1-2.3-0.4-2.9-0.8c-0.5-0.4-0.8-1.1-1-2C0.1,13.5,0,12.2,0,10.3V10c0-2,0-3.3,0.1-3.9c0.1-1,0.4-1.7,0.9-2.1 c0.5-0.5,1.4-0.8,2.7-0.9c1-0.1,2.9-0.2,5.8-0.2C9.6,2.9,10,2.9,10,2.9z M7.5,13.7l6.2-3.7L7.5,6.2V13.7L7.5,13.7z"/> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="5" y="240"> - <g> - <path d="M16.2,12.8v2.7c0,1.4-1.1,2.5-2.5,2.5H2.5C1.1,18,0,16.9,0,15.5v-10C0,4.1,1.1,3,2.5,3h7v1C8.1,4.3,6.8,4.8,5.8,5.5H2.5 v9.9h11.2v-1L16.2,12.8z M19.9,8c0,0.1-0.1,0.3-0.2,0.3l-7.9,5.4c-0.1,0-0.1,0.1-0.2,0.1c-0.1,0-0.1,0-0.2,0 c-0.1-0.1-0.2-0.2-0.2-0.4v-2.9c-5,0.1-6.2,1.8-6.2,1.8c-0.1,0.1-0.2,0.2-0.3,0.2H4.5c-0.2,0-0.3-0.2-0.3-0.4C4.2,12,4,9.5,5.9,7.6 c1.2-1.3,3-2,5.4-2.1V2.6c0-0.2,0.1-0.3,0.2-0.4c0.1-0.1,0.3-0.1,0.4,0l7.9,5.4C19.9,7.7,19.9,7.9,19.9,8z"/> - </g> - <g display="none"> - <path display="inline" d="M9.2,18.3c-2.1,2.1-5.5,2.1-7.6,0s-2.1-5.5,0-7.6l2.8-2.8C4.4,9,4.5,10,4.9,11l-1.5,1.5 c-1.1,1.1-1.1,2.9,0,4.1s2.9,1.1,4.1,0l3.1-3.1c1.1-1.1,1.1-2.9,0-4.1c-0.5-0.5-0.5-1.3,0-1.8s1.3-0.5,1.8,0c2.1,2.1,2.1,5.5,0,7.6 L9.2,18.3z M15.5,12.1c0.1-1.1,0-2.1-0.4-3.1l1.5-1.5c1.1-1.1,1.1-2.9,0-4.1c-1.1-1.1-2.9-1.1-4.1,0L9.4,6.5 c-1.1,1.1-1.1,2.9,0,4.1c0.5,0.5,0.5,1.3,0,1.7c-0.5,0.5-1.3,0.5-1.7,0c-2.1-2.1-2.1-5.5,0-7.6l3.1-3.1c2.1-2.1,5.5-2.1,7.6,0 s2.1,5.5,0,7.6L15.5,12.1z"/> - </g> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="30" y="240"> - <g display="none"> - <path display="inline" d="M16.2,10.6v2.7c0,1.4-1.1,2.5-2.5,2.5H2.5c-1.4,0-2.5-1.1-2.5-2.5V3.3c0-1.4,1.1-2.5,2.5-2.5h7v1 C8.1,2.1,6.8,2.6,5.8,3.3H2.5v9.9h11.2v-1L16.2,10.6z M19.9,5.8c0,0.1-0.1,0.3-0.2,0.3l-7.9,5.4c-0.1,0-0.1,0.1-0.2,0.1 c-0.1,0-0.1,0-0.2,0c-0.1-0.1-0.2-0.2-0.2-0.4V8.3C6.2,8.4,5,10.1,5,10.1c-0.1,0.1-0.2,0.2-0.3,0.2H4.5c-0.2,0-0.3-0.2-0.3-0.4 c0-0.1-0.2-2.6,1.7-4.5c1.2-1.3,3-2,5.4-2.1V0.4c0-0.2,0.1-0.3,0.2-0.4c0.1-0.1,0.3-0.1,0.4,0l7.9,5.4C19.9,5.5,19.9,5.7,19.9,5.8z "/> - </g> - <g> - <path d="M9.2,18.3c-2.1,2.1-5.5,2.1-7.6,0c-2.1-2.1-2.1-5.5,0-7.6l2.8-2.8C4.4,9,4.5,10,4.9,11l-1.5,1.5c-1.1,1.1-1.1,2.9,0,4.1 s2.9,1.1,4.1,0l3.1-3.1c1.1-1.1,1.1-2.9,0-4.1c-0.5-0.5-0.5-1.3,0-1.8c0.5-0.5,1.3-0.5,1.8,0c2.1,2.1,2.1,5.5,0,7.6L9.2,18.3z M15.5,12.1c0.1-1.1,0-2.1-0.4-3.1l1.5-1.5c1.1-1.1,1.1-2.9,0-4.1c-1.1-1.1-2.9-1.1-4.1,0L9.4,6.5c-1.1,1.1-1.1,2.9,0,4.1 c0.5,0.5,0.5,1.3,0,1.7c-0.5,0.5-1.3,0.5-1.7,0c-2.1-2.1-2.1-5.5,0-7.6l3.1-3.1c2.1-2.1,5.5-2.1,7.6,0c2.1,2.1,2.1,5.5,0,7.6 L15.5,12.1z"/> - </g> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="55" y="240"> - <g> - <circle cx="2.7" cy="2.7" r="2.3"/> - <rect x="0.7" y="6.8" width="4" height="12.8"/> - <path d="M14.8,6.5c-1.9,0-3.2,1.1-3.8,2.1H11V6.8H7.2v12.8h4v-6.3c0-1.7,0.3-3.3,2.4-3.3c2,0,2.1,1.9,2.1,3.4v6.2h4v-7 C19.6,9.1,18.8,6.5,14.8,6.5z"/> - </g> - </svg> - <svg height="20" viewBox="0 0 20 20" width="20" x="80" y="240"> - <path d="M16.7 12.6V17H3.3v-4.4H.7v5.7c0 .7.6 1.3 1.3 1.3h16c.7 0 1.3-.6 1.3-1.3v-5.7h-2.6zM9.8 12.2L6.1 7.7s-.6-.5 0-.5h2.1v-.9V.7s-.1-.3.4-.3h2.9c.3 0 .3.3.3.3V7.1h1.9c.7 0 .2.6.2.6s-3.1 4.2-3.6 4.6c-.2.2-.5-.1-.5-.1z"/> - </svg> - <svg height="16" viewBox="0 0 20 16" width="20" x="221" y="133"> - <path fill="#FFFFFF" d="M18.4,2h-5.7l-0.9-1.3c-0.2-0.5-0.6-0.7-1-0.7H8.3c-0.5,0-0.9,0.3-1,0.7L6.4,2H4.5V1h-2v1H0.9 C0.3,2,0.5,2.7,0.5,3.3v11c0,0.6-0.2,1.7,0.4,1.7h17.5c0.6,0,1.1-1.1,1.1-1.7v-11C19.5,2.7,19,2,18.4,2z M9.6,13.1 c-2.4,0-4.3-1.9-4.3-4.3s1.9-4.3,4.3-4.3s4.3,1.9,4.3,4.3S12,13.1,9.6,13.1z M16.5,6.6c-0.8,0-1.4-0.6-1.4-1.4s0.7-1.5,1.5-1.5 c0.8,0,1.5,0.7,1.5,1.5S17.4,6.6,16.5,6.6z"/> - </svg> - <svg height="16" viewBox="0 0 20 16" width="20" x="152" y="159"> - <path fill="#FFFFFF" d="M19.6,0h-6.9c-1.3,0-1.5,0.5-1.5,1.8V1.7C11.2,0.4,9.3,0,8,0H1v12.7V13l2.3,1.9H8c0,0,0.6,0.9,1.1,0.9h2.3 c0.7,0,1.1-0.9,1.1-0.9h4.7l2.3-1.9v-0.3L19.6,0L19.6,0z M1.9,0.9h6l0,0c0.7,0,1.4,0.1,1.4,0.7v10.4H1.9V0.9z M18.7,12.1h-6.5V1.8 c0-0.7-0.1-0.8,0.6-0.8h6V12.1z"/> - <rect x="13.1" y="4.7" fill="#FFFFFF" width="4.7" height="0.9"/> - <rect x="13.1" y="1.9" fill="#FFFFFF" width="4.7" height="0.9"/> - <rect x="13.1" y="6.5" fill="#FFFFFF" width="4.7" height="1.9"/> - <rect x="13.1" y="10.2" fill="#FFFFFF" width="4.7" height="0.9"/> - <rect x="2.8" y="4.7" fill="#FFFFFF" width="4.7" height="0.9"/> - <rect x="2.8" y="1.9" fill="#FFFFFF" width="4.7" height="0.9"/> - <rect x="2.8" y="6.5" fill="#FFFFFF" width="4.7" height="1.9"/> - <rect x="2.8" y="10.2" fill="#FFFFFF" width="4.7" height="0.9"/> - </svg> - <svg height="16" viewBox="0 0 20 16" width="20" x="177" y="159"> - <path fill="#000000" d="M19.6,0h-6.9c-1.3,0-1.5,0.5-1.5,1.8V1.7C11.2,0.4,9.3,0,8,0H1v12.7V13l2.3,1.9H8c0,0,0.6,0.9,1.1,0.9h2.3 c0.7,0,1.1-0.9,1.1-0.9h4.7l2.3-1.9v-0.3L19.6,0L19.6,0z M1.9,0.9h6l0,0c0.7,0,1.4,0.1,1.4,0.7v10.4H1.9V0.9z M18.7,12.1h-6.5V1.8 c0-0.7-0.1-0.8,0.6-0.8h6V12.1z"/> - <rect x="13.1" y="4.7" fill="#000000" width="4.7" height="0.9"/> - <rect x="13.1" y="1.9" fill="#000000" width="4.7" height="0.9"/> - <rect x="13.1" y="6.5" fill="#000000" width="4.7" height="1.9"/> - <rect x="13.1" y="10.2" fill="#000000" width="4.7" height="0.9"/> - <rect x="2.8" y="4.7" fill="#000000" width="4.7" height="0.9"/> - <rect x="2.8" y="1.9" fill="#000000" width="4.7" height="0.9"/> - <rect x="2.8" y="6.5" fill="#000000" width="4.7" height="1.9"/> - <rect x="2.8" y="10.2" fill="#000000" width="4.7" height="0.9"/> - </svg> - <svg height="17.2" viewBox="0 0 18 18" width="17.5" x="105" y="240"> - <path fill="#FFFFFF" d="M6.9,1.1c3.1,0,5.6,2.5,5.6,5.6s-2.5,5.6-5.6,5.6c-3.1,0-5.6-2.5-5.6-5.6S3.8,1.1,6.9,1.1 M6.9,0 c-3.7,0-6.7,3-6.7,6.7c0,3.7,3,6.7,6.7,6.7c3.7,0,6.7-3,6.7-6.7C13.5,2.9,10.6,0,6.9,0L6.9,0z"/> - <rect x="12.4" y="11.2" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -5.7168 14.1519)" fill="#FFFFFF" width="3.6" height="5.5"/> - </svg> - <svg height="17.2" viewBox="0 0 18 18" width="17.5" x="128" y="240"> - <path fill="#000000" d="M6.9,1.1c3.1,0,5.6,2.5,5.6,5.6s-2.5,5.6-5.6,5.6c-3.1,0-5.6-2.5-5.6-5.6S3.8,1.1,6.9,1.1 M6.9,0 c-3.7,0-6.7,3-6.7,6.7c0,3.7,3,6.7,6.7,6.7c3.7,0,6.7-3,6.7-6.7C13.5,2.9,10.6,0,6.9,0L6.9,0z"/> - <rect x="12.4" y="11.2" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -5.7168 14.1519)" fill="#000000" width="3.6" height="5.5"/> - </svg> - <svg height="16" viewBox="0 0 17 16" width="16.4" x="202" y="159"> - <path fill="#FFFFFF" d="M14.4,5.9l-3.3,3.3V6.7C11.1,6.2,10.5,6,10,6H0.8C0.3,6,0.1,6.2,0.1,6.7v8.1c0,0.6,0.1,1.1,0.7,1.1H10 c0.6,0,1.1-0.6,1.1-1.1v-2.5l3.3,3.3c0.7,0.5,1.7,0,1.7-0.8V6.7C16.1,5.9,15.1,5.4,14.4,5.9z"/> - <g> - <circle fill="#FFFFFF" cx="2.3" cy="2.4" r="2.3"/> - </g> - <g> - <circle fill="#FFFFFF" cx="8.5" cy="2.4" r="2.3"/> - </g> - </svg> - <svg height="16" viewBox="0 0 17 16" width="16.4" x="223" y="159"> - <path fill="#000000" d="M14.4,5.9l-3.3,3.3V6.7C11.1,6.2,10.5,6,10,6H0.8C0.3,6,0.1,6.2,0.1,6.7v8.1c0,0.6,0.1,1.1,0.7,1.1H10 c0.6,0,1.1-0.6,1.1-1.1v-2.5l3.3,3.3c0.7,0.5,1.7,0,1.7-0.8V6.7C16.1,5.9,15.1,5.4,14.4,5.9z"/> - <circle fill="#000000" cx="2.3" cy="2.4" r="2.3"/> - <circle fill="#000000" cx="8.5" cy="2.4" r="2.3"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="150" y="240"> - <path fill="#FFFFFF" d="M7,7.9L8.1,9l-4.9,4.9h4.5v1.6H0.5V8.3h1.6v4.5L7,7.9z M8.3,0.5h7.2v7.2h-1.6V3.2L9,8.1L7.9,7l4.9-4.9H8.3 L8.3,0.5L8.3,0.5z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="171" y="240"> - <g> - <polygon fill="#000000" points="3.3,10.7 4.3,15.7 6.4,15.7 5.4,10.7 "/> - <path fill="#000000" d="M0,6.7c0,2.5,2,3,2,3h5v-6H2C2,3.7,0,4.1,0,6.7z"/> - <path fill="#000000" d="M14.6,0.4L8,3.7v6l6.6,3.3c0.7,0.3,1.4-0.2,1.4-0.9V1.3C16,0.6,15.2,0.1,14.6,0.4z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="192" y="240"> - <g> - <polygon fill="#FFFFFF" points="3.3,10.7 4.3,15.7 6.4,15.7 5.4,10.7 "/> - <path fill="#FFFFFF" d="M0,6.7c0,2.5,2,3,2,3h5v-6H2C2,3.7,0,4.1,0,6.7z"/> - <path fill="#FFFFFF" d="M14.6,0.4L8,3.7v6l6.6,3.3c0.7,0.3,1.4-0.2,1.4-0.9V1.3C16,0.6,15.2,0.1,14.6,0.4z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="213" y="240"> - <path fill="#ffffff" d="M11,15l-7-7l7-7l1.1,1.1L6.1,8l5.9,5.9L11,15z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="234" y="240"> - <path fill="#010101" d="M11,15l-7-7l7-7l1.1,1.1L6.1,8l5.9,5.9L11,15z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="5"> - <rect id="XMLID_4_" x="6.8" y="1.2" fill="#FFFFFF" width="3" height="10"/> - <rect id="XMLID_1_" x="7" y="12" fill="#FFFFFF" width="3" height="3"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="26"> - <g id="XMLID_5_"> - <polygon id="XMLID_3_" fill="#010101" points="0,15.3 8,0.5 16,15.3 "/> - <rect id="XMLID_2_" x="6.9" y="5.1" fill="#FFFFFF" width="2.3" height="5.7"/> - <rect id="XMLID_1_" x="6.9" y="11.9" fill="#FFFFFF" width="2.3" height="2.3"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="47"> - <path fill="#DF0202" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="68"> - <g id="XMLID_5_"> - <polygon id="XMLID_3_" fill="#FFFFFF" points="0,15.3 8,0.5 16,15.3 "/> - <rect id="XMLID_2_" x="6.9" y="5.1" fill="#000000" width="2.3" height="5.7"/> - <rect id="XMLID_1_" x="6.9" y="11.9" fill="#000000" width="2.3" height="2.3"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="89"> - <g> - <path fill="#FFFFFF" d="M3,0.5v2h10v10.5c0,0.8,0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5V5.8V3.1V0.5H3z"/> - <g> - <path fill="#FFFFFF" d="M12,14.5c0-0.5,0-11,0-11H0v9c0,1.7,1.3,3,3,3c0,0,9.6,0,10,0C12.5,15.5,12,15,12,14.5z M6,12.5H1v-1h5 V12.5z M6,10.5H1v-1h5V10.5z M6,8.5H1v-1h5V8.5z M6,6.5H1v-1h5V6.5z M11,12.5H7v-7h4V12.5z"/> - </g> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="110"> - <g> - <path fill="#000000" d="M3,0.5v2h10v10.5c0,0.8,0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5V5.8V3.1V0.5H3z"/> - <g> - <path fill="#000000" d="M12,14.5c0-0.5,0-11,0-11H0v9c0,1.7,1.3,3,3,3c0,0,9.6,0,10,0C12.5,15.5,12,15,12,14.5z M6,12.5H1v-1h5 V12.5z M6,10.5H1v-1h5V10.5z M6,8.5H1v-1h5V8.5z M6,6.5H1v-1h5V6.5z M11,12.5H7v-7h4V12.5z"/> - </g> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="131"> - <path fill="#ffffff" d="M15.1,5.1l-7,7l-7-7l1.1-1.1l5.9,6l5.9-5.9L15.1,5.1z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="152"> - <g id="XMLID_6_"> - <path id="XMLID_4_" fill="#000" d="M6.9,8.5l-4.3,5.4H0.5l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> - <path id="XMLID_2_" fill="#000" d="M15.5,8.5l-4.3,5.4H9.1l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="173"> - <g id="XMLID_6_"> - <path id="XMLID_4_" fill="#FFF" d="M6.9,8.5l-4.3,5.4H0.5l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> - <path id="XMLID_2_" fill="#FFF" d="M15.5,8.5l-4.3,5.4H9.1l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="194"> - <path fill="#ffffff" d="M1.1,11l7-7l7,7L14,12.1l-5.9-6L2.2,12L1.1,11z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="215"> - <path fill="#010101" d="M15.1,5.1l-7,7l-7-7l1.1-1.1l5.9,6l5.9-5.9L15.1,5.1z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="236"> - <path fill="#FFFFFF" d="M13.3,3.8L9.1,8l4.2,4.2l-1.1,1.1L8,9.1l-4.2,4.2l-1.1-1.1L6.9,8L2.7,3.8l1.1-1.1L8,6.9l4.2-4.2L13.3,3.8z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="5" y="265"> - <g> - <polygon fill="#FFFFFF" points="15,4.6 16,4.1 8,0.1 0,4.1 8,8.1 14,5.1 14,13.5 13.4,15.9 15.6,15.9 15,13.5 "/> - <path fill="#FFFFFF" d="M3,6.6v4c0,0,1.4,2.5,5,2.5s5-2.5,5-2.5V7.1L8,9.6L3,6.6z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="26" y="265"> - <g> - <path fill="#FFFFFF" d="M12,16H4.5l-1-1H12c0.8,0,1.5-0.6,1.5-1.5v-12l1,0.5v11.5C14.5,14.9,13.4,16,12,16z"/> - <g> - <path fill="#FFFFFF" d="M1.5,0v12c0,1.1,0.9,2,2,2h7c1.1,0,2-0.9,2-2V0H1.5z M8.5,1h1v1h-1V1z M6.5,1h1v1h-1V1z M4.5,1h1v1h-1V1z M2.5,1h1v1h-1V1z M10.5,11h-7v-1h7V11z M10.5,9h-7V8h7V9z M10.5,7h-7V6h7V7z M10.5,5h-7V4h7V5z M11.5,2h-1V1h1V2z"/> - </g> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="47" y="265"> - <g> - <path fill="#000000" d="M12,16H4.5l-1-1H12c0.8,0,1.5-0.6,1.5-1.5v-12l1,0.5v11.5C14.5,14.9,13.4,16,12,16z"/> - <g> - <path fill="#000000" d="M1.5,0v12c0,1.1,0.9,2,2,2h7c1.1,0,2-0.9,2-2V0H1.5z M8.5,1h1v1h-1V1z M6.5,1h1v1h-1V1z M4.5,1h1v1h-1V1z M2.5,1h1v1h-1V1z M10.5,11h-7v-1h7V11z M10.5,9h-7V8h7V9z M10.5,7h-7V6h7V7z M10.5,5h-7V4h7V5z M11.5,2h-1V1h1V2z"/> - </g> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="68" y="265"> - <path fill="#010101" d="M8,0.5c1,0,2,0.2,2.9,0.6s1.7,0.9,2.4,1.6c0.7,0.7,1.2,1.5,1.6,2.4C15.3,6,15.5,7,15.5,8c0,1-0.2,2-0.6,2.9 c-0.4,0.9-0.9,1.7-1.6,2.4c-0.7,0.7-1.5,1.3-2.4,1.6C10,15.3,9,15.5,8,15.5c-1,0-2-0.2-2.9-0.6c-0.9-0.4-1.7-0.9-2.4-1.6 c-0.7-0.7-1.2-1.5-1.6-2.4S0.5,9,0.5,8c0-1,0.2-2,0.6-2.9C1.4,4.2,2,3.4,2.7,2.7s1.5-1.3,2.4-1.6C6,0.7,7,0.5,8,0.5z M12.3,12.3 c0.6-0.6,1-1.2,1.3-2C13.9,9.6,14,8.8,14,8c0-1.1-0.3-2.1-0.8-3c-0.5-0.9-1.3-1.7-2.2-2.2S9.1,2,8,2C7.2,2,6.4,2.1,5.7,2.4 C5,2.7,4.3,3.2,3.7,3.7s-1,1.2-1.3,2S2,7.2,2,8c0,1.1,0.3,2.1,0.8,3c0.5,0.9,1.3,1.7,2.2,2.2C5.9,13.8,6.9,14,8,14 c0.8,0,1.6-0.2,2.3-0.5C11.1,13.3,11.7,12.8,12.3,12.3L12.3,12.3z M7.2,5.7V4.2h1.5v1.5H7.2z M7.2,11.8V6.6h1.5v5.2H7.2z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="89" y="265"> - <path fill="#ffffff" d="M5.1,15l-1.1-1.1L9.8,8L3.9,2.1L5.1,1l7,7L5.1,15z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="110" y="265"> - <path fill="#010101" d="M5.1,15l-1.1-1.1L9.8,8L3.9,2.1L5.1,1l7,7L5.1,15z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="131" y="265"> - <ellipse fill="#FFFFFF" cx="2.5" cy="13.6" rx="2.1" ry="2.1"/> - <path fill="#FFFFFF" d="M10.5,15.7H7.5c0-4-3.2-7.2-7.1-7.2l0,0v-3C6,5.5,10.5,10.1,10.5,15.7z"/> - <path fill="#FFFFFF" d="M12.6,15.7c0-6.8-5.5-12.3-12.2-12.3V0.3c8.4,0,15.2,6.9,15.2,15.4H12.6z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="152" y="265"> - <ellipse fill="#000000" cx="2.5" cy="13.6" rx="2.1" ry="2.1"/> - <path fill="#000000" d="M10.5,15.7H7.5c0-4-3.2-7.2-7.1-7.2l0,0v-3C6,5.5,10.5,10.1,10.5,15.7z"/> - <path fill="#000000" d="M12.6,15.7c0-6.8-5.5-12.3-12.2-12.3V0.3c8.4,0,15.2,6.9,15.2,15.4H12.6z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="173" y="265"> - <g> - <polygon fill="#000000" points="15,4.6 16,4.1 8,0.1 0,4.1 8,8.1 14,5.1 14,13.5 13.4,15.9 15.6,15.9 15,13.5 "/> - <path fill="#000000" d="M3,6.6v4c0,0,1.4,2.5,5,2.5s5-2.5,5-2.5V7.1L8,9.6L3,6.6z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="194" y="265"> - <path fill="#010101" d="M13.3,3.8L9.1,8l4.2,4.2l-1.1,1.1L8,9.1l-4.2,4.2l-1.1-1.1L6.9,8L2.7,3.8l1.1-1.1L8,6.9l4.2-4.2L13.3,3.8z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="215" y="265"> - <path fill="#010101" d="M1.1,11l7-7l7,7L14,12.1l-5.9-6L2.2,12L1.1,11z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="236" y="265"> - <g id="XMLID_2_"> - <circle id="XMLID_8_" fill="#FFFFFF" cx="8" cy="8" r="1"/> - <path id="XMLID_3_" fill="#FFFFFF" d="M15.4,7.7c-1.5-2.2-4.3-3.6-7.2-3.6c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-3,0-5.7,1.4-7.2,3.6 L0.5,8l0.2,0.3c1.5,2.2,4.3,3.6,7.2,3.6c0,0,0.1,0,0.1,0s0.1,0,0.1,0c3,0,5.7-1.4,7.2-3.6L15.5,8L15.4,7.7z M8,10.9 c-1.7,0-3-1.3-3-2.9s1.4-2.9,3-2.9s3,1.3,3,2.9S9.7,10.9,8,10.9z M1.6,8c0.8-1,1.9-1.9,3.2-2.4C4.3,6.3,4,7.1,4,8s0.3,1.7,0.8,2.4 C3.5,9.9,2.4,9,1.6,8z M11.2,10.4C11.7,9.7,12,8.9,12,8s-0.3-1.7-0.8-2.4C12.5,6.1,13.6,7,14.4,8C13.6,9,12.5,9.9,11.2,10.4z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="257" y="265"> - <g id="XMLID_2_"> - <circle id="XMLID_8_" fill="#000000" cx="8" cy="8" r="1"/> - <path id="XMLID_3_" fill="#000000" d="M15.4,7.7c-1.5-2.2-4.3-3.6-7.2-3.6c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-3,0-5.7,1.4-7.2,3.6 L0.5,8l0.2,0.3c1.5,2.2,4.3,3.6,7.2,3.6c0,0,0.1,0,0.1,0s0.1,0,0.1,0c3,0,5.7-1.4,7.2-3.6L15.5,8L15.4,7.7z M8,10.9 c-1.7,0-3-1.3-3-2.9s1.4-2.9,3-2.9s3,1.3,3,2.9S9.7,10.9,8,10.9z M1.6,8c0.8-1,1.9-1.9,3.2-2.4C4.3,6.3,4,7.1,4,8s0.3,1.7,0.8,2.4 C3.5,9.9,2.4,9,1.6,8z M11.2,10.4C11.7,9.7,12,8.9,12,8s-0.3-1.7-0.8-2.4C12.5,6.1,13.6,7,14.4,8C13.6,9,12.5,9.9,11.2,10.4z"/> - </g> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="292" y="5"> - <rect id="XMLID_4_" x="6.8" y="1.2" fill="#000000" width="3" height="10"/> - <rect id="XMLID_1_" x="7" y="12" fill="#000000" width="3" height="3"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="292" y="26"> - <path fill="#2BBD03" d="M13.9,4.5l-1.2-1.2c-0.2-0.2-0.5-0.2-0.6,0l-6,6L4,7.2C3.8,7,3.5,7,3.3,7.2L2.1,8.4C2,8.6,2,8.9,2.1,9.1 l3.5,3.5c0.2,0.2,0.3,0.3,0.5,0.3s0.3-0.2,0.5-0.3l7.3-7.3C14,5,14,4.7,13.9,4.5z"/> - </svg> - <svg height="16" viewBox="0 0 13 16" width="12.1" x="292" y="47"> - <polygon fill="#FFFFFF" points="3.2,0 0.1,3 3.2,3"/> - <path fill="#FFFFFF" d="M4.1,0v4h-4v12h12V0H4.1z M10.1,13h-8v-1h8V13z M10.1,11h-8v-1h8V11z M10.1,9h-8V8h8V9z M10.1,7h-8V6h8V7z"/> - </svg> - <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="68"> - <g> - <polygon fill="#000000" points="4.6,0.2 1.9,2.8 4.6,2.8"/> - <path class="st0" d="M5.3,0.2v3.4H1.9v10.1h10.1V0.2H5.3z M10.4,11.2H3.6v-0.8h6.8V11.2z M10.4,9.5H3.6V8.7h6.8V9.5z M10.4,7.8H3.6 V7h6.8V7.8z M10.4,6.2H3.6V5.3h6.8V6.2z"/> - </g> - </svg> - <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="87"> - <g> - <path fill="#FFFFFF" d="M13,3H7.7l0.4,1H13v7.1l1-0.9c0,0,0-5.7,0-6.7S12.6,3,12.6,3"/> - <path fill="#FFFFFF" d="M11.1,5H7.3L6.2,3c0,0-0.4-1-1.1-1H4.2H3.1H2.4C1.7,2,1.2,2.8,1.2,2.8L0,4.5v7c0,1,1.1,1.5,1.1,1.5h10 c0,0,0.9-0.5,0.9-1.5v-6C12,4.5,11.1,5,11.1,5z"/> - </g> - </svg> - <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="106"> - <g id="XMLID_2_"> - <path id="XMLID_3_" fill="#000000" d="M10.1,3.7c0.9-0.2,1.6-0.4,2.4-0.7C11.6,1.9,10.4,1,9.1,0.6C9.5,1.6,9.8,2.6,10.1,3.7z"/> - <path id="XMLID_9_" fill="#000000" d="M4,3.7c0.3-1.1,0.6-2.2,1-3.3C3.6,0.9,2.4,1.8,1.5,3C2.3,3.3,3.1,3.6,4,3.7z"/> - <path id="XMLID_10_" fill="#000000" d="M4.9,3.9C5.6,4,6.3,4.1,7,4.1S8.4,4,9.1,3.9C8.9,2.6,8.5,1.4,7.9,0.2C7.6,0.2,7.3,0.1,7,0.1 s-0.5,0-0.8,0.1C5.6,1.4,5.2,2.6,4.9,3.9z"/> - <path id="XMLID_11_" fill="#000000" d="M9.3,9.1C9.4,8.5,9.5,7.7,9.5,7S9.4,5.5,9.3,4.9C8.5,4.9,7.8,5,7,5S5.5,4.9,4.8,4.9 C4.7,5.5,4.6,6.2,4.6,7c0,0.7,0.1,1.5,0.2,2.1C5.5,9.1,6.2,9,7,9S8.5,9.1,9.3,9.1z"/> - <path id="XMLID_12_" fill="#000000" d="M13,10.1c0.5-0.9,0.8-2,0.8-3.1S13.5,4.8,13,3.8c-0.9,0.3-1.8,0.7-2.7,0.9 c0.1,0.8,0.2,1.5,0.2,2.3s-0.1,1.5-0.2,2.3C11.2,9.5,12.2,9.7,13,10.1z"/> - <path id="XMLID_13_" fill="#000000" d="M9.1,10.1C8.5,10,7.8,9.9,7.1,9.9S5.7,10,5,10.1c0.3,1.3,0.7,2.5,1.3,3.7 c0.3,0,0.5,0.1,0.8,0.1s0.6,0,0.9-0.1C8.5,12.6,8.9,11.4,9.1,10.1z"/> - <path id="XMLID_14_" fill="#000000" d="M10.1,10.3c-0.3,1.1-0.6,2.2-1,3.3c1.4-0.4,2.6-1.4,3.4-2.5C11.7,10.7,10.9,10.4,10.1,10.3z"/> - <path id="XMLID_15_" fill="#000000" d="M3.8,9.3C3.7,8.5,3.7,7.8,3.7,7s0.1-1.5,0.2-2.3C2.9,4.5,1.9,4.2,1,3.8C0.5,4.8,0.2,5.9,0.2,7 S0.5,9.2,1,10.2C1.9,9.7,2.9,9.5,3.8,9.3z"/> - <path id="XMLID_16_" fill="#000000" d="M4,10.3c-0.9,0.2-1.6,0.4-2.5,0.8c0.9,1.2,2.1,2.1,3.5,2.5C4.5,12.5,4.2,11.4,4,10.3z"/> - </g> - </svg> - <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="125"> - <g> - <rect fill="#000000" id="XMLID_2_" x="0.8" y="1.4" width="1.9" height="12.4"/> - <polygon fill="#000000" id="XMLID_1_" points="3.7,1.2 13.2,4.5 3.7,7.9 "/> - <circle fill="#000000" id="XMLID_4_" cx="1.8" cy="1.2" r="1"/> - </g> - </svg> - <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="144"> - <path fill="#000000" d="M7,0.2c-2.8,0-5.1,2.3-5.1,5.1C1.9,7,3,8.4,4.3,10l2.9,3.9l3-4.2c1.2-1.5,2-2.6,2-4.2C12.2,2.5,9.8,0.2,7,0.2z M7,7.5c-1.2,0-2.2-0.9-2.2-2.2S5.8,3.1,7,3.1S9.2,4,9.2,5.3S8.2,7.5,7,7.5z"/> - </svg> - <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="163"> - <path fill="#FFFFFF" d="M7,0.2c-2.8,0-5.1,2.3-5.1,5.1C1.9,7,3,8.4,4.3,10l2.9,3.9l3-4.2c1.2-1.5,2-2.6,2-4.2C12.2,2.5,9.8,0.2,7,0.2z M7,7.5c-1.2,0-2.2-0.9-2.2-2.2S5.8,3.1,7,3.1S9.2,4,9.2,5.3S8.2,7.5,7,7.5z"/> - </svg> - <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="182"> - <g> - <path fill="#000000" d="M13,3H7.7l0.4,1H13v7.1l1-0.9c0,0,0-5.7,0-6.7S12.6,3,12.6,3"/> - <path fill="#000000" d="M11.1,5H7.3L6.2,3c0,0-0.4-1-1.1-1H4.2H3.1H2.4C1.7,2,1.2,2.8,1.2,2.8L0,4.5v7c0,1,1.1,1.5,1.1,1.5h10 c0,0,0.9-0.5,0.9-1.5v-6C12,4.5,11.1,5,11.1,5z"/> - </g> - </svg> - <svg height="7" viewBox="0 0 13 7" width="13" x="292" y="201"> - <polygon points="3.5,1 3.9,1.4 2.2,3.2 12,3.2 12,3.8 2.2,3.8 3.9,5.6 3.5,6 1,3.5 "/> - </svg> - <svg height="7" viewBox="0 0 13 7" width="13" x="292" y="213"> - <polygon points="9.5,1 9.1,1.4 10.8,3.2 1,3.2 1,3.8 10.8,3.8 9.1,5.6 9.5,6 12,3.5 "/> - </svg> - <svg height="7" viewBox="0 0 13 7" width="13" x="250" y="238"> - <polygon fill="#fff" points="3.5,1 3.9,1.4 2.2,3.2 12,3.2 12,3.8 2.2,3.8 3.9,5.6 3.5,6 1,3.5 "/> - </svg> - <svg height="7" viewBox="0 0 13 7" width="13" x="250" y="251"> - <polygon fill="#fff" points="9.5,1 9.1,1.4 10.8,3.2 1,3.2 1,3.8 10.8,3.8 9.1,5.6 9.5,6 12,3.5 "/> - </svg> - <svg viewBox="0 0 100 100" height="22" width="22" x="283" y="230"> - <path style="text-indent:0;text-transform:none;block-progression:tb" d="M10 13a2 2 0 1 0 0 4h10.375l10.531 49.75c.256 1.23 1.077 2.263 2.094 2.25h50c1.057.015 2.031-.943 2.031-2s-.974-2.015-2.031-2H34.625L23.969 14.563C23.77 13.679 22.906 12.993 22 13zm20 12l6 30h49l7-30zm13 48a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm30 0a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" overflow="visible" color="#000"/> - </svg> - <svg viewBox="0 0 100 100" height="22" width="22" x="283" y="260"> - <path style="text-indent:0;text-transform:none;block-progression:tb" d="M10 13a2 2 0 1 0 0 4h10.375l10.531 49.75c.256 1.23 1.077 2.263 2.094 2.25h50c1.057.015 2.031-.943 2.031-2s-.974-2.015-2.031-2H34.625L23.969 14.563C23.77 13.679 22.906 12.993 22 13zm20 12l6 30h49l7-30zm13 48a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm30 0a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" overflow="visible" fill="#fff"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="0" y="285"> - <path fill="#000" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> - </svg> - <svg height="16" viewBox="0 0 16 16" width="16" x="20" y="285"> - <path fill="#fff" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> - </svg> - <svg viewBox="0 0 12 16" width="12" height="16" x="40" y="285"> - <rect y="3" width="12" height="2"></rect> - <rect y="7" width="12" height="2"></rect> - <rect y="11" width="12" height="2"></rect> - </svg> - <svg viewBox="0 0 12 16" width="12" height="16" x="60" y="285" fill="#fff"> - <rect y="3" width="12" height="2"></rect> - <rect y="7" width="12" height="2"></rect> - <rect y="11" width="12" height="2"></rect> - </svg> - <svg width="32" height="32" viewBox="0 0 32 32" fill="none" x="52" y="153"> - <path fill-rule="evenodd" clip-rule="evenodd" d="M5.78754 14.0196C5.83131 14.0344 5.87549 14.0448 5.91963 14.0512C5.96777 14.1644 6.02996 14.3107 6.10252 14.4818C6.27959 14.8994 6.51818 15.4643 6.76446 16.0535C7.2667 17.2552 7.77332 18.4939 7.88521 18.8485C8.02372 19.2868 8.17013 19.5848 8.32996 19.7883C8.4126 19.8935 8.50819 19.9853 8.62003 20.0549C8.67633 20.0899 8.7358 20.1186 8.79788 20.14C8.80062 20.141 8.80335 20.1419 8.80608 20.1428C9.1261 20.2636 9.41786 20.2133 9.60053 20.1518C9.69827 20.1188 9.77735 20.0791 9.8334 20.0469C9.86198 20.0304 9.88612 20.0151 9.90538 20.0021L9.90992 19.9991L12.7361 18.2366L16.0007 20.7394C16.0488 20.7763 16.1014 20.8073 16.157 20.8316C16.5492 21.0027 16.929 21.0624 17.2862 21.0136C17.6429 20.9649 17.926 20.8151 18.1368 20.6464C18.3432 20.4813 18.4832 20.2963 18.5703 20.1589C18.6148 20.0887 18.6482 20.0266 18.6718 19.9791C18.6836 19.9552 18.6931 19.9346 18.7005 19.9181L18.7099 19.8963L18.7135 19.8877L18.715 19.8841L18.7156 19.8824L18.7163 19.8808C18.7334 19.8379 18.7466 19.7935 18.7556 19.7482L21.7358 4.72274C21.7453 4.67469 21.7501 4.62581 21.7501 4.57682C21.7501 4.13681 21.5843 3.71841 21.1945 3.46452C20.8613 3.24752 20.4901 3.23818 20.2556 3.25598C20.0025 3.27519 19.7688 3.33766 19.612 3.38757C19.5304 3.41355 19.4619 3.43861 19.4126 3.45773C19.3878 3.46734 19.3675 3.47559 19.3523 3.48188L19.341 3.48666L2.62725 10.0432L2.62509 10.044C2.61444 10.0479 2.60076 10.053 2.58451 10.0593C2.55215 10.0719 2.50878 10.0896 2.45813 10.1126C2.35935 10.1574 2.22077 10.2273 2.07856 10.3247C1.85137 10.4803 1.32888 10.9064 1.41686 11.6097C1.48705 12.1708 1.87143 12.5154 2.10562 12.6811C2.23421 12.7721 2.35638 12.8371 2.44535 12.8795C2.48662 12.8991 2.57232 12.9339 2.6095 12.9491L2.61889 12.9529L5.78754 14.0196ZM19.9259 4.86786L19.9236 4.86888C19.9152 4.8725 19.9069 4.87596 19.8984 4.87928L3.1644 11.4438C3.15566 11.4472 3.14686 11.4505 3.138 11.4536L3.12869 11.4571C3.11798 11.4613 3.09996 11.4686 3.07734 11.4788C3.06451 11.4846 3.05112 11.491 3.03747 11.4978C3.05622 11.5084 3.07417 11.5175 3.09012 11.5251C3.10543 11.5324 3.11711 11.5374 3.1235 11.54L6.26613 12.598C6.32365 12.6174 6.37727 12.643 6.42649 12.674L16.8033 6.59948L16.813 6.59374C16.8205 6.58927 16.8305 6.58353 16.8424 6.5768C16.866 6.56345 16.8984 6.54568 16.937 6.52603C17.009 6.48938 17.1243 6.43497 17.2541 6.39485C17.3444 6.36692 17.6109 6.28823 17.899 6.38064C18.0768 6.43767 18.2609 6.56028 18.3807 6.76798C18.4401 6.87117 18.4718 6.97483 18.4872 7.06972C18.528 7.2192 18.5215 7.36681 18.4896 7.49424C18.4208 7.76875 18.228 7.98287 18.0525 8.14665C17.9021 8.28706 15.9567 10.1629 14.0376 12.0147C13.0805 12.9381 12.1333 13.8525 11.4252 14.5359L10.9602 14.9849L16.8321 19.4867C16.9668 19.5349 17.0464 19.5325 17.0832 19.5274C17.1271 19.5214 17.163 19.5045 17.1997 19.4752C17.2407 19.4424 17.2766 19.398 17.3034 19.3557L17.3045 19.354L20.195 4.78102C20.1521 4.79133 20.1087 4.80361 20.0669 4.81691C20.0196 4.83198 19.9805 4.84634 19.9547 4.85637C19.9418 4.86134 19.9326 4.86511 19.9276 4.86719L19.9259 4.86786ZM11.4646 17.2618L10.2931 16.3636L10.0093 18.1693L11.4646 17.2618ZM9.21846 14.5814L10.3834 13.4567C11.0915 12.7732 12.0389 11.8588 12.9961 10.9352L13.9686 9.997L7.44853 13.8138L7.48351 13.8963C7.66121 14.3154 7.90087 14.8827 8.14845 15.4751C8.33358 15.918 8.52717 16.3844 8.70349 16.8162L8.98653 15.0158C9.01381 14.8422 9.09861 14.692 9.21846 14.5814Z" fill="white"/> - </svg> -</svg> diff --git a/private/src/static/scripts/cmb2-font-options.js b/private/src/static/scripts/cmb2-font-options.js deleted file mode 100644 index b0cd2e4c..00000000 --- a/private/src/static/scripts/cmb2-font-options.js +++ /dev/null @@ -1,32 +0,0 @@ -/* global jQuery */ -/* eslint-disable prefer-arrow-callback,func-names */ -jQuery(function ($) { - const form = $('#cmb2-metabox-amnesty_font_options_page'); - - if (!form) { - return; - } - - const initial = form.find('.cmb2-option[name="font_load_type"]:checked').val(); - - const repaint = function (selector, compare) { - form.find(selector).each(function () { - if (this.dataset.showFor.indexOf(compare) !== -1) { - $(this).parents('.cmb-row').show(); - } else { - $(this).parents('.cmb-row').hide(); - } - }); - }; - - repaint('[data-show-for]', initial); - - form.on('click', function (e) { - if (!e.target.classList.contains('cmb2-option')) { - return; - } - - const selected = e.target.value; - repaint('[data-show-for]', selected); - }); -}); diff --git a/private/src/static/styles/.gitkeep b/private/src/static/styles/.gitkeep deleted file mode 100755 index e69de29b..00000000 diff --git a/private/src/static/styles/print.css b/private/src/static/styles/print.css deleted file mode 100644 index 6ba5247e..00000000 --- a/private/src/static/styles/print.css +++ /dev/null @@ -1,30 +0,0 @@ -.page-header { - display: none; -} - -.article-meta .btn { - display: none; -} - -.article-share { - display: none; -} - -.article-sidebar { - display: none; -} - -.article, -.article.has-sidebar { - width: 100%; - max-width: none; - flex: 1 1 100%; -} - -.btn--download { - display: none; -} - -.page-footer { - display: none; -} diff --git a/private/src/store/actions.js b/private/src/store/actions.js new file mode 100644 index 00000000..58765926 --- /dev/null +++ b/private/src/store/actions.js @@ -0,0 +1,15 @@ +export function setSelectedSlide(slider, slide) { + return { + type: 'SET_SELECTED_SLIDE', + slider, + slide, + }; +} + +export function setSlides(slider, slides) { + return { + type: 'SET_SLIDES', + slider, + slides, + }; +} diff --git a/private/src/store/index.js b/private/src/store/index.js new file mode 100644 index 00000000..d1e93ba8 --- /dev/null +++ b/private/src/store/index.js @@ -0,0 +1,15 @@ +import { createReduxStore, register } from '@wordpress/data'; + +import reducer from './reducer'; +import * as actions from './actions'; +import * as selectors from './selectors'; + +const store = createReduxStore('amnesty/blocks', { + reducer, + actions, + selectors, +}); + +register(store); + +export default store; diff --git a/private/src/store/reducer.js b/private/src/store/reducer.js new file mode 100644 index 00000000..d1324742 --- /dev/null +++ b/private/src/store/reducer.js @@ -0,0 +1,39 @@ +const DEFAULT_STATE = { + count: 0, + selectedSlides: {}, + slides: {}, +}; + +/** + * Store reducer + * + * @param {Object} state Current state + * @param {Object} action Dispatched action + * + * @returns {Object} Updated state + */ +const reducer = (state = DEFAULT_STATE, action = {}) => { + switch (action.type) { + case 'SET_SELECTED_SLIDE': + return { + ...state, + selectedSlides: { + ...state.selectedSlides, + [action.slider]: action.slide, + }, + }; + case 'SET_SLIDES': + return { + ...state, + slides: { + ...state.slides, + // transform array of slides into object, where {slide: slider} for each slide + ...action.slides.reduce((acc, cur) => ({ ...acc, [cur]: action.slider }), {}), + }, + }; + default: + return state; + } +}; + +export default reducer; diff --git a/private/src/store/selectors.js b/private/src/store/selectors.js new file mode 100644 index 00000000..ae531b40 --- /dev/null +++ b/private/src/store/selectors.js @@ -0,0 +1,14 @@ +/** + * Get the selected slide for the specified slider + * + * @param {Object} state - Current state + * + * @returns {String} The client id of the selected slide + */ +export function getSelectedSlide(state, slider) { + return state.selectedSlides[slider] ?? null; +} + +export function getSlider(state, slide) { + return state.slides[slide] ?? null; +} diff --git a/private/src/styles/admin.scss b/private/src/styles/admin.scss deleted file mode 100644 index b7098fe1..00000000 --- a/private/src/styles/admin.scss +++ /dev/null @@ -1,12 +0,0 @@ -@import "admin/cmb2"; -@import "admin/user-profile"; -@import "admin/localisation-options"; - -:root { - --ms-base: 16; - --ms-ratio: 1.2; -} - -.is-hidden { - display: none; -} diff --git a/private/src/styles/app.scss b/private/src/styles/app.scss deleted file mode 100755 index 06b218f2..00000000 --- a/private/src/styles/app.scss +++ /dev/null @@ -1,159 +0,0 @@ -// Global variables first -@import "utils/variables/defaults"; - -// Grid settings -@import "utils/variables/grid-settings"; - -// Sass Mq -// @see https://github.com/sass-mq/sass-mq -@import "sass-mq"; - -// Flickity slider, from npm -@import "~flickity/dist/flickity.css"; - -// Media query breakpoints -@import "utils/variables/breakpoints"; - -// Functions -@import "utils/functions/maths"; -@import "utils/functions/palette"; -@import "utils/functions/strip-units"; -@import "utils/functions/flexy"; - -// Mixins -@import "utils/mixins/clearfix"; -@import "utils/mixins/headings"; -@import "utils/mixins/cols"; -@import "utils/mixins/icon"; -@import "utils/mixins/placeholder"; -@import "utils/mixins/states"; - -// Base -@import "base/reset"; -@import "base/shared"; -@import "base/base"; -@import "base/type"; -@import "base/links"; -@import "base/blockquotes"; -@import "base/images"; -@import "base/container"; -@import "base/overlay"; - -// Layout -@import "layout/language-banner"; -@import "layout/header/main"; -@import "layout/navigation/main"; -@import "layout/page-hero"; -@import "layout/footer/main"; - -// Components -@import "components/list/all"; -@import "components/media/all"; -@import "components/social"; -@import "components/form/all"; -@import "components/grid/all"; -@import "components/icon"; -@import "components/modal/base"; -@import "components/fluid"; -@import "components/pop-in/main"; -@import "components/news-filters/main"; -@import "components/tabbed-nav/main"; - -// Blocks -@import "blocks/action-block/main"; -@import "blocks/button/all"; -@import "blocks/call-to-action/all"; -@import "blocks/collapsable/main"; -@import "blocks/core-blocks/blockquote"; -@import "blocks/core-blocks/columns"; -@import "blocks/core-blocks/cover"; -@import "blocks/core-blocks/details"; -@import "blocks/core-blocks/embed"; -@import "blocks/core-blocks/file"; -@import "blocks/core-blocks/gallery"; -@import "blocks/core-blocks/group"; -@import "blocks/core-blocks/image"; -@import "blocks/core-blocks/latest-posts"; -@import "blocks/core-blocks/menu"; -@import "blocks/core-blocks/post/main"; -@import "blocks/core-blocks/post-template/main"; -@import "blocks/core-blocks/post-title/main"; -@import "blocks/core-blocks/query-pagination/main"; -@import "blocks/core-blocks/quote"; -@import "blocks/core-blocks/rss"; -@import "blocks/core-blocks/separator"; -@import "blocks/core-blocks/social-links"; -@import "blocks/core-blocks/table"; -@import "blocks/core-blocks/video"; -@import "blocks/countdown-timer/main"; -@import "blocks/custom-card/main"; -@import "blocks/download-block/style"; -@import "blocks/fact-block/main"; -@import "blocks/header/main"; -@import "blocks/hero/main"; -@import "blocks/iframe-button/main"; -@import "blocks/image-block/main"; -@import "blocks/link-group/main"; -@import "blocks/linklist/main"; -@import "blocks/links-with-icons/main"; -@import "blocks/list-block/main"; -@import "blocks/petition-list/main"; -@import "blocks/postlist/main"; -@import "blocks/regions/main"; -@import "blocks/section/main"; -@import "blocks/slider/main"; -@import "blocks/stat-counter/main"; -@import "blocks/sutori-embed/main"; -@import "blocks/tabbed-content/main"; -@import "blocks/term-list/main"; -@import "blocks/text-media/main"; -@import "blocks/tweet-action/tweet"; - -// Block patterns -@import "block-patterns/group"; - -// Pages -@import "pages/404"; -@import "pages/search"; -@import "pages/news"; -@import "pages/archive"; -@import "pages/petitions"; -@import "pages/single"; -@import "pages/author"; -@import "pages/article"; - -// WooCommerce -@import "woocommerce/base"; -@import "woocommerce/shop-index"; -@import "woocommerce/product-archive"; -@import "woocommerce/product-single"; -@import "woocommerce/cart"; -@import "woocommerce/checkout"; -@import "woocommerce/my-account"; -@import "woocommerce/orders"; - -// Helpers -@import "utils/helpers/spacing"; -@import "utils/helpers/type"; -@import "utils/helpers/display"; -@import "utils/helpers/layout"; -@import "utils/helpers/grid-classes"; - -:root { - --ms-base: 16; - --ms-ratio: 1.2; -} - -.screen-reader-text { - border: 0; - clip: rect(1px, 1px, 1px, 1px); - -webkit-clip-path: inset(50%); // stylelint-disable property-no-vendor-prefix - clip-path: inset(50%); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - word-wrap: normal !important; -} diff --git a/private/src/styles/base/_base.scss b/private/src/styles/base/_base.scss deleted file mode 100755 index 0e095d75..00000000 --- a/private/src/styles/base/_base.scss +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Apply box-sizing here, then inherit. - * https://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ - */ -html { - box-sizing: border-box; -} - -html.menu-open, -html.mobile-menu-open, -html.search-active, -html.modal-open, -html.lang-open { - body { - overflow: hidden; - } -} - -*, *::after, *::before { - box-sizing: inherit; -} - -/** - * Page level styles. - * - * 1. Use advanced typographic features included in some OpenType fonts. Only enable if - * font supports it. - * 2. Prevent certain mobile browsers from automatically zooming fonts. - * 3. Fonts on OSX will look more consistent with other systems that do not - * render text using sub-pixel anti-aliasing. - */ -body { - // font-feature-settings: "kern", "liga", "pnum"; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ - -ms-text-size-adjust: 100%; /* 2 */ - -moz-osx-font-smoothing: grayscale; /* 3 */ - -webkit-font-smoothing: antialiased; /* 3 */ - overflow-x: hidden; - min-height: 100vh; - margin: 0; - display: flex; - flex-direction: column; -} - -body.admin-bar { - min-height: calc(100vh - 46px); - - @include mq(wp-adminbar) { - min-height: calc(100vh - 32px); - } -} - -body.rtl { - direction: rtl; -} - -main { - position: relative; - flex: 1 0 auto; - display: block; -} - -.ie .main { - flex: 0 0 auto; -} - -address { - font-style: normal; -} - -.only-mobile { - @include mq(small) { - display: none !important; - } -} - -.only-desktop { - @include mq($until: small) { - display: none !important; - } -} - -.is-layout-flex { - display: flex; -} diff --git a/private/src/styles/base/_blockquotes.scss b/private/src/styles/base/_blockquotes.scss deleted file mode 100755 index 93ee985f..00000000 --- a/private/src/styles/base/_blockquotes.scss +++ /dev/null @@ -1 +0,0 @@ -// see components/core-blocks/_blockquote.scss diff --git a/private/src/styles/base/_container-editor.scss b/private/src/styles/base/_container-editor.scss deleted file mode 100644 index 5364d11f..00000000 --- a/private/src/styles/base/_container-editor.scss +++ /dev/null @@ -1,5 +0,0 @@ -.container { - @include mq(1490px) { - padding: 0 flexy-gutter(); - } -} diff --git a/private/src/styles/base/_container.scss b/private/src/styles/base/_container.scss deleted file mode 100644 index fbdb1f3b..00000000 --- a/private/src/styles/base/_container.scss +++ /dev/null @@ -1,23 +0,0 @@ -.container { - display: block; - width: 100%; - max-width: $flexy-container; - margin: 0 auto; - padding: 0 flexy-gutter(); - - @include mq(1490px) { - padding: 0 $flexy-outer-gutter; - } -} - -.container .container { - padding: 0; -} - -.container--small { - max-width: 1113px; -} - -.has-gutter { - padding: 0 40px; -} diff --git a/private/src/styles/base/_images-editor.scss b/private/src/styles/base/_images-editor.scss deleted file mode 100644 index c6888c9f..00000000 --- a/private/src/styles/base/_images-editor.scss +++ /dev/null @@ -1,78 +0,0 @@ -:root { - // used in icon mixin - --amnesty-icon-path: url("../images/sprite.svg"), none; -} - -.image-metadata { - position: absolute; - right: 0; - bottom: 0; - left: 0; - display: flex; - flex-direction: column-reverse; - justify-content: space-between; - align-items: flex-end; - width: 100%; - font-size: var(--wp--preset--font-size--small); - background-color: color-mix(in srgb, var(--wp--preset--color--black) 55%, transparent); - color: var(--wp--preset--color--white); - word-break: keep-all; - - @include mq(small) { - flex-direction: row; - gap: 16px; - } -} - -.image-metadataItem { - display: block; - padding: 4px; -} - -// specificity to avoid old image caption class collision -.image-metadataItem.image-caption { - padding: 4px flexy-gutter(); - max-width: 800px; - width: 100%; - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--grey-dark); - text-align: left; - - @include mq(small) { - padding: 4px; - background-color: transparent; - color: var(--wp--preset--color--white); - } -} - -.single .image-metadataItem.image-caption { - padding: 4px var(--wp--preset--spacing--single); - - @include mq(small) { - padding: 4px; - } -} - -.image-copyright { - margin-left: auto; - text-align: right; - - @include mq(small) { - max-width: 400px; - } -} - -.rtl .image-metadataItem.image-caption { - text-align: right; -} - -.rtl .image-copyright { - margin-right: auto; - margin-left: 0; - text-align: left; -} - -// alt text field in editor -.page-hero + .components-base-control { - display: none; -} diff --git a/private/src/styles/base/_images.scss b/private/src/styles/base/_images.scss deleted file mode 100755 index 86dc9d7b..00000000 --- a/private/src/styles/base/_images.scss +++ /dev/null @@ -1,116 +0,0 @@ -:root { - // used in icon mixin - --amnesty-icon-path: url("../images/sprite.svg"), none; -} - -/** - * Images responsive by default. - * - * 1. Fluid. - * 2. Offset `alt` text from surrounding copy - * 3. Setting `vertical-align` removes the whitespace that appears under `img` - * elements when they are dropped into a page as-is. Safer alternative to - * using `display: block;`. - */ -img { - max-width: 100%; /* 1 */ - font-style: oblique; /* 2 */ - vertical-align: middle; /* 3 */ -} - -/** - * Styles for non-responsive images. - * - * 1. Respect if a `width` and/or `height` attribute have been explicitly defined. - * 2. Fix Google Maps, doesn't like fluid images. - */ -img[width], /* 1 */ /* stylelint-disable-line */ -img[height], /* 1 */ /* stylelint-disable-line */ -.gm-style img { /* 2 */ /* stylelint-disable-line */ - max-width: none; -} - -/** - * Remove default figure marging and padding. - */ -figure { - margin: 0; - padding: 0; -} - -.has-caption { - position: relative; - - &[class*="wp-image-"] { - display: inline-block; - } -} - -.image-metadata { - position: absolute; - right: 0; - bottom: 0; - left: 0; - display: flex; - flex-direction: column-reverse; - justify-content: space-between; - align-items: flex-end; - width: 100%; - font-size: var(--wp--preset--font-size--small); - background-color: color-mix(in srgb, var(--wp--preset--color--black) 55%, transparent); - color: var(--wp--preset--color--white); - word-break: keep-all; - - @include mq(small) { - flex-direction: row; - gap: 16px; - } -} - -.image-metadataItem { - display: block; - padding: 4px; -} - -// specificity to avoid old image caption class collision -.image-metadataItem.image-caption { - padding: 4px flexy-gutter(); - max-width: 800px; - width: 100%; - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--grey-dark); - text-align: left; - - @include mq(small) { - padding: 4px; - background-color: transparent; - color: var(--wp--preset--color--white); - } -} - -.single .image-metadataItem.image-caption { - padding: 4px var(--wp--preset--spacing--single); - - @include mq(small) { - padding: 4px; - } -} - -.image-copyright { - margin-left: auto; - text-align: right; - - @include mq(small) { - max-width: 400px; - } -} - -.rtl .image-metadataItem.image-caption { - text-align: right; -} - -.rtl .image-copyright { - margin-right: auto; - margin-left: 0; - text-align: left; -} diff --git a/private/src/styles/block-patterns/_group.scss b/private/src/styles/block-patterns/_group.scss deleted file mode 100644 index eceb3c33..00000000 --- a/private/src/styles/block-patterns/_group.scss +++ /dev/null @@ -1,81 +0,0 @@ -.wp-block-group.custom-card { - width:100%; - - .wp-block-buttons { - padding-left: 8px; - padding-right: 8px; - } - - .wp-block-buttons, - .wp-block-button, - .wp-block-button__link { - width: 100%; - } - - .wp-block-heading { - text-transform: uppercase; - font-size: 1.5rem; - } - - p { - font-size: 1rem; - padding: 10px 10px 0 10px; - } - - h2 { - padding: 10px 10px 0 10px; - } - - .wp-element-caption { - padding: 0 10px; - } -} - -.wp-block-group.is-style-light { - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--black); -} - -.wp-block-group.is-style-dark { - background-color: var(--wp--preset--color--grey-dark); - color: var(--wp--preset--color--white); - - .wp-block-heading, - .wp-element-caption { - color: var(--wp--preset--color--white); - } -} - -.wp-block-group.call-to-action { - margin-top: 40px; - padding: 20px; - text-align: center; - - @include mq(small) { - padding: 36px 32px; - } -} - -.wp-block-group.is-style-top-and-bottom-border { - border-top: 7px solid var(--wp--preset--color--black); - border-bottom: 7px solid var(--wp--preset--color--black); -} - -.wp-block-group.custom-card .wp-block-image, -.wp-block-group.custom-card .wp-block-buttons, -.wp-block-group.custom-card p, -.wp-block-group.custom-card h2 { - max-width: 100%; -} - -.wp-block-group.custom-card img { - width: 100%; -} - -.wp-block-group.custom-card .wp-block-button { - min-width: 100%; -} - -.wp-block-group.custom-card .wp-block-image > div { - width: 100%; -} diff --git a/private/src/styles/blocks/action-block/_editor.scss b/private/src/styles/blocks/action-block/_editor.scss deleted file mode 100644 index 541d3b79..00000000 --- a/private/src/styles/blocks/action-block/_editor.scss +++ /dev/null @@ -1,71 +0,0 @@ -.actionBlock { - max-width: 350px !important; -} - -// aligment control classes -[data-type="amnesty-core/action-block"][data-align="left"] { - float: left; -} - -[data-type="amnesty-core/action-block"][data-align="right"] { - float: right; -} - -.actionBlock--wide { - max-width: 480px !important; -} - -.actionBlock .editor-plain-text { - border-radius: 0 !important; -} - -.actionBlock-image { - height: 100% !important; -} - -.actionBlock-label { - width: auto !important; - padding: 2px 8px !important; - color: var(--wp--preset--color--white) !important; - - @include placeholder { - color: var(--wp--preset--color--white) !important; - } -} - -.actionBlock-content { - position: relative; -} - -.actionBlock-content .editor-plain-text:not(.btn) { - padding: 8px !important; - border: 1px dotted #000; - line-height: 1.4 !important; - background-color: transparent !important; - color: var(--wp--preset--color--black) !important; - - @include placeholder { - color: var(--wp--preset--color--black) !important; - } -} - -.actionBlock-content .editor-plain-text.btn { - padding: 14px 24px !important; - font-family: var(--wp--preset--font-family--secondary); -} - -.actionBlock .editor-url-input__button { - position: absolute !important; - right: 16px !important; - top: calc(100% - 66px) !important; -} - -.actionBlock.actionBlock--wide .editor-url-input__button { - right: 66px !important; -} - -.actionBlock .editor-url-input__button-modal { - position: absolute; - left: -150%; - min-width: 250px; -} diff --git a/private/src/styles/blocks/action-block/_main.scss b/private/src/styles/blocks/action-block/_main.scss deleted file mode 100644 index c84c6d95..00000000 --- a/private/src/styles/blocks/action-block/_main.scss +++ /dev/null @@ -1,83 +0,0 @@ -.actionBlock { - margin: 0; - max-width: 350px; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - background-color: var(--wp--preset--color--grey-lighter); -} - -.actionBlock.is-centred { - margin-right: auto; - margin-left: auto; -} - -.actionBlock--wide { - width: 480px; - max-width: 100%; -} - -.actionBlock-figure { - position: relative; - height: 230px; -} - -.actionBlock-figure a { - display: block; -} - -.actionBlock-figure img { - max-width: 100%; - min-width: 100%; - height: auto; -} - -.actionBlock-image { - display: flex; - width: 100%; - height: 100%; - justify-content: center; - overflow: hidden; - background-color: color-mix(in srgb, var(--wp--preset--color--black) 25%, transparent); -} - -.actionBlock-image img { - object-fit: cover; - min-width: 100%; - min-height: 100%; -} - -.actionBlock-label { - position: absolute; - bottom: 0; - left: 16px; - padding: 8px; - font-size: var(--wp--preset--font-size--regular); - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); - text-transform: uppercase; -} - -.actionBlock-content { - padding: 16px; - font-size: var(--wp--preset--font-size--heading-5); -} - -.actionBlock-content p { - margin-bottom: 0; - min-height: 80px; -} - -// these styles may need to be global -.page-template-page-petitions .actionBlock { - display: flex; - flex-direction: column; - align-items: stretch; - justify-content: stretch; -} - -.page-template-page-petitions .actionBlock-content { - display: flex; - flex-direction: column; - flex-grow: 1; - justify-content: space-between; -} diff --git a/private/src/styles/blocks/button/_all.scss b/private/src/styles/blocks/button/_all.scss deleted file mode 100755 index f155a63c..00000000 --- a/private/src/styles/blocks/button/_all.scss +++ /dev/null @@ -1,28 +0,0 @@ -/* - * %btn-base - */ -@import "./base"; - -/* - * Main Btn Class - */ -@import "./button"; - -/* - * Unstyled button - */ -@import "./no-style"; - -/* - * Modifiers - */ -@import "./sizes"; -@import "./fill"; -@import "./spacing"; - -/** - * Styles - */ -@import "./styles/default"; -@import "./styles/dark"; -@import "./styles/link"; diff --git a/private/src/styles/blocks/button/_base.scss b/private/src/styles/blocks/button/_base.scss deleted file mode 100755 index 2b9c5f46..00000000 --- a/private/src/styles/blocks/button/_base.scss +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Base button styles. - * 1. Corrects inability to style clickable `input` types in iOS. - * 2. Normalize `box-sizing` across all elements that this component could be - * applied to. - * 3. Normalize `line-height`. For `input`, it can't be changed from `normal` in Firefox 4+. - * 4. Prevent button text from being selectable. - * 5. Make sure `input` will wrap text across multiple lines. - */ - -%btn-base { - -webkit-appearance: none; /* 1 */ - box-sizing: border-box; /* 2 */ - margin: 0; - display: inline-block; - font: inherit; - line-height: normal; /* 3 */ - text-align: center; - text-decoration: none; - border: none; - cursor: pointer; - overflow: visible; - user-select: none; /* 4 */ - white-space: normal; /* 5 */ - transition: background-color .3s ease-in-out, border-color .3s ease-in-out, color .3s ease-in-out; - - &:hover, - &:focus { - text-decoration: none; - } - - &.disabled, - &[disabled] { - cursor: not-allowed; - } -} diff --git a/private/src/styles/blocks/button/_spacing.scss b/private/src/styles/blocks/button/_spacing.scss deleted file mode 100644 index f183fd45..00000000 --- a/private/src/styles/blocks/button/_spacing.scss +++ /dev/null @@ -1,16 +0,0 @@ -.btn--topSpacing { - margin-top: 16px; -} - -.rtl .wp-block-buttons .wp-block-button:first-child { - margin-right: 0; -} - -.rtl .wp-block-buttons .wp-block-button:last-child { - margin-right: 8px; -} - -.wp-block-post-content > .wp-block-buttons { - margin-top: var(--wp--preset--spacing--single); - margin-bottom: var(--wp--preset--spacing--single); -} diff --git a/private/src/styles/blocks/button/styles/_default.scss b/private/src/styles/blocks/button/styles/_default.scss deleted file mode 100644 index 62a04a84..00000000 --- a/private/src/styles/blocks/button/styles/_default.scss +++ /dev/null @@ -1,40 +0,0 @@ -.wp-block-file a.wp-block-file__button, -.wp-block-button .wp-block-button__link, -.woocommerce a.button, -.woocommerce button.button, -.woocommerce input.button, -.btn { - @extend %btn-base; - padding: 12px 24px; - color: var(--wp--preset--color--black); - background-color: var(--wp--preset--color--primary); - border: 1px solid var(--wp--preset--color--primary-state); - border-radius: $base-border-radius; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - font-size: var(--wp--preset--font-size--small); - text-transform: uppercase; - - &:hover, - &:active, - &:focus { - border-color: var(--wp--preset--color--primary-state); - background-color: var(--wp--preset--color--primary-state); - color: var(--wp--preset--color--white); - } -} - -.woocommerce a.button, -.btn--white, -.btn.is-style-light { - border: 1px solid var(--wp--preset--color--black); - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); - - &:hover, - &:focus { - background-color: var(--wp--preset--color--grey-light); - border-color: var(--wp--preset--color--grey-light); - color: var(--wp--preset--color--black) - } -} diff --git a/private/src/styles/blocks/call-to-action/_all.scss b/private/src/styles/blocks/call-to-action/_all.scss deleted file mode 100644 index d27b73b0..00000000 --- a/private/src/styles/blocks/call-to-action/_all.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import "./base"; -@import "./shade"; -@import "./sizes"; - -.callToAction .download-block { - justify-content: center; -} diff --git a/private/src/styles/blocks/call-to-action/_base.scss b/private/src/styles/blocks/call-to-action/_base.scss deleted file mode 100644 index ad29c711..00000000 --- a/private/src/styles/blocks/call-to-action/_base.scss +++ /dev/null @@ -1,98 +0,0 @@ -.callToAction { - margin-top: 40px; - padding: 20px; - text-align: center; - border-top: 7px solid var(--wp--preset--color--black); - border-bottom: 7px solid var(--wp--preset--color--black); - - @include mq(small) { - padding: 36px 32px; - } -} - -.callToAction * { - font-family: var(--wp--preset--font-family--secondary); -} - -.callToAction > *:empty { - display: none; -} - -.callToAction:first-child { - margin-top: 0; -} - -.callToAction-preHeading { - font-size: var(--wp--preset--font-size--heading-4); - text-align: center; - - @include mq(small) { - margin-bottom: 20px; - } -} - -.callToAction-heading { - font-size: var(--wp--preset--font-size--heading-2); - margin-bottom: 20px; - text-transform: uppercase; - text-align: center; -} - -.callToAction-content { - margin-right: auto; - margin-left: auto; - max-width: 800px; - line-height: 1.4; - text-align: center; -} - -.callToAction .innerBlocksContainer { - display: flex; - justify-content: center; - - @include mq($from: xx-small, $until: medium) { - flex-direction: column; - align-items: inherit; - } -} - -.callToAction .innerBlocksContainer .btn { - margin-top: 0; - margin-left: 30px; - - &:first-of-type { - margin-left: 0; - } - - @include mq($from: xx-small, $until: medium) { - margin-top: 30px; - margin-left: 0 !important; - } -} - -.callToAction .innerBlocksContainer .wp-block-button__link { - margin-left: 14px; - - @include mq($from: xx-small, $until: medium) { - margin-top: 30px; - margin-left: 0 !important; - } -} - -.callToAction .innerBlocksContainer .wp-block-buttons .wp-block-button { - height: 100%; - - @include mq($from: xx-small, $until: medium) { - margin-bottom: 0 !important; - } -} - -.callToAction .innerBlocksContainer .wp-block-buttons .wp-block-button .wp-block-button__link { - display: flex; - align-items: center; - height: 100%; -} - -.rtl .callToAction .innerBlocksContainer .wp-block-buttons { - margin-right: 24px; -} diff --git a/private/src/styles/blocks/call-to-action/_editor.scss b/private/src/styles/blocks/call-to-action/_editor.scss deleted file mode 100644 index 20234e79..00000000 --- a/private/src/styles/blocks/call-to-action/_editor.scss +++ /dev/null @@ -1,55 +0,0 @@ -.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/block-call-to-action"] { - max-width: 100%; -} - -.callToAction * { - font-family: var(--wp--preset--font-family--secondary); -} - -.callToAction .editor-rich-text__tinymce.mce-content-body { - line-height: 1.3; -} - -.callToAction-heading { - margin-bottom: 24px; -} - -.callToAction-content { - margin-bottom: 24px; -} - -.callToAction-buttonContainer { - position: relative; - - [data-type="amnesty-core/block-button"] { - display: flex; - justify-content: center; - align-items: center; - } - - .block-editor-url-input__button { - display: inline-flex; - margin-left: 10px; - } - - .block-editor-url-input__button-modal { - position: absolute; - top: 100%; - margin-top: 5px; - } -} - -.callToAction .editor-rich-text__tinymce.mce-content-body:not(:last-child) { - // Targets the input when the placeholder is visible. - left: 50%; - transform: translateX(-50%); -} - -.callToAction-buttonContainer .block-editor-block-list__layout { - display: inline-flex; - align-items: center; -} - -.callToAction-buttonContainer .block-editor-block-list__layout .wp-block-button { - margin: 0; -} diff --git a/private/src/styles/blocks/call-to-action/_shade.scss b/private/src/styles/blocks/call-to-action/_shade.scss deleted file mode 100644 index 3ed9d2ae..00000000 --- a/private/src/styles/blocks/call-to-action/_shade.scss +++ /dev/null @@ -1,4 +0,0 @@ -.callToAction--shade { - background-color: var(--wp--preset--color--grey-lighter); - border-color: var(--wp--preset--color--grey-lighter); -} diff --git a/private/src/styles/blocks/call-to-action/_sizes.scss b/private/src/styles/blocks/call-to-action/_sizes.scss deleted file mode 100644 index 7c65eb7c..00000000 --- a/private/src/styles/blocks/call-to-action/_sizes.scss +++ /dev/null @@ -1,22 +0,0 @@ -.article-sidebar .callToAction, -.callToAction--small { - padding: 20px; -} - -.article-sidebar .callToAction .callToAction-preHeading, -.callToAction--small .callToAction-preHeading { - font-size: var(--wp--preset--font-size--heading-4); - margin-bottom: 20px; -} - -.article-sidebar .callToAction .callToAction-heading, -.callToAction--small .callToAction-heading { - font-size: var(--wp--preset--font-size--heading-3); - margin-bottom: 20px; -} - -.article-sidebar .callToAction .callToAction-content, -.callToAction--small .callToAction-content { - font-size: var(--wp--preset--font-size--small); - margin-bottom: 20px; -} diff --git a/private/src/styles/blocks/collapsable/_editor.scss b/private/src/styles/blocks/collapsable/_editor.scss deleted file mode 100644 index 6d2638ff..00000000 --- a/private/src/styles/blocks/collapsable/_editor.scss +++ /dev/null @@ -1,13 +0,0 @@ -.wp-block-amnesty-core-collapsable .dashicon { - cursor: pointer; - pointer-events: all; -} - -.wp-block-amnesty-core-collapsable-inner { - border: 1px dashed; - min-height: 70px; -} - -.wp-block-amnesty-core-collapsable.is-collapsed .wp-block-amnesty-core-collapsable-inner { - min-height: unset; -} diff --git a/private/src/styles/blocks/collapsable/_main.scss b/private/src/styles/blocks/collapsable/_main.scss deleted file mode 100644 index 9d198572..00000000 --- a/private/src/styles/blocks/collapsable/_main.scss +++ /dev/null @@ -1,80 +0,0 @@ -// author styles define this class without scope -.wp-block-amnesty-core-collapsable.is-collapsed { - max-height: unset; - padding: unset; - position: unset; - overflow: unset; - content: unset; -} - -.wp-block-amnesty-core-collapsable.is-collapsed::before { - content: unset; -} - -.wp-block-amnesty-core-collapsable figcaption { - display: flex; - align-items: center; - justify-content: space-between; - margin: 0 auto; - padding: var(--wp--preset--spacing--half) 0; - border-bottom: 1px solid var(--wp--preset--color--black); -} - -.wp-block-amnesty-core-collapsable + .wp-block-amnesty-core-collapsable { - margin-top: var(--wp--preset--spacing--half); -} - -.wp-block-amnesty-core-collapsable + .wp-block-amnesty-core-collapsable figcaption { - padding-top: 0; -} - -.wp-block-amnesty-core-collapsable figcaption h2 { - margin: 0 !important; - font-size: var(--wp--preset--font-size--heading-3); -} - -.wp-block-amnesty-core-collapsable .btn--blank { - display: flex; - align-items: center; - justify-content: center; - border-radius: 0; - width: 32px; - height: 32px; - cursor: pointer; - outline: none; -} - -.wp-block-amnesty-core-collapsable .btn--blank:focus-visible { - border: 1px solid var(--wp--preset--color--black); -} - -.wp-block-amnesty-core-collapsable .icon { - display: block; - pointer-events: none; - transform: rotate(180deg); - transition: transform .3s ease-in-out; -} - -.wp-block-amnesty-core-collapsable .icon-arrow-down { - @extend %icon-arrow-down-dark; - transform: rotate(180deg); -} - -.wp-block-amnesty-core-collapsable.is-collapsed .icon-arrow-down { - transform: rotate(0deg); -} - -.wp-block-amnesty-core-collapsable-inner { - padding-top: var(--wp--preset--spacing--half); - max-height: 2000px; -} - -.wp-block-amnesty-core-collapsable.is-collapsed .wp-block-amnesty-core-collapsable-inner { - padding-top: 0; - max-height: 0; - overflow-y: hidden; -} - -.wp-block-amnesty-core-collapsable-inner > *:last-child { - margin-bottom: 0; -} diff --git a/private/src/styles/blocks/core-blocks/_group.scss b/private/src/styles/blocks/core-blocks/_group.scss deleted file mode 100644 index e74854b8..00000000 --- a/private/src/styles/blocks/core-blocks/_group.scss +++ /dev/null @@ -1,5 +0,0 @@ -.wp-block-group.is-style-square-border { - border: 1px solid #000; - padding: 27px; - height: 100%; -} diff --git a/private/src/styles/blocks/core-blocks/_image-editor.scss b/private/src/styles/blocks/core-blocks/_image-editor.scss deleted file mode 100644 index 20e9e89c..00000000 --- a/private/src/styles/blocks/core-blocks/_image-editor.scss +++ /dev/null @@ -1,7 +0,0 @@ -.wp-block-image figcaption { - text-align: left !important; -} - -.rtl .wp-block-image figcaption { - text-align: right !important; -} diff --git a/private/src/styles/blocks/core-blocks/_quote.scss b/private/src/styles/blocks/core-blocks/_quote.scss deleted file mode 100644 index a7e9a28f..00000000 --- a/private/src/styles/blocks/core-blocks/_quote.scss +++ /dev/null @@ -1,209 +0,0 @@ -.wp-block-quote, -.wp-block-quote.is-style-default { - border-left: none; -} - -.wp-block-quote::before, -.wp-block-quote.has-text-align-center::before { - content: open-quote; -} - -.wp-block-quote cite::after, -.wp-block-quote.has-text-align-center cite::after { - content: ""; - display: block; - margin: 8px auto 0; - max-width: 200px; - height: 8px; -} - -.wp-block-quote.has-text-align-center::before { - position: absolute; - left: 48%; - font-family: var(--wp--preset--font-family--secondary) !important; - font-weight: bold; - font-size: 3.75rem !important; - line-height: 1px; - - @include mq(x-small) { - font-size: 4.375rem !important; - } - - @include mq(medium) { - font-size: 5rem !important; - } -} - -.wp-block-quote p, -.wp-block-quote cite { - font-family: var(--wp--preset--font-family--secondary); - margin-bottom: 0; -} - -.wp-block-quote p { - font-size: var(--wp--preset--font-size--large) !important; -} - -.wp-block-quote.has-small-font-size p { - font-size: var(--wp--preset--font-size--small) !important; -} - -.wp-block-quote.has-medium-font-size p { - font-size: var(--wp--preset--font-size--medium) !important; -} - -.wp-block-quote.has-large-font-size p { - font-size: var(--wp--preset--font-size--large) !important; -} - -.wp-block-quote cite { - text-transform: none !important; - display: inline-block; - font-style: normal; - font-size: 1.125rem !important; - font-weight: bold !important; - line-height: 40px !important; - padding-bottom: 24px; - - @include mq(x-small) { - font-size: 1.25rem !important; - } - - @include mq(medium) { - font-size: 1.5rem !important; - } -} - -.wp-block-quote.has-large-font-size cite { - @include mq(x-small) { - font-size: 1.25rem !important; - } - - @include mq(medium) { - font-size: 1.5rem !important; - } -} - -.wp-block-quote.has-medium-font-size cite { - font-size: 1rem !important; - - @include mq(x-small) { - font-size: 1.25rem !important; - } - - @include mq(medium) { - font-size: 1.375rem !important; - } -} - -.wp-block-quote.has-small-font-size cite { - font-size: 0.875rem !important; - - @include mq(x-small) { - font-size: 1.125rem !important; - } - - @include mq(medium) { - font-size: 1.25rem !important; - } -} - - - -.wp-block-quote cite::after, -.wp-block-quote.has-black-color cite::after, -.wp-block-quote.has-text-align-center.has-black-color cite::after { - background-color: var(--wp--preset--color--black); -} - -.wp-block-quote.has-white-color cite::after, -.wp-block-quote.has-text-align-center.has-white-color cite::after { - background-color: var(--wp--preset--color--white); -} - -.wp-block-quote.has-amnesty-grey-brand-color cite::after, -.wp-block-quote.has-text-align-center.has-amnesty-grey-brand-color cite::after { - background-color: var(--wp--preset--color--grey-light); -} - -.wp-block-quote.has-text-align-left { - border-left: 8px solid var(--wp--preset--color--black); - padding-left: 35px; -} - -.wp-block-quote.has-text-align-left.has-white-color { - border-left-color: var(--wp--preset--color--white); -} - -.wp-block-quote.has-text-align-left.has-amnesty-grey-brand-color { - border-left-color: var(--wp--preset--color--grey-light); -} - -.wp-block-quote.has-text-align-right { - border-right: 8px solid var(--wp--preset--color--black); - padding-right: 35px; -} - -.wp-block-quote.has-text-align-right.has-white-color { - border-right-color: var(--wp--preset--color--white); -} - -.wp-block-quote.has-text-align-right.has-amnesty-grey-brand-color { - border-right-color: var(--wp--preset--color--grey-light); -} - -.wp-block-quote.has-text-align-left p::before, -.wp-block-quote.has-text-align-right p::before { - content: open-quote; - display: inline-block; -} - -.wp-block-quote.has-text-align-left p::before { - text-indent: -7px; - - @include mq(medium) { - text-indent: -15px; - } -} - -.wp-block-quote.has-text-align-right p::after { - position: absolute; -} - -.wp-block-quote.has-text-align-left p::after, -.wp-block-quote.has-text-align-right p::after { - content: close-quote; - display: inline-block; -} - -.wp-block-quote.is-style-plain { - border: none !important; -} - -.wp-block-quote.is-style-plain cite::after, -.wp-block-quote.has-text-align-left cite::after, -.wp-block-quote.has-text-align-right cite::after { - content: none; -} - -.wp-block-quote.has-text-align-left::before, -.wp-block-quote.has-text-align-right::before { - content: none; -} - -// RTL styles -.rtl .wp-block-quote.has-text-align-left { - text-align: right; - border-right: 8px solid var(--wp--preset--color--black); - border-left: none; - padding-right: 35px; - padding-left: 0; -} - -.rtl .wp-block-quote.has-text-align-right { - text-align: left; - border-left: 8px solid var(--wp--preset--color--black); - border-right: none; - padding-left: 35px; - padding-right: 0; -} diff --git a/private/src/styles/blocks/core-blocks/post-template/_main.scss b/private/src/styles/blocks/core-blocks/post-template/_main.scss deleted file mode 100644 index 4a64da4f..00000000 --- a/private/src/styles/blocks/core-blocks/post-template/_main.scss +++ /dev/null @@ -1,4 +0,0 @@ -.wp-block-post-template.is-layout-grid { - margin: 0; - gap: var(--wp--preset--spacing--single); -} diff --git a/private/src/styles/blocks/core-blocks/post/_main.scss b/private/src/styles/blocks/core-blocks/post/_main.scss deleted file mode 100644 index a86eb94c..00000000 --- a/private/src/styles/blocks/core-blocks/post/_main.scss +++ /dev/null @@ -1,113 +0,0 @@ -.wp-block-post { - min-height: 460px; - background: var(--wp--preset--color--white); -} - -.wp-block-post > .wp-block-group:not(.post--result) { - display: flex; - flex-direction: column; - min-height: 460px; - background: var(--wp--preset--color--white); -} - -.search-results .wp-block-post, -.search-results .wp-block-post > .wp-block-group { - min-height: unset; -} - -.wp-block-post .post-content { - display: flex; - flex-direction: column; - flex: 1 1 auto; - align-items: flex-start; -} - -.wp-block-post .post-header > * { - margin-top: spacing(half); -} - -.wp-block-post.has-post-thumbnail .post-content { - position: relative; -} - -.wp-block-post:not(.has-post-thumbnail) .post-content::after { - content: ""; - display: block; - height: 8px; - width: 75%; - margin-top: 12px; - background-color: var(--wp--preset--color--black); - - @include mq(x-small) { - margin-top: auto; - } -} - -.wp-block-post.has-post-thumbnail > *:not(.post--result) .wp-block-post-terms.post-category { - position: absolute; - bottom: 100%; - left: 12px; - - .rtl & { - right: 12px; - left: unset; - } -} - -.post-header { - max-width: 100%; -} - -.post-content { - width: 100%; - padding: 12px; -} - -.wp-block-post-terms.post-category { - @include state-background(var(--wp--preset--color--grey-dark)); - display: inline-block; - padding: 4px 8px; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - font-size: 18px; - text-transform: uppercase; - background-color: var(--wp--preset--color--black); -} - -.wp-block-post-terms.post-category a { - color: var(--wp--preset--color--white); - text-decoration: none; -} - -.post-meta { - display: block; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - font-size: 14px; - color: var(--wp--preset--color--grey-dark); - background-color: var(--wp--preset--color--white); -} - -.post-figure { - position: relative; - background-color: var(--wp--preset--color--grey-darkest); - overflow: hidden; - max-height: 200px; - height: 100%; -} - -.post-figure img { - display: block; - width: 100%; - height: 100%; - object-fit: cover; -} - -.post-content a { - position: relative; - z-index: 1; -} - -:lang(fa-IR) .wp-block-post-terms.post-category { - display: none; -} diff --git a/private/src/styles/blocks/core-blocks/query-pagination/_container.scss b/private/src/styles/blocks/core-blocks/query-pagination/_container.scss deleted file mode 100644 index 8a25d220..00000000 --- a/private/src/styles/blocks/core-blocks/query-pagination/_container.scss +++ /dev/null @@ -1,21 +0,0 @@ -.wp-block-query-pagination { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: wrap; - margin: 0 auto; - width: 100%; - font-size: 24px; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - line-height: 1.25; - text-transform: uppercase; - - @include mq(large) { - width: 75%; - } - - @include mq(x-large) { - width: 50%; - } -} diff --git a/private/src/styles/blocks/core-blocks/query-pagination/_main.scss b/private/src/styles/blocks/core-blocks/query-pagination/_main.scss deleted file mode 100644 index 18084257..00000000 --- a/private/src/styles/blocks/core-blocks/query-pagination/_main.scss +++ /dev/null @@ -1,10 +0,0 @@ -@import "./container"; -@import "./next"; -@import "./previous"; -@import "./numbers"; - -.wp-block-query-pagination > .wp-block-query-pagination-previous, -.wp-block-query-pagination > .wp-block-query-pagination-next, -.wp-block-query-pagination > .wp-block-query-pagination-numbers { - margin: 0; -} diff --git a/private/src/styles/blocks/countdown-timer/_editor.scss b/private/src/styles/blocks/countdown-timer/_editor.scss deleted file mode 100644 index 5408461c..00000000 --- a/private/src/styles/blocks/countdown-timer/_editor.scss +++ /dev/null @@ -1,23 +0,0 @@ -.clockdiv { - justify-content: center; -} - -.countdownClock { - font-size: 5.2em; - color: var(--wp--preset--color--black); - font-family: var(--wp--preset--font-family--secondary); - text-transform: uppercase; -} - -.countdownContainer { - border: 1px solid var(--wp--preset--color--black); - padding: 20px; -} - -.expiredTextBox { - font-weight: bold; -} - -.section--textWhite .countdownClock { - color: var(--wp--preset--color--white); -} diff --git a/private/src/styles/blocks/custom-card/_editor.scss b/private/src/styles/blocks/custom-card/_editor.scss deleted file mode 100644 index fa69cbe3..00000000 --- a/private/src/styles/blocks/custom-card/_editor.scss +++ /dev/null @@ -1,53 +0,0 @@ -.customCard-editorButtonWrapper { - display: flex; - align-items: center; -} - -.customCard textarea.customCard-label { - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--grey-dark); -} - -.customCard-content textarea { - text-align: center; - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--grey-dark); -} - -.customCard-content .btn { - color: var(--wp--preset--color--grey-dark); - background-color: var(--wp--preset--color--primary); -} - -.is-style-style-2 textarea.customCard-label, -.is-style-style-2 .customCard-content textarea { - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); -} - -.is-style-style-2 .customCard-editorButtonWrapper, -.is-style-style-2 .customCard-content .btn { - color: var(--wp--preset--color--grey-dark); - background-color: var(--wp--preset--color--primary); -} - -.is-style-style-3 textarea.customCard-label, -.is-style-style-3 .customCard-content textarea { - background-color: var(--wp--preset--color--primary); - color: var(--wp--preset--color--grey-dark); -} - -.is-style-style-3 .customCard-editorButtonWrapper, -.is-style-style-3 .customCard-content .btn { - color: var(--wp--preset--color--white); - background-color: var(--wp--preset--color--grey-darkest); -} - -.is-style-style-3 .customCard-editorButtonWrapper svg { - fill: var(--wp--preset--color--white); -} - -.customCard-content .btn:hover { - background-color: var(--wp--preset--color--primary-state); - color: var(--wp--preset--color--primary); -} diff --git a/private/src/styles/blocks/custom-card/_main.scss b/private/src/styles/blocks/custom-card/_main.scss deleted file mode 100644 index 4516d00d..00000000 --- a/private/src/styles/blocks/custom-card/_main.scss +++ /dev/null @@ -1,101 +0,0 @@ -.customCard { - position: relative; - margin: 0; - max-width: 350px; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - background-color: var(--wp--preset--color--grey-lighter); - display: flex; - flex-direction: column; - height: 100%; -} - -.customCard.is-centred { - margin-right: auto; - margin-left: auto; -} - -.customCard.customCard--wide, -.customCard.actionBlock--wide { - width: 480px; - max-width: 100%; -} - -.customCard-figure { - position: relative; - height: 230px; - overflow: hidden; -} - -.customCard-image { - display: block; - width: 100%; - height: 100%; - object-fit: cover; - background-color: color-mix(in srgb, var(--wp--preset--color--black) 25%, transparent); -} - -.customCard-image img { - object-fit: cover; - width: 100%; - height: 100%; -} - -.customCard-label { - display: block; - text-align: center; - padding: var(--wp--preset--spacing--half); - font-size: var(--wp--preset--font-size--large); - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--grey-dark); - text-transform: uppercase; -} - -.customCard-content { - text-align: center; - font-weight: normal; - font-family: var(--wp--preset--font-family--primary); - padding: 10px; - font-size: var(--wp--preset--font-size--small); - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--grey-dark); - margin-top: auto; -} - -.customCard.aligncenter { - display: flex; - margin-right: auto; - margin-left: auto; -} - -.customCard.is-style-style-2 { - background-color: var(--wp--preset--color--grey-dark); -} - -.customCard.is-style-style-3 { - background-color: var(--wp--preset--color--primary); -} - -.is-style-style-2 .customCard-label, -.is-style-style-2 .customCard-content, -.is-style-style-2 .customCard { - background-color: var(--wp--preset--color--grey-dark); - color: var(--wp--preset--color--white); -} - -.is-style-style-3 .customCard-label, -.is-style-style-3 .customCard-content, -.is-style-style-3 .customCard { - background-color: var(--wp--preset--color--primary); - color: var(--wp--preset--color--grey-dark); -} - -.is-style-style-3 .btn, -.is-style-style-3 .customCard { - background-color: var(--wp--preset--color--grey-dark); - color: var(--wp--preset--color--white); -} - -.is-style-style-3 .btn:hover { - background-color: var(--wp--preset--color--primary-state); -} diff --git a/private/src/styles/blocks/download-block/_editor.scss b/private/src/styles/blocks/download-block/_editor.scss deleted file mode 100644 index dff32f47..00000000 --- a/private/src/styles/blocks/download-block/_editor.scss +++ /dev/null @@ -1,72 +0,0 @@ -.element-select { - box-sizing: border-box; - position: relative; - display: inline-block; - margin-right: 10px; - width: 300px; - height: 56px; - background-color: var(--wp--preset--color--white); - - select { - padding: 10px; - width: 100% !important; - height: 100% !important; - border-radius: 0 !important; - border: 2px solid; - } -} - -.section--textWhite .element-select::after { - background-position: -271px -131px; -} - -.section--textWhite .element-select select { - color: var(--wp--preset--color--white); - border-color: var(--wp--preset--color--white); -} - -.download-block { - padding: 2px; - border: 1px dashed; -} - -.download-block > div:first-of-type { - max-height: none !important; -} - -.wp-core-ui .download-block select { - background: none; -} - -.wp-block[data-type="amnesty-core/block-download"] .block-editor-media-placeholder.is-appender { - outline: none; -} - -.download-block.center { - display: flex; - justify-content: center; -} - -.download-block.left { - display: flex; - justify-content: flex-start; -} - -.download-block.right { - display: flex; - justify-content: flex-end; -} - -.download-block.has-multiple { - align-items: stretch; -} - -.download-block.has-multiple select { - appearance: revert; - margin-right: 12px; - - .rtl & { - margin-right: 0; - margin-left: 12px; - } -} diff --git a/private/src/styles/blocks/download-block/_style.scss b/private/src/styles/blocks/download-block/_style.scss deleted file mode 100644 index 2ba431b3..00000000 --- a/private/src/styles/blocks/download-block/_style.scss +++ /dev/null @@ -1,112 +0,0 @@ -.download-block { - display: flex; - flex-direction: column; - align-content: flex-start; - align-items: stretch; - gap: var(--wp--preset--spacing--half); - - @include mq(x-small) { - flex-direction: row; - } -} - -.download-block .checkboxGroup { - min-width: 200px; -} - -.download-block .checkboxGroup-button, -.download-block .checkboxGroup-list { - width: 100%; -} - -.download-block.alignleft { - float: none !important; - - @include mq(x-small) { - justify-content: flex-start; - } -} - -.download-block.aligncenter { - float: none !important; - - @include mq(x-small) { - justify-content: center; - display: flex; - } -} - -.download-block.alignright { - float: none !important; - - @include mq(x-small) { - justify-content: flex-end; - } -} - -.btn--download { - display: inline-flex; - align-items: baseline; - margin-top: 24px; - - .article-content & { - margin-top: 24px; - } -} - -.download-block .btn--download { - display: inline-flex; - - [dir="rtl"] & { - flex-direction: row-reverse; - } - - [dir="ltr"] & { - flex-direction: row; - } - - @include mq(x-small) { - margin-top: 0; - } -} - -.btn--download::before { - content: ""; - display: inline-block; - width: 20px; - height: 20px; - margin-right: 20px; - background-image: url("../images/icon-download-arrow.svg"); - background-size: contain; - transform: translateY(2px); - - .rtl & { - margin-right: 0; - margin-left: 20px; - } -} - -.btn--primary.btn--download::before, -.btn--white.btn--download::before { - background-image: url("../images/icon-download-arrow-dark.svg"); -} - -.btn--primary.btn--download:hover::before, -.btn--primary.btn--download:active::before, -.btn--primary.btn--download:focus::before { - background-image: url("../images/icon-download-arrow.svg"); -} - -.article-sidebar .download-block { - flex-direction: column; - color: var(--wp--preset--color--black); -} - -.article-sidebar .download-block .btn { - margin-right: auto; - - .rtl & { - margin-right: 0; - margin-left: auto; - } -} diff --git a/private/src/styles/blocks/fact-block/_editor.scss b/private/src/styles/blocks/fact-block/_editor.scss deleted file mode 100644 index ddde581b..00000000 --- a/private/src/styles/blocks/fact-block/_editor.scss +++ /dev/null @@ -1,33 +0,0 @@ -.factBlock { - margin-right: auto; - margin-left: auto; -} - -.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type) { - position: relative; - margin-bottom: 50px; -} - -.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::before, -.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::after { - content: ""; - position: absolute; - display: block; - background-color: var(--wp--preset--color--grey-darker); -} - -.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::before { - @include icon(10px, 162px, 40px, 40px); - left: calc(50% - 20px); - top: calc(100% + 5px); - z-index: 1; - width: 40px; - height: 40px; -} - -.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/key-fact"]:not(:last-of-type)::after { - bottom: -26px; // margin/2 + height/2 - left: 5%; - height: 2px; - width: 90%; -} diff --git a/private/src/styles/blocks/fact-block/_main.scss b/private/src/styles/blocks/fact-block/_main.scss deleted file mode 100644 index 86412b42..00000000 --- a/private/src/styles/blocks/fact-block/_main.scss +++ /dev/null @@ -1,58 +0,0 @@ -@use "sass:math"; - -.factBlock { - max-width: math.div($flexy-container, 3); - padding: 24px; - text-align: center; -} - -.factBlock ol { - margin: 0; - list-style: none; -} - -.factBlock-title { - text-transform: uppercase; -} - -.factBlock-title, -.factBlock-itemTitle { - font-family: var(--wp--preset--font-family--secondary); -} - -.factBlock-item:last-of-type .factBlock-itemContent { - margin-bottom: 0; -} - -.factBlock-item:not(:last-of-type) { - position: relative; - margin-bottom: 60px; -} - -.factBlock-item:not(:last-of-type)::before, -.factBlock-item:not(:last-of-type)::after { - content: ""; - position: absolute; - display: block; - background-color: var(--wp--preset--color--grey-darker); -} - -.factBlock-item:not(:last-of-type)::before { - @include icon(10px, 162px, 40px, 40px); - left: calc(50% - 20px); - top: calc(100% + 10px); - z-index: 1; - width: 40px; - height: 40px; -} - -.factBlock-item:not(:last-of-type)::after { - bottom: -31px; // margin/2 + height/2 - left: 5%; - height: 2px; - width: 90%; -} - -.factBlock-itemTitle { - margin-bottom: 16px; -} diff --git a/private/src/styles/blocks/header/_editor.scss b/private/src/styles/blocks/header/_editor.scss deleted file mode 100644 index 5bd56387..00000000 --- a/private/src/styles/blocks/header/_editor.scss +++ /dev/null @@ -1,122 +0,0 @@ -[data-type="amnesty-core/header"] { - max-width: 100% !important; - width: 100% !important; -} - -.headerBlock .container { - padding: 0 flexy-gutter(); - display: flex; -} - -.headerBlock .page-heroTitle span { - line-height: 1.2; -} - -.headerBlock .hero-content { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -.headerBlock.headerBlock.page-heroAlignment--centre .hero-content { - align-items: center; -} - -.page-heroAlignment--center .container { - display: flex; - justify-content: center; -} - -.page-heroAlignment--right .container { - display: flex; - justify-content: space-between; -} - -.page-heroAlignment--left .container { - display: flex; - justify-content: space-between; -} - -.page-hero .donation { - margin-right: auto; - margin-left: auto; -} - -.page-hero .container .hero-content { - flex-direction: column; - - > * { - margin-bottom: 12px; - } -} - -.page-hero .container { - @include mq($from: xx-small, $until: medium-sm) { - flex-wrap: wrap; - } -} - -.page-heroAlignment--right .container .hero-content { - order: 2; -} - -.page-heroAlignment--right .container .page-heroCta { - order: 2; - margin-right: 0; - margin-left: auto; -} - -.page-heroAlignment--right .page-heroTitle { - margin-left: 0; -} - -.page-heroAlignment--center .donation { - margin-left: 0; - margin-right: 0; -} - -.page-heroAlignment--right .donation { - margin-left: auto; - margin-right: auto; -} - -.rtl .page-heroAlignment--right .page-heroContent { - margin-right: 0; -} - -.rtl .page-heroAlignment--left .page-heroContent { - margin-left: 0; -} - -.rtl .page-heroAlignment--center .container .hero-content { - margin-left: 10%; - margin-right: auto; - order: 2; -} - -.rtl .page-heroAlignment--center .donation { - margin-right: 0; - margin-left: 0; -} - -.rtl .page-heroAlignment--left .container .hero-content { - margin-left: 20%; - order: 2; - text-align: end; -} - -.rtl .page-heroAlignment--right .container .hero-content { - order: 0; - text-align: left; - margin-right: 20%; - margin-left: 10%; -} - -.rtl .page-heroAlignment--right .page-heroTitle { - margin-right: 0; -} - -.rtl .page-heroAlignment--left .container .page-heroCta { - margin-right: 0; - margin-left: auto; -} diff --git a/private/src/styles/blocks/header/_main.scss b/private/src/styles/blocks/header/_main.scss deleted file mode 100644 index ff033597..00000000 --- a/private/src/styles/blocks/header/_main.scss +++ /dev/null @@ -1,283 +0,0 @@ -.headerBlock .container { - padding: 0 flexy-gutter(); - display: flex; - flex-wrap: wrap; - - @include mq("md-small") { - flex-wrap: nowrap; - } -} - -.headerBlock .page-heroTitle span { - line-height: 1.3; -} - -.headerBlock .hero-content { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -.headerBlock .donation { - margin-top: 50px; - - @include mq("md-small") { - margin-top: 0; - } -} - -.headerBlock.headerBlock.page-heroAlignment--centre .hero-content { - align-items: center; -} - -.page-heroAlignment--center .container { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - - @include mq("md-small") { - flex-direction: row; - align-items: flex-start; - } -} - -.page-heroAlignment--left .container { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - - @include mq("md-small") { - flex-direction: row; - align-items: flex-start; - } - - .rtl & { - @include mq("md-small") { - flex-direction: row; - } - } -} - -.page-heroAlignment--left .container .hero-content { - align-items: center; - - @include mq("md-small") { - align-items: flex-start; - } -} - -.page-heroAlignment--right .container .hero-content { - align-items: center; - - @include mq("md-small") { - align-items: flex-end; - } -} - -.page-hero .container .hero-content { - flex-direction: column; - - > *:not(:last-child) { - margin-bottom: 12px; - } -} - -.page-heroAlignment--right .container { - align-content: center; - flex-direction: column; - align-items: center; - - @include mq("md-small") { - flex-direction: row-reverse; - justify-content: space-between; - align-items: flex-start; - } - - .rtl & { - @include mq("md-small") { - // this is required because the order is incorrect in the dom order when using right posiiton - /* stylelint-disable */ - flex-direction: unset; - flex-direction: row-reverse; - /* stylelint-enable */ - } - } -} - -.page-heroAlignment--right .container .hero-content, -.page-heroAlignment--left .container .hero-content { - flex-direction: column; - position: relative; - margin-bottom: 5%; -} - -.page-heroAlignment--right .donation { - flex-direction: column; - position: relative; -} - -.page-heroAlignment--center .container .hero-content { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - position: relative; - margin-bottom: 5%; - margin-right: 0; -} - -.page-heroAlignment--center .donation { - margin-left: 2%; - - @include mq($from: xx-small, $until: large) { - flex-direction: column; - position: relative; - } -} - -.page-heroAlignment--left .donation { - flex-direction: column; - position: relative; -} - -.rtl .page-heroAlignment--right .container .page-heroCta { - margin-right: auto; - margin-left: 0; -} - -.rtl .page-heroAlignment--center .container .donation { - @include mq("md-small") { - margin-right: 2%; - margin-left: 0; - } -} - -.page-heroAlignment--left .container .donation { - @include mq("md-small") { - margin-right: 0; - margin-left: 2%; - } - - .rtl & { - @include mq("md-small") { - margin-right: 2%; - margin-left: 0; - } - } -} - -.headerBlock .content-type-container { - position: absolute; - bottom: 0; - display: flex; - justify-content: flex-start; - margin: 0 auto; - max-width: 1468px; - margin-right: auto; - margin-left: auto; - left: 0; - right: 0; - padding: 0 20px; - height: 27px; -} - -.headerBlock .content-type-container li { - list-style-type: none; -} - -.headerBlock .content-type-container a { - text-decoration: none; - font-family: var(--wp--preset--font-family--secondary); - padding: 5px; - font-size: var(--wp--preset--font-size--regular); - color: var(--wp--preset--color--white); - background-color: var(--wp--preset--color--black); -} - -.rtl .headerBlock .page-heroTitle span { - padding: 10px 0; - line-height: 1.6; -} - -.page-heroAlignment--center .container .hero-content.has-donation-block { - align-items: center; - - @include mq("md-small") { - align-items: flex-start; - } -} - -.page-heroAlignment--center .container .hero-content .page-heroTitle { - text-align: center; -} - -.page-heroAlignment--left .container .hero-content .page-heroTitle { - text-align: center; - - @include mq("md-small") { - text-align: start; - } -} - -.page-heroAlignment--right .container .hero-content .page-heroTitle { - text-align: center; - - @include mq("md-small") { - text-align: end; - } -} - -.page-heroAlignment--center .container .hero-content.has-donation-block .page-heroTitle { - text-align: center; - - @include mq("md-small") { - text-align: left; - } -} - -.page-hero .image-metadata.is-image { - display: flex; -} - -.page-hero .image-metadata.is-video { - display: none; -} - -.page-hero.page-hero--video .image-metadata.is-image { - display: flex; - - @include mq("small") { - display: none; - } -} - -.page-hero.page-hero--video .image-metadata.is-video { - display: none; - - @include mq("small") { - display: flex; - } -} - -:lang(fa-IR) .headerBlock .page-heroTitle span { - line-height: 1.73; - - @include mq(small) { - line-height: 1.71; - } -} - -:lang(fa-IR) .rtl .headerBlock .page-heroTitle span { - padding: 0 0; - - @include mq(small) { - padding: 10px 0; - line-height: 2.01; - } -} - -:lang(fa-IR) .headerBlock .tag-li { - display: none; -} diff --git a/private/src/styles/blocks/hero/_editor.scss b/private/src/styles/blocks/hero/_editor.scss deleted file mode 100644 index 2a42846a..00000000 --- a/private/src/styles/blocks/hero/_editor.scss +++ /dev/null @@ -1,100 +0,0 @@ -[data-type="amnesty-core/hero"] { - margin-inline: auto !important; - max-width: $flexy-container !important; - width: 100% !important; - float: none !important; -} - -[data-type="amnesty-core/hero"] .wp-block { - max-width: 100%; -} - -.wp-block-amnesty-core-hero, -.wp-block-amnesty-core-hero * { - box-sizing: border-box; -} - -.wp-block-amnesty-core-hero .hero-contentWrapper { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -.wp-block-amnesty-core-hero .hero-contentWrapper > * { - margin-top: 0; - margin-bottom: 12px; -} - -.wp-block-amnesty-core-hero .btn { - display: flex; - align-items: center; - justify-content: space-between; -} - -.wp-block-amnesty-core-hero .btn .block-editor-url-input__button { - position: relative; - margin-left: 16px; -} - -.rtl .wp-block-amnesty-core-hero .btn .block-editor-url-input__button { - margin-left: 0; - margin-right: 16px; -} - -.wp-block-amnesty-core-hero .block-editor-url-input__button-modal { - position: absolute; -} - -[data-type="amnesty-core/hero"] .has-donation-block .hero-contentWrapper, -.wp-block-amnesty-core-hero .has-donation-block .hero-contentWrapper { - max-width: 840px; -} - -[data-type="amnesty-core/hero"] .has-donation-block .hero-content, -.wp-block-amnesty-core-hero .has-donation-block .hero-content { - max-width: 460px; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align], -.wp-block[data-align] .wp-block-amnesty-core-hero { - height: auto; - min-height: 540px; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align="left"] .container, -.wp-block[data-align="left"] .wp-block-amnesty-core-hero .container { - justify-content: start; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align="left"] .hero-contentWrapper, -.wp-block[data-align="left"] .wp-block-amnesty-core-hero .hero-contentWrapper { - align-items: start; - text-align: start; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align="center"] .container, -.wp-block[data-align="center"] .wp-block-amnesty-core-hero .container { - justify-content: center; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align="center"] .hero-contentWrapper, -.wp-block[data-align="center"] .wp-block-amnesty-core-hero .hero-contentWrapper { - align-items: center; - text-align: center; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align="right"] .container, -.wp-block[data-align="right"] .wp-block-amnesty-core-hero .container { - justify-content: end; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align="right"] .hero-contentWrapper, -.wp-block[data-align="right"] .wp-block-amnesty-core-hero .hero-contentWrapper { - align-items: end; - text-align: end; -} - -[data-type="amnesty-core/hero"] .wp-block[data-align] .container.has-donation-block, -.wp-block[data-align] .wp-block-amnesty-core-hero .container.has-donation-block { - justify-content: space-between; -} diff --git a/private/src/styles/blocks/hero/_main.scss b/private/src/styles/blocks/hero/_main.scss deleted file mode 100644 index b355b543..00000000 --- a/private/src/styles/blocks/hero/_main.scss +++ /dev/null @@ -1,137 +0,0 @@ -@import "./styles"; - -.wp-block-amnesty-core-hero { - position: relative; - display: flex; - margin: auto; - padding-top: 60px; - padding-bottom: 60px; - width: 100%; - max-width: $flexy-container; - min-height: 540px; - background-size: cover; - background-position: center center; - - @include mq(small) { - padding-top: 111px; - padding-bottom: 80px; - height: auto; - } -} - -.wp-block-amnesty-core-hero .container { - z-index: 1; - display: flex; - justify-content: space-between; - padding: 0 24px !important; -} - -.hero-contentWrapper > * { - margin-bottom: 12px; -} - -.hero-content { - display: table; - padding: 10px 16px; - max-width: 460px; - font-size: var(--wp--preset--font-size--heading-6); - - @include mq(xx-small) { - padding: 10px 20px; - max-width: 840px; - } -} - -.hero-title span { - margin: 0; - padding: 0 16px; - font-size: var(--wp--preset--font-size--heading-1); - line-height: 1.3 !important; - background-color: rgba(0, 0, 0, 0.45); - color: #fff; - max-width: 840px; - text-transform: uppercase; - box-decoration-break: clone; - - @include mq(xx-small) { - padding: 0 20px; - } -} - -.hero-cta { - display: inline-block; - padding: 16px; - background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - - @include mq(xx-small) { - padding: 20px; - } -} - -.hero-videoContainer, -.hero-video { - display: none; - - @include mq(small) { - display: block; - } -} - -.hero-videoContainer { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; -} - -.hero-video { - position: absolute; - top: 50%; - left: 50%; - min-width: 100%; - min-height: 100%; - transform: translate(-50%, -50%); -} - -.wp-block-amnesty-core-hero .image-metadata.is-image { - display: flex; -} - -.wp-block-amnesty-core-hero .image-metadata.is-video { - display: none; -} - -.wp-block-amnesty-core-hero.has-video .image-metadata.is-image { - display: flex; - - @include mq(small) { - display: none; - } -} - -.wp-block-amnesty-core-hero.has-video .image-metadata.is-video { - display: none; - - @include mq(small) { - display: flex; - } -} - -.wp-block-amnesty-core-hero.has-inner-blocks .container { - justify-content: space-between; - align-items: start; -} - -.wp-block-amnesty-core-hero.has-inner-blocks .hero-title { - max-width: 840px; -} - -.wp-block-amnesty-core-hero.has-inner-blocks .hero-content { - max-width: 460px; -} - -.wp-block-amnesty-core-hero:has(+ main) { - margin-bottom: var(--wp--preset--spacing--single); -} diff --git a/private/src/styles/blocks/hero/_styles.scss b/private/src/styles/blocks/hero/_styles.scss deleted file mode 100644 index 8f644a95..00000000 --- a/private/src/styles/blocks/hero/_styles.scss +++ /dev/null @@ -1,75 +0,0 @@ -.wp-block-amnesty-core-hero.has-dark-background .hero-title span, -.wp-block-amnesty-core-hero.has-dark-background .hero-content, -.wp-block-amnesty-core-hero.has-dark-background .hero-cta { - color: var(--wp--preset--color--white); - background-color: var(--wp--preset--color--black); -} - -.wp-block-amnesty-core-hero.has-light-background .hero-title span, -.wp-block-amnesty-core-hero.has-light-background .hero-content, -.wp-block-amnesty-core-hero.has-light-background .hero-cta { - color: var(--wp--preset--color--black); - background-color: var(--wp--preset--color--white); -} - -.wp-block-amnesty-core-hero.has-light-background .btn { - border: none; - color: var(--wp--preset--color--white); - background-color: var(--wp--preset--color--black); -} - -.wp-block-amnesty-core-hero.is-aligned-left .container { - justify-content: start; -} - -.wp-block-amnesty-core-hero.is-aligned-left .hero-contentWrapper { - text-align: start; -} - -.rtl .wp-block-amnesty-core-hero.is-aligned-left .container { - justify-content: end; -} - -.rtl .wp-block-amnesty-core-hero.is-aligned-left .hero-contentWrapper { - text-align: end; -} - -.rtl .wp-block-amnesty-core-hero.is-aligned-left .hero-content { - margin-right: auto; - margin-left: 0; -} - -.wp-block-amnesty-core-hero.is-aligned-center .container { - justify-content: center; -} - -.wp-block-amnesty-core-hero.is-aligned-center .hero-contentWrapper { - align-items: center; - text-align: center; -} - -.wp-block-amnesty-core-hero.is-aligned-center .hero-content { - margin-right: auto; - margin-left: auto; -} - -.wp-block-amnesty-core-hero.is-aligned-right .container { - justify-content: end; -} - -.wp-block-amnesty-core-hero.is-aligned-right .hero-contentWrapper { - align-items: end; - text-align: end; -} - -.wp-block-amnesty-core-hero.is-aligned-right .hero-content { - margin-left: auto; -} - -.rtl .wp-block-amnesty-core-hero.is-aligned-right .container { - justify-content: start; -} - -.rtl .wp-block-amnesty-core-hero.is-aligned-right .hero-contentWrapper { - text-align: start; -} diff --git a/private/src/styles/blocks/iframe-button/_main.scss b/private/src/styles/blocks/iframe-button/_main.scss deleted file mode 100644 index 67d823d1..00000000 --- a/private/src/styles/blocks/iframe-button/_main.scss +++ /dev/null @@ -1,30 +0,0 @@ -.iframeButton-wrapper { - display: flex; - flex-wrap: wrap; -} - -.iframeButton-wrapper.is-left-aligned { - justify-content: flex-start; -} - -.iframeButton-wrapper.is-center-aligned { - justify-content: center; -} - -.iframeButton-wrapper.is-right-aligned { - justify-content: flex-end; -} - -.iframeButton-wrapper iframe { - display: none; - margin-top: 24px; - width: 100%; -} - -.iframeButton-wrapper.is-visible iframe { - display: block; -} - -.callToAction .iframeButton-wrapper { - width: 100%; -} diff --git a/private/src/styles/blocks/image-block/_editor.scss b/private/src/styles/blocks/image-block/_editor.scss deleted file mode 100644 index 1840822d..00000000 --- a/private/src/styles/blocks/image-block/_editor.scss +++ /dev/null @@ -1,107 +0,0 @@ -.edit-post-visual-editor .editor-block-list__block[data-type="amnesty-core/image-block"] { - max-width: 100%; - width: 100%; -} - -.imageBlock { - display: block; - max-width: 100% !important; - min-height: 400px; - background-color: var(--wp--preset--color--grey-light); -} - -.imageBlock.imageBlock.has-parallax { - overflow-y: hidden; -} - -.imageBlock.has-parallax .imageBlock-overlay { - z-index: 1 !important; -} - -.imageBlock.alignright .imageBlock-image { - float: right; -} - -.imageBlock.aligncentre .imageBlock-image { - display: block; - margin: 0 auto; -} - -.imageBlock.alignleft .imageBlock-image { - float: left; -} - -.imageBlock-overlay > * + * { - margin-top: 40px !important; -} - -.imageBlock-title, -.imageBlock-content { - max-width: none; - background-color: transparent !important; - text-align: center; - color: var(--wp--preset--color--white) !important; -} - -.imageBlock-buttonsContainer { - display: flex; - align-items: flex-start; - justify-content: center; - align-content: flex-start; - min-width: 600px; - - > * { - margin: 0 10px; - } -} - -.imageBlock-buttonsContainer .linkList-options { - position: static; - display: flex; - margin-top: 5px; - background: none; -} - -.imageBlock-buttonWrapper { - position: relative; -} - -.imageBlock-buttonWrapper .btn.btn--white { - padding: 10px !important; - color: var(--wp--preset--color--black) !important; - border: 1px solid var(--wp--preset--color--black) !important; - background-color: var(--wp--preset--color--white) !important; - border-radius: 0 !important; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - font-size: var(--wp--preset--font-size--small); - text-transform: uppercase; - - @include placeholder { - color: var(--wp--preset--color--black) !important; - } -} - -.imageBlock-overlay .editor-url-input__button button, -.imageBlock-overlay .components-icon-button { - background-color: var(--wp--preset--color--white); - border-radius: 0; - color: var(--wp--preset--color--black)-light; -} - -.imageBlock-copyright { - padding: 5px 10px 5px 5px !important; - width: auto !important; - font-size: var(--wp--preset--font-size--x-small) !important; - color: var(--wp--preset--color--white) !important; -} - -.imageBlock-title, -.imageBlock-content p, -.imageBlock-copyright { - color: var(--wp--preset--color--white) !important; - - @include placeholder { - color: var(--wp--preset--color--white) !important; - } -} diff --git a/private/src/styles/blocks/image-block/_main.scss b/private/src/styles/blocks/image-block/_main.scss deleted file mode 100644 index 4531e87e..00000000 --- a/private/src/styles/blocks/image-block/_main.scss +++ /dev/null @@ -1,160 +0,0 @@ -.imageBlock { - position: relative; - display: inline-block; - max-width: 100%; - height: auto; -} - -.imageBlock img { - max-width: 100%; - height: auto; -} - -.imageBlock-wrapper.alignright .imageBlock, -.imageBlock-caption.alignright { - float: right; -} - -.imageBlock-wrapper.aligncentre { - text-align: center; - - .imageBlock { - display: inline-block; - } -} - -.imageBlock-caption.aligncentre { - display: block; - margin-right: auto; - margin-left: auto; -} - -.imageBlock-wrapper.alignleft .imageBlock, -.imageBlock-caption.alignleft { - float: left; -} - -.imageBlock-caption.alignright, -.imageBlock-caption.alignleft { - width: 100%; -} - -.imageBlock-caption.alignright { - text-align: right; -} - -.imageBlock--fixed { - display: block; - min-height: 600px; - height: 600px; - max-height: 600px; - overflow: hidden; -} - -.imageBlock-wrapper.aligncentre .imageBlock--fixed { - background-color: var(--wp--preset--color--grey-lighter); -} - -.imageBlock-wrapper.aligncentre .imageBlock-image img { - display: block; - margin: 0 auto; -} - -.imageBlock--fixed .imageBlock-image { - min-width: 0; - max-width: 100%; -} - -.imageBlock-video { - display: block; - min-width: 100%; - min-height: 100%; -} - -.imageBlock--fixed .imageBlock-image.has-caption { - display: inline-block; - height: 100%; - - img { - max-width: none; - min-height: 100%; - } -} - -.imageBlock-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - background: color-mix(in srgb, var(--wp--preset--color--black) 25%, transparent); -} - -.imageBlock-title, -.imageBlock-content { - margin-right: auto; - margin-left: auto; - max-width: 50%; - text-align: center; - color: var(--wp--preset--color--white); -} - -.imageBlock-overlay > * + * { - margin-top: 30px; -} - -.imageBlock-overlay .imageBlock-title + .imageBlock-content { - margin-top: 15px; -} - -.imageBlock-title { - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--huge); - font-weight: bold; -} - -.imageBlock-content { - font-family: var(--wp--preset--font-family--primary); - font-size: var(--wp--preset--font-size--regular); - - > p:last-child { - margin-bottom: 0; - } -} - -.imageBlock-buttonWrapper .btn + .btn { - margin-left: 24px; -} - -.imageBlock-caption { - margin-top: 7px !important; - font-size: var(--wp--preset--font-size--x-small); - font-family: var(--wp--preset--font-family--primary); - line-height: 1.4; - color: var(--wp--preset--color--grey-base); -} - -.imageBlock.has-parallax { - display: block; - height: 600px; -} - -.imageBlock.has-parallax .imageBlock-overlay { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-repeat: no-repeat; - background-size: cover; - - @include mq(medium-sm) { - background-attachment: fixed; - } -} diff --git a/private/src/styles/blocks/link-group/_editor.scss b/private/src/styles/blocks/link-group/_editor.scss deleted file mode 100644 index 5b4d81c4..00000000 --- a/private/src/styles/blocks/link-group/_editor.scss +++ /dev/null @@ -1,62 +0,0 @@ -.wp-block[data-type="amnesty-core/link-group"]::after { - content: ""; - display: table; - clear: both; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group h2 { - margin-top: 0; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group ul { - margin: 0; - padding: 0; - list-style: none; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group li { - position: relative; - justify-content: space-between; - align-items: stretch; - flex-wrap: wrap; - padding: var(--wp--preset--spacing--half); -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group li > span { - width: calc(100% - 40px); // 40px is url input button width - line-height: 40px; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group .block-editor-url-input__button { - position: absolute; - top: var(--wp--preset--spacing--half); - right: var(--wp--preset--spacing--half); - z-index: 1; - display: flex; - flex-direction: column; - align-items: flex-end; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group .block-editor-url-input .components-base-control__field { - margin-bottom: 0; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group .components-spinner { - width: 18px !important; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group .newtab { - width: 100%; - text-align: right; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group .newtab .components-base-control__field { - display: inline-flex; - flex-direction: row-reverse; - align-items: center; -} - -.editor-styles-wrapper .wp-block-amnesty-core-link-group .newtab .components-checkbox-control__input-container { - margin-right: 0; - margin-left: var(--wp--preset--spacing--half); -} diff --git a/private/src/styles/blocks/link-group/_main.scss b/private/src/styles/blocks/link-group/_main.scss deleted file mode 100644 index fcb8f476..00000000 --- a/private/src/styles/blocks/link-group/_main.scss +++ /dev/null @@ -1,50 +0,0 @@ -.wp-block-amnesty-core-link-group { - padding: 24px; - background-color: var(--wp--preset--color--grey-lighter); -} - -.wp-block-amnesty-core-link-group h2 { - margin-bottom: var(--wp--preset--spacing--single); - font-size: var(--wp--preset--font-size--heading-4); -} - -.wp-block-amnesty-core-link-group ul { - margin: 0; - padding: 0; - list-style: none; -} - -.wp-block-amnesty-core-link-group li { - display: flex; - background-color: var(--wp--preset--color--white); - word-break: break-word; -} - -.wp-block-amnesty-core-link-group li + li { - margin-top: var(--wp--preset--spacing--half); -} - -.wp-block-amnesty-core-link-group li a { - display: flex; - padding: var(--wp--preset--spacing--half); - width: 100%; - height: 100%; - transition: background .3s ease-in-out; - text-decoration: none; -} - -.wp-block-amnesty-core-link-group li a:hover, -.wp-block-amnesty-core-link-group li a:active, -.wp-block-amnesty-core-link-group li a:focus { - background-color: var(--wp--preset--color--grey-lighter); -} - -.wp-block-amnesty-core-link-group li a > svg { - margin-right: var(--wp--preset--spacing--half); - width: 20px; - - .rtl & { - margin-right: 0; - margin-left: var(--wp--preset--spacing--half); - } -} diff --git a/private/src/styles/blocks/linklist/_editor.scss b/private/src/styles/blocks/linklist/_editor.scss deleted file mode 100644 index 8484e0da..00000000 --- a/private/src/styles/blocks/linklist/_editor.scss +++ /dev/null @@ -1,51 +0,0 @@ -.linkList, -.linkList * { - box-sizing: border-box; -} - -.linkList-itemMeta, -.linkList-itemTitle, -.linkList-itemDate { - position: static; - gap: 6px; -} - -.linkList-itemMeta { - display: inline-flex; -} - -.linkList-itemTitle { - display: flex; -} - -.linkList-itemTitle > a::after { - display: none; -} - -.linkList-itemMeta .components-button, -.linkList-itemTitle .components-button, -.linkList-itemDate .components-button { - background: var(--wp--preset--color--white); -} - -.linkList-itemDate { - position: relative; - flex-wrap: wrap; -} - -.linkList-itemDate .dateTerm { - padding: 0; -} - -.linkList-itemDateData { - display: block; - width: 100%; -} - -.linkList-datePicker { - position: absolute; - z-index: 100; - border: 1px solid #949292; - padding: 6px; - background: var(--wp--preset--color--white); -} diff --git a/private/src/styles/blocks/linklist/_main.scss b/private/src/styles/blocks/linklist/_main.scss deleted file mode 100644 index 15f2bf63..00000000 --- a/private/src/styles/blocks/linklist/_main.scss +++ /dev/null @@ -1,110 +0,0 @@ -.linkList { - list-style: none; - margin-left: 0; - padding: 0; -} - -.linkList li { - flex-basis: 100%; -} - -.linkList li + li { - margin-top: 18px; -} - -.linkList-item { - @include state-background(var(--wp--preset--color--grey-base)); - position: relative; - padding: 40px 10px; - width: 100%; - min-height: 171px; - background-color: var(--wp--preset--color--grey-lighter); -} - -.linkList-itemTitle { - margin-bottom: 12px; - margin-top: 12px; - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--regular); - font-weight: normal; - line-height: 1.2; -} - -.linkList-itemTitle > a { - color: var(--wp--preset--color--black); - text-decoration: none; - - &::after { - position: absolute; - content: ""; - top: 0; - right: 0; - bottom: 0; - left: 0; - } -} - -.linkList-itemMeta { - position: absolute; - top: 0; - left: 0; - display: inline-block; - padding: 4px 8px; - text-transform: uppercase; - font-size: var(--wp--preset--font-size--regular); - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); -} - -.linkList-item .linkList-itemMeta > a { - position: relative; - z-index: 2; - color: var(--wp--preset--color--white); - text-decoration: none; -} - -.postInfo-container { - display: flex; - align-items: center; -} - -.linkList-itemDate { - display: flex; - align-items: baseline; - margin-bottom: 0; -} - -.linkList-itemDate .dateDescription { - font-family: var(--wp--preset--font-family--secondary); -} - -.linkList-itemAuthor .authorDescription { - font-family: var(--wp--preset--font-family--secondary); -} - -.linkList-itemDate .dateTerm { - padding-right: 10px; -} - -.linkList-itemAuthor .authorTerm { - padding-right: 10px; -} - -.linkList-itemAuthor { - display: flex; - margin-bottom: 0; -} - -.linkList-authorDivider { - display: inline-flex; -} - -.linkList-authorDivider::before { - content: " "; - height: 12px; - width: 1px; - background: var(--wp--preset--color--black); - margin: 10px; -} diff --git a/private/src/styles/blocks/links-with-icons/_editor.scss b/private/src/styles/blocks/links-with-icons/_editor.scss deleted file mode 100644 index 354a5d53..00000000 --- a/private/src/styles/blocks/links-with-icons/_editor.scss +++ /dev/null @@ -1,216 +0,0 @@ -.wide-column-left .block-editor-block-list__block:first-child, -.wide-column-right .block-editor-block-list__block:last-child { - flex-basis: calc((100% / 3) * 2) !important; -} - -.wide-column-left .block-editor-block-list__block:not(:first-child), -.wide-column-right .block-editor-block-list__block:not(:last-child) { - flex-basis: calc(100% / 3) !important; -} - -.linksWithIcons-group { - display: block; - margin: 0 -30px; - padding: 30px; - font-family: var(--wp--preset--font-family--primary); -} - -.linksWithIcons > * { - margin-top: 40px !important; - margin-right: auto; - margin-left: auto; -} - -.linksWithIcons-group.is-style-square { - display: block; - grid-template-columns: repeat(1, 1fr) !important; -} - -.linksWithIcons-group.is-style-square .linksWithIcons > * { - margin-top: var(--wp--preset--spacing--single) !important; -} - -.linksWithIcons-bigtext { - line-height: 1em !important; -} - -.linksWithIcons-group.is-vertical .block-editor-block-list__block-edit:first-child { - margin-top: 0; -} - -.linksWithIcons-group .block-editor-block-list__layout:first-child { - margin-left: -20px; -} - -.linksWithIcons-group .block-editor-block-list__layout:last-child { - margin-right: -20px; -} - -.linksWithIcons-group.is-style-square .block-editor-block-list__layout:first-child { - margin-left: 0; -} - -.linksWithIcons-group.is-style-square .block-editor-block-list__layout:last-child { - margin-right: 0; -} - -.block-editor-block-list__layout .block-editor-block-list__block[data-type="amnesty-core/repeatable-block"] > .block-editor-block-list__block-edit { - margin-top: 0 !important; - margin-bottom: 0 !important; - padding: 0 30px; -} - -.block-editor-block-list__layout .block-editor-block-list__block[data-type="amnesty-core/repeatable-block"] > .block-editor-block-list__block-edit::before { - bottom: 5px; -} - -.linksWithIcons-group > .block-editor-inner-blocks > .block-editor-block-list__layout { - display: flex; - flex-wrap: wrap; -} - -.linksWithIcons-group > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="amnesty-core/repeatable-block"] { - display: flex; - flex-direction: column; - flex: 1; - width: 0; -} - -.linksWithIcons-group > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="amnesty-core/repeatable-block"] .block-editor-block-list__block-edit { - flex-basis: 100%; -} - -.linksWithIcons-group.is-vertical .block-editor-block-list__layout { - flex-direction: column; -} - -.linksWithIcons-group.is-style-square .block-editor-block-list__block { - margin-bottom: 24px; -} - -.linksWithIcons-group.is-horizontal.is-style-square .block-editor-block-list__block { - margin-top: 0; - margin-right: 0; - margin-left: 24px; - flex: 0 0 calc((100% - (24px * 3)) / 4); - max-width: calc((100% - (24px * 3)) / 4); - - &:first-child, - &:nth-child(4n+5) { - margin-left: 0; - } -} - -@for $cols from 2 through 4 { - .linksWithIcons-group.is-horizontal.has-#{$cols}-items .block-editor-block-list__block { - flex: 0 0 calc(100% / #{$cols}); - max-width: calc(100% / #{$cols}); - } - - .linksWithIcons-group.is-horizontal.is-style-square.has-#{$cols}-items .block-editor-block-list__block { - flex: 0 0 calc((100% - (24px * 3)) / #{$cols}); - max-width: calc((100% - (24px * 3)) / #{$cols}); - } -} - -.linksWithIcons-group.is-horizontal.is-style-square .block-editor-block-list__block .linksWithIcons { - flex-basis: unset; - max-width: 100%; -} - -.linksWithIcons-group .linksWithIcons { - max-width: none; -} - -.linksWithIcons-group .linksWithIcons-bigtext [data-rich-text-placeholder] { - font-size: var(--wp--preset--font-size--huge); -} - -.linksWithIcons-group.is-style-square .linksWithIcons { - flex: 0 0 100%; - max-width: 100%; - margin: 0; - height: 100%; - padding-top: 0; - padding-bottom: 0; -} - -.linksWithIcons-group.is-vertical .block-editor-block-list__block { - margin-right: initial; - margin-left: initial; - flex: 1 0 50%; - max-width: 100%; -} - -.linksWithIcons-group.is-vertical .block-editor-block-list__block-edit { - margin-right: 30px; - margin-left: 30px; -} - -@include mq(600px) { - .linksWithIcons-group .block-editor-block-list__block .block-editor-block-contextual-toolbar { - top: 100%; - } -} - -.linksWithIcons-group.has-1-items.has-background .linksWithIcons { - padding: 20px; -} - -.linksWithIcons-bigtext.has-underline[data-is-placeholder-visible="true"] { - left: 0; - border-bottom: none; -} - -.linksWithIcons-buttonWrapper { - position: relative; -} - -.linksWithIcons-buttonWrapper > div { - display: inline-block; - vertical-align: middle; -} - -.editor-rich-text__tinymce.mce-content-body.linksWithIcons-button { - line-height: 36px; -} - -.linksWithIcons-buttonWrapper .editor-url-input__button { - position: absolute; -} - -.linksWithIcons-buttonWrapper .editor-url-input__button-modal { - position: absolute; - min-width: 300px; - left: -150px; - top: 110%; -} - -.linksWithIcons-group.icon-arrow.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer, -.linksWithIcons-group.icon-ampersand.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer, -.linksWithIcons-group.icon-none.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer { - display: block !important; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); -} - -.linksWithIcons-group.icon-arrow.is-vertical .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"] .linksWithIcons-spacer { - display: block !important; -} - -.linksWithIcons-group.is-horizontal .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"]:last-child .linksWithIcons-spacer, -.linksWithIcons-group.is-vertical .block-editor-block-list__block[data-type="amnesty-core/links-with-icons"]:last-child .linksWithIcons-spacer { - display: none !important; -} - -.linksWithIcons-group .linksWithIcons-spacer:last-child { - display: block !important; - margin-left: auto; - margin-right: auto; -} - -.linksWithIcons-group.has-no-lines .linksWithIcons-spacer:last-child { - display: none !important; -} diff --git a/private/src/styles/blocks/links-with-icons/_group.scss b/private/src/styles/blocks/links-with-icons/_group.scss deleted file mode 100644 index 1a860b61..00000000 --- a/private/src/styles/blocks/links-with-icons/_group.scss +++ /dev/null @@ -1,234 +0,0 @@ -.linksWithIcons-group { - display: flex; - align-items: flex-start; - justify-content: center; - flex-wrap: wrap; - - @include mq(medium-sm) { - justify-content: space-around; - align-items: stretch; - } -} - -.linksWithIcons-group.has-background { - padding: 12px 0; -} - -.linksWithIcons-group.has-1-items { - padding: 0; -} - -.linksWithIcons-group.has-1-items.has-background { - padding: 60px 0; -} - -.linksWithIcons-group .linksWithIcons { - flex-basis: 100%; -} - -.linksWithIcons-group.is-vertical { - flex-direction: column; - justify-content: space-between; - margin: 0 auto; - max-width: 456px; -} - -.linksWithIcons-group.is-vertical .linksWithIcons, -.linksWithIcons-group.is-vertical .linksWithIcons-spacer { - display: flex; - flex-direction: column; - align-items: center; - flex-basis: auto; - align-self: center; -} - -.linksWithIcons-group.is-horizontal:not(.is-style-square) { - flex-direction: row; - align-items: flex-start; - justify-content: space-evenly; -} - -.linksWithIcons-group.is-horizontal .linksWithIcons { - @include mq(medium-sm) { - flex-basis: 33%; - } -} - -.linksWithIcons-group.has-2-items .linksWithIcons { - @include mq(medium-sm) { - flex-basis: 49%; - } -} - -.linksWithIcons-group.has-3-items .linksWithIcons { - @include mq(medium-sm) { - flex-basis: 33%; - } -} - -.linksWithIcons-group.is-horizontal.has-4-items .linksWithIcons { - @include mq(x-small) { - padding: 0 5px; - - &:nth-child(7) { - margin-top: 60px; - } - } - - @include mq(medium-sm) { - flex-basis: 24%; - } -} - -.rowColumn .linksWithIcons-spacer { - @include mq(medium-sm) { - display: none !important; - } -} - -.linksWithIcons-group.icon-none .linksWithIcons-spacer::before -.linksWithIcons-group.icon-none .linksWithIcons-spacer::after { - display: none !important; -} - -.linksWithIcons-group.icon-arrow .linksWithIcons-spacer, -.linksWithIcons-group.icon-ampersand .linksWithIcons-spacer { - position: relative; -} - -.linksWithIcons-group.icon-arrow.is-horizontal .linksWithIcons-spacer::before { - pointer-events: none; - background-repeat: no-repeat; - background-size: 313px 300px; - background-position: -10px -162px; - left: calc(50% - 20px); - top: calc(50% - 20px); - z-index: 1; - width: 40px; - height: 40px; - content: ""; - position: absolute; - display: block; - background-color: var(--wp--preset--color--black); -} - -.linksWithIcons-group.icon-arrow.is-horizontal .linksWithIcons-spacer::after { - pointer-events: none; - background-image: url("../images/sprite.svg"), none; - background-repeat: no-repeat; - background-size: 313px 300px; - background-position: -10px -162px; - left: calc(50% - 20px); - top: calc(50% - 20px); - z-index: 1; - width: 40px; - height: 40px; - content: ""; - position: absolute; - display: block; - - @include mq(medium-sm) { - transform: rotate(-90deg); - - .rtl & { - transform: rotate(90deg); - } - } -} - -.linksWithIcons-group.icon-arrow.is-vertical .linksWithIcons-spacer::before { - pointer-events: none; - background-repeat: no-repeat; - background-size: 313px 300px; - background-position: -10px -162px; - left: calc(50% - 20px); - top: calc(50% - 20px); - z-index: 1; - width: 40px; - height: 40px; - content: ""; - position: absolute; - display: block; - background-color: var(--wp--preset--color--black); -} - -.linksWithIcons-group.icon-arrow.is-vertical .linksWithIcons-spacer::after { - pointer-events: none; - background-image: url("../images/sprite.svg"), none; - background-repeat: no-repeat; - background-size: 313px 300px; - background-position: -10px -162px; - left: calc(50% - 20px); - top: calc(50% - 20px); - z-index: 1; - width: 40px; - height: 40px; - content: ""; - position: absolute; - display: block; -} - -.linksWithIcons-group.icon-ampersand .linksWithIcons-spacer::before { - pointer-events: none; - left: calc(50% - 20px); - top: calc(50% - 20px); - z-index: 1; - width: 40px; - height: 40px; - content: ""; - position: absolute; - display: block; - background: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); -} - -.linksWithIcons-group.icon-ampersand .linksWithIcons-spacer::after { - pointer-events: none; - left: 50%; - top: 50%; - transform: translateY(-50%) translateX(-50%); - font-weight: bold; - font-style: italic; - z-index: 1; - font-size: 30px; - content: "\0026"; - position: absolute; - display: block; - color: var(--wp--preset--color--white); - - .rtl & { - transform: translateY(-50%) translateX(-50%) rotateY(180deg); - } -} - -.linksWithIcons-group.has-very-light-gray-background-color { - background-color: var(--wp--preset--color--grey-lighter); -} - -.linksWithIcons-group.is-style-square { - display: grid; - column-gap: var(--wp--preset--spacing--single); - row-gap: var(--wp--preset--spacing--single); - grid-template-columns: repeat(1, 1fr); - grid-auto-rows: 1fr; - - @include mq(x-small) { - grid-template-columns: repeat(2, 1fr); - } - - @include mq(small) { - grid-template-columns: repeat(3, 1fr); - } - - @include mq(large) { - grid-template-columns: repeat(4, 1fr); - } -} - -.linksWithIcons-group.is-style-square.linksWithIcons-group.has-1-items, -.linksWithIcons-group.is-style-square.linksWithIcons-group.has-2-items, -.linksWithIcons-group.is-style-square.linksWithIcons-group.has-3-items { - @include mq(large) { - grid-template-columns: repeat(3, 1fr); - } -} diff --git a/private/src/styles/blocks/links-with-icons/_main.scss b/private/src/styles/blocks/links-with-icons/_main.scss deleted file mode 100644 index a092d78e..00000000 --- a/private/src/styles/blocks/links-with-icons/_main.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import "./group"; -@import "./elements"; -@import "./spacer"; - -.rowColumn .linksWithIcons { - margin: 0 auto; -} diff --git a/private/src/styles/blocks/list-block/_editor.scss b/private/src/styles/blocks/list-block/_editor.scss deleted file mode 100644 index f40177bb..00000000 --- a/private/src/styles/blocks/list-block/_editor.scss +++ /dev/null @@ -1,8 +0,0 @@ -.block-editor-block-list__layout .block-editor-block-list__block { - clear: both; -} - -.wp-block[data-align="center"]:has(.block-editor-block-list__layout .block-editor-block-list__block) { - display: flex; - justify-content: center; -} diff --git a/private/src/styles/blocks/petition-list/_main.scss b/private/src/styles/blocks/petition-list/_main.scss deleted file mode 100644 index eb33d2bf..00000000 --- a/private/src/styles/blocks/petition-list/_main.scss +++ /dev/null @@ -1,114 +0,0 @@ -.grid .petition-item { - padding: 0; -} - -.petition-item { - background: var(--wp--preset--color--grey-lighter); - display: flex; - justify-content: flex-start; - flex-direction: column; -} - -.petition-item, -.petition-item * { - box-sizing: border-box; -} - -.petition-item .petition-itemImage { - display: flex; - width: 100%; - height: 300px; - object-fit: cover; -} - -.petition-item figure { - position: relative; - margin: 0; - padding: 0; - width: 100%; -} - -.petition-item .petition-itemImageCaption { - position: absolute; - bottom: 0; - left: 5px; - background: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); - padding: 4px 8px; - text-transform: uppercase; - font-family: var(--wp--preset--font-family--secondary); - - a { - color: var(--wp--preset--color--white); - text-transform: uppercase; - font-family: var(--wp--preset--font-family--secondary); - } -} - -.petition-item .petition-item-content { - width: 100%; - padding: 14px; - display: flex; - height: 100%; - flex-direction: column; -} - -.petition-item .petition-itemTitle { - margin-top: 0; - font-family: var(--wp--preset--font-family--secondary); - color: var(--wp--preset--color--black); - flex-grow: 1; -} - -.petition-item .petition-itemTitle a { - font-family: var(--wp--preset--font-family--secondary); - color: var(--wp--preset--color--black); - font-weight: bold; - font-size: var(--wp--preset--font-size--heading-4); -} - -.petition-item .petition-itemTitle > * { - // stylelint-disable-next-line value-no-vendor-prefix -- this is necessary - display: -webkit-box; - line-clamp: 3; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; -} - -.petition-item .petition-itemExcerpt { - text-transform: uppercase; - font-family: var(--wp--preset--font-family--secondary); - line-height: 1.8; -} - -.petition-item .petition-itemCta { - display: block; - text-transform: uppercase; - width: 100%; -} - -.petition-layout { - display: flex; - flex-wrap: wrap; -} - -.petition-layout .petition-item { - max-width: 330px; - margin-right: 24px; - margin-top: 24px; - padding: 0; -} - -.petition-itemImage img { - width: 100%; - object-fit: cover; -} - -// .grid-many { -// display: grid; -// /* grid-auto-flow: column; */ -// grid-template-columns: repeat(4, 1fr); -// row-gap: 20px; -// } diff --git a/private/src/styles/blocks/postlist/_categories.scss b/private/src/styles/blocks/postlist/_categories.scss deleted file mode 100644 index 7ce6ae11..00000000 --- a/private/src/styles/blocks/postlist/_categories.scss +++ /dev/null @@ -1,182 +0,0 @@ -.postlist-categoriesContainer { - display: flex; - align-items: center; -} - -.postlist-categoriesContainer nav { - width: 100%; -} - -.postlist-categories { - display: flex; - flex: 1 1 100%; - padding: 20px !important; - margin-bottom: 0; - margin-left: 0; - max-width: 100%; - overflow-x: auto; - list-style: none; -} - -.postlist-categories::after { - content: "flickity"; - display: none; - - @include mq(medium) { - content: ""; - } -} - -.postlist-categories.use-flickity::after { - content: "flickity"; - display: none; -} - -.postlist-categories.flickity-enabled { - display: block; - padding: 0; - - .flickity-viewport { - flex: 1; - } -} - -.postlist-categories:not(.flickity-enabled) li { - flex: 1 0 auto; - list-style: none; - - @include mq(xx-small) { - @include flexy-grid(2, flexy-gutter()); - } - - @include mq(x-small) { - @include flexy-grid(3, flexy-gutter()); - } - - @include mq(medium) { - @include flexy-grid(4, flexy-gutter()); - flex-grow: 1; - max-width: none; - } -} - -.postlist-categories.flickity-enabled li { - flex: 1 0 100%; - width: 100%; - - @include mq(x-small) { - @include flexy-grid(2, flexy-gutter()); - } - - @include mq(medium) { - @include flexy-grid(3, flexy-gutter()); - flex-grow: 1; - max-width: none; - } -} - -.postlist-categories li + li { - margin-left: flexy-gutter(); - - .rtl & { - margin-right: flexy-gutter(); - margin-left: 0; - } -} - -.postlist-categories a { - display: flex; - align-items: center; - justify-content: center; - padding: 11px 16px; - width: 100%; - height: 100%; - color: var(--wp--preset--color--black); - border: 1px solid var(--wp--preset--color--grey-light); - text-decoration: none !important; - - &:hover, - &:active, - &:focus { - border-color: var(--wp--preset--color--grey-light); - } -} - -// IE11 hack for flex fail - -/* stylelint-disable-next-line selector-type-no-unknown */ -_:-ms-fullscreen, -:root .postlist-categories a { - white-space: normal; -} - -.postlist-categories .is-current a { - color: var(--wp--preset--color--white); - background-color: var(--wp--preset--color--black); - border-color: var(--wp--preset--color--black); -} - -[data-slider-next], -[data-slider-prev] { - display: none; - background-color: transparent; - border: 2px solid transparent; - transition: background-color .3s ease-in-out, opacity .3s ease-in-out; - cursor: pointer; - - &:hover { - background-color: var(--wp--preset--color--grey-lighter); - } - - &:focus, - &:active { - border: 2px solid var(--wp--preset--color--orange-base); - } -} - -[data-slider-next]:focus-within, -[data-slider-prev]:focus-within { - border: 2px solid var(--wp--preset--color--orange-base); -} - -[data-slider-next][disabled], -[data-slider-prev][disabled] { - opacity: .4; - cursor: not-allowed; -} - -.flickity-enabled [data-slider-prev] { - order: -1; -} - -.flickity-enabled [data-slider-next], -.flickity-enabled [data-slider-prev] { - display: flex; - align-items: center; - justify-content: center; - width: 44px; - height: 44px; - text-indent: -1000px; - overflow: hidden; - padding: 0; -} - -[data-slider-prev]::after { - @include icon_scale(234px, 240px, 16px, 16px, 2); - content: ""; - display: block; - - .rtl & { - background-position: -220px -530px; - } -} - -[data-slider-next]::after { - @include icon_scale(110px, 265px, 16px, 16px, 2); - content: ""; - display: block; - - .rtl & { - background-position: -468px -480px; - } -} diff --git a/private/src/styles/blocks/postlist/_header.scss b/private/src/styles/blocks/postlist/_header.scss deleted file mode 100644 index c6094dd0..00000000 --- a/private/src/styles/blocks/postlist/_header.scss +++ /dev/null @@ -1,67 +0,0 @@ -.postlist-header { - display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - margin-bottom: 20px; -} - -.postlist-headerTitle { - margin-bottom: 0; - width: 100%; - float: none; - font-size: var(--wp--preset--font-size--heading-4); - line-height: 1.2; - - @include mq(xm-small) { - float: left; - width: auto; - } -} - -.postlist-header label { - margin-top: 12px; - margin-bottom: 8px; - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--x-small); - font-weight: bold; - text-align: left; - letter-spacing: .3px; - - @include mq(xm-small) { - margin-right: 16px; - margin-bottom: 0; - margin-top: 0; - text-align: right; - - .rtl & { - margin-right: 0; - margin-left: 16px; - } - } -} - -.postlist-sort { - display: flex; - align-items: center; - flex-wrap: wrap; - margin-right: 0; - width: 100%; - float: none; - - @include mq(xm-small) { - float: right; - width: auto; - } -} - -.postlist-sort .element-select { - margin-right: 0; - margin-left: 0; - width: 100%; - - @include mq(xm-small) { - margin-right: 0; - width: auto; - } -} diff --git a/private/src/styles/blocks/postlist/_main.scss b/private/src/styles/blocks/postlist/_main.scss deleted file mode 100644 index c590ea80..00000000 --- a/private/src/styles/blocks/postlist/_main.scss +++ /dev/null @@ -1,13 +0,0 @@ -@import "./categories"; -@import "./header"; -@import "./pagination"; -@import "./post"; -@import "./post-search"; - -.postlist { - display: flex; - - @include mq($until: medium-sm) { - flex-wrap: wrap; - } -} diff --git a/private/src/styles/blocks/postlist/_post-editor.scss b/private/src/styles/blocks/postlist/_post-editor.scss deleted file mode 100644 index 6dfe1a22..00000000 --- a/private/src/styles/blocks/postlist/_post-editor.scss +++ /dev/null @@ -1,14 +0,0 @@ -.wp-block-bigbite-postlist .post { - min-height: auto !important; - align-items: center; - - &:hover { - background-color: color-mix(in srgb, var(--wp--preset--color--black) 5%, transparent);; - } -} - -.wp-block-bigbite-postlist label, -.wp-block-bigbite-postlist input, -.wp-block-bigbite-postlist select { - text-transform: none; -} diff --git a/private/src/styles/blocks/postlist/_post.scss b/private/src/styles/blocks/postlist/_post.scss deleted file mode 100644 index 2652482e..00000000 --- a/private/src/styles/blocks/postlist/_post.scss +++ /dev/null @@ -1,194 +0,0 @@ -.post { - position: relative; - width: 100%; - - @include mq(medium-sm) { - min-height: 460px; - } -} - -@include mq(medium-sm) { - .tax-location .post+.post { - margin-left: flexy-gutter(); - } -} - -@include mq($until: medium-sm) { - .tax-location .post+.post { - margin-top: flexy-gutter(); - } -} - -.post-header { - max-width: 100%; -} - -.post-content { - width: 100%; - padding: 12px; -} - -.post-content .post-content { - padding: 0; -} - -.post-category { - @include state-background(var(--wp--preset--color--grey-darker)); - display: inline-block; - padding: 4px 8px; - color: var(--wp--preset--color--white); - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - font-size: 18px; - text-transform: uppercase; - background-color: var(--wp--preset--color--black); -} - -.post-meta { - display: block; - padding: 8px 8px 0; - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - font-size: 14px; - color: var(--wp--preset--color--grey-dark); - background-color: var(--wp--preset--color--white); -} - -.post-title { - padding: 0 8px; - margin-bottom: 0; - font-size: 28px; -} - -.post-title a { - color: var(--wp--preset--color--black); -} - -.post-title span { - background-color: var(--wp--preset--color--white); - box-shadow: -8px 0 0 0 var(--wp--preset--color--white), 8px 0 0 0 var(--wp--preset--color--white); - box-decoration-break: clone; - line-height: 1.2; -} - -.postImage--full { - position: relative; - display: flex; - background-size: cover; - background-position: center; -} - -.postImage--full .post-content { - display: flex; - flex-direction: column; - justify-content: flex-end; - align-items: flex-start; -} - -.postImage--none, -.postImage--small { - display: flex; - flex-direction: column; -} - -.postImage--none .post-content, -.postImage--small .post-content { - position: relative; - background-color: var(--wp--preset--color--white); - flex: 1 1 auto; -} - -.postImage--small .post-category a { - position: absolute; - bottom: 100%; - left: 12px; - - .rtl & { - right: 12px; - left: unset; - } -} - -.postImage--none .post-title, -.postImage--small .post-title { - margin-top: 12px; - padding: 0; -} - -.postImage--none .post-meta, -.postImage--small .post-meta { - padding: 0; -} - -.postImage--none .post-meta { - margin-top: 12px; -} - -.postImage--none .post-content { - display: flex; - flex-direction: column; - align-items: flex-start; -} - -.postImage--none .post-content::after { - content: ""; - display: block; - height: 8px; - width: 75%; - margin-top: 12px; - background-color: var(--wp--preset--color--black); - - @include mq(x-small) { - margin-top: auto; - } -} - -.post-figure img { - display: block; - width: 100%; - height: 100%; - object-fit: cover; -} - -.post-content a { - position: relative; - z-index: 1; -} - -.post .post-figure img { - backface-visibility: hidden; - transition: opacity .3s ease-in-out; -} - -.post-figure { - position: relative; - background-color: var(--wp--preset--color--grey-darkest); - overflow: hidden; - max-height: 200px; - height: 100%; -} - -.post:hover, -.post:focus { - .post-figure img { - opacity: .6; - } -} - -.post:focus-within { - .post-figure img { - opacity: .6; - } -} - -:lang(fa-IR) .post-category a { - display: none; -} - -.page-template-searchpage .post { - min-height: auto; -} - -.search-results .post { - min-height: auto; -} diff --git a/private/src/styles/blocks/regions/_main.scss b/private/src/styles/blocks/regions/_main.scss deleted file mode 100644 index 8208e776..00000000 --- a/private/src/styles/blocks/regions/_main.scss +++ /dev/null @@ -1,105 +0,0 @@ -.wp-block-amnesty-core-regions { - padding: 24px; -} - -.wp-block-amnesty-core-regions h2 { - text-transform: uppercase; -} - -.wp-block-amnesty-core-regions ul, -.wp-block-amnesty-core-regions ul ul { - margin: 0 !important; - padding: 0 !important; - list-style: none; -} - -.wp-block-amnesty-core-regions .listItems { - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} - -.wp-block-amnesty-core-regions .listItems > li { - margin-top: var(--wp--preset--spacing--single); - flex: 1 1 100%; - - @include mq(x-small) { - flex-basis: 50%; - max-width: 50%; - } - - @include mq(medium) { - flex-basis: 33%; - max-width: 33%; - } - - @include mq(x-large) { - flex-basis: 25%; - max-width: 25%; - } - - @include mq(xx-large) { - flex-basis: auto; - } -} - -.wp-block-amnesty-core-regions .listItems li a { - font-weight: normal; - text-decoration: none; - text-decoration-skip-ink: auto; - - &:hover, - &:active, - &:focus { - text-decoration: underline; - } -} - -.wp-block-amnesty-core-regions .listItems > li > a { - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; -} - -.wp-block-amnesty-core-regions .has-children { - margin-bottom: 24px; -} - -.wp-block-amnesty-core-regions .children { - margin-top: var(--wp--preset--spacing--single); - - @include mq(medium) { - max-width: 90%; - } - - @include mq(x-large) { - max-width: 85%; - } -} - -.wp-block-amnesty-core-regions .has-children .has-children li::before { - content: "- "; -} - -.wp-block-amnesty-core-regions .has-children .has-children .children { - margin-top: 0; -} - -.wp-block-amnesty-core-regions .is-left-aligned { - text-align: left; - - .rtl & { - text-align: right; - } -} - -.wp-block-amnesty-core-regions .is-center-aligned { - text-align: center; -} - -.wp-block-amnesty-core-regions .is-right-aligned { - text-align: right; - - .rtl & { - text-align: left; - } -} diff --git a/private/src/styles/blocks/section/_editor.scss b/private/src/styles/blocks/section/_editor.scss deleted file mode 100644 index 4fc690f6..00000000 --- a/private/src/styles/blocks/section/_editor.scss +++ /dev/null @@ -1,16 +0,0 @@ -.editor-styles-wrapper .section:not(.section--tinted) { - padding-right: 0; - padding-left: 0; -} - -.section--has-bg-overlay::before { - z-index: 0 !important; -} - -.section--textWhite { - color: var(--wp--preset--color--white) !important; - - @include headings { - color: var(--wp--preset--color--white) !important; - } -} diff --git a/private/src/styles/blocks/section/_main.scss b/private/src/styles/blocks/section/_main.scss deleted file mode 100644 index 5ae013da..00000000 --- a/private/src/styles/blocks/section/_main.scss +++ /dev/null @@ -1,120 +0,0 @@ -.section { - @include clearfix; - padding: 25px; - color: var(--wp--preset--color--black); -} - -.section.is-fullWidth--mobile, -.section.is-fullWidth--mobile .container { - @include mq($until: small) { - padding: 0; - width: 100%; - } -} - -.section--tinted { - background-color: var(--wp--preset--color--grey-lighter); - width: 100%; - max-width: 1468px; - margin: 0 auto; -} - -.section--dark { - background-color: var(--wp--preset--color--grey-lighter); -} - -.section--has-bg-image { - display: flex; - align-items: center; - background-size: cover; - justify-content: center; - position: relative; -} - -.ie .section--has-bg-image .container { - margin: 0; -} - -.section--bgOrigin-center { - background-position: center; -} - -.section--bgOrigin-bottom { - background-position: bottom; -} - -.section--bgOrigin-top { - background-position: top; -} - -.section--bgOrigin-left { - background-position: left; -} - -.section--bgOrigin-right { - background-position: right; -} - -.section--textWhite { - color: var(--wp--preset--color--white); - - @include headings { - color: var(--wp--preset--color--white); - } -} - -.section--textWhite .wp-block-button__link { - color: var(--wp--preset--color--white); -} - -.section--topSpacing { - margin-top: 20px; -} - -.section--bottomSpacing { - margin-bottom: 20px; -} - -.section .container > *, -.article-content > * { - margin-bottom: 0; -} - -.section .container > *:not(style) + *, -.article-content > * + * { - margin-top: 24px; -} - -.section--no-padding { - padding: 0; -} - -[data-type="amnesty-core/block-row"], -[data-type="amnesty-core/block-section"] { - width: 100% !important; - max-width: none !important; -} - -.section--textWhite a { - color: var(--wp--preset--color--white); -} - -.section--has-bg-overlay > * { - z-index: 2; -} - -.section--has-bg-overlay { - position: relative; -} - -.section--has-bg-overlay::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - content: ""; - display: block; - background: rgba(0, 0, 0, .5); -} diff --git a/private/src/styles/blocks/slider/_editor.scss b/private/src/styles/blocks/slider/_editor.scss deleted file mode 100644 index 4a078a78..00000000 --- a/private/src/styles/blocks/slider/_editor.scss +++ /dev/null @@ -1,20 +0,0 @@ -.slide { - .editor-url-input__button { - position: relative; - margin-left: 16px; - } - - .editor-url-input__button-modal { - position: absolute; - left: 0; - width: 340px; - } -} - -.slide-callToAction .block-editor-url-input__button .components-toolbar__control { - background-color: var(--wp--preset--color--grey-base); -} - -.slide-callToAction .btn span { - color: var(--wp--preset--color--black); -} diff --git a/private/src/styles/blocks/slider/_main.scss b/private/src/styles/blocks/slider/_main.scss deleted file mode 100644 index ff371294..00000000 --- a/private/src/styles/blocks/slider/_main.scss +++ /dev/null @@ -1,508 +0,0 @@ -[data-type="amnesty-core/block-slider"] { - max-width: 100% !important; - width: 100% !important; -} - -.slider-nav { - display: flex; -} - -.slider-navButton { - position: relative; - display: flex; - align-items: center; - justify-content: center; - text-align: center; - min-height: 56px; - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--black); - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--small); - text-transform: uppercase; - flex: 1 1 auto; - font-weight: bold; - border: none; -} - -.slider-navButton.is-nav-selected { - background-color: var(--wp--preset--color--white); - transform: translateY(-4px); -} - -.slider-navButton.is-nav-selected::after { - content: ""; - position: absolute; - top: calc(100% - 4px); - left: 0; - display: block; - width: 100%; - height: 4px; - background-color: var(--wp--preset--color--black); -} - -.slide { - display: flex; - width: 100%; - min-height: 500px; - background-color: var(--wp--preset--color--grey-base); - background-size: cover; - background-position: center center; - background-repeat: no-repeat; - - @include mq(small) { - min-height: 670px; - padding: 40px 65px; - } - - .rtl & { - justify-content: flex-end; - } -} - -.slide.is-center-aligned { - @include mq(small) { - justify-content: center; - text-align: center; - - .slide-contentContainer { - margin-right: auto; - margin-left: auto; - } - - h1.slide-title, - h2.slide-subtitle, - .slide-content { - text-align: center; - } - - .slide-callToAction { - justify-content: center; - } - } -} - -.slide.is-right-aligned { - @include mq(small) { - justify-content: flex-end; - - .rtl & { - justify-content: flex-start; - } - - .slide-contentContainer { - margin-left: auto; - - .rtl & { - margin-right: auto; - margin-left: 0; - } - } - - .slide-callToAction { - justify-content: flex-end; - - .rtl & { - justify-content: flex-start; - } - } - } -} - -.slides-container { - position: relative; -} - -.slides-arrow { - position: absolute; - top: 50%; - left: 0; - display: none; - background-color: var(--wp--preset--color--white); - width: 50px; - height: 50px; - overflow: hidden; - text-indent: -1000vw; - border: none; - transform: translateY(-50%); - z-index: 10; - cursor: pointer; -} - -.slides-arrow::after { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.slides-arrow--next { - right: 0; - left: initial; - - .rtl & { - right: initial; - left: 0; - } -} - -.rtl .slides-arrow--previous { - right: 0; - left: initial; -} - -.slides-arrow--next::after { - @include icon_scale(110px, 265px, 16px, 16px, 2); - content: ""; - display: block; - - .rtl & { - @include icon_scale(234px, 240px, 16px, 16px, 2); - } -} - -.slides-arrow--previous::after { - @include icon_scale(234px, 240px, 16px, 16px, 2); - content: ""; - display: block; - - .rtl & { - @include icon_scale(110px, 265px, 16px, 16px, 2); - } -} - -.slide-contentContainer { - position: relative; - display: flex; - flex-direction: column; - align-self: flex-start; - min-width: 100%; - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); - padding: 16px; - - @include mq(small) { - max-width: 500px; - min-width: 250px; - } - - & > * { - margin-bottom: 0; - } - - & > * + * { - margin-top: 12px; - } - - h1, h2 { - font-family: var(--wp--preset--font-family--secondary); - } - - p, .slide-content { - font-family: var(--wp--preset--font-family--primary); - } - - h1, h2, p, span, .slide-content { - color: var(--wp--preset--color--white); - } -} - -.slide.has-opaque-background .slide-contentContainer { - background: linear-gradient(to bottom, color-mix(in srgb, var(--wp--preset--color--black) 50%, transparent) 90%, transparent 100%); -} - -.slide.has-transparent-background .slide-contentContainer { - background: transparent; -} - -.slide-callToAction { - display: flex; - align-items: center; -} - -.slider { - position: relative; - max-width: 1468px; - margin: 0 auto; - width: 100%; - - .flickity-enabled { - display: flex; - } - - .flickity-viewport { - order: 2; - width: 100%; - height: auto !important; - } - - .flickity-slider { - position: relative !important; - display: flex; - left: auto !important; - - .rtl & { - right: auto !important; - } - } - - .slide { - flex: 1 0 100%; - flex-direction: row; - left: auto !important; - position: relative !important; - transform: none !important; - - .rtl & { - flex-direction: row-reverse; - right: auto !important; - } - } - - .slider-nav { - width: 100%; - } - - .has-arrows .slider-nav { - max-width: calc(100% - 88px); - } - - .slider-navButton { - width: 100%; - flex: 1 0 auto; - flex-direction: row; - left: auto !important; - position: relative !important; - transform: none !important; - - .rtl & { - flex-direction: row-reverse; - right: auto !important; - } - - @include mq(small) { - width: auto; - } - } -} - -.slider-navContainer { - display: flex; - - [data-slider-next] { - order: 3; - - .rtl & { - order: 1; - } - } - - [data-slider-prev] { - order: 1; - - .rtl & { - order: 3; - } - } - - .slider-nav { - order: 2; - } - - [data-slider-next], - [data-slider-prev] { - display: none; - height: auto; - } - - &.has-arrows > [data-slider-next], - &.has-arrows > [data-slider-prev] { - display: flex; - } -} - -.slide-contentWrapper { - width: 100%; - max-height: 500px; - - @include mq(small) { - max-height: 670px; - } -} - -.slide-contentWrapper.is-open { - background-color: color-mix(in srgb, var(--wp--preset--color--black) 40%, transparent); - overflow-y: scroll; - - @include mq(small) { - background-color: transparent; - } - - &::before { - content: attr(data-tooltip); - position: absolute; - right: 0; - bottom: 0; - left: 0; - display: block; - padding-bottom: 20px; - color: var(--wp--preset--color--white); - text-align: center; - - @include mq(small) { - display: none; - } - } -} - -.slide-contentWrapper.is-open .slide-contentContainer { - z-index: 2; - background: var(--wp--preset--color--black); -} - -.slide-contentWrapper.is-open .slide-content { - height: auto; -} - -.slide-contentWrapper.is-open .slider-toggleContent::before { - transform: translate(-50%, -50%) rotate(180deg); -} - -.slide-content { - position: relative; - height: 45px; - overflow: hidden; - padding-right: 50px; - - .rtl & { - padding-right: 0; - padding-left: 50px; - } - - @include mq(small) { - height: auto; - padding-right: 0; - - .rtl & { - padding-left: 0; - } - } -} - -.slider-toggleContent { - position: absolute; - right: 0; - top: 0; - display: block; - height: 34px; - width: 34px; - border: 1px solid var(--wp--preset--color--white); - background-color: transparent; - text-indent: -1000vw; - - .rtl & { - left: 0; - right: auto; - } - - &::before { - @include icon_scale(271px, 131px, 16px, 16px, 1.7); - position: absolute; - top: 50%; - left: 50%; - content: ""; - display: block; - transform: translate(-50%, -50%); - } - - @include mq(small) { - display: none; - } -} - -h1.slide-title { - font-size: var(--wp--preset--font-size--heading-2); - text-transform: uppercase; - color: var(--wp--preset--color--white) !important; - - .rtl & { - text-align: right; - } -} - -h2.slide-subtitle { - font-size: var(--wp--preset--font-size--heading-3); - color: var(--wp--preset--color--white) !important; - - .rtl & { - text-align: right; - } -} - -.slide-content .btn { - margin-top: 6px; - - @include mq(small) { - margin-top: 24px; - } -} - -.slide-content p { - font-size: var(--wp--preset--font-size--regular); - - &:last-child { - margin-bottom: 0; - } -} - -.slide-timelineContent { - position: absolute; - left: 0; - bottom: 0; - width: 100%; - background: rgba(255, 255, 255, .7); - color: var(--wp--preset--color--black); - padding: 20px; - text-align: center; -} - -.timeline-dark .slide-timelineContent { - background: rgba(0, 0, 0, .3); - color: var(--wp--preset--color--white); -} - -.timeline-light .slide-timelineContent { - background: rgba(255, 255, 255, .7); - color: var(--wp--preset--color--black); -} - -.slide-timelineContent .slide-timelineContent-inner { - max-width: 1000px; - margin: 0 auto; -} - -.slider-title { - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - background: var(--wp--preset--color--white); - padding: 20px; - z-index: 1; - font-family: var(--wp--preset--font-family--secondary); - text-transform: uppercase; - font-size: var(--wp--preset--font-size--regular); - - @include mq(small) { - font-size: var(--wp--preset--font-size--large); - } -} - -.slider.timeline-light .image-metadata { - background-color: transparent; - color: var(--wp--preset--color--black); -} - -.slider.timeline-dark .image-metadata { - background-color: transparent; - color: var(--wp--preset--color--white); -} diff --git a/private/src/styles/blocks/stat-counter/_main.scss b/private/src/styles/blocks/stat-counter/_main.scss deleted file mode 100644 index 3183a3f5..00000000 --- a/private/src/styles/blocks/stat-counter/_main.scss +++ /dev/null @@ -1,20 +0,0 @@ -.wp-block-amnesty-core-counter { - font-family: var(--wp--preset--font-family--secondary); - font-size: 85px; - font-weight: bold; - line-height: normal; -} - -.wp-block-amnesty-core-counter.aligncenter { - text-align: center; -} - -.wp-block-amnesty-core-counter.alignright { - text-align: right; - float: none !important; -} - -.wp-block-amnesty-core-counter.alignleft { - text-align: left; - float: none !important; -} diff --git a/private/src/styles/blocks/sutori-embed/_main.scss b/private/src/styles/blocks/sutori-embed/_main.scss deleted file mode 100644 index fd0e3a6d..00000000 --- a/private/src/styles/blocks/sutori-embed/_main.scss +++ /dev/null @@ -1,16 +0,0 @@ -.sutori-toggle { - margin-top: 24px; - text-align: center; - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--larger); - text-decoration: underline; - text-decoration-skip-ink: auto; -} - -.sutori-embed iframe { - display: none; -} - -.sutori-embed iframe.is-open { - display: block; -} diff --git a/private/src/styles/blocks/tabbed-content/_main.scss b/private/src/styles/blocks/tabbed-content/_main.scss deleted file mode 100644 index 47854114..00000000 --- a/private/src/styles/blocks/tabbed-content/_main.scss +++ /dev/null @@ -1,110 +0,0 @@ -.wp-block-bigbite-tabs .tabsContainer { - display: flex !important; - background-color: var(--wp--preset--color--grey-lighter) !important; - overflow: hidden !important; - padding: 0 44px; -} - -.wp-block-bigbite-tabs .tabsContainer.has-no-nav-arrows { - gap: 0; - padding: 0; -} - -.wp-block-bigbite-tabs .tabsContainer.flickity-enabled { - display: block !important; -} - -.wp-block-bigbite-tabs.is-style-default .tabsContainer, -.wp-block-bigbite-tabs.is-style-grey .tabsContainer { - background-color: var(--wp--preset--color--grey-lighter) !important; -} - -.wp-block-bigbite-tabs.is-style-light .tabsContainer { - background-color: var(--wp--preset--color--white) !important; - color: var(--wp--preset--color--black) !important; -} - -.wp-block-bigbite-tabs .tabsContainer button.tab { - color: var(--wp--preset--color--black) !important; - width: 100%; - display: flex; - justify-content: center; - font-family: var(--wp--preset--font-family--secondary); - min-height: 100% !important; - cursor: pointer; - transition: background-color .5s ease; - white-space: unset; - border: solid transparent !important; - border-width: 0 0 6px 0 !important; - - &::before { - display: block; - text-align: center; - font-size: 80px; - } - - @include mq(small) { - width: 28%; - } -} - -.is-style-dark.wp-block-bigbite-tabs .tabsContainer button.tab { - color: var(--wp--preset--color--white) !important; -} - -.wp-block-bigbite-tabs .tabsContainer button.addNewTabButton { - background-color: var(--wp--preset--color--white) !important; -} - -.wp-block-bigbite-tabs.is-style-dark .tabsContainer button.addNewTabButton { - color: var(--wp--preset--color--white) !important; -} - -.wp-block-bigbite-tabs.tabPanelContainer { - border: none; -} - -.wp-block-bigbite-tabs .tabsContainer button.tab[class*="is-selected"] { - background: none !important; - color: var(--wp--preset--color--black) !important; - border: solid var(--wp--preset--color--black) !important; - border-width: 0 0 6px 0 !important; -} - -.wp-block-bigbite-tabs .tabsContainer.has-no-nav-arrows button.tab[class*="is-selected"] { - border: solid var(--wp--preset--color--black) !important; - border-width: 0 0 6px 0 !important; -} - -.wp-block-bigbite-tabs .tabPanelContainer { - border: none !important; -} - -.wp-block-bigbite-tabs .flickity-button { - background: none; -} - -.wp-block-bigbite-tabs .tabsContainer button.tab:hover { - background-color: var(--wp--preset--color--grey-light) !important; -} - -.wp-block-bigbite-tabs.is-style-default .tabsContainer button.tab:hover, -.wp-block-bigbite-tabs.is-style-grey .tabsContainer button.tab:hover, -.wp-block-bigbite-tabs.is-style-light .tabsContainer button.tab:hover { - background-color: var(--wp--preset--color--grey-light) !important; -} - -.wp-block-bigbite-tabs .flickity-prev-next-button { - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); - border-radius: 0%; - height: 100%; -} - -.wp-block-bigbite-tabs .flickity-prev-next-button.previous { - left: 0; -} - -.wp-block-bigbite-tabs .flickity-prev-next-button.next { - right: 0; -} diff --git a/private/src/styles/blocks/term-list/_main.scss b/private/src/styles/blocks/term-list/_main.scss deleted file mode 100644 index 998909a4..00000000 --- a/private/src/styles/blocks/term-list/_main.scss +++ /dev/null @@ -1,113 +0,0 @@ -.wp-block-amnesty-core-term-list .navigation { - margin-bottom: 48px; - text-align: center; - - @include mq(small) { - text-align: left; - - .rtl & { - text-align: right; - } - } -} - -.wp-block-amnesty-core-term-list .navigation button { - appearance: none; - border: none; - margin: 1px; - width: 75px; - height: 75px; - background-color: var(--wp--preset--color--grey-lighter); - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--heading-4); - font-weight: bold; - color: var(--wp--preset--color--black); - - &[disabled] { - color: var(--wp--preset--color--grey-base); - - &:hover, - &:active, - &:focus { - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--grey-base); - cursor: auto; - } - } - - &.is-active { - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); - } - - &:hover, - &:active, - &:focus { - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); - transition: background-color .25s, color .25s; - cursor: pointer; - } -} - -.wp-block-amnesty-core-term-list .listContainer { - display: flex; - align-items: stretch; -} - -.wp-block-amnesty-core-term-list .activeLetter { - flex-basis: 10%; - font-family: var(--wp--preset--font-family--secondary); - font-size: 80px; - line-height: 1; -} - -.wp-block-amnesty-core-term-list .listItems { - flex-direction: row; - display: flex; - flex-wrap: wrap; - width: 100%; - margin: 0; - list-style: none; -} - -.wp-block-amnesty-core-term-list .listItem { - display: inline-flex; - flex: 1 1 100%; - max-width: 100%; - margin-bottom: 24px; - padding-right: 12px; - - .rtl & { - padding-right: 0; - padding-left: 12px; - } - - @include mq(x-small) { - flex-basis: 50%; - max-width: 50%; - } - - @include mq(small) { - flex-basis: 25%; - max-width: 25%; - } -} - -.wp-block-amnesty-core-term-list .listItems a { - text-decoration: none; - color: inherit; - - &:hover, - &:active, - &:focus { - text-decoration: underline; - text-decoration-skip-ink: auto; - } -} - -.rtl .wp-block-amnesty-core-term-list .navigation { - @include mq(small) { - text-align: right; - } -} diff --git a/private/src/styles/blocks/text-media/_main.scss b/private/src/styles/blocks/text-media/_main.scss deleted file mode 100644 index 97332582..00000000 --- a/private/src/styles/blocks/text-media/_main.scss +++ /dev/null @@ -1,88 +0,0 @@ -.wp-block-amnesty-core-background-media { - display: flex; - width: 100%; - flex-direction: column; - - @include mq(small) { - width: 100%; - flex-direction: row; - } - - .mobile-hide-panel .text-media--backgroundImage { - @include mq($until: small) { - display: none !important; - } - } -} - -.wp-block-amnesty-core-background-media .text-media--itemContainer { - display: flex; - width: 100%; - padding: 24px; - min-height: 400px; - position: relative; - padding-bottom: 40px; - word-break: break-word; - background-repeat: no-repeat; - background-size: cover; - flex-direction: column; -} - -.wp-block-amnesty-core-background-media .text-media--itemContainer > * { - width: 100%; - margin-left: 10px; - margin-right: 10px; -} - -.text-media--itemContainer.is-vertically-aligned-center { - flex-direction: column; - justify-content: center; -} - -.text-media--itemContainer.alignleft { - flex-direction: column; - align-items: flex-start; - text-align: left; - - .rtl & { - align-items: flex-end; - text-align: right; - } -} - -.text-media--itemContainer.alignright { - flex-direction: column; - align-items: flex-end; - text-align: right; - - .rtl & { - align-items: flex-start; - text-align: left; - } -} - -.text-media--itemContainer.aligncenter { - flex-direction: column; - align-items: center; - text-align: center; -} - -.wp-block-amnesty-core-background-media.has-imageRight { - div:nth-child(1) { - @include mq($from: small, $until: medium) { - width: 66%; - } - } -} - -.wp-block-amnesty-core-background-media.has-imageLeft { - div:first-child { - @include mq($from: small, $until: medium) { - width: 66%; - } - } -} - -.wp-block-amnesty-core-background-media.has-textShadow { - text-shadow: 1px 1px 2px rgba(0, 0, 0, 1), 0 0 .75em rgba(0, 0, 0, 1), 0 0 1.25em rgba(0, 0, 0, 1); -} diff --git a/private/src/styles/blocks/tickcounter-embed/_editor.scss b/private/src/styles/blocks/tickcounter-embed/_editor.scss deleted file mode 100644 index 8b963bac..00000000 --- a/private/src/styles/blocks/tickcounter-embed/_editor.scss +++ /dev/null @@ -1,3 +0,0 @@ -.wp-block[data-type="amnesty-core/embed-tickcounter"] .components-base-control { - width: 100%; -} diff --git a/private/src/styles/blocks/tweet-action/_editor.scss b/private/src/styles/blocks/tweet-action/_editor.scss deleted file mode 100644 index b9a708f1..00000000 --- a/private/src/styles/blocks/tweet-action/_editor.scss +++ /dev/null @@ -1,45 +0,0 @@ -.tweetAction .editor-plain-text { - border-radius: 0 !important; -} - -.tweetAction-title { - display: inline-block !important; - padding: 10px !important; - max-width: calc(100% - 54px); - background: transparent; - font-family: var(--wp--preset--font-family--secondary) !important; - font-size: var(--wp--preset--font-size--heading-4) !important; - font-weight: bold; - line-height: 1.4 !important; - text-transform: uppercase; -} - -.tweetAction-content { - margin-top: 16px !important; - margin-bottom: 16px !important; - padding: 10px !important; - font-family: var(--wp--preset--font-family--primary) !important; - font-size: var(--wp--preset--font-size--heading-6) !important; -} - -.tweetAction-button { - padding-right: 10px; - padding-left: 10px; -} - -.block-editor-block-list__layout .tweetBlock { - display: flex; - min-width: 400px; -} - -.block-editor-block-list__layout .tweetBlock .align-left { - justify-content: flex-start; -} - -.block-editor-block-list__layout .tweetBlock .align-center { - justify-content: center; -} - -.block-editor-block-list__layout .tweetBlock .align-right { - justify-content: flex-end; -} diff --git a/private/src/styles/blocks/tweet-action/_tweet.scss b/private/src/styles/blocks/tweet-action/_tweet.scss deleted file mode 100644 index e69973bb..00000000 --- a/private/src/styles/blocks/tweet-action/_tweet.scss +++ /dev/null @@ -1,155 +0,0 @@ -.tweetAction { - padding: 21px; - max-width: 350px; - background-color: var(--wp--preset--color--grey-lighter); - flex: 1; - - @include mq(small) { - max-width: 480px; - } -} - -.tweetAction--narrow { - max-width: 350px; -} - -.tweetBlock.align-center { - display: flex; - justify-content: center; -} - -.tweetBlock.align-left { - display: flex; - justify-content: left; -} - -.tweetBlock.align-right { - display: flex; - justify-content: flex-end; -} - -.tweetAction-header { - display: flex; - align-items: center; -} - -.tweetAction .dashicons-twitter { - margin-right: 14px; - width: auto; - height: auto; - font-size: 40px; - color: var(--wp--preset--color--blue-twitter); -} - -.tweetAction-title { - display: inline-block; - margin-bottom: 0; - text-transform: uppercase; -} - -.tweetAction-content { - margin-top: 16px; - margin-bottom: 16px; - padding: 10px; - min-height: 150px; - max-height: 278px; - overflow-y: auto; - background-color: var(--wp--preset--color--white); - font-family: var(--wp--preset--font-family--primary); - font-size: var(--wp--preset--font-size--heading-6); - - @include mq(small) { - max-height: none; - overflow-y: unset; - } -} - -.is-style-alternative-style.tweetAction .dashicons-twitter { - order: 2; - transform: scale(1.4); - color: var(--wp--preset--color--blue-twitter); - margin-top: 33px; - margin-bottom: 15px; - margin-right: 0; -} - -.is-style-alternative-style.tweetAction { - background-color: var(--wp--preset--color--white); - padding: 0; - flex-wrap: wrap; - display: flex; - justify-content: center; - height: 100%; - flex-direction: column; -} - -.is-style-alternative-style.tweetAction .tweetAction-content { - min-height: 20px; -} - -.is-style-alternative-style.tweetAction .tweetButton { - align-self: center; -} - -.is-style-alternative-style .tweetAction-header { - flex-direction: column; -} - -.is-style-alternative-style .tweetAction-content { - padding: 0 60px; - min-height: unset; - max-height: unset; - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--heading-5); - text-align: center; -} - -.is-style-alternative-style.tweetAction .btn { - background-color: var(--wp--preset--color--blue-twitter); - border: 1px solid transparent; - margin: 0 auto; - padding: 13px 24px; - max-width: 230px; - line-height: normal; - color: var(--wp--preset--color--black); - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--small); -} - -.is-style-alternative-style.tweetAction .btn:hover, -.is-style-alternative-style.tweetAction .btn:focus { - border-color: var(--wp--preset--color--black); -} - -.is-style-alternative-style .tweetButton { - display: flex; - justify-content: center; - align-self: center; -} - -.is-style-alternative-style.tweetBlock { - height: 100%; -} - -.tweetAction-embed { - margin-top: 24px; -} - -.is-style-alternative-style.tweetAction .tweetAction-title { - text-align: center; -} - -.tweetAction .tweetAction-textBox { - margin-bottom: 24px; - background-color: var(--wp--preset--color--white); - display: flex; - flex-direction: column; -} - -.is-style-alternative-style.tweetAction .tweetAction-textBox { - text-align: center; -} - -.tweetAction .embedLink-placeholder { - padding: 10px; -} diff --git a/private/src/styles/components/_icon.scss b/private/src/styles/components/_icon.scss deleted file mode 100644 index 6153beb4..00000000 --- a/private/src/styles/components/_icon.scss +++ /dev/null @@ -1,119 +0,0 @@ -.icon { - @include icon-wrapper(); - @include icon-dimensions(); - display: inline-block; -} - -.icon-arrow-left { - @include icon(234px, 240px, 16px, 16px); - display: inline-block; - - .rtl & { - @include icon(110px, 265px, 16px, 16px); - } -} - -.icon-remove { - @include icon(0, 285px, 16px, 16px); - display: inline-block; - - .remove-link:hover &, - .remove-link:active &, - .remove-link:focus & { - background-position: -20px -285px; - } -} - -.icon-remove-alt { - @include icon(20px, 285px, 16px, 16px); - display: inline-block; -} - -.icon-document { - @include icon(26px, 265px, 16px, 16px); - display: inline-block; -} - -.icon-cart { - @include icon-size(22px, 22px); -} - -%icon-cart-dark { - @include icon-position(284px, 230px); -} - -%icon-cart-light { - @include icon-position(284px, 260px); -} - -.icon-search { - @include icon-size(18px, 18px); -} - -%icon-search-dark { - @include icon-position(128px, 240px); -} - -%icon-search-light { - @include icon-position(105px, 240px); -} - -.icon-close { - @include icon-dimensions(1.5); - @include icon-size(24px, 24px); - - @include mq(small) { - @include icon-dimensions(2); - @include icon-size(32px, 32px); - } -} - -%icon-close-dark { - @include icon-position(291px, 397.5px); - - @include mq(small) { - @include icon-position(388px, 530px); - } -} - -%icon-close-light { - @include icon-position(406.5px, 354px); - - @include mq(small) { - @include icon-position(542px, 472px); - } -} - -.icon-arrow-down { - @include icon-dimensions(1.5); - @include icon-size(24px, 24px); -} - -%icon-arrow-down-dark { - @include icon-position(406.5px, 322.5px); -} - -%icon-arrow-down-light { - @include icon-position(406.5px, 196.5px); -} - -%icon-arrow-up-dark { - @include icon-position(322.5px, 397.5px); -} - -%icon-arrow-up-light { - @include icon-position(406.5px, 291px); -} - -.icon-burger { - @include icon-dimensions(2); - @include icon-size(24px, 32px); -} - -%icon-burger-dark { - @include icon-position(80px, 570px); -} - -%icon-burger-light { - @include icon-position(120px, 570px); -} diff --git a/private/src/styles/components/form/_all.scss b/private/src/styles/components/form/_all.scss deleted file mode 100644 index aa2843d2..00000000 --- a/private/src/styles/components/form/_all.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import "./fieldset"; -@import "./checkbox-group"; -@import "./select2"; -@import "./input"; -@import "./woocommerce"; diff --git a/private/src/styles/components/grid/_all.scss b/private/src/styles/components/grid/_all.scss deleted file mode 100644 index c0dbaa4f..00000000 --- a/private/src/styles/components/grid/_all.scss +++ /dev/null @@ -1 +0,0 @@ -@import "./item"; diff --git a/private/src/styles/components/grid/_editor.scss b/private/src/styles/components/grid/_editor.scss deleted file mode 100644 index 4a80492d..00000000 --- a/private/src/styles/components/grid/_editor.scss +++ /dev/null @@ -1,267 +0,0 @@ -[data-type="amnesty-core/block-list"] { - max-width: 100% !important; - width: 100% !important; -} - -.linklist-container { - max-width: 600px; - margin: 0 auto; -} - -.edit-post-visual-editor .linkList:not(.wp-block-gallery) { - list-style: none; -} - -.linkList-item, -.grid-item { - position: relative; - - .editor-url-input__button { - position: relative; - } - - .editor-url-input__button-modal { - position: absolute; - left: 0; - width: 340px; - z-index: 999; - } -} - -.grid-itemTitle a, -.grid-itemMeta, -.linkList-itemTitle, -.linkList-itemMeta { - display: inline-flex; - align-items: center; - font-family: var(--wp--preset--font-family--secondary); -} - -.grid-item { - box-sizing: border-box; -} - -.grid-itemContent { - width: 100%; - font-family: var(--wp--preset--font-family--primary); -} - -.grid-itemContent .components-button svg { - fill: unset; -} - -.linkList-options { - position: absolute; - z-index: 10; - right: 0; - top: 0; - background-color: var(--wp--preset--color--white); - - .rtl & { - right: unset; - left: 0; - } -} - -.wp-block-bigbite-postlist { - border: 1px solid var(--wp--preset--color--grey-lightest); - - .filter select { - margin-right: 10px; - } - - .title-wrapper { - padding: 10px; - } - - .post-selectorHeader { - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px; - background-color: var(--wp--preset--color--grey-lightest); - } - - .post-selectorHeader .searchbox label, - .post-selectorHeader .searchbox { - display: flex; - flex-grow: 1; - align-items: center; - } - - .post-selectorHeader .searchbox svg { - width: 25px; - height: 25px; - fill: var(--wp--preset--color--grey-base); - } - - .post-selectorHeader input { - width: 100%; - margin-left: 8px; - } - - .post-selectorHeader input, - .post-selectorHeader select { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - border-radius: 0; - padding: 8px; - font-size: var(--wp--preset--font-size--regular); - border: none; - box-shadow: none; - max-height: none; - height: auto; - background-color: transparent; - transition: all .25s ease-in-out; - border-bottom: 2px solid transparent; - } - - .post-selectorHeader select { - margin-left: 14px; - background-color: var(--wp--preset--color--white); - } - - .post-selectorHeader input:focus { - box-shadow: none; - border-bottom: 2px solid var(--wp--preset--color--black); - } - - .post { - position: relative; - display: flex; - align-items: flex-start; - margin-bottom: 8px; - } - - .post .editor-block-icon .dashicons-plus { - margin-top: 4px; - } - - .post-figure { - width: 50px; - height: 50px; - flex-basis: 50px; - flex-shrink: 0; - background-color: var(--wp--preset--color--grey-lighter); - background-repeat: no-repeat; - background-size: cover; - margin: 0; - margin-right: 16px; - } - - .post-title { - margin: 0; - line-height: 1; - margin-bottom: 4px; - font-size: var(--wp--preset--font-size--regular); - } - - .post-meta { - font-size: var(--wp--preset--font-size--x-small); - font-style: oblique; - color: rgb(85, 93, 102); - } - - .post-selectorContainer { - display: flex; - justify-content: space-between; - margin: 5px 0; - padding: 0 10px; - } - - .post-list { - flex-basis: 50%; - padding: 0 1%; - max-height: 200px; - height: 200px; - overflow-y: auto; - - &:first-child { - border-right: 1px solid var(--wp--preset--color--grey-lighter); - } - } - - .post button { - position: absolute; - top: 50%; - right: 5px; - opacity: 0; - z-index: -999; - width: 35px; - height: 35px; - display: flex; - align-items: center; - justify-content: center; - background-color: var(--wp--preset--color--grey-lighter); - border: none; - border-radius: 50%; - box-shadow: 1px 1px 5px 1px color-mix(in srgb, var(--wp--preset--color--grey-dark) 23%, transparent); - transform: translate(0, -50%); - } - - .post:hover button { - opacity: 1; - z-index: 100; - } - - .post-list > button { - background-color: var(--wp--preset--color--black); - width: 100%; - padding: 12px 18px; - font-size: var(--wp--preset--font-size--x-small); - font-weight: bold; - border: none; - color: var(--wp--preset--color--white); - margin-bottom: 8px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - transition: all .25s ease-in-out; - } - - .post-list > button:not([disabled]):hover, - .post-list > button:not([disabled]):focus, - .post-list > button:not([disabled]):active { - background-color: var(--wp--preset--color--black); - } - - .post-list > button[disabled] { - opacity: .7; - } - - .blocks-plain-text { - line-height: 1.8; - font-size: 1.6em; - font-weight: bold; - } -} - -.grid-item .components-button { - background-color: var(--wp--preset--color--white); -} - -.grid-itemMeta { - overflow: visible; - gap: 6px; - align-items: stretch; -} - -.grid-itemMeta > span { - padding: 2px 12px; - background-color: var(--wp--preset--color--black); - line-height: 1.8; -} - -.grid-itemTitle { - box-sizing: border-box; - margin-top: 0; - width: 100%; - line-height: 1.125; -} - -.grid-itemTitle .block-editor-url-input__button { - display: inline-block; - margin-left: 30px; -} - -.rtl .grid-itemTitle .block-editor-url-input__button { - margin-right: 30px; - margin-left: 0; -} diff --git a/private/src/styles/components/grid/_item.scss b/private/src/styles/components/grid/_item.scss deleted file mode 100644 index 21f0ef99..00000000 --- a/private/src/styles/components/grid/_item.scss +++ /dev/null @@ -1,267 +0,0 @@ -.grid-item { - position: relative; - display: flex; - align-items: flex-end; - flex: 1 1 100%; - max-width: none; - min-height: 360px; - padding: 24px; - background-color: var(--wp--preset--color--grey-light); - background-position: center; - background-size: cover; - - @include flexy-grid(1, flexy-gutter()); - - @include mq(x-small) { - @include flexy-grid(2, flexy-gutter()); - - .article-sidebar & { - flex: 1 1 100%; - max-width: none; - min-width: 49%; - } - } -} - -// should be moved to plugin -.grid-item.aimc-ignore { - padding-bottom: 32px; -} - -.grid-item .grid-content { - max-width: 100%; -} - -.grid-itemContent p { - max-width: 100%; - margin-top: 20px; - margin-bottom: 0; - padding: 12px; - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); - font-size: var(--wp--preset--font-size--small); - line-height: 1.4; -} - -.grid-itemContent a { - color: var(--wp--preset--color--black); - font-weight: bold; - font-family: var(--wp--preset--font-family--secondary); - text-transform: uppercase; -} - -.grid-itemMeta { - position: relative; - z-index: 2; - display: block; - padding: 2px 12px; - width: max-content; - max-width: 100%; - overflow: hidden; - text-transform: uppercase; - text-decoration: none; - font-size: var(--wp--preset--font-size--regular); - font-family: var(--wp--preset--font-family--secondary); - font-weight: bold; - white-space: nowrap; - text-overflow: ellipsis; - background-color: var(--wp--preset--color--black); -} - -.grid-itemMeta a { - color: var(--wp--preset--color--white); -} - -// increased specificity to override global link decoration -.single main .grid-itemMeta { - text-decoration: none; -} - -.grid-itemTitle { - display: block; - margin-top: 0; - margin-bottom: 0; - padding: 2px 12px; - max-width: 100%; - font-size: var(--wp--preset--font-size--heading-5); - text-decoration: none; -} - -h3.grid-itemTitle > span, -h3.grid-itemTitle > a { - color: var(--wp--preset--color--black); - background-color: var(--wp--preset--color--white); - box-shadow: -12px 0 0 0 var(--wp--preset--color--white), 12px 0 0 0 var(--wp--preset--color--white); - box-decoration-break: clone; - text-decoration: none; - max-width: 100%; -} - -.grid-itemTitle a::before { - position: absolute; - content: ""; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.grid { - display: grid; - row-gap: 20px; - column-gap: 20px; -} - -.grid-many { - grid-template-columns: 1fr; - - @include mq(x-small) { - grid-template-columns: repeat(4, 1fr); - } - - @include mq($from: x-small, $until: medium) { - grid-template-columns: repeat(2, 1fr); - } -} - -.grid .grid-item { - max-width: 100%; - width: 100%; -} - -.grid-2 { - grid-template-columns: 1fr; - - @include mq(x-small) { - grid-template-columns: repeat(2, 1fr); - } -} - -.grid-5 { - grid-template-columns: 1fr; - - @include mq(x-small) { - grid-template-columns: repeat(6, 1fr); - } - - @include mq($from: x-small, $until: medium) { - grid-template-columns: repeat(2, 1fr); - } -} - -.grid-5 :nth-child(n+3) { - grid-column: span 3; - - @include mq($from: x-small, $until: medium) { - grid-column: span 1; - } - - @include mq(medium) { - grid-column: span 2; - } -} - -.grid-5 :nth-child(-n+2) { - grid-column: span 3; - - @include mq($from: x-small, $until: medium) { - grid-column: span 1; - } -} - -.grid-3 { - grid-template-columns: 1fr; - - @include mq(x-small) { - grid-template-columns: repeat(3, 1fr); - } -} - -.grid-1 .grid-item { - width: 33%; -} - -.grid-6 { - grid-template-columns: 1fr; - - @include mq(x-small) { - grid-template-columns: repeat(4, 1fr); - } - - @include mq($from: x-small, $until: medium) { - grid-template-columns: repeat(2, 1fr); - } -} - -.grid-6 :nth-child(-n+2) { - grid-column: span 1; - - @include mq(x-small) { - grid-column: span 2; - } - - @include mq($from: x-small, $until: medium) { - grid-column: span 1; - } -} - -.grid-7 { - grid-template-columns: 1fr; - - @include mq(x-small) { - grid-template-columns: repeat(12, 1fr); - } - - @include mq($from: x-small, $until: medium) { - grid-template-columns: repeat(2, 1fr); - } -} - -.grid-7 :nth-child(-n+3) { - grid-column: span 1; - - @include mq(x-small) { - grid-column: span 4; - } - - @include mq($from: x-small, $until: medium) { - grid-column: span 1; - } -} - -.grid-7 :nth-child(n+4) { - grid-column: span 1; - - @include mq(x-small) { - grid-column: span 3; - } - - @include mq($from: x-small, $until: medium) { - grid-column: span 1; - } -} - -.ie .grid { - display: flex; - flex-direction: row; - flex-wrap: wrap; -} - -.ie .grid img { - width: 500px; -} - -.ie .grid .grid-item { - max-width: 350px; - width: 350px; - margin-right: 14px; - margin-bottom: 14px; -} - -.ie .petition-item .petition-itemImage { - width: 350px; -} - -:lang(fa-IR) .grid .grid-content > * { - line-height: 1.75; -} diff --git a/private/src/styles/components/list/_all.scss b/private/src/styles/components/list/_all.scss deleted file mode 100755 index 3cdc5652..00000000 --- a/private/src/styles/components/list/_all.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import "./base"; -@import "./inline"; -@import "./bare"; -@import "./dl"; diff --git a/private/src/styles/components/media/_all.scss b/private/src/styles/components/media/_all.scss deleted file mode 100755 index 1761d011..00000000 --- a/private/src/styles/components/media/_all.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import "./flex"; -@import "./floats"; diff --git a/private/src/styles/components/media/_flex.scss b/private/src/styles/components/media/_flex.scss deleted file mode 100755 index 1c41906c..00000000 --- a/private/src/styles/components/media/_flex.scss +++ /dev/null @@ -1,163 +0,0 @@ -@if ($enable-flexbox) { - - /** - * Media object, flexbox style. - * - * Extention modifiers: - * - Flip [flip] Flips the figure to the opposite side - * - Stack [stack] Stacks the figure on top of the text - * - Wrap [wrap] Wraps the text around the figure - * - Vertical align [valign] Vertical aligns the figure with the text - */ - - /// Create media sizes. - /// @group Defaults - /// @type List - /// @example - /// $media-figure-sizes: ( - /// "large": "180px" - /// ); - /// <div class="media media--large"> - $media-figure-sizes: ( - "large": "180px", - "medium": "140px", - "small": "100px" - ) !default; - - /// Media spacing amount. - /// @group Defaults - /// @type Number (Unit) - $media-spacing: var(--wp--preset--spacing--single) !default; - - /// Media stack breakpoint. - /// @group Defaults - /// @type Mixed - $media-stack-breakpoint: x-small !default; - - /** - * Core media styles. - */ - .media { - @include clearfix; - display: flex; - align-items: flex-start; - margin-bottom: $media-spacing; - } - - /** - * Media figure. - * - * 1. Gets rid of bottom margin on images. - */ - .media-figure { - margin-right: $media-spacing; - } - - .media-figure, - .media-figure img { /* 1 */ /* stylelint-disable-line */ - vertical-align: bottom; - } - - /** - * Media body. - * - * 1. Prevent text wrapping. - * 2. Remove margin from last media object, and also the last element inside. - */ - .media-body { - flex: 1; - - &:last-child, > *:last-child { - margin-bottom: 0; /* 2 */ - } - } - - /** - * Media flipped. - * - * 1. Resetting the default right margin. - */ - .media--flip { - flex-direction: row-reverse; - } - - .media--flip > .media-figure { - margin-right: 0; /* 1 */ - margin-left: $media-spacing; - } - - /** - * Media stacked. - */ - .media--stack { - display: block; - text-align: center; - } - - .media--stack > .media-figure { - margin: auto auto $media-spacing; - } - - /** - * Media wrap text around image. - */ - .media--wrap { - display: block; - } - - .media--wrap > .media-figure { - float: left; - } - - .media--flip.media--wrap > .media-figure { - float: right; - } - - /** - * Media vertically aligned. - */ - .media--valign { - align-items: center; - } - - /** - * Media figure sizes. - */ - @each $key, $value in $media-figure-sizes { - .media--#{$key} > .media-figure { - width: #{$value}; - } - - .media--#{$key} > .media-figure img { - max-width: 100%; - max-height: 100%; - } - } - - /** - * Media breaking point. Wrapped in one MQ for sanity. - */ - @include mq($until: $media-stack-breakpoint) { - .media { - display: block; - text-align: center; - } - - /** - * Standard media object resetting. - * - * 1. Resets the margin for normal and flipped. - * 2. Resets floats for wrapping. - */ - .media-figure, - .media--flip > .media-figure { - margin: auto auto $media-spacing; /* 1 */ - } - - .media--wrap > .media-figure, - .media--flip.media--wrap > .media-figure { - float: none; /* 2 */ - } - } - -} diff --git a/private/src/styles/components/media/_floats.scss b/private/src/styles/components/media/_floats.scss deleted file mode 100755 index cddb8983..00000000 --- a/private/src/styles/components/media/_floats.scss +++ /dev/null @@ -1,225 +0,0 @@ -@if ($enable-flexbox == false) { - - /** - * Media object. - * - * Extention modifiers: - * - Flip [flip] Flips the figure to the opposite side - * - Stack [stack] Stacks the figure on top of the text - * - Wrap [wrap] Wraps the text around the figure - * - Vertical align [valign] Vertical aligns the figure with the text - */ - - /// Create media sizes. - /// @group Defaults - /// @type List - /// @example - /// $media-figure-sizes: ( - /// "large": "180px" - /// ); - /// <div class="media media--large"> - $media-figure-sizes: ( - "large": "180px", - "medium": "140px", - "small": "100px" - ) !default; - - /// Media spacing amount. - /// @group Defaults - /// @type Number (Unit) - $media-spacing: var(--wp--preset--spacing--single) !default; - - /// Media stack breakpoint. - /// @group Defaults - /// @type Mixed - $media-stack-breakpoint: x-small !default; - - /** - * Core media styles. - */ - .media { - @include clearfix; - margin-bottom: $media-spacing; - } - - /** - * Media figure. - * - * 1. Accomodate if figure is wrapping div or img. - */ - .media-figure { - float: left; - margin-right: $media-spacing; - } - - .media-figure, - .media-figure img { /* 1 */ /* stylelint-disable-line */ - display: inline-block; - vertical-align: bottom; - } - - /** - * Media body. - * - * 1. Prevent text wrapping. - * 2. Remove margin from last media object, and also the last element inside. - */ - .media-body { - overflow: hidden; /* 1 */ - - &:last-child, > *:last-child { - margin-bottom: 0; /* 2 */ - } - } - - /** - * Media flipped. - * - * 1. Resetting the default right margin. - */ - .media--flip > .media-figure { - float: right; - margin-right: 0; /* 1 */ - margin-left: $media-spacing; - } - - /** - * Media stacked. - */ - .media--stack { - text-align: center; - } - - .media--stack > .media-figure { - float: none; - width: 100%; - margin-right: 0; - margin-bottom: $media-spacing; - } - - /** - * Media wrap text around image. - */ - .media--wrap > .media-body { - overflow: visible; - } - - /** - * Media vertically aligned. - * - * 1. Because table-cell ignores margin. - * 2. Centres media sizes image. - */ - .media--valign { - display: table; - } - - .media--valign > .media-figure, - .media--valign > .media-body { - display: table-cell; - vertical-align: middle; - } - - .media--valign > .media-figure { - float: none; - margin: auto; /* 2 */ - padding-right: $media-spacing; /* 1 */ - } - - .media--valign > .media-figure img { - display: block; - max-width: none; - } - - .media--valign > .media-body { - width: 100%; - } - - .media--valign.media--flip { - direction: rtl; - } - - .media--valign.media--flip .media-body { - direction: ltr; - } - - .media--valign.media--flip .media-figure { - padding-right: 0; - padding-left: $media-spacing; - } - - /** - * Media figure sizes. - * 1. Targets the figure img elem when using valign _and_ a size. - * 2. Remove max width as the table (for vertical align) collapses using max-width. - * 3. Force the image 100% width for vertical aligned. Image will be stretched if - * it's not large enough. - */ - @each $key, $value in $media-figure-sizes { - .media--#{$key} > .media-figure { - width: #{$value}; - } - - .media--#{$key} > .media-figure img { - max-width: 100%; - max-height: 100%; - } - - .media--valign.media--#{$key} > .media-figure img { /* 1 */ - max-width: none; /* 2 */ - width: #{$value}; /* 3 */ - } - } - - /** - * Media breaking point. Wrapped in one MQ for sanity. - */ - @include mq($until: $media-stack-breakpoint) { - .media { - text-align: center; - } - - /** - * Standard media object resetting. - * - * 1. Resets the margin for normal and flipped. - * 2. So we can center the image. Covers when using valign. - */ - .media-figure, - .media--flip > .media-figure { - float: none; - width: 100%; - margin: auto 0 $media-spacing; /* 1 */ - } - - .media-figure img, - .media--valign .media-figure img { - display: inline-block; /* 2 */ - } - - /** - * Vertical aligned media object resetting. - * - * 1. Reset setting table layout neccessary for vertical aligning. - * 2. Resets text direction hack for flipped valign. - * 3. Reset padding, valign uses padding rather than margin. - */ - .media--valign, - .media--valign > .media-figure, - .media--valign > .media-body { - display: block; /* 1 */ - } - - .media--valign.media--flip, - .media--valign > .media-figure.media--flip, - .media--valign > .media-body.media--flip { - direction: ltr; /* 2 */ - } - - .media--valign > .media-figure, - .media--valign.media--flip .media-figure { - padding-right: 0; /* 3 */ - padding-left: 0; /* 3 */ - } - } -} diff --git a/private/src/styles/components/modal/_base.scss b/private/src/styles/components/modal/_base.scss deleted file mode 100644 index 8fb6e15b..00000000 --- a/private/src/styles/components/modal/_base.scss +++ /dev/null @@ -1,62 +0,0 @@ -.modal-container { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - display: flex; - align-items: center; - justify-content: center; - overflow: auto; - overscroll-behavior: contain; - background-color: color-mix(in srgb, var(--wp--preset--color--grey-darkest) 80%, transparent); - opacity: 0; - z-index: -999; - transition: opacity .3s ease-in-out, z-index .3s step-end; -} - -.modal-container.is-open { - z-index: 999; - opacity: 1; - transition: opacity .3s ease-in-out, z-index .3s step-start; -} - -.modal-container .container { - max-height: 100%; - max-width: 860px; - overflow: auto; - margin: 0; - overscroll-behavior: contain; - opacity: 0; - transform: translateY(50px); - transition: opacity .3s ease-in-out, transform .3s ease-in-out; - transition-delay: .2s; - - @media screen and (max-height: 450px) { - max-width: 450px; - } -} - -.modal-container.is-open .container { - opacity: 1; - transform: translateY(0); -} - -.modal-container iframe { - border: none; -} - -.modal-close { - display: flex; - align-items: center; - margin-bottom: 16px; - margin-left: auto; - backface-visibility: hidden; -} - -.modal-close::after { - @include icon_scale(194px, 265px, 16px, 16px, 1); - content: ""; - display: inline-block; - margin-left: 8px; -} diff --git a/private/src/styles/components/news-filters/_main.scss b/private/src/styles/components/news-filters/_main.scss deleted file mode 100644 index 9f7fec7f..00000000 --- a/private/src/styles/components/news-filters/_main.scss +++ /dev/null @@ -1,9 +0,0 @@ -.news-filters { - display: flex; - width: 100%; - flex-direction: column; - - @include mq(medium) { - flex-direction: row; - } -} diff --git a/private/src/styles/editor.scss b/private/src/styles/editor.scss deleted file mode 100644 index a968b6ec..00000000 --- a/private/src/styles/editor.scss +++ /dev/null @@ -1,100 +0,0 @@ -// Global variables first -@import "utils/variables/defaults"; - -// Grid settings -@import "utils/variables/grid-settings"; - -// Sass Mq -// @see https://github.com/sass-mq/sass-mq -@import "sass-mq"; -@import "utils/variables/breakpoints"; - -// Functions -@import "utils/functions/maths"; -@import "utils/functions/palette"; -@import "utils/functions/strip-units"; -@import "utils/functions/flexy"; - -// Mixins -@import "utils/mixins/clearfix"; -@import "utils/mixins/headings"; -@import "utils/mixins/cols"; -@import "utils/mixins/icon"; -@import "utils/mixins/placeholder"; -@import "utils/mixins/states"; - -// Helpers -@import "utils/helpers/display"; - -// Base -@import "base/type"; - -// Layout -@import "layout/page-hero"; - -// Components -@import "components/grid/all"; -@import "components/add-item"; -@import "components/fluid"; -@import "components/form/checkbox-group"; -@import "components/icon"; -@import "components/news-filters/main"; -@import "components/form/input-editor"; - -// Blocks -@import "blocks/action-block/main"; -@import "blocks/button/all"; -@import "blocks/call-to-action/all"; -@import "blocks/collapsable/main"; -@import "blocks/core-blocks/blockquote"; -@import "blocks/core-blocks/details"; -@import "blocks/core-blocks/latest-posts"; -@import "blocks/core-blocks/menu"; -@import "blocks/core-blocks/post-template/main"; -@import "blocks/core-blocks/post-title/main"; -@import "blocks/core-blocks/post/main"; -@import "blocks/core-blocks/post/editor"; -@import "blocks/core-blocks/query-pagination/main"; -@import "blocks/core-blocks/query-pagination/editor"; -@import "blocks/core-blocks/rss"; -@import "blocks/core-blocks/social-links"; -@import "blocks/core-blocks/quote"; -@import "blocks/custom-card/main"; -@import "blocks/download-block/style"; -@import "blocks/fact-block/main"; -@import "blocks/image-block/main"; -@import "blocks/link-group/main"; -@import "blocks/linklist/main"; -@import "blocks/links-with-icons/main"; -@import "blocks/petition-list/main"; -@import "blocks/postlist/main"; -@import "blocks/regions/main"; -@import "blocks/section/main"; -@import "blocks/slider/main"; -@import "blocks/stat-counter/main"; -@import "blocks/term-list/main"; -@import "blocks/text-media/main"; -@import "blocks/tweet-action/tweet"; - -// FSE Blocks -@import "components/pop-in/main"; -@import "components/pop-in/editor"; -@import "layout/language-banner"; -@import "layout/header/main"; -@import "layout/header/editor"; -@import "layout/navigation/main"; - -// Page level -@import "pages/archive"; -@import "pages/article"; -@import "pages/article/editor"; -@import "pages/search"; -@import "pages/single"; - -html { - box-sizing: border-box; -} - -*, *::after, *::before { - box-sizing: inherit; -} diff --git a/private/src/styles/gutenberg.scss b/private/src/styles/gutenberg.scss deleted file mode 100755 index 414472fe..00000000 --- a/private/src/styles/gutenberg.scss +++ /dev/null @@ -1,239 +0,0 @@ -// Global variables first -@import "utils/variables/defaults"; - -// Grid settings -@import "utils/variables/grid-settings"; - -// Sass Mq -// @see https://github.com/sass-mq/sass-mq -@import "sass-mq"; -@import "utils/variables/breakpoints"; - -// Functions -@import "utils/functions/maths"; -@import "utils/functions/palette"; -@import "utils/functions/strip-units"; -@import "utils/functions/flexy"; - -// Mixins -@import "utils/mixins/clearfix"; -@import "utils/mixins/headings"; -@import "utils/mixins/cols"; -@import "utils/mixins/icon"; -@import "utils/mixins/placeholder"; -@import "utils/mixins/states"; - -// Base -@import "base/container"; -@import "base/container-editor"; -@import "base/images-editor"; -@import "base/links"; - -// Layout -@import "layout/page-hero"; -@import "layout/page-hero-editor"; -@import "layout/footer/editor"; - -// Components -@import "components/grid/all"; -@import "components/grid/editor"; -@import "components/add-item"; -@import "components/fluid"; -@import "components/icon"; -@import "components/pop-in/editor"; -@import "components/social"; -@import "components/form/input"; - -// Blocks -@import "blocks/action-block/main"; -@import "blocks/action-block/editor"; -@import "blocks/button/all"; -@import "blocks/button/editor"; -@import "blocks/call-to-action/all"; -@import "blocks/call-to-action/editor"; -@import "blocks/collapsable/main"; -@import "blocks/collapsable/editor"; -@import "blocks/core-blocks/blockquote"; -@import "blocks/core-blocks/blockquote-editor"; -@import "blocks/core-blocks/details"; -@import "blocks/core-blocks/gallery-editor"; -@import "blocks/core-blocks/group"; -@import "blocks/core-blocks/image-editor"; -@import "blocks/core-blocks/latest-posts"; -@import "blocks/core-blocks/latest-posts-editor"; -@import "blocks/core-blocks/menu"; -@import "blocks/core-blocks/rss"; -@import "blocks/core-blocks/rss-editor"; -@import "blocks/core-blocks/social-links"; -@import "blocks/core-blocks/social-links-editor"; -@import "blocks/countdown-timer/editor"; -@import "blocks/custom-card/main"; -@import "blocks/custom-card/editor"; -@import "blocks/download-block/style"; -@import "blocks/download-block/editor"; -@import "blocks/fact-block/main"; -@import "blocks/fact-block/editor"; -@import "blocks/header/editor"; -@import "blocks/hero/main"; -@import "blocks/hero/editor"; -@import "blocks/iframe-button/editor"; -@import "blocks/image-block/main"; -@import "blocks/image-block/editor"; -@import "blocks/link-group/main"; -@import "blocks/link-group/editor"; -@import "blocks/linklist/main"; -@import "blocks/linklist/editor"; -@import "blocks/links-with-icons/main"; -@import "blocks/links-with-icons/editor"; -@import "blocks/list-block/editor"; -@import "blocks/petition-list/main"; -@import "blocks/postlist/categories"; -@import "blocks/postlist/categories-editor"; -@import "blocks/regions/main"; -@import "blocks/regions/editor"; -@import "blocks/section/main"; -@import "blocks/section/editor"; -@import "blocks/slider/main"; -@import "blocks/slider/editor"; -@import "blocks/stat-counter/main"; -@import "blocks/stat-counter/editor"; -@import "blocks/tabbed-content/editor"; -@import "blocks/term-list/main"; -@import "blocks/text-media/main"; -@import "blocks/text-media/editor"; -@import "blocks/tickcounter-embed/editor"; -@import "blocks/tweet-action/tweet"; -@import "blocks/tweet-action/editor"; -@import "blocks/postlist/main"; -@import "blocks/postlist/post-editor"; - -// Block Patterns -@import "block-patterns/group"; - -// Pages -@import "pages/search"; - -:root { - --ms-base: 16; - --ms-ratio: 1.2; -} - -.amnesty-byline { - margin-top: 24px; - - .components-panel__body.is-opened { - padding-right: 0; - padding-left: 0; - border-bottom: none; - } -} - -.editor-post-title__block .editor-post-title__input, -.block-editor-block-list__layout, -.editor-styles-wrapper { - font-family: var(--wp--preset--font-family--secondary); -} - -.block-editor-block-list__layout, -.editor-styles-wrapper { - li, - p, - a { - font-family: var(--wp--preset--font-family--primary); - } - - strong { - font-family: var(--wp--preset--font-family--secondary); - } -} - -.form-row { - display: flex; -} - -.form-column { - flex: 1 1 auto; -} - -.form-column + .form-column { - margin-left: 10px; -} - -.form-action { - flex: 0 0 45px; -} - -.form-action button { - margin-left: auto; -} - -.form-footer { - display: flex; - justify-content: flex-end; - padding-top: 10px; - margin-top: 20px; - border-top: 1px solid var(--wp--preset--color--grey-lighter); -} - -// Gutenberg fixes -.editor-writing-flow { - height: auto; -} - -.edit-post-visual-editor .editor-writing-flow__click-redirect { - max-height: 0; - margin: 0; -} - -// document reference input -.amnesty-docref.disabled { - margin-top: 5px; - margin-bottom: 5px; - padding-top: 5px; - padding-bottom: 5px; - width: 100%; - border-top: 1px solid var(--wp--preset--color--grey-lighter); - border-bottom: 1px solid var(--wp--preset--color--grey-lighter); - - .components-text-control__input { - background-color: var(--wp--preset--color--grey-lighter); - } -} - -.wp-block[data-type="amnesty-core/block-responsive-iframe"] { - margin-top: 16px; - margin-bottom: 16px; - - .wp-block-embed { - margin: 12px; - } -} - -.rtl .is-left-aligned { - text-align: right; -} - -.is-center-aligned { - text-align: center; -} - -.is-right-aligned { - text-align: right; - - .rtl & { - text-align: left; - } -} - -.timezone-container { - flex-direction: column; - text-align: center; -} - -.timezone-container h2 { - text-decoration: underline; -} - -.horizontal-search { - margin-bottom: 0; -} diff --git a/private/src/styles/layout/_page-hero-editor.scss b/private/src/styles/layout/_page-hero-editor.scss deleted file mode 100644 index 5dd3d77a..00000000 --- a/private/src/styles/layout/_page-hero-editor.scss +++ /dev/null @@ -1,194 +0,0 @@ -[data-type="amnesty-core/block-hero"] { - max-width: 100% !important; - width: 100% !important; -} - -.page-hero { - padding-top: 111px; - padding-bottom: 80px; - min-height: 450px; - background-size: cover; - background-position: center center; - color: var(--wp--preset--color--white); - -} - -.page-hero + .components-base-control { - display: none; -} - -.page-heroTitle { - margin: 0; - padding: 0 20px; - font-size: var(--wp--preset--font-size--heading-1); - line-height: 1.3 !important; - background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - color: var(--wp--preset--color--white); - box-decoration-break: clone; -} - -p.page-heroContent { - margin-top: 0; - margin-bottom: 0; - padding: 10px 20px; - max-width: 460px; - font-family: var(--wp--preset--font-family--secondary); - font-size: var(--wp--preset--font-size--heading-5); - background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - color: var(--wp--preset--color--white); -} - -.page-heroCta { - position: relative; - display: inline-flex; - align-items: center; - padding: 20px; - background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - - .editor-url-input__button { - position: relative; - transform: translateX(50%); - - .rtl & { - transform: translateX(-50%); - } - } - - .editor-url-input__button-modal { - position: absolute; - left: 0; - width: 340px; - } - - .page-heroAlignment--right & .editor-url-input__button-modal { - left: initial; - right: 0; - } - - .page-heroAlignment--center & .editor-url-input__button-modal { - left: initial; - right: calc(50% - 170px); - } -} - -.page-heroSize--small { - min-height: 450px; -} - -.page-heroSize--large { - min-height: 710px; -} - -.page-heroBackground--dark .page-heroContent, -.page-heroBackground--dark .page-heroCta, -.page-heroBackground--dark .page-heroTitle { - background-color: var(--wp--preset--color--black); -} - -.page-heroBackground--light .page-heroContent, -.page-heroBackground--light .page-heroCta, -.page-heroBackground--light .page-heroTitle { - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); -} - -.page-heroBackground--none .page-heroContent, -.page-heroBackground--none .page-heroCta, -.page-heroBackground--none .page-heroTitle { - background-color: transparent; - color: var(--wp--preset--color--white); -} - -.page-hero .container { - width: 100%; - max-width: $flexy-container; - margin: 0 auto; - - .hero-content { - max-width: 840px; - } -} - -.page-heroAlignment--center .hero-content { - text-align: center; - max-width: 840px; -} - -.page-heroAlignment--center .page-heroContent { - margin: 0 auto; - //left: 50%; - //transform: translateX(-50%); -} - -.page-heroAlignment--center .page-heroTitle.editor-rich-text__tinymce.mce-content-body { - left: 0; -} - -.editor-rich-text__tinymce + .editor-rich-text__tinymce { - background-color: transparent; -} - -.page-heroAlignment--right .hero-content { - margin-left: auto; - text-align: right; - max-width: 840px; - - .rtl & { - margin-left: 0; - margin-right: auto; - text-align: left; - } -} - -.page-heroAlignment--right .page-heroContent { - margin-left: auto; - text-align: right; - - .rtl & { - margin-left: 0; - margin-right: auto; - } -} - -.page-heroAlignment--left .page-heroContent.mce-content-body { - left: 0; - - .rtl & { - right: 0; - } -} - -.page-heroAlignment--right .page-heroContent.mce-content-body { - right: 0; - - .rtl & { - left: 0; - } -} - -.page-heroAlignment--center .page-heroContent.mce-content-body:not(:last-child) { - left: 50%; - transform: translateX(-50%); - margin: 0; -} - -.page-heroAlignment--right .editor-rich-text__tinymce[data-is-placeholder-visible="true"] { - right: 0; -} - -.page-heroCta .editor-rich-text__tinymce.mce-content-body { - line-height: 1; -} - -.page-heroCta .btn { - display: flex; - align-items: center; -} - -.page-heroAlignment--center .has-donation-block .page-heroContent { - margin: 0; -} - -.page-heroAlignment--center .hero-content.has-donation-block { - text-align: left; -} diff --git a/private/src/styles/layout/_page-hero.scss b/private/src/styles/layout/_page-hero.scss deleted file mode 100644 index ea882a7d..00000000 --- a/private/src/styles/layout/_page-hero.scss +++ /dev/null @@ -1,218 +0,0 @@ -.page-hero { - position: relative; - padding-top: 111px; - padding-bottom: 110px; - // height: 400px; - // max-height: 40vh; // these two break the home page - background-size: cover; - background-position: center center; - color: var(--wp--preset--color--white); - max-width: 1468px; - margin: 0 auto; - width: 100%; - - @include mq(small) { - padding-bottom: 80px; - min-height: 450px; - max-height: none; - height: auto; - } -} - -.page-hero:has(+ main) { - margin-bottom: var(--wp--preset--spacing--double); -} - -.page-header--light ~ .page-hero, -.page-header--shaded ~ .page-hero { - padding-top: 80px; -} - -.page-header--transparent-dark ~ .page-hero, -.page-header--transparent-light ~ .page-hero { - padding-top: 152px; -} - -.page-heroTitle { - max-width: 840px; - margin: 0; - padding: 0 16px; - font-size: var(--wp--preset--font-size--heading-1); - line-height: 1.2; - text-transform: uppercase; - - @include mq(xx-small) { - padding: 0 20px; - } -} - -.page-heroTitle span { - background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - color: var(--wp--preset--color--white); - box-shadow: 20px 0 0 color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent), -20px 0 0 color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - box-decoration-break: clone; -} - -p.page-heroContent { - display: table; - margin-bottom: 0; - padding: 10px 16px; - max-width: 460px; - font-size: var(--wp--preset--font-size--regular); - background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - - @include mq(xx-small) { - padding: 10px 20px; - } -} - -.page-heroContent a { - color: inherit; - text-decoration: underline; -} - -.page-heroCta { - display: inline-block; - background-color: color-mix(in srgb, var(--wp--preset--color--black) 45%, transparent); - padding: 16px; - - .btn { - font-size: var(--wp--preset--font-size--heading-5); - padding: 10px 14px; - - @include mq(xx-small) { - padding: 11px 20px; - } - } - - @include mq(xx-small) { - padding: 20px; - } -} - -.page-heroSize--small { - @include mq(small) { - min-height: 450px; - } -} - -.page-heroSize--large { - @include mq(small) { - min-height: 710px; - } -} - -.page-heroBackground--dark .page-heroContent, -.page-heroBackground--dark .page-heroCta, -.page-heroBackground--dark .page-heroTitle span { - background-color: var(--wp--preset--color--black); -} - -.page-heroBackground--dark .page-heroTitle span { - box-shadow: 16px 0 0 var(--wp--preset--color--black), -16px 0 0 var(--wp--preset--color--black); - - @include mq(xx-small) { - box-shadow: 20px 0 0 var(--wp--preset--color--black), -20px 0 0 var(--wp--preset--color--black); - } -} - -.page-heroBackground--light .page-heroContent, -.page-heroBackground--light .page-heroCta, -.page-heroBackground--light .page-heroTitle span { - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); -} - -.page-heroBackground--light .page-heroTitle span { - box-shadow: 16px 0 0 var(--wp--preset--color--white), -16px 0 0 var(--wp--preset--color--white); - - @include mq(xx-small) { - box-shadow: 20px 0 0 var(--wp--preset--color--white), -20px 0 0 var(--wp--preset--color--white); - } -} - -.page-heroBackground--light .btn { - border-color: var(--wp--preset--color--black); - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); - - &:hover, - &:focus { - background-color: color-mix(in srgb, var(--wp--preset--color--black) 80%, transparent); - color: var(--wp--preset--color--white); - } -} - -.page-heroBackground--none .page-heroContent, -.page-heroBackground--none .page-heroCta, -.page-heroBackground--none .page-heroTitle, -.page-heroBackground--none .page-heroTitle span { - padding-left: 0; - padding-right: 0; - color: var(--wp--preset--color--white); - background-color: transparent; -} - -.page-heroBackground--none .page-heroTitle span { - box-shadow: none; -} - -.page-heroAlignment--centre .hero-content, -.page-heroAlignment--center .hero-content { - text-align: center; - max-width: 840px; -} - -.page-heroAlignment--right .hero-content { - text-align: end; -} - -.page-hero--video { - position: relative; - z-index: 0; -} - -.page-heroVideoContainer { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - z-index: -1; -} - -.page-heroVideo { - position: absolute; - top: 50%; - left: 50%; - display: none; - min-width: 100%; - min-height: 100%; - transform: translate(-50%, -50%); - object-fit: cover; - - @include mq(small) { - display: block; - } -} - -.play-icon { - display: inline-block; - width: 0; - height: 0; - margin-right: 12px; - border-style: solid; - border-width: 10px 0 10px 18px; - border-color: transparent transparent transparent var(--wp--preset--color--black); - text-indent: -1000vw; - overflow: hidden; -} - -.page-heroBackground--light .play-icon { - border-color: transparent transparent transparent var(--wp--preset--color--white); -} - -.page-hero + main .article-container { - padding-top: 0; -} diff --git a/private/src/styles/layout/footer/_main.scss b/private/src/styles/layout/footer/_main.scss deleted file mode 100644 index bfedead2..00000000 --- a/private/src/styles/layout/footer/_main.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import "styles/classic"; -@import "styles/fse"; diff --git a/private/src/styles/layout/header/_editor.scss b/private/src/styles/layout/header/_editor.scss deleted file mode 100644 index f0410ff9..00000000 --- a/private/src/styles/layout/header/_editor.scss +++ /dev/null @@ -1,16 +0,0 @@ -.site-header { - margin: 0; -} - -.site-header ul { - padding: 0; -} - -.site-header .page-header li, -.site-header .page-header li a { - font-family: var(--wp--preset--font-family--secondary); -} - -.site-header .page-header li a { - text-decoration: none; -} diff --git a/private/src/styles/layout/header/_main.scss b/private/src/styles/layout/header/_main.scss deleted file mode 100644 index 09f6c8af..00000000 --- a/private/src/styles/layout/header/_main.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import "shared/base"; -@import "shared/logo"; -@import "shared/burger"; -@import "shared/button"; -@import "shared/search"; -@import "styles/light"; -@import "styles/transparent-light"; diff --git a/private/src/styles/layout/header/shared/_base.scss b/private/src/styles/layout/header/shared/_base.scss deleted file mode 100644 index becb54e8..00000000 --- a/private/src/styles/layout/header/shared/_base.scss +++ /dev/null @@ -1,66 +0,0 @@ -.page-header { - position: sticky; - top: -100%; - z-index: 11; - height: 60px; - font-size: var(--wp--preset--font-size--regular); - color: var(--wp--preset--color--black); - transition: top .5s ease-in-out; - font-family: var(--wp--preset--font-family--secondary); - text-transform: uppercase; - - li button { - text-transform: uppercase; - } - - @include mq(small) { - height: 72px; - } -} - -.page-header .container { - padding: 0; -} - -.page-header .container, -.page-headerItems { - height: 100%; -} - -.page-header.stick { - top: 0; -} - -.admin-bar .page-header.stick { - top: 0; - - @include mq(600px) { - top: 46px; - } - - @include mq(782px) { - top: 32px; - } -} - -.page-headerItems { - display: flex; - align-items: flex-start; -} - -.page-header a { - color: inherit; - transition: unset; -} - -.page-header .btn { - display: flex; - align-items: center; - font-size: var(--wp--preset--font-size--heading-4); - color: var(--wp--preset--color--black); - transition: background-color .2s ease-in-out, color .2s ease-in-out; -} - -.page-header .menu-item { - transition: background-color .2s ease-in-out, color .2s ease-in-out; -} diff --git a/private/src/styles/layout/header/shared/_burger.scss b/private/src/styles/layout/header/shared/_burger.scss deleted file mode 100644 index d177e51a..00000000 --- a/private/src/styles/layout/header/shared/_burger.scss +++ /dev/null @@ -1,40 +0,0 @@ -.burger { - display: inline-flex; - align-items: center; - justify-content: center; - width: 60px; - height: 100%; - border: 2px solid transparent; - font-family: var(--wp--preset--font-family--secondary); - background-color: transparent; - cursor: pointer; - - @include mq(small) { - width: 70px; - } - - @include mq(mobile-nav) { - display: none; - } -} - -.burger:active, -.burger:focus { - border: 2px solid var(--wp--preset--color--orange-base); -} - -.burger .icon-burger { - display: block; -} - -.burger .icon-close { - display: none; -} - -.mobile-menu-open .burger .icon-close { - display: block; -} - -.mobile-menu-open .burger .icon-burger { - display: none; -} diff --git a/private/src/styles/layout/header/shared/_search.scss b/private/src/styles/layout/header/shared/_search.scss deleted file mode 100644 index 0c281347..00000000 --- a/private/src/styles/layout/header/shared/_search.scss +++ /dev/null @@ -1,25 +0,0 @@ -.search-menu-item a::after { - @include icon-wrapper(); - @include icon-dimensions(); - @include icon-size(18px, 18px); - @extend %icon-search-dark; - display: inline-block; - margin-left: var(--wp--preset--spacing--half); - content: ""; - - @include mq(mobile-nav) { - margin-left: 0; - } -} - -.search-menu-item span { - @include mq(mobile-nav) { - position: absolute !important; - overflow: hidden !important; - width: 1px !important; - height: 1px !important; - padding: 0 !important; - border: 0 !important; - clip: rect(1px, 1px, 1px, 1px) !important; - } -} diff --git a/private/src/styles/layout/header/styles/_light.scss b/private/src/styles/layout/header/styles/_light.scss deleted file mode 100644 index 041a5807..00000000 --- a/private/src/styles/layout/header/styles/_light.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import "./light/base"; -@import "./light/burger"; -@import "./light/search"; diff --git a/private/src/styles/layout/header/styles/_transparent-light.scss b/private/src/styles/layout/header/styles/_transparent-light.scss deleted file mode 100644 index ca839be8..00000000 --- a/private/src/styles/layout/header/styles/_transparent-light.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import "./transparent-light/base"; -@import "./transparent-light/burger"; -@import "./transparent-light/search"; diff --git a/private/src/styles/layout/header/styles/light/_base.scss b/private/src/styles/layout/header/styles/light/_base.scss deleted file mode 100644 index 2e572fce..00000000 --- a/private/src/styles/layout/header/styles/light/_base.scss +++ /dev/null @@ -1,23 +0,0 @@ -.page-header.is-light { - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); -} - -.page-header.stick { - border-bottom: 1px solid var(--wp--preset--color--grey-lighter); -} - -.page-header.is-light .page-headerButton:hover, -.page-header.is-light .page-headerButton:active, -.page-header.is-light .page-headerButton:focus { - background-color: var(--wp--preset--color--grey-lighter); - color: var(--wp--preset--color--black); -} - -.page-header.is-light .icon-cart { - @extend %icon-cart-dark; -} - -.page-header.is-light .page-nav--main .current-menu-item .icon-cart { - @extend %icon-cart-light; -} diff --git a/private/src/styles/layout/header/styles/light/_burger.scss b/private/src/styles/layout/header/styles/light/_burger.scss deleted file mode 100644 index 173b9e9d..00000000 --- a/private/src/styles/layout/header/styles/light/_burger.scss +++ /dev/null @@ -1,23 +0,0 @@ -.page-header.is-light .burger:hover, -.page-header.is-light .burger:active, -.page-header.is-light .burger:focus { - background-color: var(--wp--preset--color--grey-lighter); -} - -.page-header.is-light .burger .icon-burger { - @extend %icon-burger-dark; -} - -.mobile-menu-open .page-header.is-light .burger { - background-color: var(--wp--preset--color--black); -} - -.mobile-menu-open .page-header.is-light .burger:hover, -.mobile-menu-open .page-header.is-light .burger:active, -.mobile-menu-open .page-header.is-light .burger:focus { - background-color: var(--wp--preset--color--grey-dark); -} - -.mobile-menu-open .page-header.is-light .burger .icon-close { - @extend %icon-close-light; -} diff --git a/private/src/styles/layout/header/styles/light/_search.scss b/private/src/styles/layout/header/styles/light/_search.scss deleted file mode 100644 index 18801b0e..00000000 --- a/private/src/styles/layout/header/styles/light/_search.scss +++ /dev/null @@ -1,11 +0,0 @@ -.page-header.is-light .search-menu-item span::after { - @extend %icon-search-dark; -} - -.page-header.is-light .search-menu-item.current-menu-item span::after { - @extend %icon-search-light; -} - -.page-header.is-light .search-menu-item.current-menu-item a::after { - @extend %icon-search-light; -} diff --git a/private/src/styles/layout/header/styles/transparent-light/_base.scss b/private/src/styles/layout/header/styles/transparent-light/_base.scss deleted file mode 100644 index 4712e6de..00000000 --- a/private/src/styles/layout/header/styles/transparent-light/_base.scss +++ /dev/null @@ -1,66 +0,0 @@ -.page-header.is-transparent-light { - background: linear-gradient(var(--wp--preset--color--black), transparent); - color: var(--wp--preset--color--white); -} - -.page-header.is-transparent-light.stick { - background: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); - border-bottom: 1px solid var(--wp--preset--color--grey-lighter); -} - -.page-header.is-transparent-light ~ .page-hero { - margin-top: -72px; -} - -.page-header.is-transparent-light .menu-item:hover > a, -.page-header.is-transparent-light .menu-item a:active, -.page-header.is-transparent-light .menu-item a:focus, -.page-header.is-transparent-light .menu-item:focus-within > a, -.page-header.is-transparent-light .page-headerButton:hover, -.page-header.is-transparent-light .page-headerButton:active, -.page-header.is-transparent-light .page-headerButton:focus { - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); -} - -.page-header.is-transparent-light .mobile-menu .menu-item a:hover, -.page-header.is-transparent-light .mobile-menu .menu-item a:active, -.page-header.is-transparent-light .mobile-menu .menu-item a:focus { - background-color: var(--wp--preset--color--grey-lighter); -} - -.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a { - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); -} - -.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a:hover, -.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a:active, -.page-header.is-transparent-light .mobile-menu .menu-item-has-children.is-open > a:focus, -.page-header.is-transparent-light .sub-menu .menu-item a:hover, -.page-header.is-transparent-light .sub-menu .menu-item a:active, -.page-header.is-transparent-light .sub-menu .menu-item a:focus { - background-color: var(--wp--preset--color--grey-dark); - color: var(--wp--preset--color--white); -} - -.page-header.is-transparent-light .page-nav--main .current-menu-item, -.page-header.is-transparent-light .page-nav--main .current-menu-ancestor { - background-color: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); -} - -.page-header.is-transparent-light .page-nav--main .mobile-menu .current-menu-item, -.page-header.is-transparent-light .page-nav--main .mobile-menu .current-menu-ancestor { - background-color: var(--wp--preset--color--white); - color: var(--wp--preset--color--black); -} - -.page-header.is-transparent-light .icon-cart { - @extend %icon-cart-light; -} - -.page-header.is-transparent-light .site-separator { - display: none; -} diff --git a/private/src/styles/layout/header/styles/transparent-light/_burger.scss b/private/src/styles/layout/header/styles/transparent-light/_burger.scss deleted file mode 100644 index 393825d3..00000000 --- a/private/src/styles/layout/header/styles/transparent-light/_burger.scss +++ /dev/null @@ -1,28 +0,0 @@ -.page-header.is-transparent-light .burger:hover, -.page-header.is-transparent-light .burger:active, -.page-header.is-transparent-light .burger:focus { - background-color: var(--wp--preset--color--white); -} - -.page-header.is-transparent-light .burger .icon-burger { - @extend %icon-burger-light; -} - -.page-header.is-transparent-light .burger:hover .icon-burger, -.page-header.is-transparent-light .burger:active .icon-burger, -.page-header.is-transparent-light .burger:focus .icon-burger { - @extend %icon-burger-dark; -} - -.mobile-menu-open .page-header.is-transparent-light .burger { - background-color: var(--wp--preset--color--black); -} - -.mobile-menu-open .page-header.is-transparent-light .burger:hover, -.mobile-menu-open .page-header.is-transparent-light .burger:active { - background-color: var(--wp--preset--color--grey-dark); -} - -.mobile-menu-open .page-header.is-transparent-light .burger .icon-close { - @extend %icon-close-light; -} diff --git a/private/src/styles/layout/header/styles/transparent-light/_search.scss b/private/src/styles/layout/header/styles/transparent-light/_search.scss deleted file mode 100644 index 43e69f71..00000000 --- a/private/src/styles/layout/header/styles/transparent-light/_search.scss +++ /dev/null @@ -1,17 +0,0 @@ -.page-header.is-transparent-light .search-menu-item a::after { - @extend %icon-search-light; -} - -.page-header.is-transparent-light .search-menu-item a:hover::after, -.page-header.is-transparent-light .search-menu-item a:active::after, -.page-header.is-transparent-light .search-menu-item a:focus::after { - @extend %icon-search-dark; -} - -.page-header.is-transparent-light.stick .search-menu-item a::after { - @extend %icon-search-dark; -} - -.page-header.is-transparent-light .mobile-menu .search-menu-item a::after { - @extend %icon-search-dark; -} diff --git a/private/src/styles/layout/navigation/_main.scss b/private/src/styles/layout/navigation/_main.scss deleted file mode 100644 index 50374599..00000000 --- a/private/src/styles/layout/navigation/_main.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import "./shared/keyframes"; -@import "./shared/desktop"; -@import "./shared/mobile"; -@import "./styles/light/desktop"; -@import "./styles/transparent-light/desktop"; diff --git a/private/src/styles/pages/_article.scss b/private/src/styles/pages/_article.scss deleted file mode 100644 index 82f62e5d..00000000 --- a/private/src/styles/pages/_article.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import "./article/base"; -@import "./article/featured-image"; -@import "./article/byline"; -@import "./article/back-link"; -@import "./article/meta"; -@import "./article/header"; -@import "./article/footer"; -@import "./article/sidebar"; -@import "./article/share"; diff --git a/private/src/styles/pages/_news.scss b/private/src/styles/pages/_news.scss deleted file mode 100644 index 44fea166..00000000 --- a/private/src/styles/pages/_news.scss +++ /dev/null @@ -1,60 +0,0 @@ -@use "sass:math"; - -.blog main > .container:first-child { - padding: 0; - - @include mq(xm-small) { - padding: 0 flexy-gutter(); - } -} - -.blog .postlist .wp-block-post-template.columns-4 { - width: 100%; -} - -.has-subcategories { - display: flex; - align-items: flex-start; - flex-wrap: wrap; -} - -.has-subcategories .news-section { - @include mq(medium) { - margin-right: flexy-gutter(); - flex: 0 0 #{67% - math.div(flexy-gutter(), 2)}; - } - - @include mq(large) { - flex: 0 0 #{75% - math.div(flexy-gutter(), 2)}; - } -} - -.news-sidebar { - flex: 0 0 100%; - padding-top: 0; - padding-bottom: 0; - - @include mq(medium) { - flex: 0 0 #{33% - math.div(flexy-gutter(), 2)}; - } - - @include mq(large) { - flex: 0 0 #{25% - math.div(flexy-gutter(), 2)}; - } -} - -.news-sidebar .checkboxGroup { - display: inline-block; -} - -.news-sidebar .checkboxGroup-list { - width: 100%; -} - -.post-pagination { - padding-top: 0; - - @include mq(md-small) { - padding-top: 20px; - } -} diff --git a/private/src/styles/pages/_search.scss b/private/src/styles/pages/_search.scss deleted file mode 100644 index 5b425c9e..00000000 --- a/private/src/styles/pages/_search.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import "search/searchbox"; -@import "search/results"; -@import "search/results/filters"; -@import "search/results/active-filters"; diff --git a/private/src/styles/pages/article/_base.scss b/private/src/styles/pages/article/_base.scss deleted file mode 100644 index 0c510031..00000000 --- a/private/src/styles/pages/article/_base.scss +++ /dev/null @@ -1,95 +0,0 @@ -.article { - flex: 1 1 100%; - width: 100%; - max-width: 100%; - - @include mq(medium-sm) { - flex: 1 1 calc(100% - 88px); - } -} - -.article-container { - @include flexy-wrapper; - - @include mq(large) { - flex-wrap: nowrap; - } -} - -.article-container--report .article-content { - padding-top: 30px; - border-top: 1px solid var(--wp--preset--color--grey-lighter); -} - -.article.has-sidebar { - flex: 1 1 100%; - width: 100%; - max-width: 100%; - margin-right: auto; - - @include mq(medium-sm) { - flex: 1 1 calc(100% - 88px); - } - - @include mq(large) { - flex: 0 1 900px; - width: 900px; - max-width: 900px; - } - - .rtl & { - margin-right: 0; - margin-left: auto; - } -} - -.article-figure { - position: relative; - display: flex; - align-items: center; - max-height: 710px; // hero-md image height - overflow-y: hidden; - background-color: var(--wp--preset--color--grey-lighter); - text-align: center; - - // aiic-added wrapper for metadata - > div[style="position:relative"] { - width: 100%; - } - - &.is-stretched img { - min-width: 100%; - } -} - -.article-title { - margin-bottom: 0; - font-size: var(--wp--preset--font-size--article-title); -} - -.article-termWrapper { - background: var(--wp--preset--color--black); - padding: 8px 10px; - color: var(--wp--preset--color--white); -} - -.article-content > h4, -.article-content > h6 { - color: var(--wp--preset--color--grey-base); -} - -.article-content a { - &:hover, - &:active, - &:focus { - text-decoration: none; - } -} - -.article-content a:focus-within { - text-decoration: none; -} - -.article-content .btn { - text-decoration: none; -} diff --git a/private/src/styles/pages/article/_editor.scss b/private/src/styles/pages/article/_editor.scss deleted file mode 100644 index 062f678c..00000000 --- a/private/src/styles/pages/article/_editor.scss +++ /dev/null @@ -1,3 +0,0 @@ -.block-editor-block-list__block.article-container { - gap: 40px; -} diff --git a/private/src/styles/pages/article/_header.scss b/private/src/styles/pages/article/_header.scss deleted file mode 100644 index ef9cc03b..00000000 --- a/private/src/styles/pages/article/_header.scss +++ /dev/null @@ -1,36 +0,0 @@ -.article-header { - margin-bottom: 16px; - - @include mq(small) { - margin-bottom: 24px; - } -} - -.article-header .article-header-block { - display: inline-block; - padding: 16px; - margin-bottom: 32px; - background: var(--wp--preset--color--black); - color: var(--wp--preset--color--white); -} - -.article-header .article-header-block h1 { - color: var(--wp--preset--color--white); - text-transform: uppercase; -} - -.article-header .article-term { - font-size: var(--wp--preset--font-size--small); - text-transform: uppercase; - font-family: var(--wp--preset--font-family--secondary); -} - -.article-header.is-narrow, -.article-content.is-narrow { - padding-right: 60px; - - .rtl & { - padding-right: 0; - padding-left: 60px; - } -} diff --git a/private/src/styles/pages/article/_share.scss b/private/src/styles/pages/article/_share.scss deleted file mode 100644 index d83380ed..00000000 --- a/private/src/styles/pages/article/_share.scss +++ /dev/null @@ -1,21 +0,0 @@ -ul.article-share { - display: flex; - gap: .5rem; - margin: 0 0 0 auto; - padding: 0; - list-style: none; -} - -.article-share a { - @include state-background(var(--wp--preset--color--grey-darker)); - display: block; - padding: 8px; - width: 47px; - height: 47px; - text-align: center; - background-color: var(--wp--preset--color--black); -} - -.article-share img { - max-height: 100%; -} diff --git a/private/src/styles/pages/article/_sidebar.scss b/private/src/styles/pages/article/_sidebar.scss deleted file mode 100644 index d0670fa9..00000000 --- a/private/src/styles/pages/article/_sidebar.scss +++ /dev/null @@ -1,56 +0,0 @@ -.article-sidebar { - display: flex; - align-items: center; - flex-direction: column; - flex: 0 0 100%; - width: 100%; - max-width: 100%; - - @include mq(large) { - align-items: flex-start; - flex: 1 1 392px; - width: 392px; - max-width: 392px; - margin: 0 0 0 16px; - } -} - -.article-sidebar:empty { - margin-top: 0; - margin-bottom: 0; -} - -.article-sidebar > * { - margin-bottom: 0; - width: 100%; -} - -.article-sidebar > * + * { - margin-top: 24px; -} - -.article-sidebar .section { - margin: 0 auto; - max-width: 100%; - padding: 24px; -} - -.article-sidebar .linkList li { - @include mq(large) { - width: 100%; - } -} - -.article-sidebar .linkList-item { - min-height: 0; -} - -.article-sidebar .linksWithIcons-group.is-vertical { - margin-left: 0; - margin-right: 0; - width: 100%; -} - -.article-sidebar .customCard { - height: auto; -} diff --git a/private/src/styles/utils/functions/_maths.scss b/private/src/styles/utils/functions/_maths.scss deleted file mode 100755 index 6d97d827..00000000 --- a/private/src/styles/utils/functions/_maths.scss +++ /dev/null @@ -1,27 +0,0 @@ -//// -/// Maths helpers. -//// - -/// Quarter the suplied number. -/// @param {string | mumber} $number -@function quarter($number) { - @return round($number / 4); -} - -/// Halve the suplied number. -/// @param {string | mumber} $number -@function halve($number) { - @return round($number / 2); -} - -/// Double the suplied number. -/// @param {string | mumber} $number -@function double($number) { - @return round($number * 2); -} - -/// Quadruple the suplied number. -/// @param {string | mumber} $number -@function quadruple($number) { - @return round($number * 4); -} diff --git a/private/src/styles/utils/functions/_palette.scss b/private/src/styles/utils/functions/_palette.scss deleted file mode 100755 index ac08580e..00000000 --- a/private/src/styles/utils/functions/_palette.scss +++ /dev/null @@ -1,27 +0,0 @@ -/// Create color palettes. -/// @link http://erskinedesign.com/blog/friendlier-colour-names-sass-maps/ -/// @link https://github.com/ultimate-package/tools.color-palette -/// @param {Map} $palette - The palette -/// @param {String} $tone ["base"] - The tone of from the palette -/// @example scss - Example of palette -/// $palette: ( -/// brand: ( -/// base: #123456, -/// light: #654321 -/// ) -/// ) -/// @example scss - Using the palette -/// .block { -/// color: palette(brand, light); -/// } -@function palette($palette, $tone: "base") { - @if map-has-key($palettes, $palette) { - @if map-has-key(map-get($palettes, $palette), $tone) { - @return map-get(map-get($palettes, $palette), $tone); - } @else { - @warn "`#{$tone}` is not a valid tone in the `#{$palette}` palette."; - } - } @else { - @warn "`#{$palette}` is not a palette."; - } -} diff --git a/private/src/styles/utils/functions/_strip-units.scss b/private/src/styles/utils/functions/_strip-units.scss deleted file mode 100755 index a91b2821..00000000 --- a/private/src/styles/utils/functions/_strip-units.scss +++ /dev/null @@ -1,6 +0,0 @@ -/// Strip units from given number. -/// @param {string} $number - String to strip units from -/// @return {number} -@function strip-units($number) { - @return $number / ($number * 0 + 1); -} diff --git a/private/src/styles/utils/helpers/_display.scss b/private/src/styles/utils/helpers/_display.scss deleted file mode 100755 index 493850e9..00000000 --- a/private/src/styles/utils/helpers/_display.scss +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Display-type utilities - */ -.u-block { - display: block !important; -} - -.u-hidden { - display: none !important; -} - -/** - * Completely remove from the flow but leave available to screen readers. - */ -%hidden-visually { - position: absolute !important; - overflow: hidden !important; - width: 1px !important; - height: 1px !important; - padding: 0 !important; - border: 0 !important; - clip: rect(1px, 1px, 1px, 1px) !important; -} - -.u-hiddenVisually { - @extend %hidden-visually; -} - -.u-inline { - display: inline !important; -} - -/** - * 1. Fix for Firefox bug: an image styled `max-width:100%` within an - * inline-block will display at its default size, and not limit its width to - * 100% of an ancestral container. - */ -.u-inlineBlock { - display: inline-block !important; - max-width: 100%; /* 1 */ -} - -.u-table { - display: table !important; -} - -.u-tableCell { - display: table-cell !important; -} - -.u-tableRow { - display: table-row !important; -} - -.u-flex { - display: flex !important; -} - -.u-inlineFlex { - display: inline-flex !important; -} - -.u-flexWrap { - flex-wrap: wrap !important; -} - -.u-flexJustifyAround { - justify-content: space-around !important; -} - -.u-flexJustifyBetween { - justify-content: space-between !important; -} - -.u-flexJustifyCenter { - justify-content: center !important; -} - -.u-flexJustifyStart { - justify-content: flex-start !important; -} - -.u-flexJustifyEnd { - justify-content: flex-end !important; -} - -.u-flexAlignCenter { - align-items: center !important; -} - -.u-flexAlignStretch { - align-items: stretch !important; -} - -.u-flexAlignStart { - align-items: flex-start !important; -} - -.u-flexAlignEnd { - align-items: flex-end !important; -} - -.u-flexCenter { - justify-content: center !important; - align-items: center !important; -} diff --git a/private/src/styles/utils/helpers/_grid-classes.scss b/private/src/styles/utils/helpers/_grid-classes.scss deleted file mode 100755 index 2942cf5b..00000000 --- a/private/src/styles/utils/helpers/_grid-classes.scss +++ /dev/null @@ -1,65 +0,0 @@ -// /// Enable grid classes -// /// @group Defaults -// /// @type Boolean -// /// @example -// /// .gw-1, .gw-2, .gw-3 etc. -// $enable-grid-classes: true; - -// /// Turn on to debug the grid classes -// /// @group Defaults -// /// @type Boolean -// $debug-grid-classes: false; - -// /// Grid helper stacking breakpoing -// /// @group Defaults -// /// @type Neat breakpoint -// $grid-classes-stack-breakpoint: tall; - -// $grid-columns: 12; - -// @if ($debug-grid-classes) { -// [class*="gw-"] { -// background: #eee; -// } -// } - -// @if ($enable-grid-classes) { - -// // Wrap grid glasses in a row for auto omega, else use `u-omega` -// .row { -// @include clearfix(); -// } - -// // Set up base grid styles -// [class*="gw-"] { -// float: left; -// display: block; - -// // Remove margin from the last child. -// // Needs to be wrapped in a row to work per row. -// &:last-child { -// margin-right: 0; -// } -// } - -// // Generate grid widths. -// // $grid-columns is a Neat variable set in `_grid-settings.scss` -// @for $i from 1 through $grid-columns { -// [class*="gw-#{$i}"] { -// @include grid-column($i); -// } -// } - -// // Full width at breaking point -// @include mq($until: $grid-classes-stack-breakpoint) { -// [class*="gw-"] { -// @include grid-column(12); -// margin-right: 0; -// margin-bottom: spacing(); - -// &:last-child { -// margin-bottom: 0; -// } -// } -// } -// } diff --git a/private/src/styles/utils/helpers/_layout.scss b/private/src/styles/utils/helpers/_layout.scss deleted file mode 100755 index 61a36990..00000000 --- a/private/src/styles/utils/helpers/_layout.scss +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Clearfix - */ -.u-cf { - @include clearfix; -} - -/** - * Floats - */ -.u-floatLeft, -.alignleft { - float: left !important; -} - -.u-floatRight, -.alignright { - float: right !important; -} - -.u-floatNone { - float: none !important; -} - -.aligncenter { - display: block; - margin-right: auto; - margin-left: auto; -} diff --git a/private/src/styles/utils/helpers/_spacing.scss b/private/src/styles/utils/helpers/_spacing.scss deleted file mode 100755 index a3fdb0c9..00000000 --- a/private/src/styles/utils/helpers/_spacing.scss +++ /dev/null @@ -1,190 +0,0 @@ -// This file uses spacing to align, disable disalowing more than 1 space after colon. - -/* stylelint-disable scss/comment-no-empty, declaration-block-single-line-max-declarations, declaration-colon-space-after, selector-combinator-space-before */ - -//// -/// @group helpers -/// @type Bool -//// - -/// Global spacing helper toggle -/// > _Helper classes for adding/removing spacing._ -/// -/// @require $spacing-unit -/// @require $spacing-unit--double -/// @require $spacing-unit--quad -/// @require $spacing-unit--half -/// -/// @example md -/// Explanation of classes: -/// -/// (m|p) (a|t|r|b|l|h|v) (-|+|0) -/// (margin|padding) (all|top|right|bottom|left|horizontal|vertical) (less|more|none) -/// -/// horzontal = top + bottom -/// vertical = left + right -/// -/// h -/// |‾‾‾‾‾‾‾| -/// v | | v -/// |_______| -/// h -//// -$spacing-helpers: false !default; - -/// Standard margins -/// -/// @example markup -/// <div class="u-ma u-mt u-mr u-mb u-ml u-mv u-mh"></div> -$spacing-margins: false !default; - -/// Double margins -/// -/// @example markup -/// <div class="u-ma+ u-mt+ u-mr+ u-mb+ u-ml+ u-mv+ u-mh+"></div> -$spacing-margins--double: false !default; - -/// Half margins -/// -/// @example markup -/// <div class="u-ma- u-mt- u-mr- u-mb- u-ml- u-mv- u-mh-"></div> -$spacing-margins--half: false !default; - -/// Zero margins -/// -/// @example markup -/// <div class="u-ma0 u-mt0 u-mr0 u-mb0 u-ml0 u-mv0 u-mh0"></div> -$spacing-margins--zero: false !default; - -/// Standard paddings -/// -/// @example markup -/// <div class="u-pa u-pt u-pr u-pb u-pl u-pv u-ph"></div> -$spacing-paddings: false !default; - -/// Double paddings -/// -/// @example markup -/// <div class="u-pa+ u-pt+ u-pr+ u-pb+ u-pl+ u-pv+ u-ph+"></div> -$spacing-paddings--double: false !default; - -/// Half paddings -/// -/// @example markup -/// <div class="u-pa- u-pt- u-pr- u-pb- u-pl- u-pv- u-ph-"></div> -$spacing-paddings--half: false !default; - -/// Zero paddings -/// -/// @example markup -/// <div class="u-pa0 u-pt0 u-pr0 u-pb0 u-pl0 u-pv0 u-ph0"></div> -$spacing-paddings--zero: false !default; - -// Spacing namespace, useful if characters conflict with syntax highlighting (e.g. Pygments). -// @group Helpers -// -// @example scss - Set to a string -// $spacing-namespace: "u-" -// -// @example markup - Usage -// <div class="u-mt"></div> -$spacing-namespace: "u-" !default; - -@if $spacing-helpers { - - // - // Margins - // - - // Standard margin - @if $spacing-margins { - .#{$spacing-namespace}ma { margin: $spacing-unit !important; } - .#{$spacing-namespace}mt { margin-top: $spacing-unit !important; } - .#{$spacing-namespace}mr { margin-right: $spacing-unit !important; } - .#{$spacing-namespace}mb { margin-bottom: $spacing-unit !important; } - .#{$spacing-namespace}ml { margin-left: $spacing-unit !important; } - .#{$spacing-namespace}mh { margin-top: $spacing-unit !important; margin-bottom: $spacing-unit !important; } - .#{$spacing-namespace}mv { margin-right: $spacing-unit !important; margin-left: $spacing-unit !important; } - } - - // Double margin - @if $spacing-margins--double { - .#{$spacing-namespace}ma\+ { margin: $spacing-unit--double !important; } - .#{$spacing-namespace}mt\+ { margin-top: $spacing-unit--double !important; } - .#{$spacing-namespace}mr\+ { margin-right: $spacing-unit--double !important; } - .#{$spacing-namespace}mb\+ { margin-bottom: $spacing-unit--double !important; } - .#{$spacing-namespace}ml\+ { margin-left: $spacing-unit--double !important; } - .#{$spacing-namespace}mh\+ { margin-top: $spacing-unit--double !important; margin-bottom: $spacing-unit--double !important; } - .#{$spacing-namespace}mv\+ { margin-right: $spacing-unit--double !important; margin-left: $spacing-unit--double !important; } - } - - // Half margin - @if $spacing-margins--half { - .#{$spacing-namespace}ma- { margin: $spacing-unit--half !important; } - .#{$spacing-namespace}mt- { margin-top: $spacing-unit--half !important; } - .#{$spacing-namespace}mr- { margin-right: $spacing-unit--half !important; } - .#{$spacing-namespace}mb- { margin-bottom: $spacing-unit--half !important; } - .#{$spacing-namespace}ml- { margin-left: $spacing-unit--half !important; } - .#{$spacing-namespace}mh- { margin-top: $spacing-unit--half !important; margin-bottom: $spacing-unit--half !important; } - .#{$spacing-namespace}mv- { margin-right: $spacing-unit--half !important; margin-left: $spacing-unit--half !important; } - } - - // Zero margin - @if $spacing-margins--zero { - .#{$spacing-namespace}ma0 { margin: 0 !important; } - .#{$spacing-namespace}mt0 { margin-top: 0 !important; } - .#{$spacing-namespace}mr0 { margin-right: 0 !important; } - .#{$spacing-namespace}mb0 { margin-bottom: 0 !important; } - .#{$spacing-namespace}ml0 { margin-left: 0 !important; } - .#{$spacing-namespace}mh0 { margin-top: 0 !important; margin-bottom: 0 !important; } - .#{$spacing-namespace}mv0 { margin-right: 0 !important; margin-left: 0 !important; } - } - - // - // Paddings - // - - // Base padding - @if $spacing-paddings { - .#{$spacing-namespace}pa { padding: $spacing-unit !important; } - .#{$spacing-namespace}pt { padding-top: $spacing-unit !important; } - .#{$spacing-namespace}pr { padding-right: $spacing-unit !important; } - .#{$spacing-namespace}pb { padding-bottom: $spacing-unit !important; } - .#{$spacing-namespace}pl { padding-left: $spacing-unit !important; } - .#{$spacing-namespace}ph { padding-top: $spacing-unit !important; padding-bottom: $spacing-unit !important; } - .#{$spacing-namespace}pv { padding-right: $spacing-unit !important; padding-left: $spacing-unit !important; } - } - - // Double padding - @if $spacing-paddings--double { - .#{$spacing-namespace}pa\+ { padding: $spacing-unit--double !important; } - .#{$spacing-namespace}pt\+ { padding-top: $spacing-unit--double !important; } - .#{$spacing-namespace}pr\+ { padding-right: $spacing-unit--double !important; } - .#{$spacing-namespace}pb\+ { padding-bottom: $spacing-unit--double !important; } - .#{$spacing-namespace}pl\+ { padding-left: $spacing-unit--double !important; } - .#{$spacing-namespace}ph\+ { padding-top: $spacing-unit--double !important; padding-bottom: $spacing-unit--double !important; } - .#{$spacing-namespace}pv\+ { padding-right: $spacing-unit--double !important; padding-left: $spacing-unit--double !important; } - } - - // Half padding - @if $spacing-paddings--half { - .#{$spacing-namespace}pa- { padding: $spacing-unit--half !important; } - .#{$spacing-namespace}pt- { padding-top: $spacing-unit--half !important; } - .#{$spacing-namespace}pr- { padding-right: $spacing-unit--half !important; } - .#{$spacing-namespace}pb- { padding-bottom: $spacing-unit--half !important; } - .#{$spacing-namespace}pl- { padding-left: $spacing-unit--half !important; } - .#{$spacing-namespace}ph- { padding-top: $spacing-unit--half !important; padding-bottom: $spacing-unit--half !important; } - .#{$spacing-namespace}pv- { padding-right: $spacing-unit--half !important; padding-left: $spacing-unit--half !important; } - } - - // Zero padding - @if $spacing-paddings--zero { - .#{$spacing-namespace}pa0 { padding: 0 !important; } - .#{$spacing-namespace}pt0 { padding-top: 0 !important; } - .#{$spacing-namespace}pr0 { padding-right: 0 !important; } - .#{$spacing-namespace}pb0 { padding-bottom: 0 !important; } - .#{$spacing-namespace}pl0 { padding-left: 0 !important; } - .#{$spacing-namespace}ph0 { padding-top: 0 !important; padding-bottom: 0 !important; } - .#{$spacing-namespace}pv0 { padding-right: 0 !important; padding-left: 0 !important; } - } -} diff --git a/private/src/styles/utils/helpers/_type.scss b/private/src/styles/utils/helpers/_type.scss deleted file mode 100755 index 677d6e72..00000000 --- a/private/src/styles/utils/helpers/_type.scss +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Text transforms - */ -.u-textUpper { - text-transform: uppercase !important; -} - -.u-textLower { - text-transform: lowercase !important; -} - -.u-textCaps { - text-transform: capitalize !important; -} - -/** - * Font weights - */ -.u-textLight { - font-weight: 300 !important; -} - -.u-textNormal { - font-weight: normal !important; -} - -.u-textBold { - font-weight: bold !important; -} - -/** - * Text alignment - */ -.u-textLeft { - text-align: left !important; - - .rtl & { - text-align: right !important; - } -} - -.u-textCenter { - text-align: center !important; -} - -.u-textRight { - text-align: right !important; - - .rtl & { - text-align: left !important; - } -} - -.u-textNoWrap { - white-space: nowrap !important; -} - -/** - * Text truncation. - * - * Prevent text from wrapping onto multiple lines, and truncate with an - * ellipsis. - * - * 1. Ensure that the node has a maximum width after which truncation can - * occur. - * 2. Fix for IE 8/9 if `word-wrap: break-word` is in effect on ancestor - * nodes. - */ -.u-textTruncate { - max-width: 100%; /* 1 */ - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - word-wrap: normal !important; /* 2 */ -} diff --git a/private/src/styles/utils/mixins/_clearfix.scss b/private/src/styles/utils/mixins/_clearfix.scss deleted file mode 100755 index bbf90c4c..00000000 --- a/private/src/styles/utils/mixins/_clearfix.scss +++ /dev/null @@ -1,23 +0,0 @@ -/// Clearfix -/// @example scss -/// .foo { -/// @include clearfix(); -/// } -/// -/// // This will generate a before and after containing clear fix declarations -/// .foo::before, -/// .foo::after { -/// content: ""; -/// display: table; -/// clear: both; -/// } -/// - -@mixin clearfix { - &::before, - &::after { - content: ""; - display: table; - clear: both; - } -} diff --git a/private/src/styles/utils/mixins/_cols.scss b/private/src/styles/utils/mixins/_cols.scss deleted file mode 100755 index 59ca5d13..00000000 --- a/private/src/styles/utils/mixins/_cols.scss +++ /dev/null @@ -1,52 +0,0 @@ -/// Columns Generator -/// @author Jerome Duncan -/// @param {string} $className - Class name to target. -/// @param {string} $cols - Number of items per row -/// @example scss -/// .thumbnails--small { -/// @include cols(".thumbnail", 5); -/// } -/// -/// // This will generate styles for the container and the containing element, -/// // with nth child styles already wrote out -/// -/// // Output: -/// .thumbnails--small { -/// display: flex; -/// flex-wrap: wrap; -/// } -/// -/// .thumbnails--small .thumbnail { -/// flex-grow: 0; -/// flex-shrink: 0; -/// flex-basis: 18.70968%; -/// width: 18.70968%; -/// margin-right: 1.6129%; -/// } -/// -/// .thumbnails--small .thumbnail:nth-child(5n + 5) { -/// margin-right: 0; -/// } -/// -/// .thumbnails--small .thumbnail:nth-child(-n + 5) { -/// margin-top: 0; -/// } -@mixin cols($className, $cols) { - $colspan: 12 / $cols; - - & { - @include flexy-wrapper; - } - & #{$className} { - @include flexy-column($colspan); - } - - // & #{$className}:first-child, - & #{$className}:nth-child(#{$cols}n + #{$cols}) { - margin-right: 0; - } - - & #{$className}:nth-child(-n + #{$cols}) { - margin-top: 0; - } -} diff --git a/private/src/styles/utils/mixins/_headings.scss b/private/src/styles/utils/mixins/_headings.scss deleted file mode 100755 index 2dd82b33..00000000 --- a/private/src/styles/utils/mixins/_headings.scss +++ /dev/null @@ -1,23 +0,0 @@ -/// Style any number of headings in one swoop. -/// @author @csswizardry, @lar_zzz, @paranoida, @rowanmanning and @thierrylemoulec. -/// @param {number} $from [1] - Starting heading -/// @param {number} $to [6] - Finishing heading -/// @example scss -/// .foo { -/// @include headings(1, 3) { -/// color: #BADA55; -/// } -/// } -@mixin headings($from: 1, $to: 6) { - %headings-#{$from}-#{$to} { - @content; - } - - @if $from >= 1 and $to <= 6 { - @for $i from $from through $to { - h#{$i} { - @extend %headings-#{$from}-#{$to}; - } - } - } -} diff --git a/private/src/styles/utils/variables/_breakpoints.scss b/private/src/styles/utils/variables/_breakpoints.scss deleted file mode 100755 index 1fb3f109..00000000 --- a/private/src/styles/utils/variables/_breakpoints.scss +++ /dev/null @@ -1,19 +0,0 @@ -// This file uses spacing to align, disable disalowing more than 1 space after colon. - -$mq-breakpoints: ( - xxx-small: 320px, - xx-small: 465px, - x-small: 540px, - xm-small: 570px, - md-small: 596px, - small: 760px, - wp-adminbar: 781px, - medium-sm: 840px, - medium: 940px, - medium-lg: 988px, - mobile-nav: 1024px, - large: 1110px, - x-large: 1200px, - xm-large: 1320px, - xx-large: 1400px -); diff --git a/private/src/scripts/utils/dom.js b/private/src/utils/dom.js similarity index 100% rename from private/src/scripts/utils/dom.js rename to private/src/utils/dom.js diff --git a/private/src/scripts/utils/form-data.js b/private/src/utils/form-data.js similarity index 100% rename from private/src/scripts/utils/form-data.js rename to private/src/utils/form-data.js diff --git a/private/src/styles/utils/functions/_flexy.scss b/private/src/utils/functions/_flexy.scss similarity index 83% rename from private/src/styles/utils/functions/_flexy.scss rename to private/src/utils/functions/_flexy.scss index ed585136..17395bb7 100755 --- a/private/src/styles/utils/functions/_flexy.scss +++ b/private/src/utils/functions/_flexy.scss @@ -1,6 +1,7 @@ @use "sass:math"; +@use "../variables/grid-settings" as g; -$flexy-outer-gutter: $flexy-gutter-width !default; +$flexy-outer-gutter: g.$flexy-gutter-width !default; /// A mixin for adding flex grow, shrink and basis with a width for IE11 support /// @author Jerome Duncan @@ -43,7 +44,7 @@ $flexy-outer-gutter: $flexy-gutter-width !default; /// width: calc(50% - 10px); /// } @mixin flexy-grid($noOfItems, $gutterWidth: $flexy-gutter-width) { - @if unit($gutterWidth) == "%" { + @if math.unit($gutterWidth) == "%" { @include flexy-flex(#{math.div(100, $noOfItems) - math.div($gutterWidth * ($noOfItems - 1), $noOfItems)}); } @else { @include flexy-flex(calc(#{math.div(100, $noOfItems) + "%"} - #{math.div($gutterWidth * ($noOfItems - 1), $noOfItems)})); @@ -55,8 +56,8 @@ $flexy-outer-gutter: $flexy-gutter-width !default; /// @param {string} $outer-gutter - Outer Gutter /// @return {number} /// -@function flexy-gutter($containerWidth: $flexy-container, $outer-gutter: $flexy-outer-gutter) { - $gutter: math.div($flexy-gutter-width, ($containerWidth - 2 * $outer-gutter)) * 100%; +@function flexy-gutter($containerWidth: g.$flexy-container, $outer-gutter: g.$flexy-outer-gutter) { + $gutter: math.div(g.$flexy-gutter-width, ($containerWidth - 2 * $outer-gutter)) * 100%; @return $gutter; } @@ -67,8 +68,8 @@ $flexy-outer-gutter: $flexy-gutter-width !default; /// @param {string} $outer-gutter - Outer Gutter /// @return {number} /// -@function flexy-col($noOfColumns: 1, $containerWidth: $flexy-container, $outer-gutter: $flexy-outer-gutter) { - $col: math.div($flexy-column-width, ($containerWidth - 2 * $outer-gutter)) * 100; +@function flexy-col($noOfColumns: 1, $containerWidth: g.$flexy-container, $outer-gutter: g.$flexy-outer-gutter) { + $col: math.div(g.$flexy-column-width, ($containerWidth - 2 * $outer-gutter)) * 100; $gutter: flexy-gutter($containerWidth); $myValue: ($col * $noOfColumns) + ($gutter * ($noOfColumns - 1)); @@ -92,7 +93,7 @@ $flexy-outer-gutter: $flexy-gutter-width !default; /// width: 49.33774834%; /// margin-right: 1.32450331%; /// } -@mixin flexy-column($noOfColumns, $containerWidth: $flexy-container) { +@mixin flexy-column($noOfColumns, $containerWidth: g.$flexy-container) { $col: flexy-col($noOfColumns, $containerWidth); @include flexy-flex($col); @@ -133,7 +134,7 @@ $flexy-outer-gutter: $flexy-gutter-width !default; /// } @mixin flexy-container() { @include flexy-wrapper; - max-width: $flexy-container; + max-width: g.$flexy-container; margin: 0 auto; - padding: 0 $flexy-outer-gutter; + padding: 0 g.$flexy-outer-gutter; } diff --git a/private/src/utils/index.js b/private/src/utils/index.js new file mode 100644 index 00000000..d407f671 --- /dev/null +++ b/private/src/utils/index.js @@ -0,0 +1,250 @@ +import { isUndefined } from 'lodash'; +import { sanitizeUrl } from '@braintree/sanitize-url'; + +/** + * Ensure a URI uses HTTPS proto. Fails to an empty string. + * + * @param {String} string the string to force HTTPS for + * + * @returns {String} + */ +export const httpsOnly = (string) => { + try { + const url = new URL(string.replace(/^http:/, 'https:')); + + url.protocol = 'https:'; + + return sanitizeUrl(url.toString()); + } catch (e) { + // not a proper url yet + return string; + } +}; + +export const fetchMediaUrl = (mediaId, callback) => { + if (!mediaId) { + return Promise.resolve(null); + } + + return wp + .apiRequest({ path: `/wp/v2/media/${mediaId}` }) + .then((r) => callback(r?.source_url ?? r.url)); +}; + +export const fetchMediaMetadata = (imageId, callback) => { + if (!imageId) { + return; + } + + wp.apiRequest({ + path: `/wp/v2/media/${imageId}?_fields=description,caption&context=edit`, + }).then((r) => callback({ caption: r.caption.raw, description: r.description.raw })); +}; + +/** + * Generate a random identifier + * + * @returns {String} + */ +export const randId = () => + Math.random() + .toString(36) + .replace(/[^a-z]+/g, '') + .substring(2, 10); + +/** + * Ensure a numeric value falls within a predetermined range + * + * @param {Number} min the minimum value + * @param {Number} max the maximum value + * + * @returns {Number} + */ +export const createRange = (min, max) => (num) => Math.max(min, Math.min(max, num)); + +/** + * Simply compares two string version values. + * + * Example: + * versionCompare('1.1', '1.2') => -1 + * versionCompare('1.1', '1.1') => 0 + * versionCompare('1.2', '1.1') => 1 + * versionCompare('2.23.3', '2.22.3') => 1 + * + * Returns: + * -1 = left is LOWER than right + * 0 = they are equal + * 1 = left is GREATER = right is LOWER + * And FALSE if one of input versions are not valid + * + * @function + * @param {String} left Version #1 + * @param {String} right Version #2 + * @return {Integer|Boolean} + * @author Alexey Bass (albass) + * @since 2011-07-14 + */ +export const versionCompare = (left, right) => { + if (typeof left + typeof right !== 'stringstring') return false; + + const a = left.split('.'); + const b = right.split('.'); + let i = 0; + const len = Math.max(a.length, b.length); + + // eslint-disable-next-line no-plusplus + for (; i < len; i++) { + if ((a[i] && !b[i] && parseInt(a[i], 10) > 0) || parseInt(a[i], 10) > parseInt(b[i], 10)) { + return 1; + } + if ((b[i] && !a[i] && parseInt(b[i], 10) > 0) || parseInt(a[i], 10) < parseInt(b[i], 10)) { + return -1; + } + } + + return 0; +}; + +/** + * Validate whether a value is a boolean type + * + * @param {Mixed} val the value to validate + * + * @return {Boolean} + */ +export const validateBool = (val) => { + if (isUndefined(val)) { + return false; + } + + if (val === true || val === false) { + return val; + } + + if (['1', 'true', 'yes', 'on', 'y'].indexOf(`${val}`.toLowerCase()) !== -1) { + return true; + } + + if (['0', 'false', 'no', 'off', 'n'].indexOf(`${val}`.toLowerCase()) !== -1) { + return false; + } + + return !!val; +}; + +/** + * Generate a random alphanumeric key of {length} length + * + * @param {Integer} length the length of key to generate + * + * @return {String} + */ +export const key = (length) => { + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charLength = characters.length; + let result = ''; + + for (let i = 0; i < length; i += 1) { + result += characters.charAt(Math.floor(Math.random() * charLength)); + } + + return result; +}; + +/** + * Convert the first character of a string to uppercase + * + * @param {String} str the string to texturise + * + * @returns {String} + */ +export const ucfirst = (str = '') => str.charAt(0).toUpperCase() + str.slice(1); + +/** + * Check whether a variable is of the type specified + * + * @param {Mixed} val the value to test + * @param {String} type the type to check + * + * @returns {Boolean} + */ +export const isType = (val, type) => + Object.prototype.toString.call(val) === `[object ${ucfirst(type)}]`; + +/** + * Convert an array to a string + * + * @param {Array|String} val the value to stringify + * + * @returns {String} + */ +export const stringify = (val) => (isType(val, 'array') ? val.join('') : val); + +/** + * Trim line breaks from a string + * + * @param {String} str the string to trim + * + * @returns {String} + */ +export const trimBr = (str = '') => str.replace(/\u003cbr\/\u003e/gi, ' ').trim(); + +/** + * Convert line breaks to paragraphs + * + * @param {String} str the string to texturise + * + * @returns {String} + */ +export const brToP = (str = '') => + stringify(str) + .replace(/((<|&lt;|\u003c)br[^>]*?>)+$/, '') // trim trailing <br>s + .split(/(?:(?:(?:<|&lt;|\u003c)br[^>]*?>)+)/) // split on one or more embedded <br>s + .map((p) => `<p>${p}</p>`) // make paragraphs + .join(''); // make a string + +/** + * Retrieve media data and pass response to a callback + * + * @param {Number} id the media to fetch + * @param {Function} callback the callback to execute + * @param {Object} state previous data, if any + * + * @return {Promise} + */ +export const fetchMediaData = (id, callback, state = {}) => { + if (!id) { + return Promise.resolve(callback({})); + } + + if (state?.id === id) { + return Promise.resolve(callback(state)); + } + + return wp + .apiFetch({ + path: `/wp/v2/media/${id}?_fields=id,source_url,caption,description&context=edit`, + }) + .then((media) => + callback({ + id: media.id, + url: media.source_url, + caption: media.caption.raw, + copyright: media.description.raw, + }), + ); +}; + +/** + * Create a hash usable in a HTML tag's id attribute + * + * @param {String} string the string to use as the seed + * + * @returns {String} + */ +export async function makeHtmlId(string) { + return Array.from( + new Uint8Array(await crypto.subtle.digest('SHA-1', new TextEncoder().encode(string))), + (byte) => byte.toString(16).padStart(2, 'a'), + ).join(''); +} diff --git a/private/src/scripts/utils/keyboard.js b/private/src/utils/keyboard.js similarity index 100% rename from private/src/scripts/utils/keyboard.js rename to private/src/utils/keyboard.js diff --git a/private/src/scripts/utils/list-search.js b/private/src/utils/list-search.js similarity index 100% rename from private/src/scripts/utils/list-search.js rename to private/src/utils/list-search.js diff --git a/private/src/styles/utils/mixins/_icon.scss b/private/src/utils/mixins/_icon.scss similarity index 100% rename from private/src/styles/utils/mixins/_icon.scss rename to private/src/utils/mixins/_icon.scss diff --git a/private/src/styles/utils/mixins/_placeholder.scss b/private/src/utils/mixins/_placeholder.scss similarity index 100% rename from private/src/styles/utils/mixins/_placeholder.scss rename to private/src/utils/mixins/_placeholder.scss diff --git a/private/src/styles/utils/mixins/_states.scss b/private/src/utils/mixins/_states.scss similarity index 100% rename from private/src/styles/utils/mixins/_states.scss rename to private/src/utils/mixins/_states.scss diff --git a/private/src/scripts/utils/reviseData.js b/private/src/utils/reviseData.js similarity index 100% rename from private/src/scripts/utils/reviseData.js rename to private/src/utils/reviseData.js diff --git a/private/src/scripts/utils/slugify.js b/private/src/utils/slugify.js similarity index 100% rename from private/src/scripts/utils/slugify.js rename to private/src/utils/slugify.js diff --git a/private/src/scripts/utils/url.js b/private/src/utils/url.js similarity index 98% rename from private/src/scripts/utils/url.js rename to private/src/utils/url.js index d4969ae9..0106330a 100644 --- a/private/src/scripts/utils/url.js +++ b/private/src/utils/url.js @@ -1,4 +1,4 @@ -const { isObject } = window.lodash; +import { isObject } from 'lodash'; /** * Convert a query string into an object diff --git a/private/src/styles/utils/variables/_defaults.scss b/private/src/utils/variables/_defaults.scss similarity index 80% rename from private/src/styles/utils/variables/_defaults.scss rename to private/src/utils/variables/_defaults.scss index 73f7ed3a..91004fd6 100755 --- a/private/src/styles/utils/variables/_defaults.scss +++ b/private/src/utils/variables/_defaults.scss @@ -32,16 +32,16 @@ $base-line-height: 27px !default; $spacing-unit: $base-line-height !default; /// Double `$spacing-unit`. -$spacing-unit--double: round($spacing-unit * 2); +$spacing-unit--double: math.round($spacing-unit * 2); /// Half `$spacing-unit`. -$spacing-unit--half: round(math.div($spacing-unit, 2)); +$spacing-unit--half: math.round(math.div($spacing-unit, 2)); /// Half `$spacing-unit`. -$spacing-unit--quad: round($spacing-unit * 4); +$spacing-unit--quad: math.round($spacing-unit * 4); /// Half `$spacing-unit`. -$spacing-unit--quarter: round(math.div($spacing-unit, 4)); +$spacing-unit--quarter: math.round(math.div($spacing-unit, 4)); /// Global border radius. $base-border-radius: 0 !default; diff --git a/private/src/styles/utils/variables/_grid-settings.scss b/private/src/utils/variables/_grid-settings.scss similarity index 100% rename from private/src/styles/utils/variables/_grid-settings.scss rename to private/src/utils/variables/_grid-settings.scss diff --git a/private/svg-sprite.config.json b/private/svg-sprite.config.json deleted file mode 100644 index 2815a1c4..00000000 --- a/private/svg-sprite.config.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "dest": "../wp-content/themes/amnesty-core/assets/images", - "log": null, - "shape": { - "dimension": { - "attributes": true - }, - "transform": [] - }, - "mode": { - "defs": { - "dest": "./", - "sprite": "./sprite.defs.svg", - "inline": true - } - } -} diff --git a/private/webpack.config.js b/private/webpack.config.js index 84749a9d..3cac1c37 100644 --- a/private/webpack.config.js +++ b/private/webpack.config.js @@ -1,200 +1,32 @@ const path = require('path'); -const webpack = require('webpack'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); +// eslint-disable-next-line import/no-extraneous-dependencies +const defaultConfig = require('@wordpress/scripts/config/webpack.config'); const ESLintPlugin = require('eslint-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const StyleLintPlugin = require('stylelint-webpack-plugin'); -const { EsbuildPlugin } = require('esbuild-loader'); -// Project paths. -const SRC_PATH = path.resolve(__dirname, './src/'); -const OUT_PATH = path.resolve(__dirname, '../wp-content/themes/humanity-theme/assets/'); - -/** - * Filter entry points if specified in cli - * @param {Object} env cli env vars - * @returns {Object} - */ -const getEntries = (env) => { - const entries = { - bundle: path.resolve(__dirname, `${SRC_PATH}/scripts/App.js`), - blocks: path.resolve(__dirname, `${SRC_PATH}/scripts/blocks.js`), - editor: path.resolve(__dirname, `${SRC_PATH}/scripts/editor.js`), - admin: path.resolve(__dirname, `${SRC_PATH}/scripts/admin.js`), - }; - - if (!env?.entry) { - return entries; - } - - const entry = {}; - - env.entry.split(',').forEach((name) => { - if (Object.hasOwnProperty.call(entries, name)) { - entry[name] = entries[name]; - } - }); - - return entry; -}; - -/** - * Filter list of loaded plugins based on cli args - * @param {Object} argv raw cli args - * @param {Object} env cli env vars - * @returns {Array} - */ -const getPlugins = (argv, env) => { - const staticPlugins = [ - new CopyWebpackPlugin({ - patterns: [ - { - context: SRC_PATH, - from: 'static/**/*', - to({ absoluteFilename }) { - return absoluteFilename.replace(`${SRC_PATH}/static`, OUT_PATH); - }, - }, - ], - }), - ]; - - // if we're only building static assets, skip CSS extraction - if (env?.entry === 'static') { - return [ - new ESLintPlugin({ extensions: ['js', 'jsx', 'ts', 'tsx'] }), - // Sets mode so we can access it in `postcss.config.js`. - new webpack.LoaderOptionsPlugin({ options: { mode: argv.mode } }), - new StyleLintPlugin({ threads: true }), - ...staticPlugins, - ]; - } - - const plugins = [ - new ESLintPlugin({ extensions: ['js', 'jsx', 'ts', 'tsx'] }), - // Sets mode so we can access it in `postcss.config.js`. - new webpack.LoaderOptionsPlugin({ options: { mode: argv.mode } }), - // Extract CSS to own bundle, filename relative to output.path. - new MiniCssExtractPlugin({ filename: '../styles/[name].css', chunkFilename: '[name].css' }), - new StyleLintPlugin({ threads: true }), - ]; - - // we're specifying an entry point that isn't static, skip static processing - if (env?.entry) { - return plugins; - } - - // do everything - return [...plugins, ...staticPlugins]; -}; - -/** - * Get the cache configuration for the build mode - * @param {String} mode the build mode - * @returns {Object|False} - */ -const getCacheConf = (mode) => { - if (mode === 'production') { - return false; - } - - return { - type: 'filesystem', - profile: false, - buildDependencies: { - config: [__filename], - }, - }; -}; - -const config = (env, argv) => ({ - bail: argv.mode === 'production', - cache: getCacheConf(argv.mode), - target: 'web', - profile: false, +const plugins = [ + ...defaultConfig.plugins, + new ESLintPlugin({ extensions: ['js', 'jsx', 'ts', 'tsx'] }), +]; + +module.exports = { + ...defaultConfig, + entry: { + ...defaultConfig.entry(), + admin: path.resolve(__dirname, './src/admin/index.js'), + editor: path.resolve(__dirname, './src/editor/index.js'), + editorPlugins: path.resolve(__dirname, './src/editor-plugins/index.js'), + frontend: path.resolve(__dirname, './src/frontend/index.js'), + shared: path.resolve(__dirname, './src/shared/index.js'), + }, + plugins, devtool: 'source-map', - entry: getEntries(env), - output: { - filename: '[name].js', - path: path.resolve(__dirname, `${OUT_PATH}/scripts`), - pathinfo: false, - }, - externals: { - lodash: 'lodash', - react: 'React', - 'react-dom': 'ReactDOM', - '@wordpress/i18n': 'wp.i18n', - }, - watchOptions: { - ignored: /node_modules/, - }, performance: { hints: false, }, - optimization: { - minimize: argv.mode === 'production', - minimizer: [ - new EsbuildPlugin({ - target: 'es2015', - css: true, - }), - ], - }, - resolve: { - symlinks: false, - }, stats: { - all: false, - assets: true, - errors: true, - errorDetails: true, - excludeAssets: [/\.(eot|ttf|woff2?|jpg|png|svg)$/], + preset: 'normal', + colors: true, + excludeAssets: [/\.(eot|ttf|woff2?|jpg|json|php|png|svg)$/], + timings: true, }, - plugins: getPlugins(argv, env), - module: { - rules: [ - { - test: /App\.js$/, - loader: 'expose-loader', - options: { - exposes: 'App', - }, - }, - { - test: /\.s?(a|c)?ss$/, - use: [ - MiniCssExtractPlugin.loader, - { - loader: 'css-loader', - options: { - sourceMap: true, - url: false, - }, - }, - { - loader: 'postcss-loader', - options: { - sourceMap: true, - }, - }, - { - loader: 'sass-loader', - options: { - sourceMap: true, - }, - }, - ], - }, - { - test: /\.jsx?$/, - exclude: /(lodash|node_modules|react(-dom)?)/, - loader: 'esbuild-loader', - options: { - target: 'es2015', - }, - }, - ], - }, -}); - -module.exports = (env, argv) => config(env, argv); +}; diff --git a/private/yarn.lock b/private/yarn.lock index d6f2de97..449ab18b 100644 --- a/private/yarn.lock +++ b/private/yarn.lock @@ -5,182 +5,195 @@ __metadata: version: 8 cacheKey: 10c0 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: 10c0/53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" +"@ariakit/core@npm:0.4.14": + version: 0.4.14 + resolution: "@ariakit/core@npm:0.4.14" + checksum: 10c0/7faf79069d25b9a869143fc8d25f87ce02be3fbc87183055a5cb93abf6a7989281155493cf1fe18b5d8144f6fab5a60063699d6d53b7e3d3de253e8afd0c33c2 + languageName: node + linkType: hard + +"@ariakit/react-core@npm:0.4.15": + version: 0.4.15 + resolution: "@ariakit/react-core@npm:0.4.15" dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.0" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10c0/92ce5915f8901d8c7cd4f4e6e2fe7b9fd335a29955b400caa52e0e5b12ca3796ada7c2f10e78c9c5b0f9c2539dff0ffea7b19850a56e1487aa083531e1e46d43 + "@ariakit/core": "npm:0.4.14" + "@floating-ui/dom": "npm:^1.0.0" + use-sync-external-store: "npm:^1.2.0" + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/8da567eadee423b38b54ea4c58ec19a84e329da141bf0277906a8a69b428ea6326e31e28a7f0fc67c4c8b1c420500137b6bee04e8c12253f2b7b290fb2173439 languageName: node linkType: hard -"@babel/cli@npm:^7.16.0": - version: 7.23.4 - resolution: "@babel/cli@npm:7.23.4" +"@ariakit/react@npm:^0.4.15": + version: 0.4.15 + resolution: "@ariakit/react@npm:0.4.15" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.17" - "@nicolo-ribaudo/chokidar-2": "npm:2.1.8-no-fsevents.3" - chokidar: "npm:^3.4.0" - commander: "npm:^4.0.1" - convert-source-map: "npm:^2.0.0" - fs-readdir-recursive: "npm:^1.1.0" - glob: "npm:^7.2.0" - make-dir: "npm:^2.1.0" - slash: "npm:^2.0.0" + "@ariakit/react-core": "npm:0.4.15" peerDependencies: - "@babel/core": ^7.0.0-0 - dependenciesMeta: - "@nicolo-ribaudo/chokidar-2": - optional: true - chokidar: - optional: true - bin: - babel: ./bin/babel.js - babel-external-helpers: ./bin/babel-external-helpers.js - checksum: 10c0/f71bc378f62dd19983adc8dae4ee33cd44ac7d8ea3224709f787f290e0c3a4b8a36dad76d672b3479de2b9f524e55b4bb12a2296154c73134ba111114a15779c + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/e89ccb1e56df17cf372b6f6df3217f2e2258bad920ac21044303948f59de4a61ae42142162d12c05b65e4ff63f08a450fa7429aafbb74a9817a65f36607ff980 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.7, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": "npm:^7.23.4" - chalk: "npm:^2.4.2" - checksum: 10c0/a10e843595ddd9f97faa99917414813c06214f4d9205294013e20c70fbdf4f943760da37dec1d998bf3e6fc20fa2918a47c0e987a7e458663feb7698063ad7c6 + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 10c0/081278ed46131a890ad566a59c61600a5f9557bd8ee5e535890c8548192532ea92590742fd74bd9db83d74c669ef8a04a7e1c85cdea27f960233e3b83c3a957c +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.7, @babel/compat-data@npm:^7.26.0, @babel/compat-data@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/compat-data@npm:7.26.5" + checksum: 10c0/9d2b41f0948c3dfc5de44d9f789d2208c2ea1fd7eb896dfbb297fe955e696728d6f363c600cd211e7f58ccbc2d834fe516bb1e4cf883bbabed8a32b038afc1a0 languageName: node linkType: hard -"@babel/core@npm:^7.16.0": - version: 7.23.5 - resolution: "@babel/core@npm:7.23.5" +"@babel/core@npm:7.25.7": + version: 7.25.7 + resolution: "@babel/core@npm:7.25.7" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.5" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.5" - "@babel/parser": "npm:^7.23.5" - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" + "@babel/code-frame": "npm:^7.25.7" + "@babel/generator": "npm:^7.25.7" + "@babel/helper-compilation-targets": "npm:^7.25.7" + "@babel/helper-module-transforms": "npm:^7.25.7" + "@babel/helpers": "npm:^7.25.7" + "@babel/parser": "npm:^7.25.7" + "@babel/template": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/311a512a870ee330a3f9a7ea89e5df790b2b5af0b1bd98b10b4edc0de2ac440f0df4d69ea2c0ee38a4b89041b9a495802741d93603be7d4fd834ec8bb6970bd2 + checksum: 10c0/dad20af39624086afc3a0910bd97ae712c9ad0e9dda09fc5da93876e8ea1802b63ddd81c44f4aa8a9834db46de801eaab1ce9b81ab54b4fe907ae052c24de136 languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.16.0, @babel/eslint-parser@npm:^7.16.3": - version: 7.23.3 - resolution: "@babel/eslint-parser@npm:7.23.3" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals": "npm:5.1.1-v1" - eslint-visitor-keys: "npm:^2.1.0" + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.0" + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 - checksum: 10c0/abb01d23acd80e983125cd72c547baaf7775bfca7a98fc57a2a95f2b70197a34c6bf861e255ab5c8740ace27c50a9966481503875fcc23b2636598740e4881f4 + checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e languageName: node linkType: hard -"@babel/generator@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/generator@npm:7.23.5" +"@babel/eslint-parser@npm:7.25.7": + version: 7.25.7 + resolution: "@babel/eslint-parser@npm:7.25.7" dependencies: - "@babel/types": "npm:^7.23.5" - "@jridgewell/gen-mapping": "npm:^0.3.2" - "@jridgewell/trace-mapping": "npm:^0.3.17" - jsesc: "npm:^2.5.1" - checksum: 10c0/14c6e874f796c4368e919bed6003bb0adc3ce837760b08f9e646d20aeb5ae7d309723ce6e4f06bcb4a2b5753145446c8e4425851380f695e40e71e1760f49e7b + "@nicolo-ribaudo/eslint-scope-5-internals": "npm:5.1.1-v1" + eslint-visitor-keys: "npm:^2.1.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + checksum: 10c0/7609eda37e727b0ea70fc9f6175f13adf6d912d18f52430dd3acb88c403173a5b403a8f5a31158253b03fa2a4d7347475cc0d41cc3e9628386bd9cc12a139591 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" +"@babel/generator@npm:^7.25.7, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.5, @babel/generator@npm:^7.7.2": + version: 7.26.5 + resolution: "@babel/generator@npm:7.26.5" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/5a80dc364ddda26b334bbbc0f6426cab647381555ef7d0cd32eb284e35b867c012ce6ce7d52a64672ed71383099c99d32765b3d260626527bb0e3470b0f58e45 + "@babel/parser": "npm:^7.26.5" + "@babel/types": "npm:^7.26.5" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/3be79e0aa03f38858a465d12ee2e468320b9122dc44fc85984713e32f16f4d77ce34a16a1a9505972782590e0b8d847b6f373621f9c6fafa1906d90f31416cb0 languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" +"@babel/helper-annotate-as-pure@npm:^7.25.7, @babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.22.15" - checksum: 10c0/2535e3824ca6337f65786bbac98e562f71699f25532cecd196f027d7698b4967a96953d64e36567956658ad1a05ccbdc62d1ba79ee751c79f4f1d2d3ecc2e01c + "@babel/types": "npm:^7.25.9" + checksum: 10c0/095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.15 - resolution: "@babel/helper-compilation-targets@npm:7.22.15" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.7, @babel/helper-compilation-targets@npm:^7.25.9": + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" dependencies: - "@babel/compat-data": "npm:^7.22.9" - "@babel/helper-validator-option": "npm:^7.22.15" - browserslist: "npm:^4.21.9" + "@babel/compat-data": "npm:^7.26.5" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/45b9286861296e890f674a3abb199efea14a962a27d9b8adeb44970a9fd5c54e73a9e342e8414d2851cf4f98d5994537352fbce7b05ade32e9849bbd327f9ff1 + checksum: 10c0/9da5c77e5722f1a2fcb3e893049a01d414124522bbf51323bb1a0c9dcd326f15279836450fc36f83c9e8a846f3c40e88be032ed939c5a9840922bed6073edfb4 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-create-class-features-plugin@npm:7.23.5" +"@babel/helper-create-class-features-plugin@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-member-expression-to-functions": "npm:^7.23.0" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/a29bd03725630dcf2f094b7e3fe45c63984e63a5d092ceffec2da9d95c108afcc073863d6e9c0fb944d07f3cde5ebac4bba833473ca96af5e949f7d471154901 + checksum: 10c0/b2bdd39f38056a76b9ba00ec5b209dd84f5c5ebd998d0f4033cf0e73d5f2c357fbb49d1ce52db77a2709fb29ee22321f84a5734dc9914849bdfee9ad12ce8caf languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.26.3" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - regexpu-core: "npm:^5.3.1" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + regexpu-core: "npm:^6.2.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/8eba4c1b7b94a83e7a82df5c3e504584ff0ba6ab8710a67ecc2c434a7fb841a29c2f5c94d2de51f25446119a1df538fa90b37bd570db22ddd5e7147fe98277c6 + checksum: 10c0/266f30b99af621559467ed67634cb653408a9262930c0627c3d17691a9d477329fb4dabe4b1785cbf0490e892513d247836674271842d6a8da49fd0afae7d435 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.3": - version: 0.4.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" +"@babel/helper-define-polyfill-provider@npm:^0.6.2, @babel/helper-define-polyfill-provider@npm:^0.6.3": + version: 0.6.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -189,246 +202,216 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/0007035157e0d32ee9cb4ca319b89d6f3705523383efe52a59eb3d4dfa2ed08c5147e49c10a6e6d69c15221d89c76c8e5875475d6710fb44a5c37b8e69388e40 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" - dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 + checksum: 10c0/4320e3527645e98b6a0d5626fef815680e3b2b03ec36045de5e909b0f01546ab3674e96f50bf3bc8413f8c9037e5ee1a5f560ebdf8210426dad1c2c03c96184a languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.15, @babel/helper-member-expression-to-functions@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.25.7, @babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.23.0" - checksum: 10c0/b810daddf093ffd0802f1429052349ed9ea08ef7d0c56da34ffbcdecbdafac86f95bdea2fe30e0e0e629febc7dd41b56cb5eacc10d1a44336d37b755dac31fa4 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-module-transforms@npm:^7.25.7, @babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/types": "npm:^7.22.15" - checksum: 10c0/4e0d7fc36d02c1b8c8b3006dfbfeedf7a367d3334a04934255de5128115ea0bafdeb3e5736a2559917f0653e4e437400d54542da0468e08d3cbc86d3bbfa8f30 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/31b41a764fc3c585196cf5b776b70cf4705c132e4ce9723f39871f215f2ddbfb2e28a62f9917610f67c8216c1080482b9b05f65dd195dae2a52cef461f2ac7b8 + "@babel/types": "npm:^7.25.9" + checksum: 10c0/90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: 10c0/d2c4bfe2fa91058bcdee4f4e57a3f4933aed7af843acfd169cd6179fab8d13c1d636474ecabb2af107dc77462c7e893199aa26632bac1c6d7e025a17cbb9d20d +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.7, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" +"@babel/helper-remap-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-wrap-function": "npm:^7.22.20" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-wrap-function": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/aa93aa74250b636d477e8d863fbe59d4071f8c2654841b7ac608909e480c1cf3ff7d7af5a4038568829ad09d810bb681668cbe497d9c89ba5c352793dc9edf1e + checksum: 10c0/6798b562f2788210980f29c5ee96056d90dc73458c88af5bd32f9c82e28e01975588aa2a57bb866c35556bd9b76bac937e824ee63ba472b6430224b91b4879e9 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-replace-supers@npm:7.22.20" +"@babel/helper-replace-supers@npm:^7.25.9": + version: 7.26.5 + resolution: "@babel/helper-replace-supers@npm:7.26.5" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-member-expression-to-functions": "npm:^7.22.15" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/6b0858811ad46873817c90c805015d63300e003c5a85c147a17d9845fa2558a02047c3cc1f07767af59014b2dd0fa75b503e5bc36e917f360e9b67bb6f1e79f4 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 + checksum: 10c0/b19b1245caf835207aaaaac3a494f03a16069ae55e76a2e1350b5acd560e6a820026997a8160e8ebab82ae873e8208759aa008eb8422a67a775df41f0a4633d4 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/ab7fa2aa709ab49bb8cd86515a1e715a3108c4bb9a616965ba76b43dc346dee66d1004ccf4d222b596b6224e43e04cbc5c3a34459501b388451f8c589fbc3691 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: 10c0/f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 10c0/dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e +"@babel/helper-validator-option@npm:^7.25.7, @babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 +"@babel/helper-wrap-function@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-wrap-function@npm:7.25.9" + dependencies: + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/b6627d83291e7b80df020f8ee2890c52b8d49272962cac0114ef90f189889c90f1027985873d1b5261a4e986e109b2754292dc112392f0b1fcbfc91cc08bd003 languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-wrap-function@npm:7.22.20" +"@babel/helpers@npm:^7.25.7, @babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" dependencies: - "@babel/helper-function-name": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.22.19" - checksum: 10c0/97b5f42ff4d305318ff2f99a5f59d3e97feff478333b2d893c4f85456d3c66372070f71d7bf9141f598c8cf2741c49a15918193633c427a88d170d98eb8c46eb + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 languageName: node linkType: hard -"@babel/helpers@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helpers@npm:7.23.5" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.7, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/parser@npm:7.26.5" dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" - checksum: 10c0/a37e2728eb4378a4888e5d614e28de7dd79b55ac8acbecd0e5c761273e2a02a8f33b34b1932d9069db55417ace2937cbf8ec37c42f1030ce6d228857d7ccaa4f + "@babel/types": "npm:^7.26.5" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/2e77dd99ee028ee3c10fa03517ae1169f2432751adf71315e4dc0d90b61639d51760d622f418f6ac665ae4ea65f8485232a112ea0e76f18e5900225d3d19a61e languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.7, @babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.20" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - checksum: 10c0/fbff9fcb2f5539289c3c097d130e852afd10d89a3a08ac0b5ebebbc055cc84a4bcc3dcfed463d488cde12dd0902ef1858279e31d7349b2e8cee43913744bda33 + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/7aab47fcbb8c1ddc195a3cd66609edcad54c5022f018db7de40185f0182950389690e953e952f117a1737b72f665ff02ad30de6c02b49b97f1d8f4ccdffedc34 languageName: node linkType: hard -"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/parser@npm:7.23.5" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/3356aa90d7bafb4e2c7310e7c2c3d443c4be4db74913f088d3d577a1eb914ea4188e05fd50a47ce907a27b755c4400c4e3cbeee73dbeb37761f6ca85954f5a20 +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.7, @babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/3a652b3574ca62775c5f101f8457950edc540c3581226579125da535d67765f41ad7f0e6327f8efeb2540a5dad5bb0c60a89fb934af3f67472e73fb63612d004 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.7, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/356a4e9fc52d7ca761ce6857fc58e2295c2785d22565760e6a5680be86c6e5883ab86e0ba25ef572882c01713d3a31ae6cfa3e3222cdb95e6026671dab1fa415 + checksum: 10c0/18fc9004104a150f9f5da9f3307f361bc3104d16778bb593b7523d5110f04a8df19a2587e6bdd5e726fb1d397191add45223f4f731bb556c33f14f2779d596e8 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.7, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10c0/a8785f099d55ca71ed89815e0f3a636a80c16031f80934cfec17c928d096ee0798964733320c8b145ef36ba429c5e19d5107b06231e0ab6777cfb0f01adfdc23 + checksum: 10c0/3f6c8781a2f7aa1791a31d2242399ca884df2ab944f90c020b6f112fb19f05fa6dad5be143d274dad1377e40415b63d24d5489faf5060b9c4a99e55d8f0c317c languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.7, @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/0f43b74741d50e637ba4dcef2786621126fe4da6ccf4ee2e94423ee23f6a04ecd91d458e59764c43e4968be139e5197ee43be8a2fea2c09f0b202a3391e548cc + checksum: 10c0/02b365f0cc4df8b8b811c68697c93476da387841e5f153fe42766f34241b685503ea51110d5ed6df7132759820b93e48d9fa3743cffc091eed97c19f7e5fe272 languageName: node linkType: hard -"@babel/plugin-proposal-pipeline-operator@npm:^7.16.0": - version: 7.23.3 - resolution: "@babel/plugin-proposal-pipeline-operator@npm:7.23.3" +"@babel/plugin-proposal-pipeline-operator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-proposal-pipeline-operator@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-pipeline-operator": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-syntax-pipeline-operator": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a1cda8c165db97fa32c94c29f91768dc7b63ca12015f8d1ee7f06a0d5afbf390802afb5f300cee6028751632b66243732d03ff4cb81181e0c67a6601fbbd06b8 + checksum: 10c0/770880043f3ab73a5534e7fec3485f510f5a4f8dbe99824540daef5610c45d3aeab2cca799f99d8692ffef930f9cb49754a4320d61b3569cebdae81513f3f751 languageName: node linkType: hard @@ -452,6 +435,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde + languageName: node + linkType: hard + "@babel/plugin-syntax-class-properties@npm:^7.12.13": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" @@ -496,25 +490,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.25.7, @babel/plugin-syntax-import-assertions@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7db8b59f75667bada2293353bb66b9d5651a673b22c72f47da9f5c46e719142481601b745f9822212fd7522f92e26e8576af37116f85dae1b5e5967f80d0faab + checksum: 10c0/525b174e60b210d96c1744c1575fc2ddedcc43a479cba64a5344cf77bd0541754fc58120b5a11ff832ba098437bb05aa80900d1f49bb3d888c5e349a4a3a356e languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.25.7, @babel/plugin-syntax-import-attributes@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/99b40d33d79205a8e04bb5dea56fd72906ffc317513b20ca7319e7683e18fce8ea2eea5e9171056f92b979dc0ab1e31b2cb5171177a5ba61e05b54fe7850a606 + checksum: 10c0/e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 languageName: node linkType: hard @@ -540,14 +534,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" +"@babel/plugin-syntax-jsx@npm:^7.25.7, @babel/plugin-syntax-jsx@npm:^7.25.9, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/563bb7599b868773f1c7c1d441ecc9bc53aeb7832775da36752c926fc402a1fa5421505b39e724f71eb217c13e4b93117e081cac39723b0e11dac4c897f33c3e + checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c languageName: node linkType: hard @@ -617,14 +611,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-pipeline-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-pipeline-operator@npm:7.23.3" +"@babel/plugin-syntax-pipeline-operator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-pipeline-operator@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/249c82ed7dd99d3a50c1aabf367cb773be028471335caa59076222342d65ac012563eae84e881636746faf8095e1e28848a45d55c64b4b1535575446b28deb6e + checksum: 10c0/ead8ffb45946ddc00ca6ba9fa95322a8998956da52fc2958c6f79337511d8d03e6b4e1f140fba5e383431bfe5c17f7fa3488647e12259c5afa93643fae757fdc languageName: node linkType: hard @@ -650,14 +644,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" +"@babel/plugin-syntax-typescript@npm:^7.25.9, @babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4d6e9cdb9d0bfb9bd9b220fc951d937fce2ca69135ec121153572cebe81d86abc9a489208d6b69ee5f10cadcaeffa10d0425340a5029e40e14a6025021b90948 + checksum: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 languageName: node linkType: hard @@ -673,684 +667,720 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.25.7, @babel/plugin-transform-arrow-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b128315c058f5728d29b0b78723659b11de88247ea4d0388f0b935cddf60a80c40b9067acf45cbbe055bd796928faef152a09d9e4a0695465aca4394d9f109ca + checksum: 10c0/851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" +"@babel/plugin-transform-async-generator-functions@npm:^7.25.7, @babel/plugin-transform-async-generator-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-remap-async-to-generator": "npm:^7.22.20" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f2eef4de609975a3f7da7832576b5ffc93e43c80f87e1a99e886b0f8591096cfc4c37e2d5f52fdeaa2a9c09a25a59f3e621159abaca75d3193922a5c0e4cbe0c + checksum: 10c0/e3fcb9fc3d6ab6cbd4fcd956b48c17b5e92fe177553df266ffcd2b2c1f2f758b893e51b638e77ed867941e0436487d2b8b505908d615c41799241699b520dec6 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.25.7, @babel/plugin-transform-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-remap-async-to-generator": "npm:^7.22.20" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/da3ffd413eef02a8e2cfee3e0bb0d5fc0fcb795c187bc14a5a8e8874cdbdc43bbf00089c587412d7752d97efc5967c3c18ff5398e3017b9a14a06126f017e7e9 + checksum: 10c0/c443d9e462ddef733ae56360064f32fc800105803d892e4ff32d7d6a6922b3765fa97b9ddc9f7f1d3f9d8c2d95721d85bef9dbf507804214c6cf6466b105c168 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-block-scoped-functions@npm:^7.25.7, @babel/plugin-transform-block-scoped-functions@npm:^7.25.9": + version: 7.26.5 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/82c12a11277528184a979163de7189ceb00129f60dd930b0d5313454310bf71205f302fb2bf0430247161c8a22aaa9fb9eec1459f9f7468206422c191978fd59 + checksum: 10c0/2f3060800ead46b09971dd7bf830d66383b7bc61ced9945633b4ef9bf87787956ea83fcf49b387cecb377812588c6b81681714c760f9cf89ecba45edcbab1192 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoping@npm:^7.25.7, @babel/plugin-transform-block-scoping@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/83006804dddf980ab1bcd6d67bc381e24b58c776507c34f990468f820d0da71dba3697355ca4856532fa2eeb2a1e3e73c780f03760b5507a511cbedb0308e276 + checksum: 10c0/a76e30becb6c75b4d87a2cd53556fddb7c88ddd56bfadb965287fd944810ac159aa8eb5705366fc37336041f63154ed9fab3862fb10482a45bf5ede63fd55fda languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" +"@babel/plugin-transform-class-properties@npm:^7.25.7, @babel/plugin-transform-class-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/bca30d576f539eef216494b56d610f1a64aa9375de4134bc021d9660f1fa735b1d7cc413029f22abc0b7cb737e3a57935c8ae9d8bd1730921ccb1deebce51bfd + checksum: 10c0/f0603b6bd34d8ba62c03fc0572cb8bbc75874d097ac20cc7c5379e001081210a84dba1749e7123fca43b978382f605bb9973c99caf2c5b4c492d5c0a4a441150 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-static-block@npm:^7.25.7, @babel/plugin-transform-class-static-block@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/fdca96640ef29d8641a7f8de106f65f18871b38cc01c0f7b696d2b49c76b77816b30a812c08e759d06dd10b4d9b3af6b5e4ac22a2017a88c4077972224b77ab0 + checksum: 10c0/cdcf5545ae6514ed75fbd73cccfa209c6a5dfdf0c2bb7bb62c0fb4ec334a32281bcf1bc16ace494d9dbe93feb8bdc0bd3cf9d9ccb6316e634a67056fa13b741b languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/plugin-transform-classes@npm:7.23.5" +"@babel/plugin-transform-classes@npm:^7.25.7, @babel/plugin-transform-classes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-classes@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" - "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/07988f52b4893151887d1ea6ff79e5fe834078c5731bd09babd5659edbbae21ea4e2de326a02443a63fd776b4c945da6177f07875b56fe66e0b7899e830a9e92 + checksum: 10c0/02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.25.7, @babel/plugin-transform-computed-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3ca8a006f8e652b58c21ecb84df1d01a73f0a96b1d216fd09a890b235dd90cb966b152b603b88f7e850ae238644b1636ce5c30b7c029c0934b43383932372e4a + checksum: 10c0/948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.25.7, @babel/plugin-transform-destructuring@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/717e9a62c1b0c93c507f87b4eaf839ec08d3c3147f14d74ae240d8749488d9762a8b3950132be620a069bde70f4b3e4ee9867b226c973fcc40f3cdec975cde71 + checksum: 10c0/7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.25.7, @babel/plugin-transform-dotall-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6c89286d1277c2a63802a453c797c87c1203f89e4c25115f7b6620f5fce15d8c8d37af613222f6aa497aa98773577a6ec8752e79e13d59bc5429270677ea010b + checksum: 10c0/7c3471ae5cf7521fd8da5b03e137e8d3733fc5ee4524ce01fb0c812f0bb77cb2c9657bc8a6253186be3a15bb4caa8974993c7ddc067f554ecc6a026f0a3b5e12 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.25.7, @babel/plugin-transform-duplicate-keys@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7e2640e4e6adccd5e7b0615b6e9239d7c98363e21c52086ea13759dfa11cf7159b255fc5331c2de435639ea8eb6acefae115ae0d797a3d19d12587652f8052a5 + checksum: 10c0/d0c74894b9bf6ff2a04189afffb9cd43d87ebd7b7943e51a827c92d2aaa40fa89ac81565a2fd6fbeabf9e38413a9264c45862eee2b017f1d49046cc3c8ff06b4 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.7, @babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/a8039a6d2b90e011c7b30975edee47b5b1097cf3c2f95ec1f5ddd029898d783a995f55f7d6eb8d6bb8873c060fb64f9f1ccba938dfe22d118d09cf68e0cd3bf6 + languageName: node + linkType: hard + +"@babel/plugin-transform-dynamic-import@npm:^7.25.7, @babel/plugin-transform-dynamic-import@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/19ae4a4a2ca86d35224734c41c48b2aa6a13139f3cfa1cbd18c0e65e461de8b65687dec7e52b7a72bb49db04465394c776aa1b13a2af5dc975b2a0cde3dcab67 + checksum: 10c0/5e643a8209072b668350f5788f23c64e9124f81f958b595c80fecca6561086d8ef346c04391b9e5e4cad8b8cbe22c258f0cd5f4ea89b97e74438e7d1abfd98cf languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.25.7, @babel/plugin-transform-exponentiation-operator@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5c33ee6a1bdc52fcdf0807f445b27e3fbdce33008531885e65a699762327565fffbcfde8395be7f21bcb22d582e425eddae45650c986462bb84ba68f43687516 + checksum: 10c0/cac922e851c6a0831fdd2e3663564966916015aeff7f4485825fc33879cbc3a313ceb859814c9200248e2875d65bb13802a723e5d7d7b40a2e90da82a5a1e15c languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.25.7, @babel/plugin-transform-export-namespace-from@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/38bf04f851e36240bbe83ace4169da626524f4107bfb91f05b4ad93a5fb6a36d5b3d30b8883c1ba575ccfc1bac7938e90ca2e3cb227f7b3f4a9424beec6fd4a7 + checksum: 10c0/f291ea2ec5f36de9028a00cbd5b32f08af281b8183bf047200ff001f4cb260be56f156b2449f42149448a4a033bd6e86a3a7f06d0c2825532eb0ae6b03058dfb languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-for-of@npm:7.23.3" +"@babel/plugin-transform-for-of@npm:^7.25.7, @babel/plugin-transform-for-of@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-for-of@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8a36202cfee312ba80e509c7c2131e6773524e572b4dc64a8ee95bd912634fdeb5ea91c6c7747ee30e03562d0f0d333f88ed7dbb929b36b60b8d74189189e12f + checksum: 10c0/bf11abc71934a1f369f39cd7a33cf3d4dc5673026a53f70b7c1238c4fcc44e68b3ca1bdbe3db2076f60defb6ffe117cbe10b90f3e1a613b551d88f7c4e693bbe languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.25.7, @babel/plugin-transform-function-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-function-name@npm:7.25.9" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/89cb9747802118048115cf92a8f310752f02030549b26f008904990cbdc86c3d4a68e07ca3b5c46de8a46ed4df2cb576ac222c74c56de67253d2a3ddc2956083 + checksum: 10c0/8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.25.7, @babel/plugin-transform-json-strings@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/39e82223992a9ad857722ae051291935403852ad24b0dd64c645ca1c10517b6bf9822377d88643fed8b3e61a4e3f7e5ae41cf90eb07c40a786505d47d5970e54 + checksum: 10c0/00bc2d4751dfc9d44ab725be16ee534de13cfd7e77dfb386e5dac9e48101ce8fcbc5971df919dc25b3f8a0fa85d6dc5f2a0c3cf7ec9d61c163d9823c091844f0 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.25.7, @babel/plugin-transform-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8292106b106201464c2bfdd5c014fe6a9ca1c0256eb0a8031deb20081e21906fe68b156186f77d993c23eeab6d8d6f5f66e8895eec7ed97ce6de5dbcafbcd7f4 + checksum: 10c0/00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/87b034dd13143904e405887e6125d76c27902563486efc66b7d9a9d8f9406b76c6ac42d7b37224014af5783d7edb465db0cdecd659fa3227baad0b3a6a35deff + checksum: 10c0/6e2051e10b2d6452980fc4bdef9da17c0d6ca48f81b8529e8804b031950e4fff7c74a7eb3de4a2b6ad22ffb631d0b67005425d232cce6e2b29ce861c78ed04f5 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.25.7, @babel/plugin-transform-member-expression-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/687f24f3ec60b627fef6e87b9e2770df77f76727b9d5f54fa4c84a495bb24eb4a20f1a6240fa22d339d45aac5eaeb1b39882e941bfd00cf498f9c53478d1ec88 + checksum: 10c0/91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.25.7, @babel/plugin-transform-modules-amd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9f7ec036f7cfc588833a4dd117a44813b64aa4c1fd5bfb6c78f60198c1d290938213090c93a46f97a68a2490fad909e21a82b2472e95da74d108c125df21c8d5 + checksum: 10c0/849957d9484d0a2d93331226ed6cf840cee7d57454549534c447c93f8b839ef8553eae9877f8f550e3c39f14d60992f91244b2e8e7502a46064b56c5d68ba855 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" +"@babel/plugin-transform-modules-commonjs@npm:^7.25.7, @babel/plugin-transform-modules-commonjs@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-simple-access": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5c8840c5c9ecba39367ae17c973ed13dbc43234147b77ae780eec65010e2a9993c5d717721b23e8179f7cf49decdd325c509b241d69cfbf92aa647a1d8d5a37d + checksum: 10c0/82e59708f19f36da29531a64a7a94eabbf6ff46a615e0f5d9b49f3f59e8ef10e2bac607d749091508d3fa655146c9e5647c3ffeca781060cdabedb4c7a33c6f2 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" +"@babel/plugin-transform-modules-systemjs@npm:^7.25.7, @babel/plugin-transform-modules-systemjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" dependencies: - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/0d55280a276510222c8896bf4e581acb84824aa5b14c824f7102242ad6bc5104aaffe5ab22fe4d27518f4ae2811bd59c36d0c0bfa695157f9cfce33f0517a069 + checksum: 10c0/8299e3437542129c2684b86f98408c690df27db4122a79edded4782cf04e755d6ecb05b1e812c81a34224a81e664303392d5f3c36f3d2d51fdc99bb91c881e9a languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.25.7, @babel/plugin-transform-modules-umd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f0d2f890a15b4367d0d8f160bed7062bdb145c728c24e9bfbc1211c7925aae5df72a88df3832c92dd2011927edfed4da1b1249e4c78402e893509316c0c2caa6 + checksum: 10c0/fa11a621f023e2ac437b71d5582f819e667c94306f022583d77da9a8f772c4128861a32bbb63bef5cba581a70cd7dbe87a37238edaafcfacf889470c395e7076 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.7, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/b0b072bef303670b5a98307bc37d1ac326cb7ad40ea162b89a03c2ffc465451be7ef05be95cb81ed28bfeb29670dc98fe911f793a67bceab18b4cb4c81ef48f3 + checksum: 10c0/32b14fda5c885d1706863f8af2ee6c703d39264355b57482d3a24fce7f6afbd4c7a0896e501c0806ed2b0759beb621bf7f3f7de1fbbc82026039a98d961e78ef languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.25.7, @babel/plugin-transform-new-target@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-new-target@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f489b9e1f17b42b2ba6312d58351e757cb23a8409f64f2bb6af4c09d015359588a5d68943b20756f141d0931a94431c782f3ed1225228a930a04b07be0c31b04 + checksum: 10c0/7b5f1b7998f1cf183a7fa646346e2f3742e5805b609f28ad5fee22d666a15010f3e398b7e1ab78cddb7901841a3d3f47135929af23d54e8bf4ce69b72051f71e languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9": + version: 7.26.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/bce490d22da5c87ff27fffaff6ad5a4d4979b8d7b72e30857f191e9c1e1824ba73bb8d7081166289369e388f94f0ce5383a593b1fc84d09464a062c75f824b0b + checksum: 10c0/574d6db7cbc5c092db5d1dece8ce26195e642b9c40dbfeaf3082058a78ad7959c1c333471cdd45f38b784ec488850548075d527b178c5010ee9bff7aa527cc7a languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-numeric-separator@npm:^7.25.7, @babel/plugin-transform-numeric-separator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e34902da4f5588dc4812c92cb1f6a5e3e3647baf7b4623e30942f551bf1297621abec4e322ebfa50b320c987c0f34d9eb4355b3d289961d9035e2126e3119c12 + checksum: 10c0/ad63ad341977844b6f9535fcca15ca0d6d6ad112ed9cc509d4f6b75e9bf4b1b1a96a0bcb1986421a601505d34025373608b5f76d420d924b4e21f86b1a1f2749 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" +"@babel/plugin-transform-object-rest-spread@npm:^7.25.7, @babel/plugin-transform-object-rest-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.23.3" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b56017992ffe7fcd1dd9a9da67c39995a141820316266bcf7d77dc912980d228ccbd3f36191d234f5cc389b09157b5d2a955e33e8fb368319534affd1c72b262 + checksum: 10c0/02077d8abd83bf6a48ff0b59e98d7561407cf75b591cffd3fdc5dc5e9a13dec1c847a7a690983762a3afecddb244831e897e0515c293e7c653b262c30cd614af languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.25.7, @babel/plugin-transform-object-super@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-super@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a6856fd8c0afbe5b3318c344d4d201d009f4051e2f6ff6237ff2660593e93c5997a58772b13d639077c3e29ced3440247b29c496cd77b13af1e7559a70009775 + checksum: 10c0/0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.7, @babel/plugin-transform-optional-catch-binding@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4ef61812af0e4928485e28301226ce61139a8b8cea9e9a919215ebec4891b9fea2eb7a83dc3090e2679b7d7b2c8653da601fbc297d2addc54a908b315173991e + checksum: 10c0/722fd5ee12ab905309d4e84421584fce4b6d9e6b639b06afb20b23fa809e6ab251e908a8d5e8b14d066a28186b8ef8f58d69fd6eca9ce1b9ef7af08333378f6c languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" +"@babel/plugin-transform-optional-chaining@npm:^7.25.7, @babel/plugin-transform-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/305b773c29ad61255b0e83ec1e92b2f7af6aa58be4cba1e3852bddaa14f7d2afd7b4438f41c28b179d6faac7eb8d4fb5530a17920294f25d459b8f84406bfbfb + checksum: 10c0/041ad2beae5affb8e68a0bcb6882a2dadb758db3c629a0e012f57488ab43a822ac1ea17a29db8ef36560a28262a5dfa4dbbbf06ed6e431db55abe024b7cd3961 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-parameters@npm:^7.25.7, @babel/plugin-transform-parameters@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-parameters@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a8d4cbe0f6ba68d158f5b4215c63004fc37a1fdc539036eb388a9792017c8496ea970a1932ccb929308f61e53dc56676ed01d8df6f42bc0a85c7fd5ba82482b7 + checksum: 10c0/aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" +"@babel/plugin-transform-private-methods@npm:^7.25.7, @babel/plugin-transform-private-methods@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/745a655edcd111b7f91882b921671ca0613079760d8c9befe336b8a9bc4ce6bb49c0c08941831c950afb1b225b4b2d3eaac8842e732db095b04db38efd8c34f4 + checksum: 10c0/64bd71de93d39daefa3e6c878d6f2fd238ed7d4ecfb13b0e771ddbbc131487def3ceb405b62b534a5cbb5043046b504e1b189b0a45229cc75af979a9fbcaa7bd languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-property-in-object@npm:^7.25.7, @babel/plugin-transform-private-property-in-object@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8d31b28f24204b4d13514cd3a8f3033abf575b1a6039759ddd6e1d82dd33ba7281f9bc85c9f38072a665d69bfa26dc40737eefaf9d397b024654a483d2357bf5 + checksum: 10c0/d4965de19d9f204e692cc74dbc39f0bb469e5f29df96dd4457ea23c5e5596fba9d5af76eaa96f9d48a9fc20ec5f12a94c679285e36b8373406868ea228109e27 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.25.7, @babel/plugin-transform-property-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b2549f23f90cf276c2e3058c2225c3711c2ad1c417e336d3391199445a9776dd791b83be47b2b9a7ae374b40652d74b822387e31fa5267a37bf49c122e1a9747 + checksum: 10c0/1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" +"@babel/plugin-transform-react-constant-elements@npm:^7.21.3": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3aed142af7bd1aed1df2bdad91ed33ba1cdd5c3c67ce6eafba821ff72f129162a197ffb55f1eb1775af276abd5545934489a8257fef6c6665ddf253a4f39a939 + checksum: 10c0/50aca3df122cf801abd251cc2507ef3011ead8f047d31d8f35b10627dd722f6a165245b09e81b3c6876515fd266a97aed0052f6b409aa1fe961fb36dd7cc0822 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" +"@babel/plugin-transform-react-display-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4d2e9e68383238feb873f6111df972df4a2ebf6256d6f787a8772241867efa975b3980f7d75ab7d750e7eaad4bd454e8cc6e106301fd7572dd389e553f5f69d2 + checksum: 10c0/63a0f962d64e71baf87c212755419e25c637d2d95ea6fdc067df26b91e606ae186442ae815b99a577eca9bf5404d9577ecad218a3cf42d0e9e286ca7b003a992 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.16.0, @babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.23.4 - resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" +"@babel/plugin-transform-react-jsx-development@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/types": "npm:^7.23.4" + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8851b3adc515cd91bdb06ff3a23a0f81f0069cfef79dfb3fa744da4b7a82e3555ccb6324c4fa71ecf22508db13b9ff6a0ed96675f95fc87903b9fc6afb699580 + checksum: 10c0/c0b92ff9eb029620abf320ff74aae182cea87524723d740fb48a4373d0d16bddf5edbe1116e7ba341332a5337e55c2ceaee8b8cad5549e78af7f4b3cfe77debb languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.23.3" +"@babel/plugin-transform-react-jsx@npm:7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.7" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-module-imports": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/plugin-syntax-jsx": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/76287adeab656fb7f39243e5ab6a8c60069cf69fffeebd1566457d56cb2f966366a23bd755d3e369f4d0437459e3b76243df370caa7d7d2287a8560b66c53ca2 + checksum: 10c0/6766b0357b8bbfcb77fca5350f06cf822c89bbe75ddcaea24614601ef23957504da24e76597d743038ce8fa081373b0663c8ad0c86d7c7226e8185f0680b8b56 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-react-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5c9947e8ed141f7606f54da3e05eea1074950c5b8354c39df69cb7f43cb5a83c6c9d7973b24bc3d89341c8611f8ad50830a98ab10d117d850e6bdd8febdce221 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-pure-annotations@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7c8eac04644ad19dcd71bb8e949b0ae22b9e548fa4a58e545d3d0342f647fb89db7f8789a7c5b8074d478ce6d3d581eaf47dd4b36027e16fd68211c383839abc + languageName: node + linkType: hard + +"@babel/plugin-transform-regenerator@npm:^7.25.7, @babel/plugin-transform-regenerator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3b0e989ae5db78894ee300b24e07fbcec490c39ab48629c519377581cf94e90308f4ddc10a8914edc9f403e2d3ac7a7ae0ae09003629d852da03e2ba846299c6 + checksum: 10c0/eef3ffc19f7d291b863635f32b896ad7f87806d9219a0d3404a470219abcfc5b43aabecd691026c48e875b965760d9c16abee25e6447272233f30cd07f453ec7 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4abc1db6c964efafc7a927cda814c7275275afa4b530483e0936fd614de23cb5802f7ca43edaa402008a723d4e7eac282b6f5283aa2eeb3b27da6d6c1dd7f8ed + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.25.7, @babel/plugin-transform-reserved-words@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4e6d61f6c9757592661cfbd2c39c4f61551557b98cb5f0995ef10f5540f67e18dde8a42b09716d58943b6e4b7ef5c9bcf19902839e7328a4d49149e0fecdbfcd + checksum: 10c0/8b028b80d1983e3e02f74e21924323cc66ba930e5c5758909a122aa7d80e341b8b0f42e1698e42b50d47a6ba911332f584200b28e1a4e2104b7514d9dc011e96 languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.16.0": - version: 7.23.4 - resolution: "@babel/plugin-transform-runtime@npm:7.23.4" +"@babel/plugin-transform-runtime@npm:7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-runtime@npm:7.25.7" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.6" - babel-plugin-polyfill-corejs3: "npm:^0.8.5" - babel-plugin-polyfill-regenerator: "npm:^0.5.3" + "@babel/helper-module-imports": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6ac29012550cdd10b65ec43fef0c7f43904ec458c43d597f627d8f52807413e57ea94e3986dbace576d734e67c2d09be5e43e77c72567d18f8c4ac5e19844625 + checksum: 10c0/9b2514e9079361ac8e7e500ffd522dad869d61a3894302da7e29bbac80de00276c8a1b4394d1dcf0b51c57b2c854919928df9648be336139fdf1d6ecd6d1bb32 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.25.7, @babel/plugin-transform-shorthand-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c423c66fec0b6503f50561741754c84366ef9e9818442c8881fbaa90cc363fd137084b9431cdc00ed2f1fd8c8a1a5982c4a7e1f2af3769db4caf2ac7ea55d4f0 + checksum: 10c0/05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-spread@npm:^7.25.7, @babel/plugin-transform-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-spread@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a348e4ae47e4ceeceb760506ec7bf835ccc18a2cf70ec74ebfbe41bc172fa2412b05b7d1b86836f8aee375e41a04ff20486074778d0e2d19d668b33dc52e9dbb + checksum: 10c0/996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.25.7, @babel/plugin-transform-sticky-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cd15c407906b41e4b924ea151e455c11274dba050771ee7154ad88a1a274140ac5e84efc8d08c4379f2f0cec8a09e4a0a3b2a3a954ba6a67d9fb35df1c714c56 + checksum: 10c0/e9612b0615dab4c4fba1c560769616a9bd7b9226c73191ef84b6c3ee185c8b719b4f887cdd8336a0a13400ce606ab4a0d33bc8fa6b4fcdb53e2896d07f2568f6 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.25.7, @babel/plugin-transform-template-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-template-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9b5f43788b9ffcb8f2b445a16b1aa40fcf23cb0446a4649445f098ec6b4cb751f243a535da623d59fefe48f4c40552f5621187a61811779076bab26863e3373d + checksum: 10c0/5144da6036807bbd4e9d2a8b92ae67a759543929f34f4db9b463448a77298f4a40bf1e92e582db208fe08ee116224806a3bd0bed75d9da404fc2c0af9e6da540 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.25.7, @babel/plugin-transform-typeof-symbol@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/50e81d84c6059878be2a0e41e0d790cab10882cfb8fa85e8c2665ccb0b3cd7233f49197f17427bc7c1b36c80e07076640ecf1b641888d78b9cb91bc16478d84a + checksum: 10c0/2b19fd88608589d9bc6b607ff17b06791d35c67ef3249f4659283454e6a9984241e3bd4c4eb72bb8b3d860a73223f3874558b861adb7314aa317c1c6a2f0cafb languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.23.3": - version: 7.23.5 - resolution: "@babel/plugin-transform-typescript@npm:7.23.5" +"@babel/plugin-transform-typescript@npm:^7.25.7, @babel/plugin-transform-typescript@npm:^7.25.9": + version: 7.26.5 + resolution: "@babel/plugin-transform-typescript@npm:7.26.5" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.23.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-typescript": "npm:^7.23.3" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-syntax-typescript": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/75d6689bfdf4c9462b5fb21107c295717c9bedffe5eae8b22b0a65c9603660683d55e020df83825de13792358043bd939f48efc2b3a293b5210a608076c94934 + checksum: 10c0/64204b1f1c77d896142071cc174e7bb4fbc597bdc0ea73aec8de1a72d252755db381b9ed40342fc283c32387d7375d0803d0aed8262dd503633f5035148d47a0 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.25.7, @babel/plugin-transform-unicode-escapes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f1ed54742dc982666f471df5d087cfda9c6dbf7842bec2d0f7893ed359b142a38c0210358f297ab5c7a3e11ec0dfb0e523de2e2edf48b62f257aaadd5f068866 + checksum: 10c0/615c84d7c53e1575d54ba9257e753e0b98c5de1e3225237d92f55226eaab8eb5bceb74df43f50f4aa162b0bbcc934ed11feafe2b60b8ec4934ce340fad4b8828 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.7, @babel/plugin-transform-unicode-property-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/dca5702d43fac70351623a12e4dfa454fd028a67498888522b644fd1a02534fabd440106897e886ebcc6ce6a39c58094ca29953b6f51bc67372aa8845a5ae49f + checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.25.7, @babel/plugin-transform-unicode-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/df824dcca2f6e731f61d69103e87d5dd974d8a04e46e28684a4ba935ae633d876bded09b8db890fd72d0caf7b9638e2672b753671783613cc78d472951e2df8c + checksum: 10c0/448004f978279e726af26acd54f63f9002c9e2582ecd70d1c5c4436f6de490fcd817afb60016d11c52f5ef17dbaac2590e8cc7bfaf4e91b58c452cf188c7920f languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.7, @babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/30fe1d29af8395a867d40a63a250ca89072033d9bc7d4587eeebeaf4ad7f776aab83064321bfdb1d09d7e29a1d392852361f4f60a353f0f4d1a3b435dcbf256b + checksum: 10c0/56ee04fbe236b77cbcd6035cbf0be7566d1386b8349154ac33244c25f61170c47153a9423cd1d92855f7d6447b53a4a653d9e8fd1eaeeee14feb4b2baf59bd9f languageName: node linkType: hard -"@babel/preset-env@npm:^7.16.0, @babel/preset-env@npm:^7.16.8": - version: 7.23.5 - resolution: "@babel/preset-env@npm:7.23.5" +"@babel/preset-env@npm:7.25.7": + version: 7.25.7 + resolution: "@babel/preset-env@npm:7.25.7" dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.3" + "@babel/compat-data": "npm:^7.25.7" + "@babel/helper-compilation-targets": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-validator-option": "npm:^7.25.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.7" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" - "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.25.7" + "@babel/plugin-syntax-import-attributes": "npm:^7.25.7" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -1362,63 +1392,143 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.4" - "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" - "@babel/plugin-transform-block-scoping": "npm:^7.23.4" - "@babel/plugin-transform-class-properties": "npm:^7.23.3" - "@babel/plugin-transform-class-static-block": "npm:^7.23.4" - "@babel/plugin-transform-classes": "npm:^7.23.5" - "@babel/plugin-transform-computed-properties": "npm:^7.23.3" - "@babel/plugin-transform-destructuring": "npm:^7.23.3" - "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" - "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" - "@babel/plugin-transform-dynamic-import": "npm:^7.23.4" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" - "@babel/plugin-transform-for-of": "npm:^7.23.3" - "@babel/plugin-transform-function-name": "npm:^7.23.3" - "@babel/plugin-transform-json-strings": "npm:^7.23.4" - "@babel/plugin-transform-literals": "npm:^7.23.3" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.4" - "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" - "@babel/plugin-transform-modules-amd": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-umd": "npm:^7.23.3" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.4" - "@babel/plugin-transform-numeric-separator": "npm:^7.23.4" - "@babel/plugin-transform-object-rest-spread": "npm:^7.23.4" - "@babel/plugin-transform-object-super": "npm:^7.23.3" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.4" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" - "@babel/plugin-transform-parameters": "npm:^7.23.3" - "@babel/plugin-transform-private-methods": "npm:^7.23.3" - "@babel/plugin-transform-private-property-in-object": "npm:^7.23.4" - "@babel/plugin-transform-property-literals": "npm:^7.23.3" - "@babel/plugin-transform-regenerator": "npm:^7.23.3" - "@babel/plugin-transform-reserved-words": "npm:^7.23.3" - "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" - "@babel/plugin-transform-spread": "npm:^7.23.3" - "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" - "@babel/plugin-transform-template-literals": "npm:^7.23.3" - "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" - "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.25.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.7" + "@babel/plugin-transform-async-to-generator": "npm:^7.25.7" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.7" + "@babel/plugin-transform-class-properties": "npm:^7.25.7" + "@babel/plugin-transform-class-static-block": "npm:^7.25.7" + "@babel/plugin-transform-classes": "npm:^7.25.7" + "@babel/plugin-transform-computed-properties": "npm:^7.25.7" + "@babel/plugin-transform-destructuring": "npm:^7.25.7" + "@babel/plugin-transform-dotall-regex": "npm:^7.25.7" + "@babel/plugin-transform-duplicate-keys": "npm:^7.25.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.7" + "@babel/plugin-transform-dynamic-import": "npm:^7.25.7" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.7" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.7" + "@babel/plugin-transform-for-of": "npm:^7.25.7" + "@babel/plugin-transform-function-name": "npm:^7.25.7" + "@babel/plugin-transform-json-strings": "npm:^7.25.7" + "@babel/plugin-transform-literals": "npm:^7.25.7" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.7" + "@babel/plugin-transform-member-expression-literals": "npm:^7.25.7" + "@babel/plugin-transform-modules-amd": "npm:^7.25.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.7" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.7" + "@babel/plugin-transform-modules-umd": "npm:^7.25.7" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.7" + "@babel/plugin-transform-new-target": "npm:^7.25.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.25.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.25.7" + "@babel/plugin-transform-object-super": "npm:^7.25.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.7" + "@babel/plugin-transform-parameters": "npm:^7.25.7" + "@babel/plugin-transform-private-methods": "npm:^7.25.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.25.7" + "@babel/plugin-transform-property-literals": "npm:^7.25.7" + "@babel/plugin-transform-regenerator": "npm:^7.25.7" + "@babel/plugin-transform-reserved-words": "npm:^7.25.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.25.7" + "@babel/plugin-transform-spread": "npm:^7.25.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.25.7" + "@babel/plugin-transform-template-literals": "npm:^7.25.7" + "@babel/plugin-transform-typeof-symbol": "npm:^7.25.7" + "@babel/plugin-transform-unicode-escapes": "npm:^7.25.7" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.7" + "@babel/plugin-transform-unicode-regex": "npm:^7.25.7" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.7" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.38.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/bf704a06a69420250c1de2b126cd5c859a851002c2fb2cce0910cd85a8e6755b9b31577021e94feb7e1e53519923726349aaf07580923928791583db61438fb8 + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.20.2": + version: 7.26.0 + resolution: "@babel/preset-env@npm:7.26.0" + dependencies: + "@babel/compat-data": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.26.0" + "@babel/plugin-syntax-import-attributes": "npm:^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.9" + "@babel/plugin-transform-block-scoping": "npm:^7.25.9" + "@babel/plugin-transform-class-properties": "npm:^7.25.9" + "@babel/plugin-transform-class-static-block": "npm:^7.26.0" + "@babel/plugin-transform-classes": "npm:^7.25.9" + "@babel/plugin-transform-computed-properties": "npm:^7.25.9" + "@babel/plugin-transform-destructuring": "npm:^7.25.9" + "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.9" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" + "@babel/plugin-transform-for-of": "npm:^7.25.9" + "@babel/plugin-transform-function-name": "npm:^7.25.9" + "@babel/plugin-transform-json-strings": "npm:^7.25.9" + "@babel/plugin-transform-literals": "npm:^7.25.9" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" + "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" + "@babel/plugin-transform-modules-amd": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-umd": "npm:^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-new-target": "npm:^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.9" + "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" + "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" + "@babel/plugin-transform-object-super": "npm:^7.25.9" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/plugin-transform-private-methods": "npm:^7.25.9" + "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" + "@babel/plugin-transform-property-literals": "npm:^7.25.9" + "@babel/plugin-transform-regenerator": "npm:^7.25.9" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.26.0" + "@babel/plugin-transform-reserved-words": "npm:^7.25.9" + "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" + "@babel/plugin-transform-spread": "npm:^7.25.9" + "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" + "@babel/plugin-transform-template-literals": "npm:^7.25.9" + "@babel/plugin-transform-typeof-symbol": "npm:^7.25.9" + "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.6" - babel-plugin-polyfill-corejs3: "npm:^0.8.5" - babel-plugin-polyfill-regenerator: "npm:^0.5.3" - core-js-compat: "npm:^3.31.0" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.38.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2a0e1274dec045186e131c6433659b75492583290e8d41633c616f6bff829cb2e4b2f9a57f556283a54db3bd6aa697911e56a36f607911a29b731c445a5b5a06 + checksum: 10c0/26e19dc407cfa1c5166be638b4c54239d084fe15d8d7e6306d8c6dc7bc1decc51070a8dcf28352c1a2feeefbe52a06d193a12e302327ad5f529583df75fb7a26 languageName: node linkType: hard @@ -1435,256 +1545,349 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.16.7": - version: 7.23.3 - resolution: "@babel/preset-react@npm:7.23.3" +"@babel/preset-react@npm:^7.18.6": + version: 7.26.3 + resolution: "@babel/preset-react@npm:7.26.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-react-display-name": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx": "npm:^7.22.15" - "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-transform-react-display-name": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx-development": "npm:^7.25.9" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cecb2493e09fd4ffa5effcef1d06e968386b1bfe077a99834f7e8ef249208274fca62fe5a6b3986ef1c1c3900b2eb409adb528ae1b73dba31397b16f9262e83c + checksum: 10c0/b470dcba11032ef6c832066f4af5c75052eaed49feb0f445227231ef1b5c42aacd6e216988c0bd469fd5728cd27b6b059ca307c9ecaa80c6bb5da4bf1c833e12 languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.16.0": - version: 7.23.3 - resolution: "@babel/preset-typescript@npm:7.23.3" +"@babel/preset-typescript@npm:7.25.7": + version: 7.25.7 + resolution: "@babel/preset-typescript@npm:7.25.7" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-typescript": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-validator-option": "npm:^7.25.7" + "@babel/plugin-syntax-jsx": "npm:^7.25.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.7" + "@babel/plugin-transform-typescript": "npm:^7.25.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e72b654c7f0f08b35d7e1c0e3a59c0c13037f295c425760b8b148aa7dde01e6ddd982efc525710f997a1494fafdd55cb525738c016609e7e4d703d02014152b7 + checksum: 10c0/8dc1258e3c5230bbe42ff9811f08924509238e6bd32fa0b7b0c0a6c5e1419512a8e1f733e1b114454d367b7c164beca2cf33acf2ed9e0d99be010c1c5cdbef0c languageName: node linkType: hard -"@babel/regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 10c0/4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a +"@babel/preset-typescript@npm:^7.21.0": + version: 7.26.0 + resolution: "@babel/preset-typescript@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" + "@babel/plugin-transform-typescript": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/20d86bc45d2bbfde2f84fc7d7b38746fa6481d4bde6643039ad4b1ff0b804c6d210ee43e6830effd8571f2ff43fa7ffd27369f42f2b3a2518bb92dc86c780c61 + languageName: node + linkType: hard + +"@babel/runtime@npm:7.25.7": + version: 7.25.7 + resolution: "@babel/runtime@npm:7.25.7" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/86b7829d2fc9343714a9afe92757cf96c4dc799006ca61d73cda62f4b9e29bfa1ce36794955bc6cb4c188f5b10db832c949339895e1bbe81a69022d9d578ce29 languageName: node linkType: hard -"@babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.23.5 - resolution: "@babel/runtime@npm:7.23.5" +"@babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/ca679cc91bb7e424bc2db87bb58cc3b06ade916b9adb21fbbdc43e54cdaacb3eea201ceba2a0464b11d2eb65b9fe6a6ffcf4d7521fa52994f19be96f1af14788 + checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 languageName: node linkType: hard -"@babel/template@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" +"@babel/runtime@npm:^7.26.7": + version: 7.28.4 + resolution: "@babel/runtime@npm:7.28.4" + checksum: 10c0/792ce7af9750fb9b93879cc9d1db175701c4689da890e6ced242ea0207c9da411ccf16dc04e689cc01158b28d7898c40d75598f4559109f761c12ce01e959bf7 + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.7, @babel/template@npm:^7.25.9, @babel/template@npm:^7.3.3": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.22.13" - "@babel/parser": "npm:^7.22.15" - "@babel/types": "npm:^7.22.15" - checksum: 10c0/9312edd37cf1311d738907003f2aa321a88a42ba223c69209abe4d7111db019d321805504f606c7fd75f21c6cf9d24d0a8223104cd21ebd207e241b6c551f454 + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab languageName: node linkType: hard -"@babel/traverse@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/traverse@npm:7.23.5" +"@babel/traverse@npm:^7.25.7, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/traverse@npm:7.26.5" dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" - debug: "npm:^4.1.0" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.5" + "@babel/parser": "npm:^7.26.5" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.5" + debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/c5ea793080ca6719b0a1612198fd25e361cee1f3c14142d7a518d2a1eeb5c1d21f7eec1b26c20ea6e1ddd8ed12ab50b960ff95ffd25be353b6b46e1b54d6f825 + checksum: 10c0/0779059ecf63e31446564cf31adf170e701e8017ef02c819c57924a9a83d6b2ce41dbff3ef295589da9410497a3e575655bb8084ca470e0ab1bc193128afa9fe languageName: node linkType: hard -"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.23.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.5 - resolution: "@babel/types@npm:7.23.5" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.26.5 + resolution: "@babel/types@npm:7.26.5" dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/7dd5e2f59828ed046ad0b06b039df2524a8b728d204affb4fc08da2502b9dd3140b1356b5166515d229dc811539a8b70dcd4bc507e06d62a89f4091a38d0b0fb + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/0278053b69d7c2b8573aa36dc5242cad95f0d965e1c0ed21ccacac6330092e59ba5949753448f6d6eccf6ad59baaef270295cc05218352e060ea8c68388638c4 languageName: node linkType: hard -"@braintree/sanitize-url@npm:^7.0.1": - version: 7.0.1 - resolution: "@braintree/sanitize-url@npm:7.0.1" - checksum: 10c0/d849b93f494aef173c5c1d419c1ad0851e9119e038dcc331155ffcf5f6e9c02cf3de8e571fbf91e042337e0890bf1ee0474896cd043c050f3b0be0c6d9af5176 +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.3.1": - version: 2.3.2 - resolution: "@csstools/css-parser-algorithms@npm:2.3.2" +"@braintree/sanitize-url@npm:^7.1.1": + version: 7.1.1 + resolution: "@braintree/sanitize-url@npm:7.1.1" + checksum: 10c0/fdfc1759c4244e287693ce1e9d42d649423e7c203fdccf27a571f8951ddfe34baa5273b7e6a8dd3007d7676859c7a0a9819be0ab42a3505f8505ad0eefecf7c1 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.1, @csstools/css-parser-algorithms@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-parser-algorithms@npm:3.0.4" peerDependencies: - "@csstools/css-tokenizer": ^2.2.1 - checksum: 10c0/ccae373a3ab5c10716418b69ce1f6db10a26d3a2d60b65df5fe69099afe4fb1d3192925f3c0f93c3b17c3ab1964b0f39ad2b0e97312ec4a51caa55d6b6a31672 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.0": - version: 2.2.1 - resolution: "@csstools/css-tokenizer@npm:2.2.1" - checksum: 10c0/0c6901d291e99c567893846a47068057c2a28b3edc4219b6da589a530f55f51ddd4675f906f707b393bfe7a508ab2604bf3f75708f064db857bb277636bd5a44 +"@csstools/css-tokenizer@npm:^3.0.1, @csstools/css-tokenizer@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/css-tokenizer@npm:3.0.3" + checksum: 10c0/c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.4": - version: 2.1.5 - resolution: "@csstools/media-query-list-parser@npm:2.1.5" +"@csstools/media-query-list-parser@npm:^3.0.1": + version: 3.0.1 + resolution: "@csstools/media-query-list-parser@npm:3.0.1" peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.2 - "@csstools/css-tokenizer": ^2.2.1 - checksum: 10c0/ae0692c6f92cdc82053291c7a50028b692094dfed795f0259571c5eb40f4b3fa580182ac3701e56c2834e40a62a122ea6639299e43ae88b3a835ae4c869a1a12 + "@csstools/css-parser-algorithms": ^3.0.1 + "@csstools/css-tokenizer": ^3.0.1 + checksum: 10c0/fca1935cabf9fb94128da87f72c34aa2cfce8eb0beba4c78d685c7b42aaba3521067710afc6905b7347fc41fe53947536ce15a7ef3387b48763d8f7d71778d5e languageName: node linkType: hard -"@csstools/selector-specificity@npm:^3.0.0": - version: 3.0.0 - resolution: "@csstools/selector-specificity@npm:3.0.0" +"@csstools/media-query-list-parser@npm:^4.0.2": + version: 4.0.2 + resolution: "@csstools/media-query-list-parser@npm:4.0.2" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/5d008a70f5d4fd96224066a433f5cdefa76cfd78a74416a20d6d5b2bb1bc8282b140e8373015d807d4dadb91daf3deb73eb13f853ec4e0479d0cb92e80c6f20d + languageName: node + linkType: hard + +"@csstools/selector-specificity@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/selector-specificity@npm:5.0.0" peerDependencies: - postcss-selector-parser: ^6.0.13 - checksum: 10c0/6f0e2fa9a3c5dcbc7a446fd827d3eb85ca775cc884f73f0bbb119ab49b4f5f0af8763dd23a37d423f4e7989069c09bb977e7e5f017db296e1417abb1fba75c30 + postcss-selector-parser: ^7.0.0 + checksum: 10c0/186b444cabcdcdeb553bfe021f80c58bfe9ef38dcc444f2b1f34a5aab9be063ab4e753022b2d5792049c041c28cfbb78e4b707ec398459300e402030d35c07eb languageName: node linkType: hard -"@discoveryjs/json-ext@npm:^0.5.0": +"@discoveryjs/json-ext@npm:0.5.7, @discoveryjs/json-ext@npm:^0.5.0": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c languageName: node linkType: hard -"@emotion/babel-plugin@npm:^11.11.0": - version: 11.11.0 - resolution: "@emotion/babel-plugin@npm:11.11.0" +"@discoveryjs/json-ext@npm:^0.6.1": + version: 0.6.3 + resolution: "@discoveryjs/json-ext@npm:0.6.3" + checksum: 10c0/778a9f9d5c3696da3c1f9fa4186613db95a1090abbfb6c2601430645c0d0158cd5e4ba4f32c05904e2dd2747d57710f6aab22bd2f8aa3c4e8feab9b247c65d85 + languageName: node + linkType: hard + +"@dual-bundle/import-meta-resolve@npm:^4.1.0": + version: 4.1.0 + resolution: "@dual-bundle/import-meta-resolve@npm:4.1.0" + checksum: 10c0/55069e550ee2710e738dd8bbd34aba796cede456287454b50c3be46fbef8695d00625677f3f41f5ffbec1174c0f57f314da9a908388bc9f8ad41a8438db884d9 + languageName: node + linkType: hard + +"@emotion/babel-plugin@npm:^11.13.5": + version: 11.13.5 + resolution: "@emotion/babel-plugin@npm:11.13.5" dependencies: "@babel/helper-module-imports": "npm:^7.16.7" "@babel/runtime": "npm:^7.18.3" - "@emotion/hash": "npm:^0.9.1" - "@emotion/memoize": "npm:^0.8.1" - "@emotion/serialize": "npm:^1.1.2" + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/serialize": "npm:^1.3.3" babel-plugin-macros: "npm:^3.1.0" convert-source-map: "npm:^1.5.0" escape-string-regexp: "npm:^4.0.0" find-root: "npm:^1.1.0" source-map: "npm:^0.5.7" stylis: "npm:4.2.0" - checksum: 10c0/89cbb6ec0e52c8ee9c2a4b9889ccd4fc3a75d28091d835bfac6d7c4565d3338621e23af0a85f3bcd133e1cae795c692e1dadada015784d4b0554aa5bb111df43 + checksum: 10c0/8ccbfec7defd0e513cb8a1568fa179eac1e20c35fda18aed767f6c59ea7314363ebf2de3e9d2df66c8ad78928dc3dceeded84e6fa8059087cae5c280090aeeeb languageName: node linkType: hard -"@emotion/cache@npm:^11.11.0, @emotion/cache@npm:^11.4.0": - version: 11.11.0 - resolution: "@emotion/cache@npm:11.11.0" +"@emotion/cache@npm:^11.13.5, @emotion/cache@npm:^11.14.0, @emotion/cache@npm:^11.4.0, @emotion/cache@npm:^11.7.1": + version: 11.14.0 + resolution: "@emotion/cache@npm:11.14.0" dependencies: - "@emotion/memoize": "npm:^0.8.1" - "@emotion/sheet": "npm:^1.2.2" - "@emotion/utils": "npm:^1.2.1" - "@emotion/weak-memoize": "npm:^0.3.1" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.2" + "@emotion/weak-memoize": "npm:^0.4.0" stylis: "npm:4.2.0" - checksum: 10c0/a23ab5ab2fd08e904698106d58ad3536fed51cc1aa0ef228e95bb640eaf11f560dbd91a395477b0d84e1e3c20150263764b4558517cf6576a89d2d6cc5253688 + checksum: 10c0/3fa3e7a431ab6f8a47c67132a00ac8358f428c1b6c8421d4b20de9df7c18e95eec04a5a6ff5a68908f98d3280044f247b4965ac63df8302d2c94dba718769724 + languageName: node + linkType: hard + +"@emotion/css@npm:^11.7.1": + version: 11.13.5 + resolution: "@emotion/css@npm:11.13.5" + dependencies: + "@emotion/babel-plugin": "npm:^11.13.5" + "@emotion/cache": "npm:^11.13.5" + "@emotion/serialize": "npm:^1.3.3" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.2" + checksum: 10c0/45d444b08c1a9776046786f1ad8b93297d9e0fb79e6a40b73e9f9c5c20a071f83bae2408e7b98fe526fc123774a18b12ae3c8dc5b5883b8169685ee7b8df9463 languageName: node linkType: hard -"@emotion/hash@npm:^0.9.1": - version: 0.9.1 - resolution: "@emotion/hash@npm:0.9.1" - checksum: 10c0/cdafe5da63fc1137f3db6e232fdcde9188b2b47ee66c56c29137199642a4086f42382d866911cfb4833cae2cc00271ab45cad3946b024f67b527bb7fac7f4c9d +"@emotion/hash@npm:^0.9.2": + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10c0/0dc254561a3cc0a06a10bbce7f6a997883fd240c8c1928b93713f803a2e9153a257a488537012efe89dbe1246f2abfe2add62cdb3471a13d67137fcb808e81c2 languageName: node linkType: hard -"@emotion/memoize@npm:^0.8.1": - version: 0.8.1 - resolution: "@emotion/memoize@npm:0.8.1" - checksum: 10c0/dffed372fc3b9fa2ba411e76af22b6bb686fb0cb07694fdfaa6dd2baeb0d5e4968c1a7caa472bfcf06a5997d5e7c7d16b90e993f9a6ffae79a2c3dbdc76dfe78 +"@emotion/is-prop-valid@npm:^1.3.0": + version: 1.3.1 + resolution: "@emotion/is-prop-valid@npm:1.3.1" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + checksum: 10c0/123215540c816ff510737ec68dcc499c53ea4deb0bb6c2c27c03ed21046e2e69f6ad07a7a174d271c6cfcbcc9ea44e1763e0cf3875c92192f7689216174803cd + languageName: node + linkType: hard + +"@emotion/memoize@npm:^0.9.0": + version: 0.9.0 + resolution: "@emotion/memoize@npm:0.9.0" + checksum: 10c0/13f474a9201c7f88b543e6ea42f55c04fb2fdc05e6c5a3108aced2f7e7aa7eda7794c56bba02985a46d8aaa914fcdde238727a98341a96e2aec750d372dadd15 languageName: node linkType: hard -"@emotion/react@npm:^11.8.1": - version: 11.11.1 - resolution: "@emotion/react@npm:11.11.1" +"@emotion/react@npm:^11.7.1, @emotion/react@npm:^11.8.1": + version: 11.14.0 + resolution: "@emotion/react@npm:11.14.0" dependencies: "@babel/runtime": "npm:^7.18.3" - "@emotion/babel-plugin": "npm:^11.11.0" - "@emotion/cache": "npm:^11.11.0" - "@emotion/serialize": "npm:^1.1.2" - "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.1" - "@emotion/utils": "npm:^1.2.1" - "@emotion/weak-memoize": "npm:^0.3.1" + "@emotion/babel-plugin": "npm:^11.13.5" + "@emotion/cache": "npm:^11.14.0" + "@emotion/serialize": "npm:^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" + "@emotion/utils": "npm:^1.4.2" + "@emotion/weak-memoize": "npm:^0.4.0" hoist-non-react-statics: "npm:^3.3.1" peerDependencies: react: ">=16.8.0" peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/1aea4d735b537fbfbeda828bbf929488a7e1b5b7d131f14aeede8737e92bb3b611e15fec353e97f85aed7a65a1c86a695a04ba6e9be905231beef6bd624cb705 + checksum: 10c0/d0864f571a9f99ec643420ef31fde09e2006d3943a6aba079980e4d5f6e9f9fecbcc54b8f617fe003c00092ff9d5241179149ffff2810cb05cf72b4620cfc031 languageName: node linkType: hard -"@emotion/serialize@npm:^1.1.2": - version: 1.1.2 - resolution: "@emotion/serialize@npm:1.1.2" +"@emotion/serialize@npm:^1.0.2, @emotion/serialize@npm:^1.3.3": + version: 1.3.3 + resolution: "@emotion/serialize@npm:1.3.3" dependencies: - "@emotion/hash": "npm:^0.9.1" - "@emotion/memoize": "npm:^0.8.1" - "@emotion/unitless": "npm:^0.8.1" - "@emotion/utils": "npm:^1.2.1" + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/unitless": "npm:^0.10.0" + "@emotion/utils": "npm:^1.4.2" csstype: "npm:^3.0.2" - checksum: 10c0/d243e0e5abce8d2183d25a32ec89bf650ee741ebadb29e6405abde05d4e2ed446ba5b3f725a29833ad709d0d08f0a5c8d0532fdcd43f4b23d931d8b6d4f218c1 + checksum: 10c0/b28cb7de59de382021de2b26c0c94ebbfb16967a1b969a56fdb6408465a8993df243bfbd66430badaa6800e1834724e84895f5a6a9d97d0d224de3d77852acb4 languageName: node linkType: hard -"@emotion/sheet@npm:^1.2.2": - version: 1.2.2 - resolution: "@emotion/sheet@npm:1.2.2" - checksum: 10c0/69827a1bfa43d7b188f1d8cea42163143a36312543fdade5257c459a2b3efd7ce386aac84ba152bc2517a4f7e54384c04800b26adb382bb284ac7e4ad40e584b +"@emotion/sheet@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/sheet@npm:1.4.0" + checksum: 10c0/3ca72d1650a07d2fbb7e382761b130b4a887dcd04e6574b2d51ce578791240150d7072a9bcb4161933abbcd1e38b243a6fb4464a7fe991d700c17aa66bb5acc7 languageName: node linkType: hard -"@emotion/unitless@npm:^0.8.1": - version: 0.8.1 - resolution: "@emotion/unitless@npm:0.8.1" - checksum: 10c0/a1ed508628288f40bfe6dd17d431ed899c067a899fa293a13afe3aed1d70fac0412b8a215fafab0b42829360db687fecd763e5f01a64ddc4a4b58ec3112ff548 +"@emotion/styled@npm:^11.6.0": + version: 11.14.0 + resolution: "@emotion/styled@npm:11.14.0" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.13.5" + "@emotion/is-prop-valid": "npm:^1.3.0" + "@emotion/serialize": "npm:^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" + "@emotion/utils": "npm:^1.4.2" + peerDependencies: + "@emotion/react": ^11.0.0-rc.0 + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/20aa5c488e4edecf63659212fc5ba1ccff2d3a66593fc8461de7cd5fe9192a741db357ffcd270a455bd61898d7f37cd5c84b4fd2b7974dade712badf7860ca9c languageName: node linkType: hard -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.1": - version: 1.0.1 - resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1" +"@emotion/unitless@npm:^0.10.0": + version: 0.10.0 + resolution: "@emotion/unitless@npm:0.10.0" + checksum: 10c0/150943192727b7650eb9a6851a98034ddb58a8b6958b37546080f794696141c3760966ac695ab9af97efe10178690987aee4791f9f0ad1ff76783cdca83c1d49 + languageName: node + linkType: hard + +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.2.0": + version: 1.2.0 + resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.2.0" peerDependencies: react: ">=16.8.0" - checksum: 10c0/a15b2167940e3a908160687b73fc4fcd81e59ab45136b6967f02c7c419d9a149acd22a416b325c389642d4f1c3d33cf4196cad6b618128b55b7c74f6807a240b + checksum: 10c0/074dbc92b96bdc09209871070076e3b0351b6b47efefa849a7d9c37ab142130767609ca1831da0055988974e3b895c1de7606e4c421fecaa27c3e56a2afd3b08 languageName: node linkType: hard -"@emotion/utils@npm:^1.2.1": - version: 1.2.1 - resolution: "@emotion/utils@npm:1.2.1" - checksum: 10c0/db43ca803361740c14dfb1cca1464d10d27f4c8b40d3e8864e6932ccf375d1450778ff4e4eadee03fb97f2aeb18de9fae98294905596a12ff7d4cd1910414d8d +"@emotion/utils@npm:^1.0.0, @emotion/utils@npm:^1.4.2": + version: 1.4.2 + resolution: "@emotion/utils@npm:1.4.2" + checksum: 10c0/7d0010bf60a2a8c1a033b6431469de4c80e47aeb8fd856a17c1d1f76bbc3a03161a34aeaa78803566e29681ca551e7bf9994b68e9c5f5c796159923e44f78d9a languageName: node linkType: hard -"@emotion/weak-memoize@npm:^0.3.1": - version: 0.3.1 - resolution: "@emotion/weak-memoize@npm:0.3.1" - checksum: 10c0/ed514b3cb94bbacece4ac2450d98898066c0a0698bdeda256e312405ca53634cb83c75889b25cd8bbbe185c80f4c05a1f0a0091e1875460ba6be61d0334f0b8a +"@emotion/weak-memoize@npm:^0.4.0": + version: 0.4.0 + resolution: "@emotion/weak-memoize@npm:0.4.0" + checksum: 10c0/64376af11f1266042d03b3305c30b7502e6084868e33327e944b539091a472f089db307af69240f7188f8bc6b319276fd7b141a36613f1160d73d12a60f6ca1a languageName: node linkType: hard @@ -1699,273 +1902,450 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/android-arm64@npm:0.19.8" - conditions: os=android & cpu=arm64 +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/android-arm@npm:0.19.8" - conditions: os=android & cpu=arm +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/android-x64@npm:0.19.8" - conditions: os=android & cpu=x64 +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/darwin-arm64@npm:0.19.8" - conditions: os=darwin & cpu=arm64 +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/darwin-x64@npm:0.19.8" - conditions: os=darwin & cpu=x64 +"@floating-ui/core@npm:^1.6.0": + version: 1.6.9 + resolution: "@floating-ui/core@npm:1.6.9" + dependencies: + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/77debdfc26bc36c6f5ae1f26ab3c15468215738b3f5682af4e1915602fa21ba33ad210273f31c9d2da1c531409929e1afb1138b1608c6b54a0f5853ee84c340d languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/freebsd-arm64@npm:0.19.8" - conditions: os=freebsd & cpu=arm64 +"@floating-ui/dom@npm:^1.0.0, @floating-ui/dom@npm:^1.0.1": + version: 1.6.13 + resolution: "@floating-ui/dom@npm:1.6.13" + dependencies: + "@floating-ui/core": "npm:^1.6.0" + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/272242d2eb6238ffcee0cb1f3c66e0eafae804d5d7b449db5ecf904bc37d31ad96cf575a9e650b93c1190f64f49a684b1559d10e05ed3ec210628b19116991a9 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/freebsd-x64@npm:0.19.8" - conditions: os=freebsd & cpu=x64 +"@floating-ui/react-dom@npm:^2.0.8": + version: 2.1.2 + resolution: "@floating-ui/react-dom@npm:2.1.2" + dependencies: + "@floating-ui/dom": "npm:^1.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/e855131c74e68cab505f7f44f92cd4e2efab1c125796db3116c54c0859323adae4bf697bf292ee83ac77b9335a41ad67852193d7aeace90aa2e1c4a640cafa60 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-arm64@npm:0.19.8" - conditions: os=linux & cpu=arm64 +"@floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-arm@npm:0.19.8" - conditions: os=linux & cpu=arm +"@formatjs/ecma402-abstract@npm:2.3.2": + version: 2.3.2 + resolution: "@formatjs/ecma402-abstract@npm:2.3.2" + dependencies: + "@formatjs/fast-memoize": "npm:2.2.6" + "@formatjs/intl-localematcher": "npm:0.5.10" + decimal.js: "npm:10" + tslib: "npm:2" + checksum: 10c0/364e9e7de974fed976e0e8142a0f888ee0af4a11a61899115e5761ed933e7c1f16379b7b54a01524fd3c5d58bf08b71308237ea969cd54889eaf7bb2d30ec776 languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-ia32@npm:0.19.8" - conditions: os=linux & cpu=ia32 +"@formatjs/fast-memoize@npm:2.2.6": + version: 2.2.6 + resolution: "@formatjs/fast-memoize@npm:2.2.6" + dependencies: + tslib: "npm:2" + checksum: 10c0/dccdc21105af673e58ec7b04eb17cd6fde1fb1a7e7a446273ca43f7ab97c26d5c0fcc2b9e80d5b54bf9b80354f9e1e681273c0ed26633ec72f0adc2d116dfd7f languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-loong64@npm:0.19.8" - conditions: os=linux & cpu=loong64 +"@formatjs/icu-messageformat-parser@npm:2.9.8": + version: 2.9.8 + resolution: "@formatjs/icu-messageformat-parser@npm:2.9.8" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.3.2" + "@formatjs/icu-skeleton-parser": "npm:1.8.12" + tslib: "npm:2" + checksum: 10c0/df97c7f24fbeb8ef49ae1371f9498ad90f231f88211bf1effb7b2e8ac3531bec67c5d9147ddcb1add0ba697e8d089729add44a9a9c5015e0e8d61e7a43f062d9 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-mips64el@npm:0.19.8" - conditions: os=linux & cpu=mips64el +"@formatjs/icu-skeleton-parser@npm:1.8.12": + version: 1.8.12 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.12" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.3.2" + tslib: "npm:2" + checksum: 10c0/03e743aa09acb2137e37d03b98578fcbbc949d056b8c151763778e885d04d621e69c82f7656547f0532351d2a987bffac0a8c4c3d81186f47a28047ba64385e2 languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-ppc64@npm:0.19.8" - conditions: os=linux & cpu=ppc64 +"@formatjs/intl-localematcher@npm:0.5.10": + version: 0.5.10 + resolution: "@formatjs/intl-localematcher@npm:0.5.10" + dependencies: + tslib: "npm:2" + checksum: 10c0/362ec83aca9382165be575f1cefa477478339e6fead8ca8866185ce6e58427ea1487a811b12c73d1bcfa99fd4db0c24543b35c823451839f585576bfccb8c9cc languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-riscv64@npm:0.19.8" - conditions: os=linux & cpu=riscv64 +"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 10c0/a096063805051fb8bba4c947e293c664b05a32b47e13bc654c0dd43813a1cec993bdd8f29ceb838020299e1d0f89f68dc0d62a603c13c9cc8541963f0beca055 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-s390x@npm:0.19.8" - conditions: os=linux & cpu=s390x +"@hapi/topo@npm:^5.1.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": "npm:^9.0.0" + checksum: 10c0/b16b06d9357947149e032bdf10151eb71aea8057c79c4046bf32393cb89d0d0f7ca501c40c0f7534a5ceca078de0700d2257ac855c15e59fe4e00bba2f25c86f languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-x64@npm:0.19.8" - conditions: os=linux & cpu=x64 +"@hello-pangea/dnd@npm:^18.0.1": + version: 18.0.1 + resolution: "@hello-pangea/dnd@npm:18.0.1" + dependencies: + "@babel/runtime": "npm:^7.26.7" + css-box-model: "npm:^1.2.1" + raf-schd: "npm:^4.0.3" + react-redux: "npm:^9.2.0" + redux: "npm:^5.0.1" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/30c47ac8048f85e5c6d39c0b5a492cf2cc9e5f532cee12c5ecc77688596c8846670be142bd716212db789f161cd769601a5da135fa99ac65824fbb6a07d4d137 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/netbsd-x64@npm:0.19.8" - conditions: os=netbsd & cpu=x64 +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/openbsd-x64@npm:0.19.8" - conditions: os=openbsd & cpu=x64 +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/sunos-x64@npm:0.19.8" - conditions: os=sunos & cpu=x64 +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/win32-arm64@npm:0.19.8" - conditions: os=win32 & cpu=arm64 +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/win32-ia32@npm:0.19.8" - conditions: os=win32 & cpu=ia32 +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/win32-x64@npm:0.19.8" - conditions: os=win32 & cpu=x64 +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + jest-get-type: "npm:^29.6.3" + checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a languageName: node linkType: hard -"@eslint/js@npm:8.55.0": - version: 8.55.0 - resolution: "@eslint/js@npm:8.55.0" - checksum: 10c0/88ab9fc57a651becd2b32ec40a3958db27fae133b1ae77bebd733aa5bbd00a92f325bb02f20ad680d31c731fa49b22f060a4777dd52eb3e27da013d940bd978d +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e languageName: node linkType: hard -"@floating-ui/core@npm:^1.4.2": - version: 1.5.1 - resolution: "@floating-ui/core@npm:1.5.1" +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" dependencies: - "@floating-ui/utils": "npm:^0.1.3" - checksum: 10c0/291692b734e3d4937eebd2de37d6ade86c76dca494f229e6de776944cc2547add8e4f6b30b5ace8445bbce2164ed8c87bc3d04505fbd0a428b8c15c3a48308fa + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c languageName: node linkType: hard -"@floating-ui/dom@npm:^1.0.1": - version: 1.5.3 - resolution: "@floating-ui/dom@npm:1.5.3" +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" dependencies: - "@floating-ui/core": "npm:^1.4.2" - "@floating-ui/utils": "npm:^0.1.3" - checksum: 10c0/e5f30b911f939e40003851077bba441f269ae689bdc43c674bee43aa98fc6b7a5f59be432d27b7be599b1e4ab7b15c752875ea777a89cff01d157e593b78b25b + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea languageName: node linkType: hard -"@floating-ui/utils@npm:^0.1.3": - version: 0.1.6 - resolution: "@floating-ui/utils@npm:0.1.6" - checksum: 10c0/0a089db0e0526b89e83cb0a773a903517db5c9067cd473febfd8fa91a3a2ccbc3a835234796c1bb528def21dbb67be50e28d9c473cb58a6d90679d7e549b9c0c +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.13": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.1" - debug: "npm:^4.1.1" - minimatch: "npm:^3.0.5" - checksum: 10c0/d76ca802d853366094d0e98ff0d0994117fc8eff96649cd357b15e469e428228f597cd2e929d54ab089051684949955f16ee905bb19f7b2f0446fb377157be7a + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be languageName: node linkType: hard -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.1": - version: 2.0.1 - resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: 10c0/9dba24e59fdb4041829d92b693aacb778add3b6f612aaa9c0774f3b650c11a378cc64f042a59da85c11dae33df456580a3c36837b953541aed6ff94294f97fac +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 languageName: node linkType: hard -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b languageName: node linkType: hard -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" dependencies: - "@sinclair/typebox": "npm:^0.27.8" - checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 languageName: node linkType: hard @@ -1983,72 +2363,71 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: - "@jridgewell/set-array": "npm:^1.0.1" + "@jridgewell/set-array": "npm:^1.2.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10c0/376fc11cf5a967318ba3ddd9d8e91be528eab6af66810a713c49b0c3f8dc67e9949452c51c38ab1b19aa618fb5e8594da5a249977e26b1e7fea1ee5a1fcacc74 + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a languageName: node linkType: hard "@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: 10c0/0dbc9e29bc640bbbdc5b9876d2859c69042bfcf1423c1e6421bcca53e826660bff4e41c7d4bcb8dbea696404231a6f902f76ba41835d049e20f2dd6cffb713bf + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 10c0/bc7ab4c4c00470de4e7562ecac3c0c84f53e7ee8a711e546d67c47da7febe7c45cd67d4d84ee3c9b2c05ae8e872656cdded8a707a283d30bd54fbc65aef821ab +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 languageName: node linkType: hard "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.5 - resolution: "@jridgewell/source-map@npm:0.3.5" + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.0" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10c0/b985d9ebd833a21a6e9ace820c8a76f60345a34d9e28d98497c16b6e93ce1f131bff0abd45f8585f14aa382cce678ed680d628c631b40a9616a19cfbc2049b68 + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 languageName: node linkType: hard "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/0ea0b2675cf513ec44dc25605616a3c9b808b9832e74b5b63c44260d66b58558bba65764f81928fc1033ead911f8718dca1134049c3e7a93937faf436671df31 + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.20": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@keyv/serialize@npm:^1.0.2": + version: 1.0.2 + resolution: "@keyv/serialize@npm:1.0.2" dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + buffer: "npm:^6.0.3" + checksum: 10c0/31c5cb0938d22ce890314befc4d00c248c4c9be9664885978d6449b1787993dbc91999041076d53437888bb5f4280233276fbc4c72f97955d111d7a6ccd4cd67 languageName: node linkType: hard -"@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3": - version: 2.1.8-no-fsevents.3 - resolution: "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3" - checksum: 10c0/27dcabaa0c9a29b3a60217bd3fff87a22cb43ed77863da570c6828e4d0b8f1c6ee52582cd3d439275a2b1f2051005e648ed866b981f2a03b61c645b7e4806ba7 +"@leichtgewicht/ip-codec@npm:^2.0.1": + version: 2.0.5 + resolution: "@leichtgewicht/ip-codec@npm:2.0.5" + checksum: 10c0/14a0112bd59615eef9e3446fea018045720cd3da85a98f801a685a818b0d96ef2a1f7227e8d271def546b2e2a0fe91ef915ba9dc912ab7967d2317b1a051d66b languageName: node linkType: hard @@ -2088,5070 +2467,11752 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.0 - resolution: "@npmcli/agent@npm:2.2.0" +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.1" - checksum: 10c0/7b89590598476dda88e79c473766b67c682aae6e0ab0213491daa6083dcc0c171f86b3868f5506f22c09aa5ea69ad7dfb78f4bf39a8dca375d89a42f408645b3 + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd +"@parcel/watcher-android-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-android-arm64@npm:2.5.0" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@pkgr/utils@npm:^2.4.2": - version: 2.4.2 - resolution: "@pkgr/utils@npm:2.4.2" - dependencies: - cross-spawn: "npm:^7.0.3" - fast-glob: "npm:^3.3.0" - is-glob: "npm:^4.0.3" - open: "npm:^9.1.0" - picocolors: "npm:^1.0.0" - tslib: "npm:^2.6.0" - checksum: 10c0/7c3e68f6405a1d4c51f418d8d580e71d7bade2683d5db07e8413d8e57f7e389047eda44a2341f77a1b3085895fca7676a9d45e8812a58312524f8c4c65d501be +"@parcel/watcher-darwin-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e +"@parcel/watcher-darwin-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tannin/compile@npm:^1.1.0": - version: 1.1.0 - resolution: "@tannin/compile@npm:1.1.0" - dependencies: - "@tannin/evaluate": "npm:^1.2.0" - "@tannin/postfix": "npm:^1.1.0" - checksum: 10c0/3dddaad1a3e152439ee595d53d309e4cd9c84bfc3e7afbecdbb8ab064337f4da56d2cc999c62588f189bbe4841d22a487070ba240a321287aab46223d6080f5d +"@parcel/watcher-freebsd-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@tannin/evaluate@npm:^1.2.0": - version: 1.2.0 - resolution: "@tannin/evaluate@npm:1.2.0" - checksum: 10c0/233116c3b55f06844a5d49b7fe3575c4e8bf29287a3d8b3729a46f9b000daa8f7826e4e8c8c220064ddcb16276d4d7ce12113115d8015533d93e5b52148b3a68 +"@parcel/watcher-linux-arm-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@tannin/plural-forms@npm:^1.1.0": - version: 1.1.0 - resolution: "@tannin/plural-forms@npm:1.1.0" - dependencies: - "@tannin/compile": "npm:^1.1.0" - checksum: 10c0/bf318832e37c0f3b0cf9d25f962b78ded9a2c42b0fb2c23139531094a2b3c69c043e2f76bdfb2c386b8436d3d209ff17578b8c4f5566f27f1542135154a218f8 +"@parcel/watcher-linux-arm-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@tannin/postfix@npm:^1.1.0": - version: 1.1.0 - resolution: "@tannin/postfix@npm:1.1.0" - checksum: 10c0/5a433b3ac9f30534c1e82c218d8f6558d960ebf822ad44dfcd6d7adad88d9800382de86913c5bcbe38c03252dc75ef233762036e0ac3a428e1a14df6bc8c6120 +"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@types/eslint@npm:^8.37.0": - version: 8.44.8 - resolution: "@types/eslint@npm:8.44.8" - dependencies: - "@types/estree": "npm:*" - "@types/json-schema": "npm:*" - checksum: 10c0/610966753add984f6ac9f00eeb766691e141e66a7e20b724a45ad077f60e8cd8fd7874b7e655e93537e54873cc5711cd6f57728474e08b478407cd942f098263 +"@parcel/watcher-linux-arm64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d +"@parcel/watcher-linux-x64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@types/hoist-non-react-statics@npm:^3.3.0": - version: 3.3.5 - resolution: "@types/hoist-non-react-statics@npm:3.3.5" - dependencies: - "@types/react": "npm:*" - hoist-non-react-statics: "npm:^3.3.0" - checksum: 10c0/2a3b64bf3d9817d7830afa60ee314493c475fb09570a64e7737084cd482d2177ebdddf888ce837350bac51741278b077683facc9541f052d4bbe8487b4e3e618 +"@parcel/watcher-linux-x64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": - version: 2.0.6 - resolution: "@types/istanbul-lib-coverage@npm:2.0.6" - checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 +"@parcel/watcher-win32-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@types/istanbul-lib-report@npm:*": - version: 3.0.3 - resolution: "@types/istanbul-lib-report@npm:3.0.3" - dependencies: - "@types/istanbul-lib-coverage": "npm:*" - checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c +"@parcel/watcher-win32-ia32@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/istanbul-reports@npm:3.0.4" - dependencies: - "@types/istanbul-lib-report": "npm:*" - checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee - languageName: node - linkType: hard - -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db +"@parcel/watcher-win32-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-x64@npm:2.5.0" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@types/json5@npm:^0.0.29": - version: 0.0.29 - resolution: "@types/json5@npm:0.0.29" - checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac +"@parcel/watcher@npm:^2.4.1": + version: 2.5.0 + resolution: "@parcel/watcher@npm:2.5.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-x64": "npm:2.5.0" + "@parcel/watcher-freebsd-x64": "npm:2.5.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm-musl": "npm:2.5.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-x64-musl": "npm:2.5.0" + "@parcel/watcher-win32-arm64": "npm:2.5.0" + "@parcel/watcher-win32-ia32": "npm:2.5.0" + "@parcel/watcher-win32-x64": "npm:2.5.0" + detect-libc: "npm:^1.0.3" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm-musl": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 10c0/9bad727d8b11e5d150ec47459254544c583adaa47d047b8ef65e1c74aede1a0767dc7fc6b8997649dae07318d6ef39caba6a1c405d306398d5bcd47074ec5d29 languageName: node linkType: hard -"@types/minimist@npm:^1.2.2": - version: 1.2.5 - resolution: "@types/minimist@npm:1.2.5" - checksum: 10c0/3f791258d8e99a1d7d0ca2bda1ca6ea5a94e5e7b8fc6cde84dd79b0552da6fb68ade750f0e17718f6587783c24254bbca0357648dd59dc3812c150305cabdc46 +"@paulirish/trace_engine@npm:0.0.39": + version: 0.0.39 + resolution: "@paulirish/trace_engine@npm:0.0.39" + dependencies: + third-party-web: "npm:latest" + checksum: 10c0/6256d73772d5770abc424e3b670afb47897ebe7869e51ce0e0e2b6a6385adbf13f99e6d82690c8d9be63276260b289913361402a4294239879ac88e6196d0c28 languageName: node linkType: hard -"@types/node@npm:*": - version: 20.10.3 - resolution: "@types/node@npm:20.10.3" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/7c8a0327a29d68a0bb152ae30e8c4738638515dd599064821c9d0c1884a1efa103021cd8f8c91e690cd56b0602bb6fe0e6651a5df2337bdc85e0c0f66054b2ce +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd languageName: node linkType: hard -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.4 - resolution: "@types/normalize-package-data@npm:2.4.4" - checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 10c0/3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 languageName: node linkType: hard -"@types/parse-json@npm:^4.0.0": - version: 4.0.2 - resolution: "@types/parse-json@npm:4.0.2" - checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 +"@playwright/test@npm:^1.49.1": + version: 1.49.1 + resolution: "@playwright/test@npm:1.49.1" + dependencies: + playwright: "npm:1.49.1" + bin: + playwright: cli.js + checksum: 10c0/2fca0bb7b334f7a23c7c5dfa5dbe37b47794c56f39b747c8d74a2f95c339e7902a296f2f1dd32c47bdd723cfa92cee05219f1a5876725dc89a1871b9137a286d languageName: node linkType: hard -"@types/prop-types@npm:*": - version: 15.7.11 - resolution: "@types/prop-types@npm:15.7.11" - checksum: 10c0/e53423cf9d510515ef8b47ff42f4f1b65a7b7b37c8704e2dbfcb9a60defe0c0e1f3cb1acfdeb466bad44ca938d7c79bffdd51b48ffb659df2432169d0b27a132 +"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.11": + version: 0.5.15 + resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.15" + dependencies: + ansi-html: "npm:^0.0.9" + core-js-pure: "npm:^3.23.3" + error-stack-parser: "npm:^2.0.6" + html-entities: "npm:^2.1.0" + loader-utils: "npm:^2.0.4" + schema-utils: "npm:^4.2.0" + source-map: "npm:^0.7.3" + peerDependencies: + "@types/webpack": 4.x || 5.x + react-refresh: ">=0.10.0 <1.0.0" + sockjs-client: ^1.4.0 + type-fest: ">=0.17.0 <5.0.0" + webpack: ">=4.43.0 <6.0.0" + webpack-dev-server: 3.x || 4.x || 5.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + "@types/webpack": + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + checksum: 10c0/ba310aa4d53070f59c8a374d1d256c5965c044c0c3fb1ff6b55353fb5e86de08a490a7bd59a31f0d4951f8f29f81864c7df224fe1342543a95d048b7413ff171 languageName: node linkType: hard -"@types/react-redux@npm:^7.1.20": - version: 7.1.32 - resolution: "@types/react-redux@npm:7.1.32" - dependencies: - "@types/hoist-non-react-statics": "npm:^3.3.0" - "@types/react": "npm:*" - hoist-non-react-statics: "npm:^3.3.0" - redux: "npm:^4.0.0" - checksum: 10c0/8ad6f4b6c09bef2ee8b8daf0df6f2176ee11eb39ccf338af86a5fe364225e31ad97074e492e1c05f18e065f695b875001a3f133efe6883ad32b07d2202df6fca +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.28 + resolution: "@polka/url@npm:1.0.0-next.28" + checksum: 10c0/acc5ea62597e4da2fb42dbee02749d07f102ae7d6d2c966bf7e423c79cd65d1621da305af567e6e7c232f3b565e242d1ec932cbb3dcc0db1508d02e9a2cafa2e languageName: node linkType: hard -"@types/react-transition-group@npm:^4.4.0": - version: 4.4.9 - resolution: "@types/react-transition-group@npm:4.4.9" +"@puppeteer/browsers@npm:2.6.1": + version: 2.6.1 + resolution: "@puppeteer/browsers@npm:2.6.1" dependencies: - "@types/react": "npm:*" - checksum: 10c0/279cd319202f7ec24ecad174dffd19fd161250bc438bf3c62951f467093e5664a0c895b185976bf45f55b68ec901e520924216eb8abafe934b66f55337319ff5 + debug: "npm:^4.4.0" + extract-zip: "npm:^2.0.1" + progress: "npm:^2.0.3" + proxy-agent: "npm:^6.5.0" + semver: "npm:^7.6.3" + tar-fs: "npm:^3.0.6" + unbzip2-stream: "npm:^1.4.3" + yargs: "npm:^17.7.2" + bin: + browsers: lib/cjs/main-cli.js + checksum: 10c0/31d4951eec40515769467be3878d3581fe0e50227f2a9fa865e9f872e4a003262996c412a1d48d9c800665b3aa91bb1c2d971eaa314ef10e536d08e63f2f40d3 languageName: node linkType: hard -"@types/react@npm:*": - version: 18.2.42 - resolution: "@types/react@npm:18.2.42" - dependencies: - "@types/prop-types": "npm:*" - "@types/scheduler": "npm:*" - csstype: "npm:^3.0.2" - checksum: 10c0/2946d78c1f9a220a4dfedd7995b8bcba47235b19756bf3dd845c604bb24fff8d0ff5be81c0c98ac7f4488791e8c7e6cbcc4898c40c0209d74a1223b8fbfb994f +"@radix-ui/primitive@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/primitive@npm:1.1.1" + checksum: 10c0/6457bd8d1aa4ecb948e5d2a2484fc570698b2ab472db6d915a8f1eec04823f80423efa60b5ba840f0693bec2ca380333cc5f3b52586b40f407d9f572f9261f8d languageName: node linkType: hard -"@types/scheduler@npm:*": - version: 0.16.8 - resolution: "@types/scheduler@npm:0.16.8" - checksum: 10c0/f86de504945b8fc41b1f391f847444d542e2e4067cf7e5d9bfeb5d2d2393d3203b1161bc0ef3b1e104d828dabfb60baf06e8d2c27e27ff7e8258e6e618d8c4ec +"@radix-ui/react-compose-refs@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-compose-refs@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/3e84580024e66e3cc5b9ae79355e787815c1d2a3c7d46e7f47900a29c33751ca24cf4ac8903314957ab1f7788aebe1687e2258641c188cf94653f7ddf8f70627 languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": - version: 7.5.6 - resolution: "@types/semver@npm:7.5.6" - checksum: 10c0/196dc32db5f68cbcde2e6a42bb4aa5cbb100fa2b7bd9c8c82faaaf3e03fbe063e205dbb4f03c7cdf53da2edb70a0d34c9f2e601b54281b377eb8dc1743226acd +"@radix-ui/react-context@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-context@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/fc4ace9d79d7954c715ade765e06c95d7e1b12a63a536bcbe842fb904f03f88fc5bd6e38d44bd23243d37a270b4c44380fedddaeeae2d274f0b898a20665aba2 languageName: node linkType: hard -"@types/yargs-parser@npm:*": - version: 21.0.3 - resolution: "@types/yargs-parser@npm:21.0.3" - checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 +"@radix-ui/react-dialog@npm:^1.1.2": + version: 1.1.4 + resolution: "@radix-ui/react-dialog@npm:1.1.4" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-focus-guards": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.1" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-portal": "npm:1.1.3" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:^2.6.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/d0ac8d85869b0d5a51823eb66503e41bab543807aa8702a2f1b2d5f720b1a2e4e9d0d83ca744aae06c6942a8759a1cd12bfa9b715d492868548254784969f78d languageName: node linkType: hard -"@types/yargs@npm:^17.0.8": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" +"@radix-ui/react-dismissable-layer@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.3" dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + "@radix-ui/react-use-escape-keydown": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/1ab2ebddf3d450bf4efb1e846894824a0056d3fa3deec0858206bc7547857fe5fe37e42f0a34918072702ead6dedc388a5770c060b2596cd408e20db86c54253 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.4.1": - version: 6.13.2 - resolution: "@typescript-eslint/eslint-plugin@npm:6.13.2" - dependencies: - "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/type-utils": "npm:6.13.2" - "@typescript-eslint/utils": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" - debug: "npm:^4.3.4" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.4" - natural-compare: "npm:^1.4.0" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" +"@radix-ui/react-focus-guards@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-focus-guards@npm:1.1.1" peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + "@types/react": optional: true - checksum: 10c0/531a4406d872738d165c6a66cb26e976523c94053b022a8210dc9fd10e91b79b705bc0fcc77145e9744e4108b53bdba55e02a10dc17757b22be92aff57849384 + checksum: 10c0/2e99750ca593083a530542a185d656b45b100752353a7a193a67566e3c256414a76fa9171d152f8c0167b8d6c1fdf62b2e07750d7af2974bf8ef39eb204aa537 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.4.1": - version: 6.13.2 - resolution: "@typescript-eslint/parser@npm:6.13.2" +"@radix-ui/react-focus-scope@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-focus-scope@npm:1.1.1" dependencies: - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/typescript-estree": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" - debug: "npm:^4.3.4" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + "@types/react": optional: true - checksum: 10c0/2c62b8cd8a37eb2ea59cd00e559f51a9f57af746e2040e872af3c58ddd3f4071ad7b7009789bdeb0e0d4ee0343bfe96ee77288020f3ae22d08e1674203f5e156 + "@types/react-dom": + optional: true + checksum: 10c0/a430264a32e358c05dfa1c3abcf6c3d0481cbcbb2547532324c6d69fa7f9e3ed77b5eb2dd64d42808ec62c8d69abb573d6076907764af126d14ea18febf45d7b languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" +"@radix-ui/react-id@npm:1.1.0, @radix-ui/react-id@npm:^1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-id@npm:1.1.0" dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - checksum: 10c0/861253235576c1c5c1772d23cdce1418c2da2618a479a7de4f6114a12a7ca853011a1e530525d0931c355a8fd237b9cd828fac560f85f9623e24054fd024726f + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/acf13e29e51ee96336837fc0cfecc306328b20b0e0070f6f0f7aa7a621ded4a1ee5537cfad58456f64bae76caa7f8769231e88dc7dc106197347ee433c275a79 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/scope-manager@npm:6.13.2" +"@radix-ui/react-portal@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-portal@npm:1.1.3" dependencies: - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" - checksum: 10c0/9b159e5bb10dfb5953e71488200b4126378fc7e987ce7d90946aea9ec40cd66c7ada92399657c5d9794189b764ca6f4eb38a8dcb9e4c5aa50ab6000a39636b9c + "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/b3cd1a81513e528d261599cffda8d7d6094a8598750eaa32bac0d64dbc9a3b4d4e1c10f5bdadf7051b5fd77033b759dbeb4838dae325b94bf8251804c61508c5 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/type-utils@npm:6.13.2" +"@radix-ui/react-presence@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-presence@npm:1.1.2" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.13.2" - "@typescript-eslint/utils": "npm:6.13.2" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.0.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + "@types/react": optional: true - checksum: 10c0/1ca97c78abdf479aea0c54e869fda2ae2f69de1974cc063062ce7b5b16c7fdf497ea15c50a29dd5941ea1b6b77e8f1213a5c272a747e334ac69ede083f327468 + "@types/react-dom": + optional: true + checksum: 10c0/0c6fa281368636308044df3be4c1f02733094b5e35ba04f26e610dd1c4315a245ffc758e0e176c444742a7a46f4328af1a9d8181e860175ec39338d06525a78d languageName: node linkType: hard -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 10c0/7febd3a7f0701c0b927e094f02e82d8ee2cada2b186fcb938bc2b94ff6fbad88237afc304cbaf33e82797078bbbb1baf91475f6400912f8b64c89be79bfa4ddf +"@radix-ui/react-primitive@npm:2.0.1, @radix-ui/react-primitive@npm:^2.0.0": + version: 2.0.1 + resolution: "@radix-ui/react-primitive@npm:2.0.1" + dependencies: + "@radix-ui/react-slot": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/6a562bec14f8e9fbfe0012d6c2932b0e54518fed898fa0622300c463611e77a4ca28a969f0cd484efd6570c01c5665dd6151f736262317d01715bc4da1a7dea6 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/types@npm:6.13.2" - checksum: 10c0/029918ca5b1442bb4bc435773504ce32191e2c3e2fde8d4176bb6513f03e3dfa2aa9724b2d22b1640656d666b97f7a7ebfeaf67b881d5e07250828fa83e3ebe8 +"@radix-ui/react-slot@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-slot@npm:1.1.1" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/f3cc71c16529c67a8407a89e0ac13a868cafa0cd05ca185b464db609aa5996a3f00588695518e420bd47ffdb4cc2f76c14cc12ea5a38fc2ca3578a30d2ca58b9 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" +"@radix-ui/react-use-callback-ref@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-callback-ref@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + "@types/react": optional: true - checksum: 10c0/d7984a3e9d56897b2481940ec803cb8e7ead03df8d9cfd9797350be82ff765dfcf3cfec04e7355e1779e948da8f02bc5e11719d07a596eb1cb995c48a95e38cf + checksum: 10c0/e954863f3baa151faf89ac052a5468b42650efca924417470efd1bd254b411a94c69c30de2fdbb90187b38cb984795978e12e30423dc41e4309d93d53b66d819 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/typescript-estree@npm:6.13.2" +"@radix-ui/react-use-controllable-state@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-controllable-state@npm:1.1.0" dependencies: - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + "@types/react": optional: true - checksum: 10c0/1c4c59dce0c51fdfee34d9f418e64fe28e3ec1a97661efc8a3d2780bdff36aff38de9090d356a968f394fa6d4e9c058936ce9cd260d4c44a52761ecd74915bce + checksum: 10c0/2af883b5b25822ac226e60a6bfde647c0123a76345052a90219026059b3f7225844b2c13a9a16fba859c1cda5fb3d057f2a04503f71780e607516492db4eb3a1 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/utils@npm:6.13.2" +"@radix-ui/react-use-escape-keydown@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/typescript-estree": "npm:6.13.2" - semver: "npm:^7.5.4" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 10c0/84969be91e7949868eaaa289288c9d71927f0e427b572501b0991d8d62b40a4234f7287c35b35d276ccbb53e9ea5457b8250fcf4941e60e6b9ba4065fbfba416 + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/910fd696e5a0994b0e06b9cb68def8a865f47951a013ec240c77db2a9e1e726105602700ef5e5f01af49f2f18fe0e73164f9a9651021f28538ef8a30d91f3fbb languageName: node linkType: hard -"@typescript-eslint/utils@npm:^5.10.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@types/json-schema": "npm:^7.0.9" - "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" - eslint-scope: "npm:^5.1.1" - semver: "npm:^7.3.7" +"@radix-ui/react-use-layout-effect@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-layout-effect@npm:1.1.0" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/f09b7d9952e4a205eb1ced31d7684dd55cee40bf8c2d78e923aa8a255318d97279825733902742c09d8690f37a50243f4c4d383ab16bd7aefaf9c4b438f785e1 + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/9bf87ece1845c038ed95863cfccf9d75f557c2400d606343bab0ab3192b9806b9840e6aa0a0333fdf3e83cf9982632852192f3e68d7d8367bc8c788dfdf8e62b languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" +"@react-spring/animated@npm:~9.7.5": + version: 9.7.5 + resolution: "@react-spring/animated@npm:9.7.5" dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10c0/7c3b8e4148e9b94d9b7162a596a1260d7a3efc4e65199693b8025c71c4652b8042501c0bc9f57654c1e2943c26da98c0f77884a746c6ae81389fcb0b513d995d + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/f8c2473c60f39a878c7dd0fdfcfcdbc720521e1506aa3f63c9de64780694a0a73d5ccc535a5ccec3520ddb70a71cf43b038b32c18e99531522da5388c510ecd7 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/visitor-keys@npm:6.13.2" +"@react-spring/core@npm:~9.7.5": + version: 9.7.5 + resolution: "@react-spring/core@npm:9.7.5" dependencies: - "@typescript-eslint/types": "npm:6.13.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/c173bc1fcc42c3075a5ee094e7f3bf0279d98315c25ff49e20d02d79022b1d0402accfa113b070afb4d52a6f6d180594b67baa8b6a784eabdf82b54dd1ff454c + "@react-spring/animated": "npm:~9.7.5" + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/5bfd83dfe248cd91889f215f015d908c7714ef445740fd5afa054b27ebc7d5a456abf6c309e2459d9b5b436e78d6fda16b62b9601f96352e9130552c02270830 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d +"@react-spring/rafz@npm:~9.7.5": + version: 9.7.5 + resolution: "@react-spring/rafz@npm:9.7.5" + checksum: 10c0/8bdad180feaa9a0e870a513043a5e98a4e9b7292a9f887575b7e6fadab2677825bc894b7ff16c38511b35bfe6cc1072df5851c5fee64448d67551559578ca759 languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" +"@react-spring/shared@npm:~9.7.5": + version: 9.7.5 + resolution: "@react-spring/shared@npm:9.7.5" dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + "@react-spring/rafz": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/0207eacccdedd918a2fc55e78356ce937f445ce27ad9abd5d3accba8f9701a39349b55115641dc2b39bb9d3a155b058c185b411d292dc8cc5686bfa56f73b94f languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 10c0/37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a +"@react-spring/types@npm:~9.7.5": + version: 9.7.5 + resolution: "@react-spring/types@npm:9.7.5" + checksum: 10c0/85c05121853cacb64f7cf63a4855e9044635e1231f70371cd7b8c78bc10be6f4dd7c68f592f92a2607e8bb68051540989b4677a2ccb525dba937f5cd95dc8bc1 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: 10c0/a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a +"@react-spring/web@npm:^9.4.5": + version: 9.7.5 + resolution: "@react-spring/web@npm:9.7.5" + dependencies: + "@react-spring/animated": "npm:~9.7.5" + "@react-spring/core": "npm:~9.7.5" + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/bcd1e052e1b16341a12a19bf4515f153ca09d1fa86ff7752a5d02d7c4db58e8baf80e6283e64411f1e388c65340dce2254b013083426806b5dbae38bd151e53e languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a +"@remote-ui/rpc@npm:^1.2.5": + version: 1.4.5 + resolution: "@remote-ui/rpc@npm:1.4.5" + checksum: 10c0/2817a0ce56510bf13df382702de48cd76d381af6972f3ed8997ca91ba97dc34519e638cdef322b7830bc6e8aca25af73b42c83b95470c04f8d3e8e157e3587aa languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 10c0/79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 +"@sentry-internal/tracing@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry-internal/tracing@npm:7.120.3" + dependencies: + "@sentry/core": "npm:7.120.3" + "@sentry/types": "npm:7.120.3" + "@sentry/utils": "npm:7.120.3" + checksum: 10c0/97d640121bb137efba6deeecbc80a61cc34b526c89d39a43efc2b8be4be159c1536951d1121503bd5171a7c5e1ef225bc632f3ef35248d6c478865abf7330cf3 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" +"@sentry/core@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/core@npm:7.120.3" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + "@sentry/types": "npm:7.120.3" + "@sentry/utils": "npm:7.120.3" + checksum: 10c0/97bcfd423ee9583fae8dc995cefb4839eb59c9d38334ebd1b22398626692aa4df322a5386e3b25a7a96b596155f802169c4ec04e63c1835ea9794955d27ba54a languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" +"@sentry/integrations@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/integrations@npm:7.120.3" dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10c0/59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f + "@sentry/core": "npm:7.120.3" + "@sentry/types": "npm:7.120.3" + "@sentry/utils": "npm:7.120.3" + localforage: "npm:^1.8.1" + checksum: 10c0/b539d4725ac2053db94e122a8e11aac4c36218c2e301547aa95956523d552c79a835a9a8e843617be808c565b116d822ede94ee7c806bea69dc9d9f5c1edd575 languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" +"@sentry/node@npm:^7.0.0": + version: 7.120.3 + resolution: "@sentry/node@npm:7.120.3" dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e + "@sentry-internal/tracing": "npm:7.120.3" + "@sentry/core": "npm:7.120.3" + "@sentry/integrations": "npm:7.120.3" + "@sentry/types": "npm:7.120.3" + "@sentry/utils": "npm:7.120.3" + checksum: 10c0/b8a6c7fa530f1bf91498db0b3898095a0b94dee322bd7facae66b9ba45ee867fd383e29ac157cdf4ac98cc040f2349c5a91f072fba9551110aec8d8cf795b78a languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 10c0/14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee +"@sentry/types@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/types@npm:7.120.3" + checksum: 10c0/f7c4a46c72dd66a88053d579ad5a0137eaf6882dfe5e942828e750ad80fd8fe98ceec1a6328dfcf31f5a56849dda8ee27f7419125f905f19751119b9662dbdcb languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" +"@sentry/utils@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/utils@npm:7.120.3" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + "@sentry/types": "npm:7.120.3" + checksum: 10c0/15a1e0a0d29aae668023f68f4b3e4b3bd5353b5f033874d2bf51264206f05036e68b8d6d88078cf807fbb051c20244b1ac73b19a875da76a97e635a38b9fd180 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" +"@shopify/web-worker@npm:^6.4.0": + version: 6.4.0 + resolution: "@shopify/web-worker@npm:6.4.0" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 + "@remote-ui/rpc": "npm:^1.2.5" + peerDependencies: + "@babel/core": ^7.0.0 + webpack: ^5.38.0 + webpack-virtual-modules: ^0.4.3 || ^0.5.0 || ^0.6.0 + peerDependenciesMeta: + "@babel/core": + optional: true + webpack: + optional: true + webpack-virtual-modules: + optional: true + checksum: 10c0/3b9326fba6dfd30dd2bc3c63d942a0ede736d865307c13665ecffc549a35ee8e4bc842cb9f58543d83baef22dac716132736826f5944ba7e314758d8fcc7973a languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" +"@sideway/address@npm:^4.1.5": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb + "@hapi/hoek": "npm:^9.0.0" + checksum: 10c0/638eb6f7e7dba209053dd6c8da74d7cc995e2b791b97644d0303a7dd3119263bcb7225a4f6804d4db2bc4f96e5a9d262975a014f58eae4d1753c27cbc96ef959 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e +"@sideway/formula@npm:^3.0.1": + version: 3.0.1 + resolution: "@sideway/formula@npm:3.0.1" + checksum: 10c0/3fe81fa9662efc076bf41612b060eb9b02e846ea4bea5bd114f1662b7f1541e9dedcf98aff0d24400bcb92f113964a50e0290b86e284edbdf6346fa9b7e2bf2c languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 10c0/d2ca75dacaf69b8fc0bb8916a204e01def3105ee44d8be16c355e5f58189eb94039e15ce831f3d544f229889ccfa35562a0ce2516179f3a7ee1bbe0b71e55b36 languageName: node linkType: hard -"@webpack-cli/configtest@npm:^2.1.1": - version: 2.1.1 - resolution: "@webpack-cli/configtest@npm:2.1.1" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - checksum: 10c0/a8da1f15702cb289807da99235ed95326ed7dabeb1a36ca59bd3a5dbe6adcc946a9a2767936050fc4d5ed14efab0e5b5a641dfe8e3d862c36caa5791ac12759d +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e languageName: node linkType: hard -"@webpack-cli/info@npm:^2.0.2": - version: 2.0.2 - resolution: "@webpack-cli/info@npm:2.0.2" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - checksum: 10c0/ca88a35604dc9aedac7c26e8f6793c5039dc1eea2b12a85fbfd669a5f21ecf9cf169d7fd157ea366a62666e3fa05b776306a96742ac61a9868f44fdce6b40f7d +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 languageName: node linkType: hard -"@webpack-cli/serve@npm:^2.0.5": - version: 2.0.5 - resolution: "@webpack-cli/serve@npm:2.0.5" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - peerDependenciesMeta: - webpack-dev-server: - optional: true - checksum: 10c0/36079d34971ff99a58b66b13f4184dcdd8617853c48cccdbc3f9ab7ea9e5d4fcf504e873c298ea7aa15e0b51ad2c4aee4d7a70bd7d9364e60f57b0eb93ca15fc +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 languageName: node linkType: hard -"@wordpress/babel-plugin-import-jsx-pragma@npm:^4.30.0": - version: 4.30.0 - resolution: "@wordpress/babel-plugin-import-jsx-pragma@npm:4.30.0" +"@stylistic/stylelint-plugin@npm:^3.0.1": + version: 3.1.1 + resolution: "@stylistic/stylelint-plugin@npm:3.1.1" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.1" + "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/media-query-list-parser": "npm:^3.0.1" + is-plain-object: "npm:^5.0.0" + postcss-selector-parser: "npm:^6.1.2" + postcss-value-parser: "npm:^4.2.0" + style-search: "npm:^0.1.0" + stylelint: "npm:^16.8.2" peerDependencies: - "@babel/core": ^7.12.9 - checksum: 10c0/8520c0753e59a41e58623da0d4af152a52758da9f666ca49f2b0b126b8d4744c5e7efaf2f062427f13db10b33b92aa3e05f08f61aaa499a9f4a27b915677a7e6 + stylelint: ^16.8.0 + checksum: 10c0/868d17f8dc7110d298b112d90f61361de4ca5807b7b68d37fe68cc2a8d630a048478e1634cb9a0e88089a69c170b951640cd6bf584e5402d8bb814e2699dd424 languageName: node linkType: hard -"@wordpress/babel-preset-default@npm:^7.31.0": - version: 7.31.0 - resolution: "@wordpress/babel-preset-default@npm:7.31.0" - dependencies: - "@babel/core": "npm:^7.16.0" - "@babel/plugin-transform-react-jsx": "npm:^7.16.0" - "@babel/plugin-transform-runtime": "npm:^7.16.0" - "@babel/preset-env": "npm:^7.16.0" - "@babel/preset-typescript": "npm:^7.16.0" - "@babel/runtime": "npm:^7.16.0" - "@wordpress/babel-plugin-import-jsx-pragma": "npm:^4.30.0" - "@wordpress/browserslist-config": "npm:^5.30.0" - "@wordpress/warning": "npm:^2.47.0" - browserslist: "npm:^4.21.10" - core-js: "npm:^3.31.0" - react: "npm:^18.2.0" - checksum: 10c0/e7dd34595e1d79b62aaeaf199635a4121ec323aac7a786ce782098a4de6c1c96c1564ed9ec7449df00bb8408a5f02622be74152536072e0483a17f415092b45b +"@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a50bd0baa34faf16bcba712091f94c7f0e230431fe99a9dfc3401fa92823ad3f68495b86ab9bf9044b53839e8c416cfbb37eb3f246ff33f261e0fa9ee1779c5b languageName: node linkType: hard -"@wordpress/browserslist-config@npm:^5.30.0": - version: 5.30.0 - resolution: "@wordpress/browserslist-config@npm:5.30.0" - checksum: 10c0/1b7b19c2cd45c824b89c7717783d6303d551dc3beb1a4c7c5ba306a12c74e72992af604c3d4630fa1e33ae03f61d1d8e15abe6f8e33c0b8690404ee39cff8c29 +"@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8a98e59bd9971e066815b4129409932f7a4db4866834fe75677ea6d517972fb40b380a69a4413189f20e7947411f9ab1b0f029dd5e8068686a5a0188d3ccd4c7 languageName: node linkType: hard -"@wordpress/eslint-plugin@npm:^17.4.0": - version: 17.4.0 - resolution: "@wordpress/eslint-plugin@npm:17.4.0" - dependencies: - "@babel/eslint-parser": "npm:^7.16.0" - "@typescript-eslint/eslint-plugin": "npm:^6.4.1" - "@typescript-eslint/parser": "npm:^6.4.1" - "@wordpress/babel-preset-default": "npm:^7.31.0" - "@wordpress/prettier-config": "npm:^3.4.0" - cosmiconfig: "npm:^7.0.0" - eslint-config-prettier: "npm:^8.3.0" - eslint-plugin-import: "npm:^2.25.2" - eslint-plugin-jest: "npm:^27.2.3" - eslint-plugin-jsdoc: "npm:^46.4.6" - eslint-plugin-jsx-a11y: "npm:^6.5.1" - eslint-plugin-playwright: "npm:^0.15.3" - eslint-plugin-prettier: "npm:^5.0.0" - eslint-plugin-react: "npm:^7.27.0" - eslint-plugin-react-hooks: "npm:^4.3.0" - globals: "npm:^13.12.0" - requireindex: "npm:^1.2.0" +"@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" peerDependencies: - "@babel/core": ">=7" - eslint: ">=8" - prettier: ">=3" - typescript: ">=4" - peerDependenciesMeta: - prettier: - optional: true - typescript: - optional: true - checksum: 10c0/e14bb300421e9582ced782decaf37f936b12214bd12cdc886a5b9a5a9fe0da14061f87ff2bfc058b287c56a8d8c7d45e4eb409b8ba0ec84ad57f96d1e9e5ed8c + "@babel/core": ^7.0.0-0 + checksum: 10c0/517dcca75223bd05d3f056a8514dbba3031278bea4eadf0842c576d84f4651e7a4e0e7082d3ee4ef42456de0f9c4531d8a1917c04876ca64b014b859ca8f1bde languageName: node linkType: hard -"@wordpress/hooks@npm:^3.47.0": - version: 3.47.0 - resolution: "@wordpress/hooks@npm:3.47.0" - dependencies: - "@babel/runtime": "npm:^7.16.0" - checksum: 10c0/22c5056a1febbad96d896d954ec283a4b00f40bed568b654ad91d182ad76f3b1902fdea7057e2af10f8e26babd7a6878d676662cb1fe7d44002c9b489ba57bc6 +"@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/004bd1892053b7e9c1b0bb14acc44e77634ec393722b87b1e4fae53e2c35122a2dd0d5c15e9070dbeec274e22e7693a2b8b48506733a8009ee92b12946fcb10a languageName: node linkType: hard -"@wordpress/i18n@npm:^4.2.4": - version: 4.47.0 - resolution: "@wordpress/i18n@npm:4.47.0" - dependencies: - "@babel/runtime": "npm:^7.16.0" - "@wordpress/hooks": "npm:^3.47.0" - gettext-parser: "npm:^1.3.1" - memize: "npm:^2.1.0" - sprintf-js: "npm:^1.1.1" - tannin: "npm:^1.2.0" - bin: - pot-to-php: tools/pot-to-php.js - checksum: 10c0/47e9dac3d1100753473ea7c24982562adf568e6c8bdcc4278dda2c248ecae73893836ea7478d8d6908eb83d715132afbb54813252fca06a5011b5fb5bf7ba32b +"@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/80e0a7fcf902f984c705051ca5c82ea6050ccbb70b651a8fea6d0eb5809e4dac274b49ea6be2d87f1eb9dfc0e2d6cdfffe1669ec2117f44b67a60a07d4c0b8b8 languageName: node linkType: hard -"@wordpress/prettier-config@npm:^3.4.0": - version: 3.4.0 - resolution: "@wordpress/prettier-config@npm:3.4.0" +"@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0" peerDependencies: - prettier: ">=3" - checksum: 10c0/476d37e819bbb9bc0e434b800dbbd17844f52a99b05ad17aad9eba1a821b37b694939b9e3e53d88247bc28c9aa9c50d8d959c0d61e532f4e6aaba7d3ab42c070 + "@babel/core": ^7.0.0-0 + checksum: 10c0/73e92c8277a89279745c0c500f59f083279a8dc30cd552b22981fade2a77628fb2bd2819ee505725fcd2e93f923e3790b52efcff409a159e657b46604a0b9a21 languageName: node linkType: hard -"@wordpress/warning@npm:^2.47.0": - version: 2.47.0 - resolution: "@wordpress/warning@npm:2.47.0" - checksum: 10c0/db936ba4a980049e05724f82f5cce73ea86673dd4a0b9237eb90d4d797e20cdba06fc093853d30f2fde0d784944836104f10e96b60e54bd832f63d8677a1601f +"@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/655ed6bc7a208ceaa4ecff0a54ccc36008c3cb31efa90d11e171cab325ebbb21aa78f09c7b65f9b3ddeda3a85f348c0c862902c48be13c14b4de165c847974e3 languageName: node linkType: hard -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f +"@svgr/babel-plugin-transform-svg-component@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-transform-svg-component@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4ac00bb99a3db4ef05e4362f116a3c608ee365a2d26cf7318d8d41a4a5b30a02c80455cce0e62c65b60ed815b5d632bedabac2ccd4b56f998fadef5286e3ded4 languageName: node linkType: hard -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 +"@svgr/babel-preset@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-preset@npm:8.1.0" + dependencies: + "@svgr/babel-plugin-add-jsx-attribute": "npm:8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute": "npm:8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression": "npm:8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value": "npm:8.0.0" + "@svgr/babel-plugin-svg-dynamic-title": "npm:8.0.0" + "@svgr/babel-plugin-svg-em-dimensions": "npm:8.0.0" + "@svgr/babel-plugin-transform-react-native-svg": "npm:8.1.0" + "@svgr/babel-plugin-transform-svg-component": "npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/49367d3ad0831f79b1056871b91766246f449d4d1168623af5e283fbaefce4a01d77ab00de6b045b55e956f9aae27895823198493cd232d88d3435ea4517ffc5 languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 +"@svgr/core@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/core@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@svgr/babel-preset": "npm:8.1.0" + camelcase: "npm:^6.2.0" + cosmiconfig: "npm:^8.1.3" + snake-case: "npm:^3.0.4" + checksum: 10c0/6a2f6b1bc79bce39f66f088d468985d518005fc5147ebf4f108570a933818b5951c2cb7da230ddff4b7c8028b5a672b2d33aa2acce012b8b9770073aa5a2d041 languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" - peerDependencies: - acorn: ^8 - checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d +"@svgr/hast-util-to-babel-ast@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/hast-util-to-babel-ast@npm:8.0.0" + dependencies: + "@babel/types": "npm:^7.21.3" + entities: "npm:^4.4.0" + checksum: 10c0/f4165b583ba9eaf6719e598977a7b3ed182f177983e55f9eb55a6a73982d81277510e9eb7ab41f255151fb9ed4edd11ac4bef95dd872f04ed64966d8c85e0f79 languageName: node linkType: hard -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" +"@svgr/plugin-jsx@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-jsx@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@svgr/babel-preset": "npm:8.1.0" + "@svgr/hast-util-to-babel-ast": "npm:8.0.0" + svg-parser: "npm:^2.0.4" peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + "@svgr/core": "*" + checksum: 10c0/07b4d9e00de795540bf70556fa2cc258774d01e97a12a26234c6fdf42b309beb7c10f31ee24d1a71137239347b1547b8bb5587d3a6de10669f95dcfe99cddc56 languageName: node linkType: hard -"acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" - bin: - acorn: bin/acorn - checksum: 10c0/a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 +"@svgr/plugin-svgo@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-svgo@npm:8.1.0" + dependencies: + cosmiconfig: "npm:^8.1.3" + deepmerge: "npm:^4.3.1" + svgo: "npm:^3.0.2" + peerDependencies: + "@svgr/core": "*" + checksum: 10c0/bfd25460f23f1548bfb8f6f3bedd6d6972c1a4f8881bd35a4f8c115218da6e999e8f9ac0ef0ed88c4e0b93fcec37f382b94c0322f4ec2b26752a89e5cc8b9d7a languageName: node linkType: hard -"adjust-sourcemap-loader@npm:^4.0.0": - version: 4.0.0 - resolution: "adjust-sourcemap-loader@npm:4.0.0" +"@svgr/webpack@npm:^8.0.1": + version: 8.1.0 + resolution: "@svgr/webpack@npm:8.1.0" dependencies: - loader-utils: "npm:^2.0.0" - regex-parser: "npm:^2.2.11" - checksum: 10c0/6a6e5bb8b670e4e1238c708f6163e92aa2ad0308fe5913de73c89e4cbf41738ee0bcc5552b94d0b7bf8be435ee49b78c6de8a6db7badd80762051e843c8aa14f + "@babel/core": "npm:^7.21.3" + "@babel/plugin-transform-react-constant-elements": "npm:^7.21.3" + "@babel/preset-env": "npm:^7.20.2" + "@babel/preset-react": "npm:^7.18.6" + "@babel/preset-typescript": "npm:^7.21.0" + "@svgr/core": "npm:8.1.0" + "@svgr/plugin-jsx": "npm:8.1.0" + "@svgr/plugin-svgo": "npm:8.1.0" + checksum: 10c0/4c1cac45bd5890de8643e5a7bfb71f3bcd8b85ae5bbacf10b8ad9f939b7a98e8d601c3ada204ffb95223abf4a24beeac5a2a0d6928a52a1ab72a29da3c015c22 languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": - version: 7.1.0 - resolution: "agent-base@npm:7.1.0" +"@tannin/compile@npm:^1.1.0": + version: 1.1.0 + resolution: "@tannin/compile@npm:1.1.0" dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce + "@tannin/evaluate": "npm:^1.2.0" + "@tannin/postfix": "npm:^1.1.0" + checksum: 10c0/3dddaad1a3e152439ee595d53d309e4cd9c84bfc3e7afbecdbb8ab064337f4da56d2cc999c62588f189bbe4841d22a487070ba240a321287aab46223d6080f5d languageName: node linkType: hard -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 +"@tannin/evaluate@npm:^1.2.0": + version: 1.2.0 + resolution: "@tannin/evaluate@npm:1.2.0" + checksum: 10c0/233116c3b55f06844a5d49b7fe3575c4e8bf29287a3d8b3729a46f9b000daa8f7826e4e8c8c220064ddcb16276d4d7ce12113115d8015533d93e5b52148b3a68 languageName: node linkType: hard -"ajv-formats@npm:^2.1.1": - version: 2.1.1 - resolution: "ajv-formats@npm:2.1.1" +"@tannin/plural-forms@npm:^1.1.0": + version: 1.1.0 + resolution: "@tannin/plural-forms@npm:1.1.0" dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + "@tannin/compile": "npm:^1.1.0" + checksum: 10c0/bf318832e37c0f3b0cf9d25f962b78ded9a2c42b0fb2c23139531094a2b3c69c043e2f76bdfb2c386b8436d3d209ff17578b8c4f5566f27f1542135154a218f8 languageName: node linkType: hard -"ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 +"@tannin/postfix@npm:^1.1.0": + version: 1.1.0 + resolution: "@tannin/postfix@npm:1.1.0" + checksum: 10c0/5a433b3ac9f30534c1e82c218d8f6558d960ebf822ad44dfcd6d7adad88d9800382de86913c5bcbe38c03252dc75ef233762036e0ac3a428e1a14df6bc8c6120 languageName: node linkType: hard -"ajv-keywords@npm:^5.1.0": - version: 5.1.0 - resolution: "ajv-keywords@npm:5.1.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - peerDependencies: - ajv: ^8.8.2 - checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: 10c0/073bfa548026b1ebaf1659eb8961e526be22fa77139b10d60e712f46d2f0f05f4e6c8bec62a087d41088ee9e29faa7f54838568e475ab2f776171003c3920858 languageName: node linkType: hard -"ajv@npm:^6.12.4, ajv@npm:^6.12.5": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 +"@tootallnate/quickjs-emscripten@npm:^0.23.0": + version: 0.23.0 + resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" + checksum: 10c0/2a939b781826fb5fd3edd0f2ec3b321d259d760464cf20611c9877205aaca3ccc0b7304dea68416baa0d568e82cd86b17d29548d1e5139fa3155a4a86a2b4b49 languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.9.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e +"@trysound/sax@npm:0.2.0": + version: 0.2.0 + resolution: "@trysound/sax@npm:0.2.0" + checksum: 10c0/44907308549ce775a41c38a815f747009ac45929a45d642b836aa6b0a536e4978d30b8d7d680bbd116e9dd73b7dbe2ef0d1369dcfc2d09e83ba381e485ecbe12 languageName: node linkType: hard -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff languageName: node linkType: hard -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b languageName: node linkType: hard -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + "@babel/types": "npm:^7.20.7" + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 languageName: node linkType: hard -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c +"@types/body-parser@npm:*": + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" + dependencies: + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df languageName: node linkType: hard -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" +"@types/bonjour@npm:^3.5.9": + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + "@types/node": "npm:*" + checksum: 10c0/eebedbca185ac3c39dd5992ef18d9e2a9f99e7f3c2f52f5561f90e9ed482c5d224c7962db95362712f580ed5713264e777a98d8f0bd8747f4eadf62937baed16 languageName: node linkType: hard -"are-docs-informative@npm:^0.0.2": - version: 0.0.2 - resolution: "are-docs-informative@npm:0.0.2" - checksum: 10c0/f0326981bd699c372d268b526b170a28f2e1aec2cf99d7de0686083528427ecdf6ae41fef5d9988e224a5616298af747ad8a76e7306b0a7c97cc085a99636d60 +"@types/connect-history-api-fallback@npm:^1.3.5": + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" + dependencies: + "@types/express-serve-static-core": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/1b4035b627dcd714b05a22557f942e24a57ca48e7377dde0d2f86313fe685bc0a6566512a73257a55b5665b96c3041fb29228ac93331d8133011716215de8244 languageName: node linkType: hard -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c languageName: node linkType: hard -"aria-query@npm:^5.3.0": - version: 5.3.0 - resolution: "aria-query@npm:5.3.0" +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" dependencies: - call-bind: "npm:^1.0.2" - is-array-buffer: "npm:^3.0.1" - checksum: 10c0/12f84f6418b57a954caa41654e5e63e019142a4bbb2c6829ba86d1ba65d31ccfaf1461d1743556fd32b091fac34ff44d9dfbdb001402361c45c373b2c86f5c20 + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": - version: 3.1.7 - resolution: "array-includes@npm:3.1.7" +"@types/eslint@npm:^8.56.10": + version: 8.56.12 + resolution: "@types/eslint@npm:8.56.12" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - is-string: "npm:^1.0.7" - checksum: 10c0/692907bd7f19d06dc58ccb761f34b58f5dc0b437d2b47a8fe42a1501849a5cf5c27aed3d521a9702667827c2c85a7e75df00a402c438094d87fc43f39ebf9b2b + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/e4ca426abe9d55f82b69a3250bec78b6d340ad1e567f91c97ecc59d3b2d6a1d8494955ac62ad0ea14b97519db580611c02be8277cbea370bdfb0f96aa2910504 languageName: node linkType: hard -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 +"@types/estree@npm:*, @types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.3": - version: 1.2.3 - resolution: "array.prototype.findlastindex@npm:1.2.3" +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": + version: 5.0.5 + resolution: "@types/express-serve-static-core@npm:5.0.5" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/2c5c4d3f07512d6729f728f6260a314c00f2eb0a243123092661fa1bc65dce90234c3b483b5f978396eccef6f69c50f0bea248448aaf9cdfcd1cedad6217acbb + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/0b27f62835f55d061a41718c9eae5caf533f08a4d1f23107f15f929c64013e8ba43afc110a198bd70196ed2925932bdbd9da2cca802c7be8fc6ec0cc4292833d languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.19.6 + resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/4281f4ead71723f376b3ddf64868ae26244d434d9906c101cf8d436d4b5c779d01bd046e4ea0ed1a394d3e402216fabfa22b1fa4dba501061cd7c81c54045983 languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" +"@types/express@npm:*": + version: 5.0.0 + resolution: "@types/express@npm:5.0.0" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/67b3f1d602bb73713265145853128b1ad77cc0f9b833c7e1e056b323fbeac41a4ff1c9c99c7b9445903caea924d9ca2450578d9011913191aa88cc3c3a4b54f4 + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10c0/0d74b53aefa69c3b3817ee9b5145fd50d7dbac52a8986afc2d7500085c446656d0b6dc13158c04e2d9f18f4324d4d93b0452337c5ff73dd086dca3e4ff11f47b languageName: node linkType: hard -"array.prototype.tosorted@npm:^1.1.1": - version: 1.1.2 - resolution: "array.prototype.tosorted@npm:1.1.2" +"@types/express@npm:^4.17.13": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/aa222a0f78e9cdb4ea4d788a11f0acc2b17c2226f0912917e1c89e0f0c4dcdd14414ac88afffbd03025f33501f2649907cfb80664e48aa2af3430c1fb1b0b416 + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" +"@types/glob@npm:^7.1.1": + version: 7.2.0 + resolution: "@types/glob@npm:7.2.0" dependencies: - array-buffer-byte-length: "npm:^1.0.0" - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - is-array-buffer: "npm:^3.0.2" - is-shared-array-buffer: "npm:^1.0.2" - checksum: 10c0/96b6e40e439678ffb7fa266398510074d33c3980fbb475490b69980cca60adec3b0777047ef377068a29862157f83edef42efc64ce48ce38977d04d68de5b7fb + "@types/minimatch": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/a8eb5d5cb5c48fc58c7ca3ff1e1ddf771ee07ca5043da6e4871e6757b4472e2e73b4cfef2644c38983174a4bc728c73f8da02845c28a1212f98cabd293ecae98 languageName: node linkType: hard -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 10c0/c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b languageName: node linkType: hard -"ast-types-flow@npm:^0.0.8": - version: 0.0.8 - resolution: "ast-types-flow@npm:0.0.8" - checksum: 10c0/f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e +"@types/gradient-parser@npm:0.1.3": + version: 0.1.3 + resolution: "@types/gradient-parser@npm:0.1.3" + checksum: 10c0/afe2f7be1482f96698f75eed9d2927558e3b84bd95d55442e0c637078a8581eb99d574bc5647ce6e422cd0b0b6cdfca6170783e55950a4bed9a78890a86ece9f languageName: node linkType: hard -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 +"@types/highlight-words-core@npm:1.2.1": + version: 1.2.1 + resolution: "@types/highlight-words-core@npm:1.2.1" + checksum: 10c0/f3795656cbe4215e849faa2e53c74a9c6a7b2e148f54267c6a7f25a4f3cd55374f3e4d2e2618740c96fafabdb36b855f7cec27cab207957d566d0500a10e2312 languageName: node linkType: hard -"asynciterator.prototype@npm:^1.0.0": - version: 1.0.0 - resolution: "asynciterator.prototype@npm:1.0.0" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/fb76850e57d931ff59fd16b6cddb79b0d34fe45f400b2c3480d38892e72cd089787401687dbdb7cdb14ece402c275d3e02a648760d1489cd493527129c4c6204 +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 languageName: node linkType: hard -"autoprefixer@npm:^10.4.0": - version: 10.4.16 - resolution: "autoprefixer@npm:10.4.16" +"@types/http-proxy@npm:^1.17.8": + version: 1.17.15 + resolution: "@types/http-proxy@npm:1.17.15" dependencies: - browserslist: "npm:^4.21.10" - caniuse-lite: "npm:^1.0.30001538" - fraction.js: "npm:^4.3.6" - normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.1.0 - bin: - autoprefixer: bin/autoprefixer - checksum: 10c0/e00256e754d481a026d928bca729b25954074dd142dbec022f0a7db0d3bbc0dc2e2dc7542e94fec22eff81e21fe140e6856448e2d9a002660cb1e2ad434daee0 - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 10c0/c4df567ca72d2754a6cbad20088f5f98b1065b3360178169fa9b44ea101af62c0f423fc3854fa820fd6895b6b9171b8386e71558203103ff8fc2ad503fdcc660 - languageName: node - linkType: hard - -"axe-core@npm:=4.7.0": - version: 4.7.0 - resolution: "axe-core@npm:4.7.0" - checksum: 10c0/89ac5712b5932ac7d23398b4cb5ba081c394a086e343acc68ba49c83472706e18e0799804e8388c779dcdacc465377deb29f2714241d3fbb389cf3a6b275c9ba + "@types/node": "npm:*" + checksum: 10c0/e2bf2fcdf23c88141b8d2c85ed5e5418b62ef78285884a2b5a717af55f4d9062136aa475489d10292093343df58fb81975f34bebd6b9df322288fd9821cbee07 languageName: node linkType: hard -"axobject-query@npm:^3.2.1": - version: 3.2.1 - resolution: "axobject-query@npm:3.2.1" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/f7debc2012e456139b57d888c223f6d3cb4b61eb104164a85e3d346273dd6ef0bc9a04b6660ca9407704a14a8e05fa6b6eb9d55f44f348c7210de7ffb350c3a7 +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 languageName: node linkType: hard -"babel-loader@npm:^9.1.0": - version: 9.1.3 - resolution: "babel-loader@npm:9.1.3" +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" dependencies: - find-cache-dir: "npm:^4.0.0" - schema-utils: "npm:^4.0.0" - peerDependencies: - "@babel/core": ^7.12.0 - webpack: ">=5" - checksum: 10c0/e3fc3c9e02bd908b37e8e8cd4f3d7280cf6ac45e33fc203aedbb615135a0fecc33bf92573b71a166a827af029d302c0b060354985cd91d510320bd70a2f949eb + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c languageName: node linkType: hard -"babel-plugin-macros@npm:^3.1.0": - version: 3.1.0 - resolution: "babel-plugin-macros@npm:3.1.0" +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" dependencies: - "@babel/runtime": "npm:^7.12.5" - cosmiconfig: "npm:^7.0.0" - resolve: "npm:^1.19.0" - checksum: 10c0/c6dfb15de96f67871d95bd2e8c58b0c81edc08b9b087dc16755e7157f357dc1090a8dc60ebab955e92587a9101f02eba07e730adc253a1e4cf593ca3ebd3839c + "@types/istanbul-lib-report": "npm:*" + checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.6": - version: 0.4.6 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/64a98811f343492aa6970ab253760194e389c0417e5b830522f944009c1f0c78e1251975fd1b9869cd48cc4623111b20a3389cf6732a1d10ba0d19de6fa5114f + "@types/node": "npm:*" + "@types/tough-cookie": "npm:*" + parse5: "npm:^7.0.0" + checksum: 10c0/3d4b2a3eab145674ee6da482607c5e48977869109f0f62560bf91ae1a792c9e847ac7c6aaf243ed2e97333cb3c51aef314ffa54a19ef174b8f9592dfcb836b25 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.5": - version: 0.8.6 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.6" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - core-js-compat: "npm:^3.33.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/97d974c1dfbefdf27866e21a1ac757f6ab1626379b544d6f8ddb05f7bfa02173f8347b6140295b0f770394549f9321775d3048e466a9a02b99b88ad5f0346858 +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.3": - version: 0.5.3 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/cc32313b9ebbf1d7bedc33524a861136b9e5d3b6e9be317ac360a1c2a59ae5ed1b465a6c68b2715cdefb089780ddfb0c11f4a148e49827a947beee76e43da598 +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac languageName: node linkType: hard -"balanced-match@npm:^1.0.0, balanced-match@npm:^1.0.2": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc languageName: node linkType: hard -"balanced-match@npm:^2.0.0": - version: 2.0.0 - resolution: "balanced-match@npm:2.0.0" - checksum: 10c0/60a54e0b75a61674e16a7a336b805f06c72d6f8fc457639c24efc512ba2bf9cb5744b9f6f5225afcefb99da39714440c83c737208cc65c5d9ecd1f3093331ca3 +"@types/minimatch@npm:*": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 10c0/83cf1c11748891b714e129de0585af4c55dd4c2cafb1f1d5233d79246e5e1e19d1b5ad9e8db449667b3ffa2b6c80125c429dbee1054e9efb45758dbc4e118562 languageName: node linkType: hard -"big-integer@npm:^1.6.44": - version: 1.6.52 - resolution: "big-integer@npm:1.6.52" - checksum: 10c0/9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 +"@types/minimist@npm:^1.2.0": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 10c0/3f791258d8e99a1d7d0ca2bda1ca6ea5a94e5e7b8fc6cde84dd79b0552da6fb68ade750f0e17718f6587783c24254bbca0357648dd59dc3812c150305cabdc46 languageName: node linkType: hard -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f +"@types/mousetrap@npm:^1.6.8": + version: 1.6.15 + resolution: "@types/mousetrap@npm:1.6.15" + checksum: 10c0/6aec93b46cdf6d23b1b61990e199edb35d84bd032309ebfd8daf94f4ad78806155730059a83229b04b3754ddb2593fd5490ce3186b921a9db2098ea589c9f1ad languageName: node linkType: hard -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: 10c0/d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d +"@types/node-forge@npm:^1.3.0": + version: 1.3.11 + resolution: "@types/node-forge@npm:1.3.11" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/3d7d23ca0ba38ac0cf74028393bd70f31169ab9aba43f21deb787840170d307d662644bac07287495effe2812ddd7ac8a14dbd43f16c2936bbb06312e96fc3b9 languageName: node linkType: hard -"bplist-parser@npm:^0.2.0": - version: 0.2.0 - resolution: "bplist-parser@npm:0.2.0" +"@types/node@npm:*": + version: 22.10.7 + resolution: "@types/node@npm:22.10.7" dependencies: - big-integer: "npm:^1.6.44" - checksum: 10c0/ce79c69e0f6efe506281e7c84e3712f7d12978991675b6e3a58a295b16f13ca81aa9b845c335614a545e0af728c8311b6aa3142af76ba1cb616af9bbac5c4a9f + undici-types: "npm:~6.20.0" + checksum: 10c0/c941b4689dfc4044b64a5f601306cbcb0c7210be853ba378a5dd44137898c45accedd796ee002ad9407024cac7ecaf5049304951cb1d80ce3d7cebbbae56f20e languageName: node linkType: hard -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 languageName: node linkType: hard -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f +"@types/parse-json@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 languageName: node linkType: hard -"braces@npm:^3.0.3, braces@npm:~3.0.2": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 +"@types/prop-types@npm:*": + version: 15.7.14 + resolution: "@types/prop-types@npm:15.7.14" + checksum: 10c0/1ec775160bfab90b67a782d735952158c7e702ca4502968aa82565bd8e452c2de8601c8dfe349733073c31179116cf7340710160d3836aa8a1ef76d1532893b1 languageName: node linkType: hard -"browserslist@npm:^4.21.10, browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" - dependencies: - caniuse-lite: "npm:^1.0.30001565" - electron-to-chromium: "npm:^1.4.601" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" - bin: - browserslist: cli.js - checksum: 10c0/2a331aab90503130043ca41dd5d281fa1e89d5e076d07a2d75e76bf4d693bd56e73d5abcd8c4f39119da6328d450578c216cf1cd5c99b82d8a90a2ae6271b465 +"@types/qs@npm:*": + version: 6.9.18 + resolution: "@types/qs@npm:6.9.18" + checksum: 10c0/790b9091348e06dde2c8e4118b5771ab386a8c22a952139a2eb0675360a2070d0b155663bf6f75b23f258fd0a1f7ffc0ba0f059d99a719332c03c40d9e9cd63b languageName: node linkType: hard -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c languageName: node linkType: hard -"builtin-modules@npm:^3.3.0": - version: 3.3.0 - resolution: "builtin-modules@npm:3.3.0" - checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a +"@types/react-dom@npm:^18.2.25": + version: 18.3.5 + resolution: "@types/react-dom@npm:18.3.5" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10c0/b163d35a6b32a79f5782574a7aeb12a31a647e248792bf437e6d596e2676961c394c5e3c6e91d1ce44ae90441dbaf93158efb4f051c0d61e2612f1cb04ce4faa languageName: node linkType: hard -"bundle-name@npm:^3.0.0": - version: 3.0.0 - resolution: "bundle-name@npm:3.0.0" - dependencies: - run-applescript: "npm:^5.0.0" - checksum: 10c0/57bc7f8b025d83961b04db2f1eff6a87f2363c2891f3542a4b82471ff8ebb5d484af48e9784fcdb28ef1d48bb01f03d891966dc3ef58758e46ea32d750ce40f8 +"@types/react-transition-group@npm:^4.4.0": + version: 4.4.12 + resolution: "@types/react-transition-group@npm:4.4.12" + peerDependencies: + "@types/react": "*" + checksum: 10c0/0441b8b47c69312c89ec0760ba477ba1a0808a10ceef8dc1c64b1013ed78517332c30f18681b0ec0b53542731f1ed015169fed1d127cc91222638ed955478ec7 languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.1 - resolution: "cacache@npm:18.0.1" +"@types/react@npm:^18.2.79": + version: 18.3.18 + resolution: "@types/react@npm:18.3.18" dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/a31666805a80a8b16ad3f85faf66750275a9175a3480896f4f6d31b5d53ef190484fabd71bdb6d2ea5603c717fbef09f4af03d6a65b525c8ef0afaa44c361866 + "@types/prop-types": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/8fb2b00672072135d0858dc9db07873ea107cc238b6228aaa2a9afd1ef7a64a7074078250db38afbeb19064be8ea6af5eac32d404efdd5f45e093cc4829d87f8 languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": - version: 1.0.5 - resolution: "call-bind@npm:1.0.5" +"@types/react@npm:^19.0.8": + version: 19.0.8 + resolution: "@types/react@npm:19.0.8" dependencies: - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.1" - set-function-length: "npm:^1.1.1" - checksum: 10c0/a6172c168fd6dacf744fcde745099218056bd755c50415b592655dcd6562157ed29f130f56c3f6db2250f67e4bd62e5c218cdc56d7bfd76e0bda50770fce2d10 + csstype: "npm:^3.0.2" + checksum: 10c0/5fa7236356b1476de03519c66ef65d4fd904826956105619e2ad60cb0b55ae7b251dd5fff02234076225b5e15333d0d936bf9dbe1d461406f8a2ba01c197ddcd languageName: node linkType: hard -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 +"@types/retry@npm:0.12.0": + version: 0.12.0 + resolution: "@types/retry@npm:0.12.0" + checksum: 10c0/7c5c9086369826f569b83a4683661557cab1361bac0897a1cefa1a915ff739acd10ca0d62b01071046fe3f5a3f7f2aec80785fe283b75602dc6726781ea3e328 languageName: node linkType: hard -"camelcase-keys@npm:^7.0.0": - version: 7.0.2 - resolution: "camelcase-keys@npm:7.0.2" - dependencies: - camelcase: "npm:^6.3.0" - map-obj: "npm:^4.1.0" - quick-lru: "npm:^5.1.1" - type-fest: "npm:^1.2.1" - checksum: 10c0/ae86a51168643e9e8a2f2c7bfa17850729979ec3dafc5253056a7d97931cbb0e3ef5b4185e59d54b7a56c54405dee2874b0c82033498d8626e512ff9034cb05c +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa languageName: node linkType: hard -"camelcase@npm:^6.3.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001636 - resolution: "caniuse-lite@npm:1.0.30001636" - checksum: 10c0/e5f965b4da7bae1531fd9f93477d015729ff9e3fa12670ead39a9e6cdc4c43e62c272d47857c5cc332e7b02d697cb3f2f965a1030870ac7476da60c2fc81ee94 +"@types/serve-index@npm:^1.9.1": + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" + dependencies: + "@types/express": "npm:*" + checksum: 10c0/94c1b9e8f1ea36a229e098e1643d5665d9371f8c2658521718e259130a237c447059b903bac0dcc96ee2c15fd63f49aa647099b7d0d437a67a6946527a837438 languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" +"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": + version: 1.15.7 + resolution: "@types/serve-static@npm:1.15.7" dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae languageName: node linkType: hard -"chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" +"@types/simple-peer@npm:^9.11.5": + version: 9.11.8 + resolution: "@types/simple-peer@npm:9.11.8" dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + "@types/node": "npm:*" + checksum: 10c0/ef55b05fb2d12ed790d8e3b46d96bb84224c67bbcdfb6a867d14129ffc77f7b3edbf66b1eb5e737953d1f1b2ce9928f3505fe29061bfb048016616beaf866ef8 languageName: node linkType: hard -"chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.0": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" +"@types/sockjs@npm:^0.3.33": + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + "@types/node": "npm:*" + checksum: 10c0/b20b7820ee813f22de4f2ce98bdd12c68c930e016a8912b1ed967595ac0d8a4cbbff44f4d486dd97f77f5927e7b5725bdac7472c9ec5b27f53a5a13179f0612f languageName: node linkType: hard -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 +"@types/source-list-map@npm:*": + version: 0.1.6 + resolution: "@types/source-list-map@npm:0.1.6" + checksum: 10c0/1e6d8d4a48535c51368c65bb2c44a1c9fd9afe2eeefefa32cbf06f9c191f7b20f638b3aa755100de0a750b0ba6a76140e912f1bee75705bc2b9a58b5a5185539 languageName: node linkType: hard -"chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: 10c0/080ce2d20c2b9e0f8461a380e9585686caa768b1c834a464470c9dc74cda07f27611c7b727a2cd768a9cecd033297fdec4ce01f1e58b62227882c1059dec321c +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c languageName: node linkType: hard -"ci-info@npm:^3.2.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a +"@types/tapable@npm:^1": + version: 1.0.12 + resolution: "@types/tapable@npm:1.0.12" + checksum: 10c0/d6a080f5839b323eb96dd5b65a6c3161c1297d8c2433eb52437912d1c3df54e38fce12ce7a57650f6453d96942298bd0935436e2501d09e407b7f41634483131 languageName: node linkType: hard -"classnames@npm:^2.3.1": - version: 2.3.2 - resolution: "classnames@npm:2.3.2" - checksum: 10c0/cd50ead57b4f97436aaa9f9885c6926323efc7c2bea8e3d4eb10e4e972aa6a1cfca1c7a0e06f8a199ca7498d4339e30bb6002e589e61c9f21248cbf3e8b0b18d +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 10c0/68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473 languageName: node linkType: hard -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 +"@types/uglify-js@npm:*": + version: 3.17.5 + resolution: "@types/uglify-js@npm:3.17.5" + dependencies: + source-map: "npm:^0.6.1" + checksum: 10c0/e225d7da26a7a8b71e71f584ab2b4e14f9bd61e2ae4c72fa14d3d862ebfb8f3c1c24414048f23ea485e93618d3370e6c9d5e5af51b6a836d48ec453a26e419f4 languageName: node linkType: hard -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - kind-of: "npm:^6.0.2" - shallow-clone: "npm:^3.0.0" - checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 +"@types/use-sync-external-store@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/use-sync-external-store@npm:0.0.6" + checksum: 10c0/77c045a98f57488201f678b181cccd042279aff3da34540ad242f893acc52b358bd0a8207a321b8ac09adbcef36e3236944390e2df4fcedb556ce7bb2a88f2a8 languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" +"@types/webpack-sources@npm:*": + version: 3.2.3 + resolution: "@types/webpack-sources@npm:3.2.3" dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + "@types/node": "npm:*" + "@types/source-list-map": "npm:*" + source-map: "npm:^0.7.3" + checksum: 10c0/74e9dfdd38bc345ce99442f3be5b5ad1efc7af5890304175c141717a7c0b38c152e6f7fe1d2875fc19aaa68964019ff4661678eba7fdeee8c3ad42dc6dbf6b62 languageName: node linkType: hard -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" +"@types/webpack@npm:^4.4.31": + version: 4.41.40 + resolution: "@types/webpack@npm:4.41.40" dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + "@types/node": "npm:*" + "@types/tapable": "npm:^1" + "@types/uglify-js": "npm:*" + "@types/webpack-sources": "npm:*" + anymatch: "npm:^3.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/ecd530e5db4c21ec61795eec538026f96c126323836249a83e72805afd1d0b1141fc781f14d4a59d77f877523384b4c5d79dc391cfb901e7a781a9aa085f8198 languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 +"@types/ws@npm:^8.5.5": + version: 8.5.13 + resolution: "@types/ws@npm:8.5.13" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/a5430aa479bde588e69cb9175518d72f9338b6999e3b2ae16fc03d3bdcff8347e486dc031e4ed14601260463c07e1f9a0d7511dfc653712b047c439c680b0b34 languageName: node linkType: hard -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 languageName: node linkType: hard -"colord@npm:^2.9.3": - version: 2.9.3 - resolution: "colord@npm:2.9.3" - checksum: 10c0/9699e956894d8996b28c686afe8988720785f476f59335c80ce852ded76ab3ebe252703aec53d9bef54f6219aea6b960fb3d9a8300058a1d0c0d4026460cd110 +"@types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10c0/d16937d7ac30dff697801c3d6f235be2166df42e4a88bf730fa6dc09201de3727c0a9500c59a672122313341de5f24e45ee0ff579c08ce91928e519090b7906b languageName: node linkType: hard -"colorette@npm:^2.0.14": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc languageName: node linkType: hard -"commander@npm:^10.0.1": - version: 10.0.1 - resolution: "commander@npm:10.0.1" - checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 - languageName: node - linkType: hard - -"commander@npm:^2.20.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - -"commander@npm:^4.0.1": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: 10c0/84a76c08fe6cc08c9c93f62ac573d2907d8e79138999312c92d4155bc2325d487d64d13f669b2000c9f8caf70493c1be2dac74fec3c51d5a04f8bc3ae1830bab +"@typescript-eslint/eslint-plugin@npm:^6.4.1": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.5.1" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/type-utils": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + debug: "npm:^4.3.4" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.4" + natural-compare: "npm:^1.4.0" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/f911a79ee64d642f814a3b6cdb0d324b5f45d9ef955c5033e78903f626b7239b4aa773e464a38c3e667519066169d983538f2bf8e5d00228af587c9d438fb344 languageName: node linkType: hard -"comment-parser@npm:1.4.1": - version: 1.4.1 - resolution: "comment-parser@npm:1.4.1" - checksum: 10c0/d6c4be3f5be058f98b24f2d557f745d8fe1cc9eb75bebbdccabd404a0e1ed41563171b16285f593011f8b6a5ec81f564fb1f2121418ac5cbf0f49255bf0840dd +"@typescript-eslint/parser@npm:^6.4.1": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/a8f99820679decd0d115c0af61903fb1de3b1b5bec412dc72b67670bf636de77ab07f2a68ee65d6da7976039bbf636907f9d5ca546db3f0b98a31ffbc225bc7d languageName: node linkType: hard -"common-path-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "common-path-prefix@npm:3.0.0" - checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb +"@typescript-eslint/scope-manager@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/scope-manager@npm:5.62.0" + dependencies: + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" + checksum: 10c0/861253235576c1c5c1772d23cdce1418c2da2618a479a7de4f6114a12a7ca853011a1e530525d0931c355a8fd237b9cd828fac560f85f9623e24054fd024726f languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" + dependencies: + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + checksum: 10c0/eaf868938d811cbbea33e97e44ba7050d2b6892202cea6a9622c486b85ab1cf801979edf78036179a8ba4ac26f1dfdf7fcc83a68c1ff66be0b3a8e9a9989b526 languageName: node linkType: hard -"confusing-browser-globals@npm:^1.0.10": - version: 1.0.11 - resolution: "confusing-browser-globals@npm:1.0.11" - checksum: 10c0/475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" + dependencies: + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/7409c97d1c4a4386b488962739c4f1b5b04dc60cf51f8cd88e6b12541f84d84c6b8b67e491a147a2c95f9ec486539bf4519fb9d418411aef6537b9c156468117 languageName: node linkType: hard -"convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.7.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 10c0/7febd3a7f0701c0b927e094f02e82d8ee2cada2b186fcb938bc2b94ff6fbad88237afc304cbaf33e82797078bbbb1baf91475f6400912f8b64c89be79bfa4ddf languageName: node linkType: hard -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 10c0/020631d3223bbcff8a0da3efbdf058220a8f48a3de221563996ad1dcc30d6c08dadc3f7608cc08830d21c0d565efd2db19b557b9528921c78aabb605eef2d74d languageName: node linkType: hard -"copy-webpack-plugin@npm:^11.0.0": - version: 11.0.0 - resolution: "copy-webpack-plugin@npm:11.0.0" +"@typescript-eslint/typescript-estree@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" dependencies: - fast-glob: "npm:^3.2.11" - glob-parent: "npm:^6.0.1" - globby: "npm:^13.1.1" - normalize-path: "npm:^3.0.0" - schema-utils: "npm:^4.0.0" - serialize-javascript: "npm:^6.0.0" - peerDependencies: - webpack: ^5.1.0 - checksum: 10c0/a667dd226b26f148584a35fb705f5af926d872584912cf9fd203c14f2b3a68f473a1f5cf768ec1dd5da23820823b850e5d50458b685c468e4a224b25c12a15b4 + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d7984a3e9d56897b2481940ec803cb8e7ead03df8d9cfd9797350be82ff765dfcf3cfec04e7355e1779e948da8f02bc5e11719d07a596eb1cb995c48a95e38cf languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": - version: 3.33.3 - resolution: "core-js-compat@npm:3.33.3" +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" dependencies: - browserslist: "npm:^4.22.1" - checksum: 10c0/779997ac791b7f7d01f21312c7b83fff2babb1f632d21fd6cfd8e9c737442475bcb660fade7e1cd7642b5c9593685bc2188089bf86b31d671e8e05e28ee30e58 + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/af1438c60f080045ebb330155a8c9bb90db345d5069cdd5d01b67de502abb7449d6c75500519df829f913a6b3f490ade3e8215279b6bdc63d0fb0ae61034df5f languageName: node linkType: hard -"core-js@npm:^3.19.1, core-js@npm:^3.31.0": - version: 3.33.3 - resolution: "core-js@npm:3.33.3" - checksum: 10c0/08abdc9470c8228b9d09f61e62ab312738681202c4c34e9638889125b304b235f34c4fe22e9d41c20906ac0fcc807dca57c5ff7d6b90021bf64e8fe23461d9ab +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@types/json-schema": "npm:^7.0.12" + "@types/semver": "npm:^7.5.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + semver: "npm:^7.5.4" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 10c0/ab2df3833b2582d4e5467a484d08942b4f2f7208f8e09d67de510008eb8001a9b7460f2f9ba11c12086fd3cdcac0c626761c7995c2c6b5657d5fa6b82030a32d languageName: node linkType: hard -"cosmiconfig@npm:^7.0.0": - version: 7.1.0 - resolution: "cosmiconfig@npm:7.1.0" +"@typescript-eslint/utils@npm:^5.10.0": + version: 5.62.0 + resolution: "@typescript-eslint/utils@npm:5.62.0" dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.2.1" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.10.0" - checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@types/json-schema": "npm:^7.0.9" + "@types/semver": "npm:^7.3.12" + "@typescript-eslint/scope-manager": "npm:5.62.0" + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/typescript-estree": "npm:5.62.0" + eslint-scope: "npm:^5.1.1" + semver: "npm:^7.3.7" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/f09b7d9952e4a205eb1ced31d7684dd55cee40bf8c2d78e923aa8a255318d97279825733902742c09d8690f37a50243f4c4d383ab16bd7aefaf9c4b438f785e1 languageName: node linkType: hard -"cosmiconfig@npm:^8.2.0": - version: 8.3.6 - resolution: "cosmiconfig@npm:8.3.6" +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" dependencies: - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.2.0" - path-type: "npm:^4.0.0" - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a + "@typescript-eslint/types": "npm:5.62.0" + eslint-visitor-keys: "npm:^3.3.0" + checksum: 10c0/7c3b8e4148e9b94d9b7162a596a1260d7a3efc4e65199693b8025c71c4652b8042501c0bc9f57654c1e2943c26da98c0f77884a746c6ae81389fcb0b513d995d languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + "@typescript-eslint/types": "npm:6.21.0" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/7395f69739cfa1cb83c1fb2fad30afa2a814756367302fb4facd5893eff66abc807e8d8f63eba94ed3b0fe0c1c996ac9a1680bcbf0f83717acedc3f2bb724fbf languageName: node linkType: hard -"css-box-model@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.2.0": version: 1.2.1 - resolution: "css-box-model@npm:1.2.1" - dependencies: - tiny-invariant: "npm:^1.0.6" - checksum: 10c0/611e56d76b16e4e21956ed9fa53f1936fbbfaccd378659587e9c929f342037fc6c062f8af9447226e11fe7c95e31e6c007a37e592f9bff4c2d40e6915553104a + resolution: "@ungap/structured-clone@npm:1.2.1" + checksum: 10c0/127afbcc75ff1532f7b1eb85ee992f9faa70e8d5bb2558da05355d423b966fc279d0a485bf19da2883280e7c299ae4170809a72e78eab086da71c6bcdda5d1e2 languageName: node linkType: hard -"css-functions-list@npm:^3.2.1": - version: 3.2.1 - resolution: "css-functions-list@npm:3.2.1" - checksum: 10c0/e6e2d9580437ad6df9f2cf18cff3f941691ec5cbbaebd4cb17a5da40d8d5dac50004807ddd05c00a121d2f21a224e2c5d339fe8e13614af21c00181d7d1c22b9 +"@use-gesture/core@npm:10.3.1": + version: 10.3.1 + resolution: "@use-gesture/core@npm:10.3.1" + checksum: 10c0/2e3b5c0f7fe26cdb47be3a9c2a58a6a9edafc5b2895b07d2898eda9ab5a2b29fb0098b15597baa0856907b593075cd44cc69bba4785c9cfb7b6fabaa3b52cd3e languageName: node linkType: hard -"css-loader@npm:^6.8.1": - version: 6.8.1 - resolution: "css-loader@npm:6.8.1" +"@use-gesture/react@npm:^10.3.1": + version: 10.3.1 + resolution: "@use-gesture/react@npm:10.3.1" dependencies: - icss-utils: "npm:^5.1.0" - postcss: "npm:^8.4.21" - postcss-modules-extract-imports: "npm:^3.0.0" - postcss-modules-local-by-default: "npm:^4.0.3" - postcss-modules-scope: "npm:^3.0.0" - postcss-modules-values: "npm:^4.0.0" - postcss-value-parser: "npm:^4.2.0" - semver: "npm:^7.3.8" + "@use-gesture/core": "npm:10.3.1" peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/a6e23de4ec1d2832f10b8ca3cfec6b6097a97ca3c73f64338ae5cd110ac270f1b218ff0273d39f677a7a561f1a9d9b0d332274664d0991bcfafaae162c2669c4 + react: ">= 16.8.0" + checksum: 10c0/978da66e4e7c424866ad52eba8fdf0ce93a4c8fc44f8837c7043e68c6a6107cd67e817fffb27f7db2ae871ef2f6addb0c8ddf1586f24c67b7e6aef1646c668cf languageName: node linkType: hard -"css-tree@npm:^2.3.1": - version: 2.3.1 - resolution: "css-tree@npm:2.3.1" +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" dependencies: - mdn-data: "npm:2.0.30" - source-map-js: "npm:^1.0.1" - checksum: 10c0/6f8c1a11d5e9b14bf02d10717fc0351b66ba12594166f65abfbd8eb8b5b490dd367f5c7721db241a3c792d935fc6751fbc09f7e1598d421477ad9fadc30f4f24 + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 10c0/67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b languageName: node linkType: hard -"css-vars-ponyfill@npm:^2.4.7": - version: 2.4.8 - resolution: "css-vars-ponyfill@npm:2.4.8" - dependencies: - balanced-match: "npm:^1.0.2" - get-css-data: "npm:^2.0.2" - checksum: 10c0/788998ceb6c4c2b27e46640fd356b7fb62b531c16c1c378329e88035b3f8a131812726ebcb99275a6bb132a9b945f86992057a28286c21806d3d7565a2401ca1 +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 10c0/0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412 languageName: node linkType: hard -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 10c0/31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.2 - resolution: "csstype@npm:3.1.2" - checksum: 10c0/32c038af259897c807ac738d9eab16b3d86747c72b09d5c740978e06f067f9b7b1737e1b75e407c7ab1fe1543dc95f20e202b4786aeb1b8d3bdf5d5ce655e6c6 +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 10c0/0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210 languageName: node linkType: hard -"damerau-levenshtein@npm:^1.0.8": - version: 1.0.8 - resolution: "damerau-levenshtein@npm:1.0.8" - checksum: 10c0/4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 10c0/c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682 languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 10c0/1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64 languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10c0/2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7 languageName: node linkType: hard -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" dependencies: - decamelize: "npm:^1.1.0" - map-obj: "npm:^1.0.0" - checksum: 10c0/4ca385933127437658338c65fb9aead5f21b28d3dd3ccd7956eb29aab0953b5d3c047fbc207111672220c71ecf7a4d34f36c92851b7bbde6fca1a02c541bdd7d + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659 languageName: node linkType: hard -"decamelize@npm:^1.1.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 10c0/d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799 languageName: node linkType: hard -"decamelize@npm:^5.0.0": - version: 5.0.1 - resolution: "decamelize@npm:5.0.1" - checksum: 10c0/3da71022bc1e85487810fa0833138effb599fa331ca21e179650e93a765d0c4dabeb1ecdd6ad1474fa0bacd2457953c63ea335afb6e53b35f2b4bf779514e2a3 +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 10c0/5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2 languageName: node linkType: hard -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10 languageName: node linkType: hard -"default-browser-id@npm:^3.0.0": - version: 3.0.0 - resolution: "default-browser-id@npm:3.0.0" +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" dependencies: - bplist-parser: "npm:^0.2.0" - untildify: "npm:^4.0.0" - checksum: 10c0/8db3ab882eb3e1e8b59d84c8641320e6c66d8eeb17eb4bb848b7dd549b1e6fd313988e4a13542e95fbaeff03f6e9dedc5ad191ad4df7996187753eb0d45c00b7 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 10c0/515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee languageName: node linkType: hard -"default-browser@npm:^4.0.0": - version: 4.0.0 - resolution: "default-browser@npm:4.0.0" +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" dependencies: - bundle-name: "npm:^3.0.0" - default-browser-id: "npm:^3.0.0" - execa: "npm:^7.1.1" - titleize: "npm:^3.0.0" - checksum: 10c0/7c8848badc139ecf9d878e562bc4e7ab4301e51ba120b24d8dcb14739c30152115cc612065ac3ab73c02aace4afa29db5a044257b2f0cf234f16e3a58f6c925e + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6 languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": - version: 1.1.1 - resolution: "define-data-property@npm:1.1.1" +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" dependencies: - get-intrinsic: "npm:^1.2.1" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - checksum: 10c0/77ef6e0bceb515e05b5913ab635a84d537cee84f8a7c37c77fdcb31fc5b80f6dbe81b33375e4b67d96aa04e6a0d8d4ea099e431d83f089af8d93adfb584bcb94 + "@webassemblyjs/ast": "npm:1.14.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24 languageName: node linkType: hard -"define-lazy-prop@npm:^3.0.0": - version: 3.0.0 - resolution: "define-lazy-prop@npm:3.0.0" - checksum: 10c0/5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 +"@webpack-cli/configtest@npm:^2.1.1": + version: 2.1.1 + resolution: "@webpack-cli/configtest@npm:2.1.1" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 10c0/a8da1f15702cb289807da99235ed95326ed7dabeb1a36ca59bd3a5dbe6adcc946a9a2767936050fc4d5ed14efab0e5b5a641dfe8e3d862c36caa5791ac12759d languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 +"@webpack-cli/configtest@npm:^3.0.1": + version: 3.0.1 + resolution: "@webpack-cli/configtest@npm:3.0.1" + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + checksum: 10c0/edd24ecfc429298fe86446f7d7daedfe82d72e7f6236c81420605484fdadade5d59c6bcef3d76bd724e11d9727f74e75de183223ae62d3a568b2d54199688cbe languageName: node linkType: hard -"delegate@npm:^3.2.0": - version: 3.2.0 - resolution: "delegate@npm:3.2.0" - checksum: 10c0/f8512633514f375b8675018088fdd679d92b84246ad6ba1de9fbc4ea7630f7fb0ff8772ac86c37a68233885f58c6b8b70676d7366f38cb2dcbf7baa474e2362d +"@webpack-cli/info@npm:^2.0.2": + version: 2.0.2 + resolution: "@webpack-cli/info@npm:2.0.2" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 10c0/ca88a35604dc9aedac7c26e8f6793c5039dc1eea2b12a85fbfd669a5f21ecf9cf169d7fd157ea366a62666e3fa05b776306a96742ac61a9868f44fdce6b40f7d languageName: node linkType: hard -"dequal@npm:^2.0.3": - version: 2.0.3 - resolution: "dequal@npm:2.0.3" - checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 +"@webpack-cli/info@npm:^3.0.1": + version: 3.0.1 + resolution: "@webpack-cli/info@npm:3.0.1" + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + checksum: 10c0/b23b94e7dc8c93e79248f20d5f1bd0fbb7b9ba4b012803e2fdc5440b8f2ee1f3eca7f4933bbca346c8168673bf572b1858169a3cb2c17d9b8bcd833d480c2170 languageName: node linkType: hard -"desandro-matches-selector@npm:^2.0.0": - version: 2.0.2 - resolution: "desandro-matches-selector@npm:2.0.2" - checksum: 10c0/f4b1f42e6ccd6c97e93e3f99a64461eef2722075b03d8a9e349e31766436f8b385d1fd50802b024dae951dc69399f13de20a139c1187000fd5e2fcf11cb5eb00 +"@webpack-cli/serve@npm:^2.0.5": + version: 2.0.5 + resolution: "@webpack-cli/serve@npm:2.0.5" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 10c0/36079d34971ff99a58b66b13f4184dcdd8617853c48cccdbc3f9ab7ea9e5d4fcf504e873c298ea7aa15e0b51ad2c4aee4d7a70bd7d9364e60f57b0eb93ca15fc languageName: node linkType: hard -"dir-glob@npm:^3.0.1": +"@webpack-cli/serve@npm:^3.0.1": version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: "npm:^4.0.0" - checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + resolution: "@webpack-cli/serve@npm:3.0.1" + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 10c0/65245e45bfa35e11a5b30631b99cfed0c1b39b2cc8320fa2d2a4185264535618827d349ec032c58af4201d6236cbc43bec894fcb840fdd06314611537a80e210 languageName: node linkType: hard -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" +"@wordpress/a11y@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/a11y@npm:4.16.0" dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + "@babel/runtime": "npm:7.25.7" + "@wordpress/dom-ready": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + checksum: 10c0/376a9c15df2d180aff01a1a68960df509cefe80d19b76e7a65fd540e52fb1fafe625f5e06d2f8e3405937d350e1cccc53b6813ce5cda3bd775b27dbbd2445599 languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" +"@wordpress/a11y@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/a11y@npm:4.17.0" dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + "@babel/runtime": "npm:7.25.7" + "@wordpress/dom-ready": "npm:^4.17.0" + "@wordpress/i18n": "npm:^5.17.0" + checksum: 10c0/6c1941e3af759bde7175dce0c1fe47612107131edf2f6c9163b53806e574a6b4ccfc898e4f9d46ca7009bcc42da797df12519afb85f9ae0b2714516c46c4d665 languageName: node linkType: hard -"dom-helpers@npm:^5.0.1": - version: 5.2.1 - resolution: "dom-helpers@npm:5.2.1" +"@wordpress/api-fetch@npm:^7.15.1, @wordpress/api-fetch@npm:^7.16.0": + version: 7.16.0 + resolution: "@wordpress/api-fetch@npm:7.16.0" dependencies: - "@babel/runtime": "npm:^7.8.7" - csstype: "npm:^3.0.2" - checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c + "@babel/runtime": "npm:7.25.7" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/url": "npm:^4.16.0" + checksum: 10c0/97c89d36a15154ed00283e9c5ffcec158a9f975f44fbad558f47a895ae733ddb59a8cf16aa085a8750418fb679cd333f1a279e4d939f2f28789775681efdb8c9 languageName: node linkType: hard -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 +"@wordpress/autop@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/autop@npm:4.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/6ba150b1ec0993b29193b831b5333e89b9fdf3de3952b4c7bdd86e0d4c6df78f0e39e3dc88a9ca24fcbe3f0f227cb50fc0db89aecb945ec5fb3374055919f421 languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.601": - version: 1.4.603 - resolution: "electron-to-chromium@npm:1.4.603" - checksum: 10c0/92287fb0780c05e98e2cc46ce0cb158e7f7f8a68b94b1418ec229746e7546e5661614b26afa31084bb893a073191b17799a61f5454937a8d3095b52c0bf6a835 +"@wordpress/babel-preset-default@npm:^8.16.0": + version: 8.16.0 + resolution: "@wordpress/babel-preset-default@npm:8.16.0" + dependencies: + "@babel/core": "npm:7.25.7" + "@babel/plugin-transform-react-jsx": "npm:7.25.7" + "@babel/plugin-transform-runtime": "npm:7.25.7" + "@babel/preset-env": "npm:7.25.7" + "@babel/preset-typescript": "npm:7.25.7" + "@babel/runtime": "npm:7.25.7" + "@wordpress/browserslist-config": "npm:^6.16.0" + "@wordpress/warning": "npm:^3.16.0" + browserslist: "npm:^4.21.10" + core-js: "npm:^3.31.0" + react: "npm:^18.3.0" + checksum: 10c0/1b02efae0015725b37338c388ba85ca29c5e52566246b4961e72b95964606f8af51626e382043feb7f59a1586cda895a00291b3dbe6291fe5b290b58f407883b + languageName: node + linkType: hard + +"@wordpress/base-styles@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/base-styles@npm:5.16.0" + checksum: 10c0/d533642ab63eacf95eb429bb8ca83bf6c271b1643c65e25fc8c4181a56e64f1bf4bf78943924c88e962562c2fefbba3a40bdd161b39351978a14a91bae5f45b6 + languageName: node + linkType: hard + +"@wordpress/blob@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/blob@npm:4.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/85c422b9d0b55b43b9a21cd0c932c8b51825b3cc51d802d2ce8a322d730101b667b0ff2124bc8cc38991ded87e610d1104587f5efd1251cc0ee08aeb199a89ab + languageName: node + linkType: hard + +"@wordpress/block-editor@npm:^14.10.1, @wordpress/block-editor@npm:^14.11.0": + version: 14.11.0 + resolution: "@wordpress/block-editor@npm:14.11.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@emotion/react": "npm:^11.7.1" + "@emotion/styled": "npm:^11.6.0" + "@react-spring/web": "npm:^9.4.5" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/api-fetch": "npm:^7.16.0" + "@wordpress/blob": "npm:^4.16.0" + "@wordpress/block-serialization-default-parser": "npm:^5.16.0" + "@wordpress/blocks": "npm:^14.5.0" + "@wordpress/commands": "npm:^1.16.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/date": "npm:^5.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/dom": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/escape-html": "npm:^3.16.0" + "@wordpress/hooks": "npm:^4.16.0" + "@wordpress/html-entities": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + "@wordpress/keyboard-shortcuts": "npm:^5.16.0" + "@wordpress/keycodes": "npm:^4.16.0" + "@wordpress/notices": "npm:^5.16.0" + "@wordpress/preferences": "npm:^4.16.0" + "@wordpress/priority-queue": "npm:^3.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/rich-text": "npm:^7.16.0" + "@wordpress/style-engine": "npm:^2.16.0" + "@wordpress/token-list": "npm:^3.16.0" + "@wordpress/upload-media": "npm:^0.1.0" + "@wordpress/url": "npm:^4.16.0" + "@wordpress/warning": "npm:^3.16.0" + "@wordpress/wordcount": "npm:^4.16.0" + change-case: "npm:^4.1.2" + clsx: "npm:^2.1.1" + colord: "npm:^2.7.0" + deepmerge: "npm:^4.3.0" + diff: "npm:^4.0.2" + fast-deep-equal: "npm:^3.1.3" + memize: "npm:^2.1.0" + parsel-js: "npm:^1.1.2" + postcss: "npm:^8.4.21" + postcss-prefix-selector: "npm:^1.16.0" + postcss-urlrebase: "npm:^1.4.0" + react-autosize-textarea: "npm:^7.1.0" + react-easy-crop: "npm:^5.0.6" + remove-accents: "npm:^0.5.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/5ab4e1fd3bd5e2013c1ae583ffdf45d06d9bcaa5aca6c9f6573bfedbd78badbbbcbc186798e3d4d843a6bdd60bc4594114a388f5e7fa378d4a57fbccd96ba98e + languageName: node + linkType: hard + +"@wordpress/block-serialization-default-parser@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/block-serialization-default-parser@npm:5.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/76ec8df0fa5a58996358fd736f086395b9eb0bd73d6671ec3112a9caf7d2e9b9b386ea297ee71c32439065be6a34cb82a57f3880eb1c983e98b1249ed34d0015 + languageName: node + linkType: hard + +"@wordpress/blocks@npm:^14.4.1, @wordpress/blocks@npm:^14.5.0": + version: 14.5.0 + resolution: "@wordpress/blocks@npm:14.5.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/autop": "npm:^4.16.0" + "@wordpress/blob": "npm:^4.16.0" + "@wordpress/block-serialization-default-parser": "npm:^5.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/dom": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/hooks": "npm:^4.16.0" + "@wordpress/html-entities": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/rich-text": "npm:^7.16.0" + "@wordpress/shortcode": "npm:^4.16.0" + "@wordpress/warning": "npm:^3.16.0" + change-case: "npm:^4.1.2" + colord: "npm:^2.7.0" + fast-deep-equal: "npm:^3.1.3" + hpq: "npm:^1.3.0" + is-plain-object: "npm:^5.0.0" + memize: "npm:^2.1.0" + react-is: "npm:^18.3.0" + remove-accents: "npm:^0.5.0" + showdown: "npm:^1.9.1" + simple-html-tokenizer: "npm:^0.5.7" + uuid: "npm:^9.0.1" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/b1614589440df2daad04b360912b9f643b1def79599b1b4537700a168951647ba2be1290c0dc75103738b98f17df1a297b29f80c795002d6b97f8cca270f2454 languageName: node linkType: hard -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 +"@wordpress/browserslist-config@npm:^6.16.0": + version: 6.16.0 + resolution: "@wordpress/browserslist-config@npm:6.16.0" + checksum: 10c0/21cb83777925c9757ebaf606bea0efa0e46e405497ec8a36eebf189da527fb77f99cbb40cfed1e18a0e1c57f0819508211fa21068cbdd9622b19d99e5e17dfe8 languageName: node linkType: hard -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 +"@wordpress/commands@npm:^1.16.0": + version: 1.16.0 + resolution: "@wordpress/commands@npm:1.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/keyboard-shortcuts": "npm:^5.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + clsx: "npm:^2.1.1" + cmdk: "npm:^1.0.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/70fb4cbf59d0f80479d54fcc6c7d0d328f36aecab85de89335f59053e4ab3071b3638909b8f31f3577f4bcb099c9a57b1c3fa17db482a6903e995f88758427d5 + languageName: node + linkType: hard + +"@wordpress/components@npm:^29.1.1, @wordpress/components@npm:^29.2.0": + version: 29.2.0 + resolution: "@wordpress/components@npm:29.2.0" + dependencies: + "@ariakit/react": "npm:^0.4.15" + "@babel/runtime": "npm:7.25.7" + "@emotion/cache": "npm:^11.7.1" + "@emotion/css": "npm:^11.7.1" + "@emotion/react": "npm:^11.7.1" + "@emotion/serialize": "npm:^1.0.2" + "@emotion/styled": "npm:^11.6.0" + "@emotion/utils": "npm:^1.0.0" + "@floating-ui/react-dom": "npm:^2.0.8" + "@types/gradient-parser": "npm:0.1.3" + "@types/highlight-words-core": "npm:1.2.1" + "@use-gesture/react": "npm:^10.3.1" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/date": "npm:^5.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/dom": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/escape-html": "npm:^3.16.0" + "@wordpress/hooks": "npm:^4.16.0" + "@wordpress/html-entities": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + "@wordpress/keycodes": "npm:^4.16.0" + "@wordpress/primitives": "npm:^4.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/rich-text": "npm:^7.16.0" + "@wordpress/warning": "npm:^3.16.0" + change-case: "npm:^4.1.2" + clsx: "npm:^2.1.1" + colord: "npm:^2.7.0" + date-fns: "npm:^3.6.0" + deepmerge: "npm:^4.3.0" + fast-deep-equal: "npm:^3.1.3" + framer-motion: "npm:^11.1.9" + gradient-parser: "npm:^0.1.5" + highlight-words-core: "npm:^1.2.2" + is-plain-object: "npm:^5.0.0" + memize: "npm:^2.1.0" + path-to-regexp: "npm:^6.2.1" + re-resizable: "npm:^6.4.0" + react-colorful: "npm:^5.3.1" + remove-accents: "npm:^0.5.0" + uuid: "npm:^9.0.1" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/5e8bb4dc4c0de01ecc23539b75e91226509581e03b940cc5fe5b7faa691a51a8954c3dc349ebcdcd6b3419c1a8ddd9e50db4ad42dfb7f8819d9f1e9848b017e7 + languageName: node + linkType: hard + +"@wordpress/components@npm:^29.3.0": + version: 29.3.0 + resolution: "@wordpress/components@npm:29.3.0" + dependencies: + "@ariakit/react": "npm:^0.4.15" + "@babel/runtime": "npm:7.25.7" + "@emotion/cache": "npm:^11.7.1" + "@emotion/css": "npm:^11.7.1" + "@emotion/react": "npm:^11.7.1" + "@emotion/serialize": "npm:^1.0.2" + "@emotion/styled": "npm:^11.6.0" + "@emotion/utils": "npm:^1.0.0" + "@floating-ui/react-dom": "npm:^2.0.8" + "@types/gradient-parser": "npm:0.1.3" + "@types/highlight-words-core": "npm:1.2.1" + "@use-gesture/react": "npm:^10.3.1" + "@wordpress/a11y": "npm:^4.17.0" + "@wordpress/compose": "npm:^7.17.0" + "@wordpress/date": "npm:^5.17.0" + "@wordpress/deprecated": "npm:^4.17.0" + "@wordpress/dom": "npm:^4.17.0" + "@wordpress/element": "npm:^6.17.0" + "@wordpress/escape-html": "npm:^3.17.0" + "@wordpress/hooks": "npm:^4.17.0" + "@wordpress/html-entities": "npm:^4.17.0" + "@wordpress/i18n": "npm:^5.17.0" + "@wordpress/icons": "npm:^10.17.0" + "@wordpress/is-shallow-equal": "npm:^5.17.0" + "@wordpress/keycodes": "npm:^4.17.0" + "@wordpress/primitives": "npm:^4.17.0" + "@wordpress/private-apis": "npm:^1.17.0" + "@wordpress/rich-text": "npm:^7.17.0" + "@wordpress/warning": "npm:^3.17.0" + change-case: "npm:^4.1.2" + clsx: "npm:^2.1.1" + colord: "npm:^2.7.0" + date-fns: "npm:^3.6.0" + deepmerge: "npm:^4.3.0" + fast-deep-equal: "npm:^3.1.3" + framer-motion: "npm:^11.1.9" + gradient-parser: "npm:^0.1.5" + highlight-words-core: "npm:^1.2.2" + is-plain-object: "npm:^5.0.0" + memize: "npm:^2.1.0" + path-to-regexp: "npm:^6.2.1" + re-resizable: "npm:^6.4.0" + react-colorful: "npm:^5.3.1" + remove-accents: "npm:^0.5.0" + uuid: "npm:^9.0.1" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/d8ba1a24db303b26f12394d70654514b6a86f2ab8f2e7e7d38340a3a9955511410779f15feecee16f5b425804db6b59cf48d569a38c4c8b741f467fca2684ad3 + languageName: node + linkType: hard + +"@wordpress/compose@npm:^7.15.1, @wordpress/compose@npm:^7.16.0": + version: 7.16.0 + resolution: "@wordpress/compose@npm:7.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@types/mousetrap": "npm:^1.6.8" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/dom": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + "@wordpress/keycodes": "npm:^4.16.0" + "@wordpress/priority-queue": "npm:^3.16.0" + "@wordpress/undo-manager": "npm:^1.16.0" + change-case: "npm:^4.1.2" + clipboard: "npm:^2.0.11" + mousetrap: "npm:^1.6.5" + use-memo-one: "npm:^1.1.1" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/cbf8d8639886d350cbb624b7b28bf78b8e3e58187ac338841a58fd60b8bd412a9af9adc806691d0aa5ef3ecac20144f4f2a946213a15ff015e1cc80664753af1 + languageName: node + linkType: hard + +"@wordpress/compose@npm:^7.17.0": + version: 7.17.0 + resolution: "@wordpress/compose@npm:7.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@types/mousetrap": "npm:^1.6.8" + "@wordpress/deprecated": "npm:^4.17.0" + "@wordpress/dom": "npm:^4.17.0" + "@wordpress/element": "npm:^6.17.0" + "@wordpress/is-shallow-equal": "npm:^5.17.0" + "@wordpress/keycodes": "npm:^4.17.0" + "@wordpress/priority-queue": "npm:^3.17.0" + "@wordpress/undo-manager": "npm:^1.17.0" + change-case: "npm:^4.1.2" + clipboard: "npm:^2.0.11" + mousetrap: "npm:^1.6.5" + use-memo-one: "npm:^1.1.1" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/a38893a98c7dc72fffd264530ab736b6b2416bd266f92994534fb9e3974ba2fe30105bcd29b419bbaf9f8a074d93da84f193d36ef9ffa0ed4d8b292d9c51a9aa + languageName: node + linkType: hard + +"@wordpress/core-data@npm:^7.15.1, @wordpress/core-data@npm:^7.16.0": + version: 7.16.0 + resolution: "@wordpress/core-data@npm:7.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/api-fetch": "npm:^7.16.0" + "@wordpress/block-editor": "npm:^14.11.0" + "@wordpress/blocks": "npm:^14.5.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/html-entities": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/rich-text": "npm:^7.16.0" + "@wordpress/sync": "npm:^1.16.0" + "@wordpress/undo-manager": "npm:^1.16.0" + "@wordpress/url": "npm:^4.16.0" + "@wordpress/warning": "npm:^3.16.0" + change-case: "npm:^4.1.2" + equivalent-key-map: "npm:^0.2.2" + fast-deep-equal: "npm:^3.1.3" + memize: "npm:^2.1.0" + uuid: "npm:^9.0.1" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/4fe2167e453bedc7c54b124e372b2d6f23631220cc79d36019994fff20a2eb7dc02a4d49037310ebc10a229e1fa59c9bf4cb3b2ba59e643a496a1d8d0fd3db98 + languageName: node + linkType: hard + +"@wordpress/data@npm:^10.15.1, @wordpress/data@npm:^10.16.0": + version: 10.16.0 + resolution: "@wordpress/data@npm:10.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + "@wordpress/priority-queue": "npm:^3.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/redux-routine": "npm:^5.16.0" + deepmerge: "npm:^4.3.0" + equivalent-key-map: "npm:^0.2.2" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + redux: "npm:^5.0.1" + rememo: "npm:^4.0.2" + use-memo-one: "npm:^1.1.1" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/0d009cdbb32c627cc343b1106e82bb47b147415837ea5c9a70e826ca8dfbb3489e1b733d1cc145469e4e54df2de15618fa14e74b06157d1049b623e951f64ad3 languageName: node linkType: hard -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b +"@wordpress/data@npm:^10.17.0": + version: 10.17.0 + resolution: "@wordpress/data@npm:10.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/compose": "npm:^7.17.0" + "@wordpress/deprecated": "npm:^4.17.0" + "@wordpress/element": "npm:^6.17.0" + "@wordpress/is-shallow-equal": "npm:^5.17.0" + "@wordpress/priority-queue": "npm:^3.17.0" + "@wordpress/private-apis": "npm:^1.17.0" + "@wordpress/redux-routine": "npm:^5.17.0" + deepmerge: "npm:^4.3.0" + equivalent-key-map: "npm:^0.2.2" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + redux: "npm:^5.0.1" + rememo: "npm:^4.0.2" + use-memo-one: "npm:^1.1.1" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/16038b006b9566c06808f0d46fbb49afd902ad41d54940378fcc3b4aad544c612e85a68194a3c5a0d0548a367b312c48d7dbf94bd01339c99f82798b3e1ea927 + languageName: node + linkType: hard + +"@wordpress/dataviews@npm:^4.12.0": + version: 4.12.0 + resolution: "@wordpress/dataviews@npm:4.12.0" + dependencies: + "@ariakit/react": "npm:^0.4.15" + "@babel/runtime": "npm:7.25.7" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/primitives": "npm:^4.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/warning": "npm:^3.16.0" + clsx: "npm:^2.1.1" + remove-accents: "npm:^0.5.0" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/2b5fdf0527ea16a76547a07ed55fd48785f3f96c458269cde4f8658aa80ef98f09bd0d990859a6a7ecd4e6fdd0e9b68f13113861871d0ec67ca61273f8312ec3 languageName: node linkType: hard -"encoding@npm:^0.1.12, encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" +"@wordpress/date@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/date@npm:5.16.0" dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + "@babel/runtime": "npm:7.25.7" + "@wordpress/deprecated": "npm:^4.16.0" + moment: "npm:^2.29.4" + moment-timezone: "npm:^0.5.40" + checksum: 10c0/c6099fbd12e560a06e918f93d497551ac809d93fd7a8d3371d2b719cc0811b1ac28477912bab938a9ad35d00d015084ba8b6fd69b403a764debf46ce9bc36335 languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" +"@wordpress/date@npm:^5.17.0": + version: 5.17.0 + resolution: "@wordpress/date@npm:5.17.0" dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 + "@babel/runtime": "npm:7.25.7" + "@wordpress/deprecated": "npm:^4.17.0" + moment: "npm:^2.29.4" + moment-timezone: "npm:^0.5.40" + checksum: 10c0/45cf350e0beb1d05c989e080384f1d114d683b970ae466be1bc889ff392f8b5428b8f994ddaa5ad6d58a4e9793459e66fce02357a5bd185c0a32ad26f66d2a9f languageName: node linkType: hard -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 +"@wordpress/dependency-extraction-webpack-plugin@npm:^6.16.0": + version: 6.16.0 + resolution: "@wordpress/dependency-extraction-webpack-plugin@npm:6.16.0" + dependencies: + json2php: "npm:^0.0.7" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/a4293357ffa4232431091c9805ec2f32e648c53f47808fb547a7c49186b67becd9116de2ed41f7056657e187ca480c2fb38faf959e1fcd8e7de8e3540eec5ef8 languageName: node linkType: hard -"envinfo@npm:^7.7.3": - version: 7.11.0 - resolution: "envinfo@npm:7.11.0" - bin: - envinfo: dist/cli.js - checksum: 10c0/4415b9c1ca32cdf92ce126136b9965eeac2efd6ab7e5278c06e8f86d048edad87ef4084710313a6d938ef9bc084ab17e1caee16339d731d230f3e2650f3aaf4d +"@wordpress/deprecated@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/deprecated@npm:4.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/hooks": "npm:^4.16.0" + checksum: 10c0/849dae8875d48f50dc0b31ab8d88512251f4340687b4847bc61380ed1fe2e1151ec0837960f4d2dcfee09f14ba1cdfab6314d6b4ea51ee00a8688c07175563be languageName: node linkType: hard -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 +"@wordpress/deprecated@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/deprecated@npm:4.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/hooks": "npm:^4.17.0" + checksum: 10c0/03d5dc4bbda2a0c8db46a05f60fdbcf08c2bd88b5616b4e1be64582753ba55dce8094961ced0fd5c66d60031870927d4e62865b030de8941568172f0f1af0000 languageName: node linkType: hard -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" +"@wordpress/deprecated@npm:^4.18.0": + version: 4.18.0 + resolution: "@wordpress/deprecated@npm:4.18.0" dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + "@babel/runtime": "npm:7.25.7" + "@wordpress/hooks": "npm:^4.18.0" + checksum: 10c0/4fbd771898e30051416d1b05143d42ff1b3f6b59221671729fa0e862976d9c66c9b4fbe4cdc73afa49031e783333fdeb2dc4e63f23bf16d5e01de59dbbcda41c languageName: node linkType: hard -"es-abstract@npm:^1.22.1": - version: 1.22.3 - resolution: "es-abstract@npm:1.22.3" +"@wordpress/dom-ready@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/dom-ready@npm:4.16.0" dependencies: - array-buffer-byte-length: "npm:^1.0.0" - arraybuffer.prototype.slice: "npm:^1.0.2" - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.5" - es-set-tostringtag: "npm:^2.0.1" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.2" - get-symbol-description: "npm:^1.0.0" - globalthis: "npm:^1.0.3" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - internal-slot: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.2" - is-callable: "npm:^1.2.7" - is-negative-zero: "npm:^2.0.2" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.12" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.4" - regexp.prototype.flags: "npm:^1.5.1" - safe-array-concat: "npm:^1.0.1" - safe-regex-test: "npm:^1.0.0" - string.prototype.trim: "npm:^1.2.8" - string.prototype.trimend: "npm:^1.0.7" - string.prototype.trimstart: "npm:^1.0.7" - typed-array-buffer: "npm:^1.0.0" - typed-array-byte-length: "npm:^1.0.0" - typed-array-byte-offset: "npm:^1.0.0" - typed-array-length: "npm:^1.0.4" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.13" - checksum: 10c0/da31ec43b1c8eb47ba8a17693cac143682a1078b6c3cd883ce0e2062f135f532e93d873694ef439670e1f6ca03195118f43567ba6f33fb0d6c7daae750090236 - languageName: node - linkType: hard - -"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": - version: 1.0.15 - resolution: "es-iterator-helpers@npm:1.0.15" - dependencies: - asynciterator.prototype: "npm:^1.0.0" - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.1" - es-set-tostringtag: "npm:^2.0.1" - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.2.1" - globalthis: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.0" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.5" - iterator.prototype: "npm:^1.1.2" - safe-array-concat: "npm:^1.0.1" - checksum: 10c0/b4c83f94bfe624260d5238092de3173989f76f1416b1d02c388aea3b2024174e5f5f0e864057311ac99790b57e836ca3545b6e77256b26066dac944519f5e6d6 + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/b92f1510a55f47e6c4b514933040ec8f87eff84c6e99bea8b51d99cc17e0cb958a388371aa1b21f379667c3ed50a7e77dbcae603a43e27b374bfe5a59eb80337 languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1": - version: 1.4.1 - resolution: "es-module-lexer@npm:1.4.1" - checksum: 10c0/b7260a138668554d3f0ddcc728cb4b60c2fa463f15545cf155ecbdd5450a1348952d58298a7f48642e900ee579f21d7f5304b6b3c61b3d9fc2d4b2109b5a9dff +"@wordpress/dom-ready@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/dom-ready@npm:4.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/87bf63d291cb12def948ccc4ef03cc7eb7a53e0b3e912ab5d907ceeddde08b97ba3d02c9eb62d3ef7fcacc6f02374c24688938d9a4a5dfac1036c5e38f43a543 languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.2 - resolution: "es-set-tostringtag@npm:2.0.2" +"@wordpress/dom@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/dom@npm:4.16.0" dependencies: - get-intrinsic: "npm:^1.2.2" - has-tostringtag: "npm:^1.0.0" - hasown: "npm:^2.0.0" - checksum: 10c0/176d6bd1be31dd0145dcceee62bb78d4a5db7f81db437615a18308a6f62bcffe45c15081278413455e8cf0aad4ea99079de66f8de389605942dfdacbad74c2d5 + "@babel/runtime": "npm:7.25.7" + "@wordpress/deprecated": "npm:^4.16.0" + checksum: 10c0/f9aaa9bcf08468f6d2331ce2e19958add6f35d28af8778279c3228f68af7e6c35176f4602fa09c56f1344a426f13526c5c4182be571ad680b0f7a5e0f4f9b7d1 languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" +"@wordpress/dom@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/dom@npm:4.17.0" dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 + "@babel/runtime": "npm:7.25.7" + "@wordpress/deprecated": "npm:^4.17.0" + checksum: 10c0/304ad22d52d3fd461afb5a4531bb39312bcd4f01d6e5aed01e1be349ac610293af95d3e500841544841c61e1a104d6c3cbc856e2dabe07c1a30b0b757a050232 languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"@wordpress/dom@npm:^4.18.0": + version: 4.18.0 + resolution: "@wordpress/dom@npm:4.18.0" dependencies: - is-callable: "npm:^1.1.4" - is-date-object: "npm:^1.0.1" - is-symbol: "npm:^1.0.2" - checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + "@babel/runtime": "npm:7.25.7" + "@wordpress/deprecated": "npm:^4.18.0" + checksum: 10c0/668729b5f87882453669e01a0774fb22d4c97a12a45fcd5f6e19e1442350d358780c8d7a0265fe0c0154f11f085f2bc35b49f284fd1238592dce8b75369f77d5 languageName: node linkType: hard -"esbuild-loader@npm:^4.0.2": - version: 4.0.2 - resolution: "esbuild-loader@npm:4.0.2" +"@wordpress/e2e-test-utils-playwright@npm:^1.16.0": + version: 1.16.0 + resolution: "@wordpress/e2e-test-utils-playwright@npm:1.16.0" dependencies: - esbuild: "npm:^0.19.0" - get-tsconfig: "npm:^4.7.0" - loader-utils: "npm:^2.0.4" - webpack-sources: "npm:^1.4.3" - peerDependencies: - webpack: ^4.40.0 || ^5.0.0 - checksum: 10c0/9e69458e469a4fd0926dfad71bef2bd39d1aa5b70da0fb94dbfb92decf20e836f0095ac6f39718164e51d8f7e0aed2542dcd888c864a33ef0b17b5091fcce34d - languageName: node - linkType: hard - -"esbuild@npm:^0.19.0": - version: 0.19.8 - resolution: "esbuild@npm:0.19.8" - dependencies: - "@esbuild/android-arm": "npm:0.19.8" - "@esbuild/android-arm64": "npm:0.19.8" - "@esbuild/android-x64": "npm:0.19.8" - "@esbuild/darwin-arm64": "npm:0.19.8" - "@esbuild/darwin-x64": "npm:0.19.8" - "@esbuild/freebsd-arm64": "npm:0.19.8" - "@esbuild/freebsd-x64": "npm:0.19.8" - "@esbuild/linux-arm": "npm:0.19.8" - "@esbuild/linux-arm64": "npm:0.19.8" - "@esbuild/linux-ia32": "npm:0.19.8" - "@esbuild/linux-loong64": "npm:0.19.8" - "@esbuild/linux-mips64el": "npm:0.19.8" - "@esbuild/linux-ppc64": "npm:0.19.8" - "@esbuild/linux-riscv64": "npm:0.19.8" - "@esbuild/linux-s390x": "npm:0.19.8" - "@esbuild/linux-x64": "npm:0.19.8" - "@esbuild/netbsd-x64": "npm:0.19.8" - "@esbuild/openbsd-x64": "npm:0.19.8" - "@esbuild/sunos-x64": "npm:0.19.8" - "@esbuild/win32-arm64": "npm:0.19.8" - "@esbuild/win32-ia32": "npm:0.19.8" - "@esbuild/win32-x64": "npm:0.19.8" - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/57d7d0bc40965bdd9d4c2d76d7f9b8890c59d764e2e3820d3b01af03b6187a90efc0acf05ec900d66672c15760d7377bd22d9330d302fecc492b27065c6941a6 + change-case: "npm:^4.1.2" + form-data: "npm:^4.0.0" + get-port: "npm:^5.1.1" + lighthouse: "npm:^12.2.2" + mime: "npm:^3.0.0" + web-vitals: "npm:^4.2.1" + peerDependencies: + "@playwright/test": ">=1" + checksum: 10c0/31ce6b08d233fe0f11715ccd52b788591a7acf0409bdbae42db8c43957a9acef3bcb7d635062b617c1735749137a26452952571957876db07abb3f9838b23cd3 + languageName: node + linkType: hard + +"@wordpress/editor@npm:^14.15.1": + version: 14.16.0 + resolution: "@wordpress/editor@npm:14.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/api-fetch": "npm:^7.16.0" + "@wordpress/blob": "npm:^4.16.0" + "@wordpress/block-editor": "npm:^14.11.0" + "@wordpress/blocks": "npm:^14.5.0" + "@wordpress/commands": "npm:^1.16.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/core-data": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/dataviews": "npm:^4.12.0" + "@wordpress/date": "npm:^5.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/dom": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/fields": "npm:^0.8.0" + "@wordpress/hooks": "npm:^4.16.0" + "@wordpress/html-entities": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/interface": "npm:^9.1.0" + "@wordpress/keyboard-shortcuts": "npm:^5.16.0" + "@wordpress/keycodes": "npm:^4.16.0" + "@wordpress/media-utils": "npm:^5.16.0" + "@wordpress/notices": "npm:^5.16.0" + "@wordpress/patterns": "npm:^2.16.0" + "@wordpress/plugins": "npm:^7.16.0" + "@wordpress/preferences": "npm:^4.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/reusable-blocks": "npm:^5.16.0" + "@wordpress/rich-text": "npm:^7.16.0" + "@wordpress/server-side-render": "npm:^5.16.0" + "@wordpress/url": "npm:^4.16.0" + "@wordpress/warning": "npm:^3.16.0" + "@wordpress/wordcount": "npm:^4.16.0" + change-case: "npm:^4.1.2" + client-zip: "npm:^2.4.5" + clsx: "npm:^2.1.1" + date-fns: "npm:^3.6.0" + deepmerge: "npm:^4.3.0" + fast-deep-equal: "npm:^3.1.3" + is-plain-object: "npm:^5.0.0" + memize: "npm:^2.1.0" + react-autosize-textarea: "npm:^7.1.0" + remove-accents: "npm:^0.5.0" + uuid: "npm:^9.0.1" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/0c7b647b37e64a84a8e814d714c9261b5fbb11a9dfcd9352a02f10c483a96341486009735e06367ddfce14bf8c041eb26f883d12b43848fba4342599d999da07 languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: 10c0/afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d +"@wordpress/element@npm:^6.15.1, @wordpress/element@npm:^6.16.0": + version: 6.16.0 + resolution: "@wordpress/element@npm:6.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@types/react": "npm:^18.2.79" + "@types/react-dom": "npm:^18.2.25" + "@wordpress/escape-html": "npm:^3.16.0" + change-case: "npm:^4.1.2" + is-plain-object: "npm:^5.0.0" + react: "npm:^18.3.0" + react-dom: "npm:^18.3.0" + checksum: 10c0/c0b05ece053250f1a9b2f3a65c395f3979eb04933843931917ab4f49886752c81ffa9e5154bfeb4ccdf78f5163be6c9b63bc44bee5e657a8315a736d6ca54305 languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 +"@wordpress/element@npm:^6.17.0": + version: 6.17.0 + resolution: "@wordpress/element@npm:6.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@types/react": "npm:^18.2.79" + "@types/react-dom": "npm:^18.2.25" + "@wordpress/escape-html": "npm:^3.17.0" + change-case: "npm:^4.1.2" + is-plain-object: "npm:^5.0.0" + react: "npm:^18.3.0" + react-dom: "npm:^18.3.0" + checksum: 10c0/18413b5227102f30f80d7ecd1942befa21c3dba135209b619f2b655dcf83a5c4c6c81675f3a9103872ef6c6a9c19544c6009cbef31ac30fa9d2223612ab07cf3 languageName: node linkType: hard -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 +"@wordpress/escape-html@npm:^3.16.0": + version: 3.16.0 + resolution: "@wordpress/escape-html@npm:3.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/6bb7c75e4c260754d01e08bfbbbe9bcd6ff4458f91352baa30f2ae7aeb316e2d54bf043bc019253b10bd7e4b0a48e50f1c04a1a236df94a888900e7bf7b54227 languageName: node linkType: hard -"eslint-config-airbnb-base@npm:^15.0.0": - version: 15.0.0 - resolution: "eslint-config-airbnb-base@npm:15.0.0" +"@wordpress/escape-html@npm:^3.17.0": + version: 3.17.0 + resolution: "@wordpress/escape-html@npm:3.17.0" dependencies: - confusing-browser-globals: "npm:^1.0.10" - object.assign: "npm:^4.1.2" - object.entries: "npm:^1.1.5" - semver: "npm:^6.3.0" - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 - checksum: 10c0/93639d991654414756f82ad7860aac30b0dc6797277b7904ddb53ed88a32c470598696bbc6c503e066414024d305221974d3769e6642de65043bedf29cbbd30f + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/88901d2f86add34c58b4d6db1d90847ac791ca55218024be9cf72442a72161773eff0ab52be3bc50b6637e0907f8968e2ebb746b2310d325fc9b8a85d09e2f15 languageName: node linkType: hard -"eslint-config-prettier@npm:^8.3.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" +"@wordpress/eslint-plugin@npm:^22.2.0": + version: 22.2.0 + resolution: "@wordpress/eslint-plugin@npm:22.2.0" + dependencies: + "@babel/eslint-parser": "npm:7.25.7" + "@typescript-eslint/eslint-plugin": "npm:^6.4.1" + "@typescript-eslint/parser": "npm:^6.4.1" + "@wordpress/babel-preset-default": "npm:^8.16.0" + "@wordpress/prettier-config": "npm:^4.16.0" + cosmiconfig: "npm:^7.0.0" + eslint-config-prettier: "npm:^8.3.0" + eslint-plugin-import: "npm:^2.25.2" + eslint-plugin-jest: "npm:^27.4.3" + eslint-plugin-jsdoc: "npm:^46.4.6" + eslint-plugin-jsx-a11y: "npm:^6.5.1" + eslint-plugin-playwright: "npm:^0.15.3" + eslint-plugin-prettier: "npm:^5.0.0" + eslint-plugin-react: "npm:^7.27.0" + eslint-plugin-react-hooks: "npm:^4.3.0" + globals: "npm:^13.12.0" + requireindex: "npm:^1.2.0" peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 10c0/19f8c497d9bdc111a17a61b25ded97217be3755bbc4714477dfe535ed539dddcaf42ef5cf8bb97908b058260cf89a3d7c565cb0be31096cbcd39f4c2fa5fe43c + "@babel/core": ">=7" + eslint: ">=8" + prettier: ">=3" + typescript: ">=5" + peerDependenciesMeta: + prettier: + optional: true + typescript: + optional: true + checksum: 10c0/051244f31c6de4ce359df1cd9e94bbb261871d777f252ad9ab21bda83ec27e26a76f08dcf4cf4d2ce30c1487220f37c76661cb501f2edfa3fa6447e1356a12bd languageName: node linkType: hard -"eslint-config-prettier@npm:^9.1.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" +"@wordpress/fields@npm:^0.8.0": + version: 0.8.0 + resolution: "@wordpress/fields@npm:0.8.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/api-fetch": "npm:^7.16.0" + "@wordpress/blob": "npm:^4.16.0" + "@wordpress/block-editor": "npm:^14.11.0" + "@wordpress/blocks": "npm:^14.5.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/core-data": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/dataviews": "npm:^4.12.0" + "@wordpress/date": "npm:^5.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/hooks": "npm:^4.16.0" + "@wordpress/html-entities": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/media-utils": "npm:^5.16.0" + "@wordpress/notices": "npm:^5.16.0" + "@wordpress/patterns": "npm:^2.16.0" + "@wordpress/primitives": "npm:^4.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/router": "npm:^1.16.0" + "@wordpress/url": "npm:^4.16.0" + "@wordpress/warning": "npm:^3.16.0" + change-case: "npm:4.1.2" + client-zip: "npm:^2.4.5" + clsx: "npm:2.1.1" + remove-accents: "npm:^0.5.0" peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + react: ^18.0.0 + checksum: 10c0/e2898e2e7edaad820a7ea0285b2445b95180c935c7799a2766f2b179c8ebbdd94c9a5ad9c5e203a8b55d490d2d082961411d94871da7b756287a8efc99aabc00 languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.9": - version: 0.3.9 - resolution: "eslint-import-resolver-node@npm:0.3.9" +"@wordpress/hooks@npm:^4.15.0, @wordpress/hooks@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/hooks@npm:4.16.0" dependencies: - debug: "npm:^3.2.7" - is-core-module: "npm:^2.13.0" - resolve: "npm:^1.22.4" - checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/ed95118abf543dfd81242cee287c916705de492013260f53061be0e9ad0eb4071f1c30a8668a462710f92691655627b5364029e9f250579324a64b2bbd60ecc1 languageName: node linkType: hard -"eslint-module-utils@npm:^2.8.0": - version: 2.8.0 - resolution: "eslint-module-utils@npm:2.8.0" +"@wordpress/hooks@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/hooks@npm:4.17.0" dependencies: - debug: "npm:^3.2.7" - peerDependenciesMeta: - eslint: - optional: true - checksum: 10c0/c7a8d1a58d76ec8217a8fea49271ec8132d1b9390965a75f6a4ecbc9e5983d742195b46d2e4378231d2186801439fe1aa5700714b0bfd4eb17aac6e1b65309df + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/e4ead5e4c8439cacb536ce54c4314780cd78c3cb664dcdd94dcc0fd905e007b918103675bb8c01eb294fa007ce42d14cf1e8a61fe7b4c0cbd365dc5e743c6b8f languageName: node linkType: hard -"eslint-plugin-import@npm:^2.25.2, eslint-plugin-import@npm:^2.25.3": - version: 2.29.0 - resolution: "eslint-plugin-import@npm:2.29.0" +"@wordpress/hooks@npm:^4.18.0": + version: 4.18.0 + resolution: "@wordpress/hooks@npm:4.18.0" dependencies: - array-includes: "npm:^3.1.7" - array.prototype.findlastindex: "npm:^1.2.3" - array.prototype.flat: "npm:^1.3.2" - array.prototype.flatmap: "npm:^1.3.2" - debug: "npm:^3.2.7" - doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.8.0" - hasown: "npm:^2.0.0" - is-core-module: "npm:^2.13.1" - is-glob: "npm:^4.0.3" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.7" - object.groupby: "npm:^1.0.1" - object.values: "npm:^1.1.7" - semver: "npm:^6.3.1" - tsconfig-paths: "npm:^3.14.2" - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 10c0/761a4e1fbc2cd318e62350bed4c448f8b11ed83091d6bb7776f096556363a09debd9922b39fd2714c895edc9aaea82e08e684eb632283f880c58a91e4bae6733 + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/5b7297c8ea06e7066296776fdfc8ccc1785a30e980a949f8a7509730b9ee14f32d40ab637e7883f054ae7dfe64460e061716c08d9f485951c371bc8abacbe56e languageName: node linkType: hard -"eslint-plugin-jest@npm:^27.2.3": - version: 27.6.0 - resolution: "eslint-plugin-jest@npm:27.6.0" +"@wordpress/html-entities@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/html-entities@npm:4.16.0" dependencies: - "@typescript-eslint/utils": "npm:^5.10.0" - peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: "*" - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - checksum: 10c0/f6a61f91c382c82d653632b85749896c0c8c2ac1e17e43cbe242da0eb5ea9f818e796ac65f7e5d7904acea36392218181be4672869b566a756243e9d39737644 + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/d140d6aa91ce6cb59a4694a52cb27541eb410966918402d8b2c8cd3ca85db4e00d52264e33d9d183ba5fa22db031506566e488ed50402135c56625385debda2e languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^46.4.6": - version: 46.9.0 - resolution: "eslint-plugin-jsdoc@npm:46.9.0" +"@wordpress/html-entities@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/html-entities@npm:4.17.0" dependencies: - "@es-joy/jsdoccomment": "npm:~0.41.0" - are-docs-informative: "npm:^0.0.2" - comment-parser: "npm:1.4.1" - debug: "npm:^4.3.4" - escape-string-regexp: "npm:^4.0.0" - esquery: "npm:^1.5.0" - is-builtin-module: "npm:^3.2.1" - semver: "npm:^7.5.4" - spdx-expression-parse: "npm:^3.0.1" - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 10c0/4566b0f9bda54b446c813cf5ea93ae6d5866cbc4d448cb957b9ce2563f934d3ed2ed4e665e5a870750860a57137a1714c38599c35c60be16dce0f8e5a75b6ff6 + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/da7fd2c4995d4178a60f2cd72d035dd3a721e277a5ca8829edf30163b24988fe69b6b8b1416869e88a160d9e75e5cc58c19096be60732f8db76266e84cf84e84 languageName: node linkType: hard -"eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.8.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" +"@wordpress/i18n@npm:^5.15.1, @wordpress/i18n@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/i18n@npm:5.16.0" dependencies: - "@babel/runtime": "npm:^7.23.2" - aria-query: "npm:^5.3.0" - array-includes: "npm:^3.1.7" - array.prototype.flatmap: "npm:^1.3.2" - ast-types-flow: "npm:^0.0.8" - axe-core: "npm:=4.7.0" - axobject-query: "npm:^3.2.1" - damerau-levenshtein: "npm:^1.0.8" - emoji-regex: "npm:^9.2.2" - es-iterator-helpers: "npm:^1.0.15" - hasown: "npm:^2.0.0" - jsx-ast-utils: "npm:^3.3.5" - language-tags: "npm:^1.0.9" - minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.7" - object.fromentries: "npm:^2.0.7" - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/199b883e526e6f9d7c54cb3f094abc54f11a1ec816db5fb6cae3b938eb0e503acc10ccba91ca7451633a9d0b9abc0ea03601844a8aba5fe88c5e8897c9ac8f49 + "@babel/runtime": "npm:7.25.7" + "@wordpress/hooks": "npm:^4.16.0" + gettext-parser: "npm:^1.3.1" + memize: "npm:^2.1.0" + sprintf-js: "npm:^1.1.1" + tannin: "npm:^1.2.0" + bin: + pot-to-php: ./tools/pot-to-php.js + checksum: 10c0/3d50e865423cb2c7c89de8aca52308fefb4088713112a0fcc2fb64a30603b281bb270febe673a9ca068b55474d996e7cb0392ca5326d5461aa55d66982112f16 languageName: node linkType: hard -"eslint-plugin-playwright@npm:^0.15.3": - version: 0.15.3 - resolution: "eslint-plugin-playwright@npm:0.15.3" - peerDependencies: - eslint: ">=7" - eslint-plugin-jest: ">=25" - peerDependenciesMeta: - eslint-plugin-jest: - optional: true - checksum: 10c0/be96ce7e4157dfb52dcb38107cbdeebb1d1445b4a52d4909f62831ac060d8ff155c18cceb7ef2cdbbf4149e7f3465731975fb95587591144663cf72b1a541df6 +"@wordpress/i18n@npm:^5.17.0": + version: 5.17.0 + resolution: "@wordpress/i18n@npm:5.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/hooks": "npm:^4.17.0" + gettext-parser: "npm:^1.3.1" + memize: "npm:^2.1.0" + sprintf-js: "npm:^1.1.1" + tannin: "npm:^1.2.0" + bin: + pot-to-php: ./tools/pot-to-php.js + checksum: 10c0/5560f46234cf3add39e6fe1ae0fdca1786c5859ebaaa2c462286795651366f27589acc230710b99399f3f44575d338a79ab0aafc3cbc8dcada0a9e0dad0b7bf6 languageName: node linkType: hard -"eslint-plugin-prettier@npm:^5.0.0, eslint-plugin-prettier@npm:^5.0.1": - version: 5.0.1 - resolution: "eslint-plugin-prettier@npm:5.0.1" +"@wordpress/icons@npm:^10.16.0": + version: 10.16.0 + resolution: "@wordpress/icons@npm:10.16.0" dependencies: - prettier-linter-helpers: "npm:^1.0.0" - synckit: "npm:^0.8.5" - peerDependencies: - "@types/eslint": ">=8.0.0" - eslint: ">=8.0.0" - prettier: ">=3.0.0" - peerDependenciesMeta: - "@types/eslint": - optional: true - eslint-config-prettier: - optional: true - checksum: 10c0/08e2c7bed93d9f7c86e9aa0bd4f5cc51f65233a446ddfda11e821f12819e1e4be62cfbc2a4e17169c76fded1c4de7371e37e5f2525e81695decaf6c652a41fb0 + "@babel/runtime": "npm:7.25.7" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/primitives": "npm:^4.16.0" + checksum: 10c0/6a16ed5984ad16875083bb7e199f96d9339de28290ed95cc0d3d25ba33b667adfddf7d25000d83210686605dff6f894701bd78955158c8b9ee10efd665e67954 languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^4.3.0": - version: 4.6.0 - resolution: "eslint-plugin-react-hooks@npm:4.6.0" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 10c0/58c7e10ea5792c33346fcf5cb4024e14837035ce412ff99c2dcb7c4f903dc9b17939078f80bfef826301ce326582c396c00e8e0ac9d10ac2cde2b42d33763c65 +"@wordpress/icons@npm:^10.17.0": + version: 10.17.0 + resolution: "@wordpress/icons@npm:10.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/element": "npm:^6.17.0" + "@wordpress/primitives": "npm:^4.17.0" + checksum: 10c0/95859442097af2c00e472cc2c2c70ba5441612dbca3ea96771d243bebab7772c5f6ad2dd74d6c7341af1bae844c8576fbea2d43143faf87e0f1587f31933d3c8 languageName: node linkType: hard -"eslint-plugin-react@npm:^7.27.0, eslint-plugin-react@npm:^7.28.0": - version: 7.33.2 - resolution: "eslint-plugin-react@npm:7.33.2" - dependencies: - array-includes: "npm:^3.1.6" - array.prototype.flatmap: "npm:^1.3.1" - array.prototype.tosorted: "npm:^1.1.1" - doctrine: "npm:^2.1.0" - es-iterator-helpers: "npm:^1.0.12" - estraverse: "npm:^5.3.0" - jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" - minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.6" - object.fromentries: "npm:^2.0.6" - object.hasown: "npm:^1.1.2" - object.values: "npm:^1.1.6" - prop-types: "npm:^15.8.1" - resolve: "npm:^2.0.0-next.4" - semver: "npm:^6.3.1" - string.prototype.matchall: "npm:^4.0.8" +"@wordpress/interface@npm:^9.1.0": + version: 9.1.0 + resolution: "@wordpress/interface@npm:9.1.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/plugins": "npm:^7.16.0" + "@wordpress/preferences": "npm:^4.16.0" + "@wordpress/viewport": "npm:^6.16.0" + clsx: "npm:^2.1.1" peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/f9b247861024bafc396c4bd3c9ac946604b3b23077251c98f23602aa22027a0c33a69157fd49564e4ff7f17b3678e5dc366a46c7ec42a09454d7cbce786d5001 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/181d0d135ca142d9c075b84c965de7f91283f2e5698419c508562f6a02b62b2079e8fc6b437eb3f068e835f926be9b791da248801d838aac416b0ae81d98bf48 languageName: node linkType: hard -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" +"@wordpress/is-shallow-equal@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/is-shallow-equal@npm:5.16.0" dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/0eaf33b093473bbf4028b162cf7e146700257cf5e041a7106e5b0d4de81d422803d318edde40eb43969a1904de31dd9f672234fb674a02765a1ed422a0ebec5a languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"@wordpress/is-shallow-equal@npm:^5.17.0": + version: 5.17.0 + resolution: "@wordpress/is-shallow-equal@npm:5.17.0" dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^2.1.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: 10c0/9f0e3a2db751d84067d15977ac4b4472efd6b303e369e6ff241a99feac04da758f46d5add022c33d06b53596038dbae4b4aceb27c7e68b8dfc1055b35e495787 + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/379622c59e558313ef03423a436d5c17f51c4f11b71f1a957186f0fcd59a33bd46d33864d284358e19e79c4be5aba846a51babcb191183239a0e1a95c4521e16 languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 +"@wordpress/jest-console@npm:^8.16.0": + version: 8.16.0 + resolution: "@wordpress/jest-console@npm:8.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + jest-matcher-utils: "npm:^29.6.2" + peerDependencies: + jest: ">=29" + checksum: 10c0/c9ae3566a7967d8ef9d888d9c6dd1f95a8d063f9867f879bfd0567fe5f5da851eec01ae3910588ecd0d8269864722d5f07b1049b9001c055c33dee0427ba0146 languageName: node linkType: hard -"eslint-webpack-plugin@npm:^4.0.1": - version: 4.0.1 - resolution: "eslint-webpack-plugin@npm:4.0.1" +"@wordpress/jest-preset-default@npm:^12.16.0": + version: 12.16.0 + resolution: "@wordpress/jest-preset-default@npm:12.16.0" dependencies: - "@types/eslint": "npm:^8.37.0" - jest-worker: "npm:^29.5.0" - micromatch: "npm:^4.0.5" - normalize-path: "npm:^3.0.0" - schema-utils: "npm:^4.0.0" + "@wordpress/jest-console": "npm:^8.16.0" + babel-jest: "npm:29.7.0" peerDependencies: - eslint: ^8.0.0 - webpack: ^5.0.0 - checksum: 10c0/21af66b577f696202a1c852eed2e218218fba83983fb42d5a5e3367c8ffed5669f269435389452e6c139fd0029887a67c6cfee0b3a04043b7369810a7dd34143 + "@babel/core": ">=7" + jest: ">=29" + checksum: 10c0/9791b132fdb7e6a484a0d4ee9581018067e4821a10445ce70baed6383f598c5efd082ff83de639bc1b7c0861a5d561e43191aa946349d26d5523ba72594fd5bc languageName: node linkType: hard -"eslint@npm:^8.3.0": - version: 8.55.0 - resolution: "eslint@npm:8.55.0" +"@wordpress/keyboard-shortcuts@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/keyboard-shortcuts@npm:5.16.0" dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.55.0" - "@humanwhocodes/config-array": "npm:^0.11.13" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" - debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - bin: - eslint: bin/eslint.js - checksum: 10c0/d28c0b60f19bb7d355cb8393e77b018c8f548dba3f820b799c89bb2e0c436ee26084e700c5e57e1e97e7972ec93065277849141b82e7b0c0d02c2dc1e553a2a1 + "@babel/runtime": "npm:7.25.7" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/keycodes": "npm:^4.16.0" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/8df7c05b45d9b0b9b700a2300c13e4c036d44726a35b0f7a22dcbb6675fe18de51b70ec22e61ca095faed0eeaab940b3c7552056133d1a07e0f439d55794718c languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"@wordpress/keycodes@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/keycodes@npm:4.16.0" dependencies: - acorn: "npm:^8.9.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + "@babel/runtime": "npm:7.25.7" + "@wordpress/i18n": "npm:^5.16.0" + checksum: 10c0/e99a2087e89d7909e128186ba26b4672843906a18f175b74243784abc8db35eb3902a0b899812fec0417f839a8f9c9085a7cca37f95118f6dfbab0bc2772272e languageName: node linkType: hard -"esquery@npm:^1.4.2, esquery@npm:^1.5.0": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"@wordpress/keycodes@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/keycodes@npm:4.17.0" dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + "@babel/runtime": "npm:7.25.7" + "@wordpress/i18n": "npm:^5.17.0" + checksum: 10c0/ef3bebae79bef998cb41ee9891909baf39af039b0f6de3239cd330910a0ff993c7622be7f2c9c5c6bfdb196fda4acc62f29570aa8644fe85bd0982c4f7a4ebd3 languageName: node linkType: hard -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" +"@wordpress/media-utils@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/media-utils@npm:5.16.0" dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + "@babel/runtime": "npm:7.25.7" + "@wordpress/api-fetch": "npm:^7.16.0" + "@wordpress/blob": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + checksum: 10c0/6f312429f27bf9a656668827f0e1dd5932c3882f671979d2714fe2da00db8ad6339ebcd1e7fe835a54a316cf439e217df859f643350dab116813543523397ee6 languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d +"@wordpress/notices@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/notices@npm:5.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/data": "npm:^10.16.0" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/5b46ea11ff1c40de6fad89c4159e556964eb7893dcb6438e2a5697cbdb21750dac36034b8674cb67b9d5918072a8a1ddd5870d6868dc4aa1b21fce2aaf133b01 languageName: node linkType: hard -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 +"@wordpress/npm-package-json-lint-config@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/npm-package-json-lint-config@npm:5.16.0" + peerDependencies: + npm-package-json-lint: ">=6.0.0" + checksum: 10c0/111c9c78f696bec579e9f4f20a5eb97cc1fa4c074ad0279d2f291d42ef8dff5ce011e9b05a9888868d085544ccedc5af157632b0601f9975425d3a067e5db34c + languageName: node + linkType: hard + +"@wordpress/patterns@npm:^2.16.0": + version: 2.16.0 + resolution: "@wordpress/patterns@npm:2.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/block-editor": "npm:^14.11.0" + "@wordpress/blocks": "npm:^14.5.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/core-data": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/html-entities": "npm:^4.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/notices": "npm:^5.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/url": "npm:^4.16.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/61d28b737a855b75c60343f0792e3dcc3d0fb6a51d37fcb89a06963c414db1d833d305ca511387aec412eeee144e6a08fb1a3915cfdc8582a0c3c8d46e5d54f2 languageName: node linkType: hard -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 +"@wordpress/plugins@npm:^7.16.0": + version: 7.16.0 + resolution: "@wordpress/plugins@npm:7.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/hooks": "npm:^4.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + memize: "npm:^2.0.1" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/470d4197338f55c991aa1cebbcca0210df17b42efbdc82150a95b4e752408e5f92a7139d8a1f899ba5c7d76d2b3eb07e5e8de772b57bbfc917b2c1a8668415b7 languageName: node linkType: hard -"ev-emitter@npm:^1.0.1, ev-emitter@npm:^1.1.1": - version: 1.1.1 - resolution: "ev-emitter@npm:1.1.1" - checksum: 10c0/332dcb444de2b1d81035fb22a10dd33926311baa7ea6fc24f1de7b60c6eff5b7e133611000fce740471f0c8f95259d3914d49b4201af2d85a51f0aeb8cb1ceda +"@wordpress/plugins@npm:^7.17.0": + version: 7.17.0 + resolution: "@wordpress/plugins@npm:7.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/components": "npm:^29.3.0" + "@wordpress/compose": "npm:^7.17.0" + "@wordpress/deprecated": "npm:^4.17.0" + "@wordpress/element": "npm:^6.17.0" + "@wordpress/hooks": "npm:^4.17.0" + "@wordpress/icons": "npm:^10.17.0" + "@wordpress/is-shallow-equal": "npm:^5.17.0" + memize: "npm:^2.0.1" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/806df03c4fa81c2eb5575c62256532b83ca5b86b63a9b5471de498dac4cfc9d1c3cad43fca8b29e9821e8442608d4eea87f3b5b30920aa16ea43c419adef478d languageName: node linkType: hard -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 +"@wordpress/postcss-plugins-preset@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/postcss-plugins-preset@npm:5.16.0" + dependencies: + "@wordpress/base-styles": "npm:^5.16.0" + autoprefixer: "npm:^10.4.20" + peerDependencies: + postcss: ^8.0.0 + checksum: 10c0/114018f6505013a311ebb16722be897ed8e9b3e1c8f9f74d0dfef41edd730cb6e4f52959057a93d5afdffd76e585424cf0c5d0969287b87ddb88f66063c11eb0 languageName: node linkType: hard -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" +"@wordpress/preferences@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/preferences@npm:4.16.0" dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + "@babel/runtime": "npm:7.25.7" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + clsx: "npm:^2.1.1" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/4dc18548befb354548928f53faf25c39f69398a8768b5b2f93b6377214bfd77357095f5efe9ece4e0442720ba4d851f854f32acfb2eb6db344fb7880ba924317 languageName: node linkType: hard -"execa@npm:^7.1.1": - version: 7.2.0 - resolution: "execa@npm:7.2.0" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.1" - human-signals: "npm:^4.3.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^3.0.7" - strip-final-newline: "npm:^3.0.0" - checksum: 10c0/098cd6a1bc26d509e5402c43f4971736450b84d058391820c6f237aeec6436963e006fd8423c9722f148c53da86aa50045929c7278b5522197dff802d10f9885 +"@wordpress/prettier-config@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/prettier-config@npm:4.16.0" + peerDependencies: + prettier: ">=3" + checksum: 10c0/f5241ec01127cc468d48f9123efeb732a8f992cd9ab813fd88841073975df93adac3049b46d748102effa67f1cc1ff860a47b578a1c0b0b6dd45d2e631f76840 languageName: node linkType: hard -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 +"@wordpress/primitives@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/primitives@npm:4.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/element": "npm:^6.16.0" + clsx: "npm:^2.1.1" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/2af68a36336a4be7726f478575a7ee20080c7072d5011366e19601f34265c6f7ce53dc58b4ebcad123223fa3281107d38f1c3aa322f6118452f75f5e3afa66ab languageName: node linkType: hard -"expose-loader@npm:^4.0.0": - version: 4.1.0 - resolution: "expose-loader@npm:4.1.0" +"@wordpress/primitives@npm:^4.17.0": + version: 4.17.0 + resolution: "@wordpress/primitives@npm:4.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/element": "npm:^6.17.0" + clsx: "npm:^2.1.1" peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/c5fd8deb0b3ab421c0464a0cd1550bf95a732f914495794f4eb68b664eb230624ef992b37284c7d7f376b578203ea3da2a512af28b0a9746f0d48587e08f41d5 + react: ^18.0.0 + checksum: 10c0/bac983e77358c0c4457341d0ab6656badc8385683aeae75e4a479be0e29229b9d177d3abe31177913a99e83dace8f0ec988b57fb1fe209b85f4384499ffb673b languageName: node linkType: hard -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 +"@wordpress/priority-queue@npm:^3.16.0": + version: 3.16.0 + resolution: "@wordpress/priority-queue@npm:3.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + requestidlecallback: "npm:^0.3.0" + checksum: 10c0/da9629fdf5e21748587f89fa567be61cc044ba45b521d251c7e6aa7a2fb0384551d34a7f01a49bfe79337e8a3fd9df7a79c699ee06cad26f1d85520b73b515ae languageName: node linkType: hard -"fast-diff@npm:^1.1.2": - version: 1.3.0 - resolution: "fast-diff@npm:1.3.0" - checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 +"@wordpress/priority-queue@npm:^3.17.0": + version: 3.17.0 + resolution: "@wordpress/priority-queue@npm:3.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + requestidlecallback: "npm:^0.3.0" + checksum: 10c0/c870ef477dfb09cd1eac2b872d119a743ae929ad7e23feda3334e0e1331765585c17283be69b2a691090f85b7c8aff6b5fff929fa24b26d415ee1fd0333d7045 languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"@wordpress/private-apis@npm:^1.16.0": + version: 1.16.0 + resolution: "@wordpress/private-apis@npm:1.16.0" dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/8afaa02c7577fc92de803107e21ad5f78e8040762dc4a9aa6cd7fab75478594103285a2b4f1fab44b4938b43cc94367b60e30281f5c21446df20a539ebfb5412 languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b +"@wordpress/private-apis@npm:^1.17.0": + version: 1.17.0 + resolution: "@wordpress/private-apis@npm:1.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/6227511644c5194bb84cf9a4158157d1150541b805d9f65167fa0b4441a98970b6d1709c2f5931f0e714a685451e90ae23d18fda84721e6e0cfef6173c887f87 languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 +"@wordpress/redux-routine@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/redux-routine@npm:5.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + rungen: "npm:^0.3.2" + peerDependencies: + redux: ">=4" + checksum: 10c0/ef3ff7232e97cdd5ce65146c3f56d28fd92d3ba74eb06575f4a0cf9672b92382555910cf7e633f935fb873945028ccb2b597ec54665656d0a8709812329c1651 languageName: node linkType: hard -"fastest-levenshtein@npm:^1.0.12, fastest-levenshtein@npm:^1.0.16": - version: 1.0.16 - resolution: "fastest-levenshtein@npm:1.0.16" - checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b +"@wordpress/redux-routine@npm:^5.17.0": + version: 5.17.0 + resolution: "@wordpress/redux-routine@npm:5.17.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + rungen: "npm:^0.3.2" + peerDependencies: + redux: ">=4" + checksum: 10c0/2a3fff4bd925422596c1b884fb5f845fc283546e323c62a8478789d356ad515dd43961d9a55235877b651a55b33d0e9723566bd65d4e3d03251835a3db4addc1 + languageName: node + linkType: hard + +"@wordpress/reusable-blocks@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/reusable-blocks@npm:5.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/block-editor": "npm:^14.11.0" + "@wordpress/blocks": "npm:^14.5.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/core-data": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/icons": "npm:^10.16.0" + "@wordpress/notices": "npm:^5.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/url": "npm:^4.16.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/90b6a9f5fbb621a088e9797f95b8fa6cdfb3ca9dd45de573c32ff7f961e99c45e633d36fc5099f23f7991d8190cb7593c92661841199c11ac3f81658b1e48cb9 languageName: node linkType: hard -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" +"@wordpress/rich-text@npm:^7.16.0": + version: 7.16.0 + resolution: "@wordpress/rich-text@npm:7.16.0" dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/5ce4f83afa5f88c9379e67906b4d31bc7694a30826d6cc8d0f0473c966929017fda65c2174b0ec89f064ede6ace6c67f8a4fe04cef42119b6a55b0d465554c24 + "@babel/runtime": "npm:7.25.7" + "@wordpress/a11y": "npm:^4.16.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/escape-html": "npm:^3.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/keycodes": "npm:^4.16.0" + memize: "npm:^2.1.0" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/488e143e930340fe43297423c47f005dc6cfa7eaf7f04408b9807bb868dcdb7b0c5c64ce66512b6229cba7d91671046204aa782f4256d531d0e3d26c6bf2623f languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"@wordpress/rich-text@npm:^7.17.0": + version: 7.17.0 + resolution: "@wordpress/rich-text@npm:7.17.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + "@babel/runtime": "npm:7.25.7" + "@wordpress/a11y": "npm:^4.17.0" + "@wordpress/compose": "npm:^7.17.0" + "@wordpress/data": "npm:^10.17.0" + "@wordpress/deprecated": "npm:^4.17.0" + "@wordpress/element": "npm:^6.17.0" + "@wordpress/escape-html": "npm:^3.17.0" + "@wordpress/i18n": "npm:^5.17.0" + "@wordpress/keycodes": "npm:^4.17.0" + memize: "npm:^2.1.0" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/7f0fdd7567eb2705de4c17f7c759474ae1571188b820ef2806408fb2ce6605123b804f82f6b854114786bf1eb63cc0e4769be554e51b24daabd4b2a90c933048 languageName: node linkType: hard -"file-entry-cache@npm:^7.0.0": - version: 7.0.2 - resolution: "file-entry-cache@npm:7.0.2" +"@wordpress/router@npm:^1.16.0": + version: 1.16.0 + resolution: "@wordpress/router@npm:1.16.0" dependencies: - flat-cache: "npm:^3.2.0" - checksum: 10c0/822664e35c3e295e6a8ca7ec490d8d8077017607f41f94b29922f1f49c6dd07025048e3ed528e2909a1439eba66d60f802c0774aa612cf6ee053ee4ecc16c8c5 + "@babel/runtime": "npm:7.25.7" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/url": "npm:^4.16.0" + history: "npm:^5.3.0" + route-recognizer: "npm:^0.3.4" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/f9ef5c3efbe570f05d699738f60351606bb5a1cbf622c1d82d87f105cb607d8c628e58575da3390245bb21a85b0f084283bfdbff55f50a6cf1df15c798d2ecd2 + languageName: node + linkType: hard + +"@wordpress/scripts@npm:^30.8.1": + version: 30.9.0 + resolution: "@wordpress/scripts@npm:30.9.0" + dependencies: + "@babel/core": "npm:7.25.7" + "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.5.11" + "@svgr/webpack": "npm:^8.0.1" + "@wordpress/babel-preset-default": "npm:^8.16.0" + "@wordpress/browserslist-config": "npm:^6.16.0" + "@wordpress/dependency-extraction-webpack-plugin": "npm:^6.16.0" + "@wordpress/e2e-test-utils-playwright": "npm:^1.16.0" + "@wordpress/eslint-plugin": "npm:^22.2.0" + "@wordpress/jest-preset-default": "npm:^12.16.0" + "@wordpress/npm-package-json-lint-config": "npm:^5.16.0" + "@wordpress/postcss-plugins-preset": "npm:^5.16.0" + "@wordpress/prettier-config": "npm:^4.16.0" + "@wordpress/stylelint-config": "npm:^23.8.0" + adm-zip: "npm:^0.5.9" + babel-jest: "npm:29.7.0" + babel-loader: "npm:9.2.1" + browserslist: "npm:^4.21.10" + chalk: "npm:^4.0.0" + check-node-version: "npm:^4.1.0" + clean-webpack-plugin: "npm:^3.0.0" + copy-webpack-plugin: "npm:^10.2.0" + cross-spawn: "npm:^7.0.6" + css-loader: "npm:^6.2.0" + cssnano: "npm:^6.0.1" + cwd: "npm:^0.10.0" + dir-glob: "npm:^3.0.1" + eslint: "npm:^8.3.0" + expect-puppeteer: "npm:^4.4.0" + fast-glob: "npm:^3.2.7" + filenamify: "npm:^4.2.0" + jest: "npm:^29.6.2" + jest-dev-server: "npm:^10.1.4" + jest-environment-jsdom: "npm:^29.6.2" + jest-environment-node: "npm:^29.6.2" + json2php: "npm:^0.0.9" + markdownlint-cli: "npm:^0.31.1" + merge-deep: "npm:^3.0.3" + mini-css-extract-plugin: "npm:^2.9.2" + minimist: "npm:^1.2.0" + npm-package-json-lint: "npm:^6.4.0" + npm-packlist: "npm:^3.0.0" + postcss: "npm:^8.4.5" + postcss-loader: "npm:^6.2.1" + prettier: "npm:wp-prettier@3.0.3" + puppeteer-core: "npm:^23.10.1" + react-refresh: "npm:^0.14.0" + read-pkg-up: "npm:^7.0.1" + resolve-bin: "npm:^0.4.0" + rtlcss: "npm:^4.3.0" + sass: "npm:^1.54.0" + sass-loader: "npm:^16.0.3" + schema-utils: "npm:^4.2.0" + source-map-loader: "npm:^3.0.0" + stylelint: "npm:^16.8.2" + terser-webpack-plugin: "npm:^5.3.10" + url-loader: "npm:^4.1.1" + webpack: "npm:^5.97.0" + webpack-bundle-analyzer: "npm:^4.9.1" + webpack-cli: "npm:^5.1.4" + webpack-dev-server: "npm:^4.15.1" + peerDependencies: + "@playwright/test": ^1.49.1 + react: ^18.0.0 + react-dom: ^18.0.0 + bin: + wp-scripts: ./bin/wp-scripts.js + checksum: 10c0/879d0c14721b9078e2810d876573d1f3138c6ea01d6739fe7f844246ae6b8cb09eb27568668f71f86cb9ea02b6bbdcae3048e6ee21cd5d004179e8b20c5fe028 languageName: node linkType: hard -"file-loader@npm:^6.2.0": - version: 6.2.0 - resolution: "file-loader@npm:6.2.0" +"@wordpress/server-side-render@npm:^5.15.1, @wordpress/server-side-render@npm:^5.16.0": + version: 5.16.0 + resolution: "@wordpress/server-side-render@npm:5.16.0" dependencies: - loader-utils: "npm:^2.0.0" - schema-utils: "npm:^3.0.0" + "@babel/runtime": "npm:7.25.7" + "@wordpress/api-fetch": "npm:^7.16.0" + "@wordpress/blocks": "npm:^14.5.0" + "@wordpress/components": "npm:^29.2.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/deprecated": "npm:^4.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/url": "npm:^4.16.0" + fast-deep-equal: "npm:^3.1.3" peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/e176a57c2037ab0f78e5755dbf293a6b7f0f8392350a120bd03cc2ce2525bea017458ba28fea14ca535ff1848055e86d1a3a216bdb2561ef33395b27260a1dd3 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/ef024049d57530c3af3e968c370c3061abbca45b65e7a64e6015e9c8fb0b40c23c5a9ae709a3fb1e282de77e0f824e5b9d4bb869756f02d0fa2bd99fc19c6b1b languageName: node linkType: hard -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" +"@wordpress/shortcode@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/shortcode@npm:4.16.0" dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + "@babel/runtime": "npm:7.25.7" + memize: "npm:^2.0.1" + checksum: 10c0/0dc0ba794d509416c454c51bbb45d6cf48b742e3be19616f17466c925355b949344462a530d8d57122f7c3aeae6321ba5e7edca0ba96b7273d60dcb791723e6f languageName: node linkType: hard -"find-cache-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "find-cache-dir@npm:4.0.0" +"@wordpress/style-engine@npm:^2.16.0": + version: 2.16.0 + resolution: "@wordpress/style-engine@npm:2.16.0" dependencies: - common-path-prefix: "npm:^3.0.0" - pkg-dir: "npm:^7.0.0" - checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff + "@babel/runtime": "npm:7.25.7" + change-case: "npm:^4.1.2" + checksum: 10c0/a36ff8ebef010e036489097476ae69070c34df5c2ed3113e0d4963346c9365e9a9a0ba4c464c8f079b2ef001469d4a6494e471a6abb32404a733d394418d820e languageName: node linkType: hard -"find-root@npm:^1.1.0": - version: 1.1.0 - resolution: "find-root@npm:1.1.0" - checksum: 10c0/1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa +"@wordpress/stylelint-config@npm:^23.8.0": + version: 23.8.0 + resolution: "@wordpress/stylelint-config@npm:23.8.0" + dependencies: + "@stylistic/stylelint-plugin": "npm:^3.0.1" + stylelint-config-recommended: "npm:^14.0.1" + stylelint-config-recommended-scss: "npm:^14.1.0" + peerDependencies: + stylelint: ^16.8.2 + checksum: 10c0/1c313bf44e826d2ee4a0d4ac290c9c1ca63072d74919a9992ee4819837c62a37e8a6853b0ed38a666f92f7462689667162ac3f5c7cefd54a795d546b3af8d566 languageName: node linkType: hard -"find-up@npm:^4.0.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" +"@wordpress/sync@npm:^1.16.0": + version: 1.16.0 + resolution: "@wordpress/sync@npm:1.16.0" dependencies: - locate-path: "npm:^5.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + "@babel/runtime": "npm:7.25.7" + "@types/simple-peer": "npm:^9.11.5" + "@wordpress/url": "npm:^4.16.0" + import-locals: "npm:^2.0.0" + lib0: "npm:^0.2.42" + simple-peer: "npm:^9.11.0" + y-indexeddb: "npm:~9.0.11" + y-protocols: "npm:^1.0.5" + y-webrtc: "npm:~10.2.5" + yjs: "npm:~13.6.6" + checksum: 10c0/d5370d6abe5f91e232b0242a765b35344d695199ff0856a66f99fc45f36d0d0b126b559a68079e3ff36a96263a6dd4198653f82fafee3cfb22c8caef5c91351e languageName: node linkType: hard -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" +"@wordpress/token-list@npm:^3.16.0": + version: 3.16.0 + resolution: "@wordpress/token-list@npm:3.16.0" dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/fff1f339687548f66fb3e803394c54b1e04f319cd0f1c30b39c4a85381256ccac158ee5c793b3078402e12aa9e58bc45b20e8ed408fdf109c65d769808e25d87 languageName: node linkType: hard -"find-up@npm:^6.3.0": - version: 6.3.0 - resolution: "find-up@npm:6.3.0" +"@wordpress/undo-manager@npm:^1.16.0": + version: 1.16.0 + resolution: "@wordpress/undo-manager@npm:1.16.0" dependencies: - locate-path: "npm:^7.1.0" - path-exists: "npm:^5.0.0" - checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + "@babel/runtime": "npm:7.25.7" + "@wordpress/is-shallow-equal": "npm:^5.16.0" + checksum: 10c0/291997d288d370fe42f767a3b1929adfb6e694f39a1e129e5e00f7c652dcf8238c71aa7edb542f2a0eb9b3d4fe3dcdf5f1a96d5e7338666e0b518196392664e4 languageName: node linkType: hard -"fizzy-ui-utils@npm:^2.0.0, fizzy-ui-utils@npm:^2.0.7": - version: 2.0.7 - resolution: "fizzy-ui-utils@npm:2.0.7" +"@wordpress/undo-manager@npm:^1.17.0": + version: 1.17.0 + resolution: "@wordpress/undo-manager@npm:1.17.0" dependencies: - desandro-matches-selector: "npm:^2.0.0" - checksum: 10c0/4c36d45db4e2e0cf1507aa9633af6710a12bdc047146fa89505e10aedc5bfb16cbfb0da686d5dfd89a37e1da4bce86bbee365e22be88705ab4ffccd530b4902a + "@babel/runtime": "npm:7.25.7" + "@wordpress/is-shallow-equal": "npm:^5.17.0" + checksum: 10c0/951d3b2f74ffee26e95770a63af7ba05a995e976293832c77158a5c2fe30322c65a94f57409217b525e3e009c5b0a2f3bbf24445fc6298e6d2a4018d7b2624a3 languageName: node linkType: hard -"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"@wordpress/upload-media@npm:^0.1.0": + version: 0.1.0 + resolution: "@wordpress/upload-media@npm:0.1.0" dependencies: - flatted: "npm:^3.2.9" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + "@shopify/web-worker": "npm:^6.4.0" + "@wordpress/api-fetch": "npm:^7.16.0" + "@wordpress/blob": "npm:^4.16.0" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/element": "npm:^6.16.0" + "@wordpress/i18n": "npm:^5.16.0" + "@wordpress/preferences": "npm:^4.16.0" + "@wordpress/private-apis": "npm:^1.16.0" + "@wordpress/url": "npm:^4.16.0" + uuid: "npm:^9.0.1" + checksum: 10c0/9ad1ea82ca3ffd9253b2a480a2b590466c89e92808d2f7c6b0d0269b6dbb59f64160020cfc55545532b4a9fa278a604a8f333b5f55c6112a97c36940196c0481 languageName: node linkType: hard -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" +"@wordpress/url@npm:^4.15.0, @wordpress/url@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/url@npm:4.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + remove-accents: "npm:^0.5.0" + checksum: 10c0/a8af9d219976e579f584fe575e396bfb16c9005e6a76fa657d583c08c3ffdcd09740f4e04b46b1db696c96dc9ce917937fd7c56a69e335f18e0b8c5d9b394132 + languageName: node + linkType: hard + +"@wordpress/viewport@npm:^6.16.0": + version: 6.16.0 + resolution: "@wordpress/viewport@npm:6.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + "@wordpress/compose": "npm:^7.16.0" + "@wordpress/data": "npm:^10.16.0" + "@wordpress/element": "npm:^6.16.0" + peerDependencies: + react: ^18.0.0 + checksum: 10c0/a909f6942d5788e282f822b56f22fbffec7e1059a3eebd4ed15ca1cd43f34636af03649d683b35f9f0c7392cc34205276c4d5c28b6db61a841f1acfb1fc83bbd + languageName: node + linkType: hard + +"@wordpress/warning@npm:^3.16.0": + version: 3.16.0 + resolution: "@wordpress/warning@npm:3.16.0" + checksum: 10c0/5d9c8b164772f97abbec38c0e2341c6a9634ea4b6258c0bd5fedcc8c912dc920f7f46d8e93640f4a0d6194960247804272683a645c97aef179bbf74303845c77 + languageName: node + linkType: hard + +"@wordpress/warning@npm:^3.17.0": + version: 3.17.0 + resolution: "@wordpress/warning@npm:3.17.0" + checksum: 10c0/a49c5b3f4f1f470ff829baf765f5e5350efd2d9eefac8814b7a08650ce8ea0225bd7d024bbb86d08d9c7f48e1c0b02ab117c9963d67ac8ef5233d817c08a4e8d + languageName: node + linkType: hard + +"@wordpress/wordcount@npm:^4.16.0": + version: 4.16.0 + resolution: "@wordpress/wordcount@npm:4.16.0" + dependencies: + "@babel/runtime": "npm:7.25.7" + checksum: 10c0/8faee359e8eb668965d42e22bdc2f494326e35221e754b28facb068a98d1970663c92d33f8c35c0c05e7452f6aa1db23164117e301c8b4d046509454a5516e7a + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 + languageName: node + linkType: hard + +"abab@npm:^2.0.5, abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 10c0/0b245c3c3ea2598fe0025abf7cc7bb507b06949d51e8edae5d12c1b847a0a0c09639abcb94788332b4e2044ac4491c1e8f571b51c7826fd4b0bda1685ad4a278 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"accepts@npm:~1.3.4, accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 + languageName: node + linkType: hard + +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: "npm:^8.1.0" + acorn-walk: "npm:^8.0.2" + checksum: 10c0/7437f58e92d99292dbebd0e79531af27d706c9f272f31c675d793da6c82d897e75302a8744af13c7f7978a8399840f14a353b60cf21014647f71012982456d2b + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: - flat: cli.js - checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + acorn: bin/acorn + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + +"adm-zip@npm:^0.5.9": + version: 0.5.16 + resolution: "adm-zip@npm:0.5.16" + checksum: 10c0/6f10119d4570c7ba76dcf428abb8d3f69e63f92e51f700a542b43d4c0130373dd2ddfc8f85059f12d4a843703a90c3970cfd17876844b4f3f48bf042bfa6b49f + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + languageName: node + linkType: hard + +"ajv-errors@npm:^1.0.1": + version: 1.0.1 + resolution: "ajv-errors@npm:1.0.1" + peerDependencies: + ajv: ">=5.0.0" + checksum: 10c0/de2d6e8100c8707ea063ee4785d53adf599b457c0d4f72c3592244d67ad16448a6d35f7ce45f12bdd2819939447c876e8ef2f1c0800896d7f2aa25c3838acdf1 + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + ajv: ^8.8.2 + checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.12.6": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: 10c0/ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-html-community@npm:^0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 + languageName: node + linkType: hard + +"ansi-html@npm:^0.0.9": + version: 0.0.9 + resolution: "ansi-html@npm:0.0.9" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/4a5de9802fb50193e32b51a9ea48dc0d7e4436b860cb819d7110c62f2bfb1410288e1a2f9a848269f5eab8f903797a7f0309fe4c552f92a92b61a5b759ed52bd + languageName: node + linkType: hard + +"ansi-regex@npm:^4.1.0": + version: 4.1.1 + resolution: "ansi-regex@npm:4.1.1" + checksum: 10c0/d36d34234d077e8770169d980fed7b2f3724bfa2a01da150ccd75ef9707c80e883d27cdf7a0eac2f145ac1d10a785a8a855cffd05b85f778629a0db62e7033da + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.0": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anymatch@npm:^3.0.0, anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"are-docs-informative@npm:^0.0.2": + version: 0.0.2 + resolution: "are-docs-informative@npm:0.0.2" + checksum: 10c0/f0326981bd699c372d268b526b170a28f2e1aec2cf99d7de0686083528427ecdf6ae41fef5d9988e224a5616298af747ad8a76e7306b0a7c97cc085a99636d60 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"aria-hidden@npm:^1.1.1": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10c0/8abcab2e1432efc4db415e97cb3959649ddf52c8fc815d7384f43f3d3abf56f1c12852575d00df9a8927f421d7e0712652dd5f8db244ea57634344e29ecfc74a + languageName: node + linkType: hard + +"aria-query@npm:^5.3.2": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e + languageName: node + linkType: hard + +"arr-union@npm:^3.1.0": + version: 3.1.0 + resolution: "arr-union@npm:3.1.0" + checksum: 10c0/7d5aa05894e54aa93c77c5726c1dd5d8e8d3afe4f77983c0aa8a14a8a5cbe8b18f0cf4ecaa4ac8c908ef5f744d2cbbdaa83fd6e96724d15fea56cfa7f5efdd51 + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 + languageName: node + linkType: hard + +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + is-string: "npm:^1.0.7" + checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 + languageName: node + linkType: hard + +"array-union@npm:^1.0.1": + version: 1.0.2 + resolution: "array-union@npm:1.0.2" + dependencies: + array-uniq: "npm:^1.0.1" + checksum: 10c0/18686767c0cfdae8dc4acf5ac119b0f0eacad82b7fcc0aa62cc41f93c5ad406d494b6a6e53d85e52e8f0349b67a4fec815feeb537e95c02510d747bc9a4157c7 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + languageName: node + linkType: hard + +"array-union@npm:^3.0.1": + version: 3.0.1 + resolution: "array-union@npm:3.0.1" + checksum: 10c0/b5271d7e5688d2d1932928b271796dbbddc422448557ab05ef6f34a9f84fb645eb855384feec6234bf59c226053a0e21b8a00b0e6cd588874b90a5c13dbeb64e + languageName: node + linkType: hard + +"array-uniq@npm:^1.0.1": + version: 1.0.3 + resolution: "array-uniq@npm:1.0.3" + checksum: 10c0/3acbaf9e6d5faeb1010e2db04ab171b8d265889e46c61762e502979bdc5e55656013726e9a61507de3c82d329a0dc1e8072630a3454b4f2b881cb19ba7fd8aa6 + languageName: node + linkType: hard + +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775 + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlastindex@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/962189487728b034f3134802b421b5f39e42ee2356d13b42d2ddb0e52057ffdcc170b9524867f4f0611a6f638f4c19b31e14606e8bcbda67799e26685b195aa3 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 10c0/c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab + languageName: node + linkType: hard + +"ast-types-flow@npm:^0.0.8": + version: 0.0.8 + resolution: "ast-types-flow@npm:0.0.8" + checksum: 10c0/f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e + languageName: node + linkType: hard + +"ast-types@npm:^0.13.4": + version: 0.13.4 + resolution: "ast-types@npm:0.13.4" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/3a1a409764faa1471601a0ad01b3aa699292991aa9c8a30c7717002cabdf5d98008e7b53ae61f6e058f757fc6ba965e147967a93c13e62692c907d79cfb245f8 + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"autoprefixer@npm:^10.4.20": + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" + dependencies: + browserslist: "npm:^4.23.3" + caniuse-lite: "npm:^1.0.30001646" + fraction.js: "npm:^4.3.7" + normalize-range: "npm:^0.1.2" + picocolors: "npm:^1.0.1" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.1.0 + bin: + autoprefixer: bin/autoprefixer + checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940 + languageName: node + linkType: hard + +"autosize@npm:^4.0.2": + version: 4.0.4 + resolution: "autosize@npm:4.0.4" + checksum: 10c0/3397348ff385702a4eca49b65b45e27c6e1881414e4eddc9ceaa6dbcda9dda24b5c01d021d2888ea745ebcc6353395dc5f5735ad5e76f076c864dd95e2ffb71d + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"axe-core@npm:^4.10.0, axe-core@npm:^4.10.2": + version: 4.10.2 + resolution: "axe-core@npm:4.10.2" + checksum: 10c0/0e20169077de96946a547fce0df39d9aeebe0077f9d3eeff4896518b96fde857f80b98f0d4279274a7178791744dd5a54bb4f322de45b4f561ffa2586ff9a09d + languageName: node + linkType: hard + +"axios@npm:^1.7.9": + version: 1.7.9 + resolution: "axios@npm:1.7.9" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/b7a41e24b59fee5f0f26c1fc844b45b17442832eb3a0fb42dd4f1430eb4abc571fe168e67913e8a1d91c993232bd1d1ab03e20e4d1fee8c6147649b576fc1b0b + languageName: node + linkType: hard + +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 + languageName: node + linkType: hard + +"b4a@npm:^1.6.4": + version: 1.6.7 + resolution: "b4a@npm:1.6.7" + checksum: 10c0/ec2f004d1daae04be8c5a1f8aeb7fea213c34025e279db4958eb0b82c1729ee25f7c6e89f92a5f65c8a9cf2d017ce27e3dda912403341d1781bd74528a4849d4 + languageName: node + linkType: hard + +"babel-jest@npm:29.7.0, babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 + languageName: node + linkType: hard + +"babel-loader@npm:9.2.1": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" + dependencies: + find-cache-dir: "npm:^4.0.0" + schema-utils: "npm:^4.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: 10c0/efb82faff4c7c27e9c15bb28bf11c73200e61cf365118a9514e8d74dd489d0afc2a0d5aaa62cb4254eefc2ab631579224d95a03fd245410f28ea75e24de54ba4 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e + languageName: node + linkType: hard + +"babel-plugin-macros@npm:^3.1.0": + version: 3.1.0 + resolution: "babel-plugin-macros@npm:3.1.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + cosmiconfig: "npm:^7.0.0" + resolve: "npm:^1.19.0" + checksum: 10c0/c6dfb15de96f67871d95bd2e8c58b0c81edc08b9b087dc16755e7157f357dc1090a8dc60ebab955e92587a9101f02eba07e730adc253a1e4cf593ca3ebd3839c + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.12 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.12" + dependencies: + "@babel/compat-data": "npm:^7.22.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/49150c310de2d472ecb95bd892bca1aa833cf5e84bbb76e3e95cf9ff2c6c8c3b3783dd19d70ba50ff6235eb8ce1fa1c0affe491273c95a1ef6a2923f4d5a3819 + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs3@npm:^0.10.6": + version: 0.10.6 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + core-js-compat: "npm:^3.38.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/3a69220471b07722c2ae6537310bf26b772514e12b601398082965459c838be70a0ca70b0662f0737070654ff6207673391221d48599abb4a2b27765206d9f79 + languageName: node + linkType: hard + +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.3 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.3" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/40164432e058e4b5c6d56feecacdad22692ae0534bd80c92d5399ed9e1a6a2b6797c8fda837995daddd4ca391f9aa2d58c74ad465164922e0f73631eaf9c4f76 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"balanced-match@npm:^2.0.0": + version: 2.0.0 + resolution: "balanced-match@npm:2.0.0" + checksum: 10c0/60a54e0b75a61674e16a7a336b805f06c72d6f8fc457639c24efc512ba2bf9cb5744b9f6f5225afcefb99da39714440c83c737208cc65c5d9ecd1f3093331ca3 + languageName: node + linkType: hard + +"bare-events@npm:^2.0.0, bare-events@npm:^2.2.0": + version: 2.5.4 + resolution: "bare-events@npm:2.5.4" + checksum: 10c0/877a9cea73d545e2588cdbd6fd01653e27dac48ad6b44985cdbae73e1f57f292d4ba52e25d1fba53674c1053c463d159f3d5c7bc36a2e6e192e389b499ddd627 + languageName: node + linkType: hard + +"bare-fs@npm:^4.0.1": + version: 4.0.1 + resolution: "bare-fs@npm:4.0.1" + dependencies: + bare-events: "npm:^2.0.0" + bare-path: "npm:^3.0.0" + bare-stream: "npm:^2.0.0" + checksum: 10c0/db2f4e2646faa011e322cbdc4615fe0cac865a03c2f76d7c686eccf96b0b5eea2bc71dfa37e8cfb14f4f61f8cd3ca95ff7b745d37c55fca319e40ec351d4ae0c + languageName: node + linkType: hard + +"bare-os@npm:^3.0.1": + version: 3.4.0 + resolution: "bare-os@npm:3.4.0" + checksum: 10c0/2d1a4467ef8aff0a13d738e549aac30bbecf7631721f7099de78d6f8fc0ced9334ab391e489de28d69809f788f64081ac25108303a9a9e122f9bf87a8d589025 + languageName: node + linkType: hard + +"bare-path@npm:^3.0.0": + version: 3.0.0 + resolution: "bare-path@npm:3.0.0" + dependencies: + bare-os: "npm:^3.0.1" + checksum: 10c0/56a3ca82a9f808f4976cb1188640ac206546ce0ddff582afafc7bd2a6a5b31c3bd16422653aec656eeada2830cfbaa433c6cbf6d6b4d9eba033d5e06d60d9a68 + languageName: node + linkType: hard + +"bare-stream@npm:^2.0.0": + version: 2.6.4 + resolution: "bare-stream@npm:2.6.4" + dependencies: + streamx: "npm:^2.21.0" + peerDependencies: + bare-buffer: "*" + bare-events: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + checksum: 10c0/91fcc50e0d75514c5d7896e4b753c477130fdc5b8a58443bfd2fa5267490eff5667ce70ef6da1d72217b8b44e337a0ffdb98b28a8007167223e5930ac87a5833 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"basic-ftp@npm:^5.0.2": + version: 5.0.5 + resolution: "basic-ftp@npm:5.0.5" + checksum: 10c0/be983a3997749856da87b839ffce6b8ed6c7dbf91ea991d5c980d8add275f9f2926c19f80217ac3e7f353815be879371d636407ca72b038cea8cab30e53928a6 + languageName: node + linkType: hard + +"batch@npm:0.6.1": + version: 0.6.1 + resolution: "batch@npm:0.6.1" + checksum: 10c0/925a13897b4db80d4211082fe287bcf96d297af38e26448c857cee3e095c9792e3b8f26b37d268812e7f38a589f694609de8534a018b1937d7dc9f84e6b387c5 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + +"bonjour-service@npm:^1.0.11": + version: 1.3.0 + resolution: "bonjour-service@npm:1.3.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + multicast-dns: "npm:^7.2.5" + checksum: 10c0/5721fd9f9bb968e9cc16c1e8116d770863dd2329cb1f753231de1515870648c225142b7eefa71f14a5c22bc7b37ddd7fdeb018700f28a8c936d50d4162d433c7 + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.23.0, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.3": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" + dependencies: + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" + bin: + browserslist: cli.js + checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 + languageName: node + linkType: hard + +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"buffer@npm:^5.2.1": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + +"bytes@npm:3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + languageName: node + linkType: hard + +"cacheable@npm:^1.8.7": + version: 1.8.7 + resolution: "cacheable@npm:1.8.7" + dependencies: + hookified: "npm:^1.6.0" + keyv: "npm:^5.2.3" + checksum: 10c0/3403c2afe9f8bb804b2371e2aa45f10c1f817945ce20b3da2338d2f0b099c9a9d28e59939592e832ba0e6b1d932f8555cc0a0d815ca7bd68a086e1ad131ae40a + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": + version: 1.0.1 + resolution: "call-bind-apply-helpers@npm:1.0.1" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/acb2ab68bf2718e68a3e895f0d0b73ccc9e45b9b6f210f163512ba76f91dab409eb8792f6dae188356f9095747512a3101646b3dea9d37fb8c7c6bf37796d18c + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.2" + checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": + version: 1.0.3 + resolution: "call-bound@npm:1.0.3" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/45257b8e7621067304b30dbd638e856cac913d31e8e00a80d6cf172911acd057846572d0b256b45e652d515db6601e2974a1b1a040e91b4fc36fb3dd86fa69cf + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a + languageName: node + linkType: hard + +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" + dependencies: + camelcase: "npm:^5.3.1" + map-obj: "npm:^4.0.0" + quick-lru: "npm:^4.0.1" + checksum: 10c0/bf1a28348c0f285c6c6f68fb98a9d088d3c0269fed0cdff3ea680d5a42df8a067b4de374e7a33e619eb9d5266a448fe66c2dd1f8e0c9209ebc348632882a3526 + languageName: node + linkType: hard + +"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"caniuse-api@npm:^3.0.0": + version: 3.0.0 + resolution: "caniuse-api@npm:3.0.0" + dependencies: + browserslist: "npm:^4.0.0" + caniuse-lite: "npm:^1.0.0" + lodash.memoize: "npm:^4.1.2" + lodash.uniq: "npm:^4.5.0" + checksum: 10c0/60f9e85a3331e6d761b1b03eec71ca38ef7d74146bece34694853033292156b815696573ed734b65583acf493e88163618eda915c6c826d46a024c71a9572b4c + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001745 + resolution: "caniuse-lite@npm:1.0.30001745" + checksum: 10c0/646ca4b57baaa7a835cf7204c8a257490ee8e36364c04638212e3750c5e8ef45c39f352307e6205114487bcc179d42f5216f6dac146641b16a60b20b29d6f2a6 + languageName: node + linkType: hard + +"capital-case@npm:^1.0.4": + version: 1.0.4 + resolution: "capital-case@npm:1.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case-first: "npm:^2.0.2" + checksum: 10c0/6a034af73401f6e55d91ea35c190bbf8bda21714d4ea8bb8f1799311d123410a80f0875db4e3236dc3f97d74231ff4bf1c8783f2be13d7733c7d990c57387281 + languageName: node + linkType: hard + +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2, chalk@npm:~4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"change-case@npm:4.1.2, change-case@npm:^4.1.2": + version: 4.1.2 + resolution: "change-case@npm:4.1.2" + dependencies: + camel-case: "npm:^4.1.2" + capital-case: "npm:^1.0.4" + constant-case: "npm:^3.0.4" + dot-case: "npm:^3.0.4" + header-case: "npm:^2.0.4" + no-case: "npm:^3.0.4" + param-case: "npm:^3.0.4" + pascal-case: "npm:^3.1.2" + path-case: "npm:^3.0.4" + sentence-case: "npm:^3.0.4" + snake-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/95a6e48563cd393241ce18470c7310a8a050304a64b63addac487560ab039ce42b099673d1d293cc10652324d92060de11b5d918179fe3b5af2ee521fb03ca58 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"check-node-version@npm:^4.1.0": + version: 4.2.1 + resolution: "check-node-version@npm:4.2.1" + dependencies: + chalk: "npm:^3.0.0" + map-values: "npm:^1.0.1" + minimist: "npm:^1.2.0" + object-filter: "npm:^1.0.2" + run-parallel: "npm:^1.1.4" + semver: "npm:^6.3.0" + bin: + check-node-version: bin.js + checksum: 10c0/7778e04d240710c64d952181d45c1efe21c2a032da529d8eafced5811652137bd24d53b0a850fac27cb75de8041f40fa268df66e8f57fbeeff82813215eefab7 + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 + languageName: node + linkType: hard + +"chokidar@npm:^4.0.0": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"chrome-launcher@npm:^1.1.2": + version: 1.1.2 + resolution: "chrome-launcher@npm:1.1.2" + dependencies: + "@types/node": "npm:*" + escape-string-regexp: "npm:^4.0.0" + is-wsl: "npm:^2.2.0" + lighthouse-logger: "npm:^2.0.1" + bin: + print-chrome-path: bin/print-chrome-path.js + checksum: 10c0/518a6cb846b7187a692c510cc9d3f4d2a87ad3e21cec5eaefb3dcb7ce72ac6ab8b5465cb90510480b9f0b077c8fc340f57e2e078e1d7719aff576595800470b2 + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.4 + resolution: "chrome-trace-event@npm:1.0.4" + checksum: 10c0/3058da7a5f4934b87cf6a90ef5fb68ebc5f7d06f143ed5a4650208e5d7acae47bc03ec844b29fbf5ba7e46e8daa6acecc878f7983a4f4bb7271593da91e61ff5 + languageName: node + linkType: hard + +"chromium-bidi@npm:0.11.0": + version: 0.11.0 + resolution: "chromium-bidi@npm:0.11.0" + dependencies: + mitt: "npm:3.0.1" + zod: "npm:3.23.8" + peerDependencies: + devtools-protocol: "*" + checksum: 10c0/7155b1b78bc07371cc750f5a431fb7120fb96e412d24895e5107efe21056a2406f4d051c26be89d2a7355258d6322d203e6d1c4e82f4b30f9b02923de50ba6c9 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10c0/5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc + languageName: node + linkType: hard + +"classnames@npm:^2.5.1": + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: 10c0/afff4f77e62cea2d79c39962980bf316bacb0d7c49e13a21adaadb9221e1c6b9d3cdb829d8bb1b23c406f4e740507f37e1dcf506f7e3b7113d17c5bab787aa69 + languageName: node + linkType: hard + +"clean-webpack-plugin@npm:^3.0.0": + version: 3.0.0 + resolution: "clean-webpack-plugin@npm:3.0.0" + dependencies: + "@types/webpack": "npm:^4.4.31" + del: "npm:^4.1.1" + peerDependencies: + webpack: "*" + checksum: 10c0/780c87d3730544c56c779f5e422eee3c438446e3120724f5c4d1aab88dca5eedd7a1890c49785c19b048e77c519cf21a17f9c8550a97514ef88fed1d02dbe243 + languageName: node + linkType: hard + +"client-zip@npm:^2.4.5": + version: 2.4.6 + resolution: "client-zip@npm:2.4.6" + checksum: 10c0/8078b467e1aa15e93f1a863f7daf542f4f589921edf61c9d1fcd56e248c1731e3188da8b3eecbfeeef8e9b43505bdc93e4a2e5359b9372442017c5292236a42f + languageName: node + linkType: hard + +"clipboard@npm:^2.0.11": + version: 2.0.11 + resolution: "clipboard@npm:2.0.11" + dependencies: + good-listener: "npm:^1.2.2" + select: "npm:^1.1.2" + tiny-emitter: "npm:^2.0.0" + checksum: 10c0/23bdf16b875bd2dd101eeefae3c25a2fbd990b613fad3d227ca6719d1b81a3c6f69701b494393fdecd07d98380024f82d045f464124dbbafbcf0557f2921978f + languageName: node + linkType: hard + +"cliui@npm:^5.0.0": + version: 5.0.0 + resolution: "cliui@npm:5.0.0" + dependencies: + string-width: "npm:^3.1.0" + strip-ansi: "npm:^5.2.0" + wrap-ansi: "npm:^5.1.0" + checksum: 10c0/76142bf306965850a71efd10c9755bd7f447c7c20dd652e1c1ce27d987f862a3facb3cceb2909cef6f0cb363646ee7a1735e3dfdd49f29ed16d733d33e15e2f8 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"clone-deep@npm:^0.2.4": + version: 0.2.4 + resolution: "clone-deep@npm:0.2.4" + dependencies: + for-own: "npm:^0.1.3" + is-plain-object: "npm:^2.0.1" + kind-of: "npm:^3.0.2" + lazy-cache: "npm:^1.0.3" + shallow-clone: "npm:^0.1.2" + checksum: 10c0/ff52206b825fdad27c1c78dc77a8e23739117402212f224b9ad34b722b694adb171cf201895d76be080544460e7e63e66fd0b62689efd6cb009a50bb679ac3fa + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + kind-of: "npm:^6.0.2" + shallow-clone: "npm:^3.0.0" + checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 + languageName: node + linkType: hard + +"clsx@npm:2.1.1, clsx@npm:^2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 + languageName: node + linkType: hard + +"cmdk@npm:^1.0.0": + version: 1.0.4 + resolution: "cmdk@npm:1.0.4" + dependencies: + "@radix-ui/react-dialog": "npm:^1.1.2" + "@radix-ui/react-id": "npm:^1.1.0" + "@radix-ui/react-primitive": "npm:^2.0.0" + use-sync-external-store: "npm:^1.2.2" + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + checksum: 10c0/8c37568c9b52cb44a7b8f1414d622100cea0368f564167f4a1bc5c97ba3ba2b392ab4871f691c60a9a414a7295fb702c2f941e6556d6861a48657bb4e82fd979 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"colord@npm:^2.7.0, colord@npm:^2.9.3": + version: 2.9.3 + resolution: "colord@npm:2.9.3" + checksum: 10c0/9699e956894d8996b28c686afe8988720785f476f59335c80ce852ded76ab3ebe252703aec53d9bef54f6219aea6b960fb3d9a8300058a1d0c0d4026460cd110 + languageName: node + linkType: hard + +"colorette@npm:^2.0.10, colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:^10.0.1": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 + languageName: node + linkType: hard + +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a + languageName: node + linkType: hard + +"commander@npm:~9.0.0": + version: 9.0.0 + resolution: "commander@npm:9.0.0" + checksum: 10c0/527e1aa27be7db7e8f543e9f6c7a8cd8e82290dd2319eef65537b4e49efa7b53c503fc3353aea89686b220dde78892d3ba855e663a4e15b771d5f2241660e9f0 + languageName: node + linkType: hard + +"comment-parser@npm:1.4.1": + version: 1.4.1 + resolution: "comment-parser@npm:1.4.1" + checksum: 10c0/d6c4be3f5be058f98b24f2d557f745d8fe1cc9eb75bebbdccabd404a0e1ed41563171b16285f593011f8b6a5ec81f564fb1f2121418ac5cbf0f49255bf0840dd + languageName: node + linkType: hard + +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + +"compressible@npm:~2.0.18": + version: 2.0.18 + resolution: "compressible@npm:2.0.18" + dependencies: + mime-db: "npm:>= 1.43.0 < 2" + checksum: 10c0/8a03712bc9f5b9fe530cc5a79e164e665550d5171a64575d7dcf3e0395d7b4afa2d79ab176c61b5b596e28228b350dd07c1a2a6ead12fd81d1b6cd632af2fef7 + languageName: node + linkType: hard + +"compression@npm:^1.7.4": + version: 1.7.5 + resolution: "compression@npm:1.7.5" + dependencies: + bytes: "npm:3.1.2" + compressible: "npm:~2.0.18" + debug: "npm:2.6.9" + negotiator: "npm:~0.6.4" + on-headers: "npm:~1.0.2" + safe-buffer: "npm:5.2.1" + vary: "npm:~1.1.2" + checksum: 10c0/35c9d2d57c86d8107eab5e637f2146fcefec8475a2ff3e162f5eb0982ff856d385fb5d8c9823c3d50e075f2d9304bc622dac3df27bfef0355309c0a5307861c5 + languageName: node + linkType: hard + +"computed-style@npm:~0.1.3": + version: 0.1.4 + resolution: "computed-style@npm:0.1.4" + checksum: 10c0/d7cb13bae10f8453d873953db5d8382b5e1a13f263d333b4bddd0398461adf2cfeee480757fc5702ddb0fbb8855adea1280922749c6e6c2ea16dc59543231dc9 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"configstore@npm:^5.0.1": + version: 5.0.1 + resolution: "configstore@npm:5.0.1" + dependencies: + dot-prop: "npm:^5.2.0" + graceful-fs: "npm:^4.1.2" + make-dir: "npm:^3.0.0" + unique-string: "npm:^2.0.0" + write-file-atomic: "npm:^3.0.0" + xdg-basedir: "npm:^4.0.0" + checksum: 10c0/5af23830e78bdc56cbe92a2f81e87f1d3a39e96e51a0ab2a8bc79bbbc5d4440a48d92833b3fd9c6d34b4a9c4c5853c8487b8e6e68593e7ecbc7434822f7aced3 + languageName: node + linkType: hard + +"confusing-browser-globals@npm:^1.0.10": + version: 1.0.11 + resolution: "confusing-browser-globals@npm:1.0.11" + checksum: 10c0/475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e + languageName: node + linkType: hard + +"connect-history-api-fallback@npm:^2.0.0": + version: 2.0.0 + resolution: "connect-history-api-fallback@npm:2.0.0" + checksum: 10c0/90fa8b16ab76e9531646cc70b010b1dbd078153730c510d3142f6cf07479ae8a812c5a3c0e40a28528dd1681a62395d0cfdef67da9e914c4772ac85d69a3ed87 + languageName: node + linkType: hard + +"constant-case@npm:^3.0.4": + version: 3.0.4 + resolution: "constant-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case: "npm:^2.0.2" + checksum: 10c0/91d54f18341fcc491ae66d1086642b0cc564be3e08984d7b7042f8b0a721c8115922f7f11d6a09f13ed96ff326eabae11f9d1eb0335fa9d8b6e39e4df096010e + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb + languageName: node + linkType: hard + +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + +"convert-source-map@npm:^1.5.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 + languageName: node + linkType: hard + +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 10c0/5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde + languageName: node + linkType: hard + +"copy-webpack-plugin@npm:^10.2.0": + version: 10.2.4 + resolution: "copy-webpack-plugin@npm:10.2.4" + dependencies: + fast-glob: "npm:^3.2.7" + glob-parent: "npm:^6.0.1" + globby: "npm:^12.0.2" + normalize-path: "npm:^3.0.0" + schema-utils: "npm:^4.0.0" + serialize-javascript: "npm:^6.0.0" + peerDependencies: + webpack: ^5.1.0 + checksum: 10c0/d4501aa2d813eadc906318ed301707240fc7bfeb250813e2e4d93e95bc9896822c136e49de01dfe612ea5334a1f04cb8fbed4412b91117666a92607c0deba624 + languageName: node + linkType: hard + +"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": + version: 3.40.0 + resolution: "core-js-compat@npm:3.40.0" + dependencies: + browserslist: "npm:^4.24.3" + checksum: 10c0/44f6e88726fe266a5be9581a79766800478a8d5c492885f2d4c2a4e2babd9b06bc1689d5340d3a61ae7332f990aff2e83b6203ff8773137a627cfedfbeefabeb + languageName: node + linkType: hard + +"core-js-pure@npm:^3.23.3": + version: 3.40.0 + resolution: "core-js-pure@npm:3.40.0" + checksum: 10c0/97590017216e2614e44bacc0b73159061b58e3ac86b61a3ed8cd78fc12bef604c5fb559a7a4d51ae5f2d1bd23ec57760ba6bf2802e802beb42d6bbce136acf52 + languageName: node + linkType: hard + +"core-js@npm:^3.31.0, core-js@npm:^3.40.0": + version: 3.40.0 + resolution: "core-js@npm:3.40.0" + checksum: 10c0/db7946ada881e845d8b157061945b1187618fa45cf162f392a151e8a497962aed2da688c982eaa1d444c864be97a70f8be4d73385294b515d224dd164d19f1d4 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"cosmiconfig@npm:^7.0.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.0.0, cosmiconfig@npm:^8.1.3": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + path-type: "npm:^4.0.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a + languageName: node + linkType: hard + +"cosmiconfig@npm:^9.0.0": + version: 9.0.0 + resolution: "cosmiconfig@npm:9.0.0" + dependencies: + env-paths: "npm:^2.2.1" + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/1c1703be4f02a250b1d6ca3267e408ce16abfe8364193891afc94c2d5c060b69611fdc8d97af74b7e6d5d1aac0ab2fb94d6b079573146bc2d756c2484ce5f0ee + languageName: node + linkType: hard + +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"crypto-random-string@npm:^2.0.0": + version: 2.0.0 + resolution: "crypto-random-string@npm:2.0.0" + checksum: 10c0/288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 + languageName: node + linkType: hard + +"csp_evaluator@npm:1.1.1": + version: 1.1.1 + resolution: "csp_evaluator@npm:1.1.1" + checksum: 10c0/cc8abae2071af80a5148d04cf332a7af89ce1564e5da224b4badf5bfff46aeafd3b7a09ba87aae8517a29084de24586bf9cb5b8f580c68b1e41d7792e021416f + languageName: node + linkType: hard + +"css-box-model@npm:^1.2.1": + version: 1.2.1 + resolution: "css-box-model@npm:1.2.1" + dependencies: + tiny-invariant: "npm:^1.0.6" + checksum: 10c0/611e56d76b16e4e21956ed9fa53f1936fbbfaccd378659587e9c929f342037fc6c062f8af9447226e11fe7c95e31e6c007a37e592f9bff4c2d40e6915553104a + languageName: node + linkType: hard + +"css-declaration-sorter@npm:^7.2.0": + version: 7.2.0 + resolution: "css-declaration-sorter@npm:7.2.0" + peerDependencies: + postcss: ^8.0.9 + checksum: 10c0/d8516be94f8f2daa233ef021688b965c08161624cbf830a4d7ee1099429437c0ee124d35c91b1c659cfd891a68e8888aa941726dab12279bc114aaed60a94606 + languageName: node + linkType: hard + +"css-functions-list@npm:^3.2.3": + version: 3.2.3 + resolution: "css-functions-list@npm:3.2.3" + checksum: 10c0/03f9ed34eeed310d2b1cf0e524eea02bc5f87854a4de85f8957ea432ab1036841a3fb00879590519f7bb8fda40d992ce7a72fa9b61696ca1dc53b90064858f96 + languageName: node + linkType: hard + +"css-loader@npm:^6.2.0": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" + dependencies: + icss-utils: "npm:^5.1.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" + postcss-modules-values: "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/bb52434138085fed06a33e2ffbdae9ee9014ad23bf60f59d6b7ee67f28f26c6b1764024d3030bd19fd884d6ee6ee2224eaed64ad19eb18fbbb23d148d353a965 + languageName: node + linkType: hard + +"css-select@npm:^5.1.0": + version: 5.1.0 + resolution: "css-select@npm:5.1.0" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.1.0" + domhandler: "npm:^5.0.2" + domutils: "npm:^3.0.1" + nth-check: "npm:^2.0.1" + checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 + languageName: node + linkType: hard + +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: "npm:2.0.30" + source-map-js: "npm:^1.0.1" + checksum: 10c0/6f8c1a11d5e9b14bf02d10717fc0351b66ba12594166f65abfbd8eb8b5b490dd367f5c7721db241a3c792d935fc6751fbc09f7e1598d421477ad9fadc30f4f24 + languageName: node + linkType: hard + +"css-tree@npm:^3.0.1, css-tree@npm:^3.1.0": + version: 3.1.0 + resolution: "css-tree@npm:3.1.0" + dependencies: + mdn-data: "npm:2.12.2" + source-map-js: "npm:^1.0.1" + checksum: 10c0/b5715852c2f397c715ca00d56ec53fc83ea596295ae112eb1ba6a1bda3b31086380e596b1d8c4b980fe6da09e7d0fc99c64d5bb7313030dd0fba9c1415f30979 + languageName: node + linkType: hard + +"css-tree@npm:~2.2.0": + version: 2.2.1 + resolution: "css-tree@npm:2.2.1" + dependencies: + mdn-data: "npm:2.0.28" + source-map-js: "npm:^1.0.1" + checksum: 10c0/47e87b0f02f8ac22f57eceb65c58011dd142d2158128882a0bf963cf2eabb81a4ebbc2e3790c8289be7919fa8b83750c7b69272bd66772c708143b772ba3c186 + languageName: node + linkType: hard + +"css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + +"cssnano-preset-default@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-default@npm:6.1.2" + dependencies: + browserslist: "npm:^4.23.0" + css-declaration-sorter: "npm:^7.2.0" + cssnano-utils: "npm:^4.0.2" + postcss-calc: "npm:^9.0.1" + postcss-colormin: "npm:^6.1.0" + postcss-convert-values: "npm:^6.1.0" + postcss-discard-comments: "npm:^6.0.2" + postcss-discard-duplicates: "npm:^6.0.3" + postcss-discard-empty: "npm:^6.0.3" + postcss-discard-overridden: "npm:^6.0.2" + postcss-merge-longhand: "npm:^6.0.5" + postcss-merge-rules: "npm:^6.1.1" + postcss-minify-font-values: "npm:^6.1.0" + postcss-minify-gradients: "npm:^6.0.3" + postcss-minify-params: "npm:^6.1.0" + postcss-minify-selectors: "npm:^6.0.4" + postcss-normalize-charset: "npm:^6.0.2" + postcss-normalize-display-values: "npm:^6.0.2" + postcss-normalize-positions: "npm:^6.0.2" + postcss-normalize-repeat-style: "npm:^6.0.2" + postcss-normalize-string: "npm:^6.0.2" + postcss-normalize-timing-functions: "npm:^6.0.2" + postcss-normalize-unicode: "npm:^6.1.0" + postcss-normalize-url: "npm:^6.0.2" + postcss-normalize-whitespace: "npm:^6.0.2" + postcss-ordered-values: "npm:^6.0.2" + postcss-reduce-initial: "npm:^6.1.0" + postcss-reduce-transforms: "npm:^6.0.2" + postcss-svgo: "npm:^6.0.3" + postcss-unique-selectors: "npm:^6.0.4" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/af99021f936763850f5f35dc9e6a9dfb0da30856dea36e0420b011da2a447099471db2a5f3d1f5f52c0489da186caf9a439d8f048a80f82617077efb018333fa + languageName: node + linkType: hard + +"cssnano-utils@npm:^4.0.2": + version: 4.0.2 + resolution: "cssnano-utils@npm:4.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/260b8c8ffa48b908aa77ef129f9b8648ecd92aed405b20e7fe6b8370779dd603530344fc9d96683d53533246e48b36ac9d2aa5a476b4f81c547bbad86d187f35 + languageName: node + linkType: hard + +"cssnano@npm:^6.0.1": + version: 6.1.2 + resolution: "cssnano@npm:6.1.2" + dependencies: + cssnano-preset-default: "npm:^6.1.2" + lilconfig: "npm:^3.1.1" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/4df0dc0389b34b38acb09b7cfb07267b0eda95349c6d5e9b7666acc7200bb33359650869a60168e9d878298b05f4ad2c7f070815c90551720a3f4e1037f79691 + languageName: node + linkType: hard + +"csso@npm:^5.0.5": + version: 5.0.5 + resolution: "csso@npm:5.0.5" + dependencies: + css-tree: "npm:~2.2.0" + checksum: 10c0/ab4beb1e97dd7e207c10e9925405b45f15a6cd1b4880a8686ad573aa6d476aed28b4121a666cffd26c37a26179f7b54741f7c257543003bfb244d06a62ad569b + languageName: node + linkType: hard + +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 10c0/8c4121c243baf0678c65dcac29b201ff0067dfecf978de9d5c83b2ff127a8fdefd2bfd54577f5ad8c80ed7d2c8b489ae01c82023545d010c4ecb87683fb403dd + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 10c0/d74017b209440822f9e24d8782d6d2e808a8fdd58fa626a783337222fe1c87a518ba944d4c88499031b4786e68772c99dfae616638d71906fe9f203aeaf14411 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: "npm:~0.3.6" + checksum: 10c0/863400da2a458f73272b9a55ba7ff05de40d850f22eb4f37311abebd7eff801cf1cd2fb04c4c92b8c3daed83fe766e52e4112afb7bc88d86c63a9c2256a7d178 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + languageName: node + linkType: hard + +"cwd@npm:^0.10.0": + version: 0.10.0 + resolution: "cwd@npm:0.10.0" + dependencies: + find-pkg: "npm:^0.1.2" + fs-exists-sync: "npm:^0.1.0" + checksum: 10c0/d900a87e31016d4b0c98b33fdc22c89a7534223bfcf2834c27e2a31e9a0d72ed390ff696a03eaca5a5b4b3ffcbf2ade9dfe1ba12ec86e375848a94a1a2a5396a + languageName: node + linkType: hard + +"damerau-levenshtein@npm:^1.0.8": + version: 1.0.8 + resolution: "damerau-levenshtein@npm:1.0.8" + checksum: 10c0/4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 + languageName: node + linkType: hard + +"data-uri-to-buffer@npm:^6.0.2": + version: 6.0.2 + resolution: "data-uri-to-buffer@npm:6.0.2" + checksum: 10c0/f76922bf895b3d7d443059ff278c9cc5efc89d70b8b80cd9de0aa79b3adc6d7a17948eefb8692e30398c43635f70ece1673d6085cc9eba2878dbc6c6da5292ac + languageName: node + linkType: hard + +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: "npm:^2.0.6" + whatwg-mimetype: "npm:^3.0.0" + whatwg-url: "npm:^11.0.0" + checksum: 10c0/051c3aaaf3e961904f136aab095fcf6dff4db23a7fc759dd8ba7b3e6ba03fc07ef608086caad8ab910d864bd3b5e57d0d2f544725653d77c96a2c971567045f4 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 + languageName: node + linkType: hard + +"date-fns@npm:^3.6.0": + version: 3.6.0 + resolution: "date-fns@npm:3.6.0" + checksum: 10c0/0b5fb981590ef2f8e5a3ba6cd6d77faece0ea7f7158948f2eaae7bbb7c80a8f63ae30b01236c2923cf89bb3719c33aeb150c715ea4fe4e86e37dcf06bed42fb6 + languageName: node + linkType: hard + +"debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 10c0/6c9320aa0973fc42050814621a7a8a78146c1975799b5b3cc1becf1f77ba9a5aa583987884230da0842a03f385def452fad5d60db97c3d1c8b824e38a8edf500 + languageName: node + linkType: hard + +"debug@npm:2.6.9, debug@npm:^2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: "npm:^1.1.0" + map-obj: "npm:^1.0.0" + checksum: 10c0/4ca385933127437658338c65fb9aead5f21b28d3dd3ccd7956eb29aab0953b5d3c047fbc207111672220c71ecf7a4d34f36c92851b7bbde6fca1a02c541bdd7d + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 + languageName: node + linkType: hard + +"decimal.js@npm:10, decimal.js@npm:^10.4.2": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 10c0/6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10c0/d94bde6e6f780be4da4fd760288fcf755ec368872f4ac5218197200d86430aeb8d90a003a840bff1c20221188e3f23adced0119cb811c6873c70d0ac66d12832 + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.0, deepmerge@npm:^4.3.1": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"default-gateway@npm:^6.0.3": + version: 6.0.3 + resolution: "default-gateway@npm:6.0.3" + dependencies: + execa: "npm:^5.0.0" + checksum: 10c0/5184f9e6e105d24fb44ade9e8741efa54bb75e84625c1ea78c4ef8b81dff09ca52d6dbdd1185cf0dc655bb6b282a64fffaf7ed2dd561b8d9ad6f322b1f039aba + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"degenerator@npm:^5.0.0": + version: 5.0.1 + resolution: "degenerator@npm:5.0.1" + dependencies: + ast-types: "npm:^0.13.4" + escodegen: "npm:^2.1.0" + esprima: "npm:^4.0.1" + checksum: 10c0/e48d8a651edeb512a648711a09afec269aac6de97d442a4bb9cf121a66877e0eec11b9727100a10252335c0666ae1c84a8bc1e3a3f47788742c975064d2c7b1c + languageName: node + linkType: hard + +"del@npm:^4.1.1": + version: 4.1.1 + resolution: "del@npm:4.1.1" + dependencies: + "@types/glob": "npm:^7.1.1" + globby: "npm:^6.1.0" + is-path-cwd: "npm:^2.0.0" + is-path-in-cwd: "npm:^2.0.0" + p-map: "npm:^2.0.0" + pify: "npm:^4.0.1" + rimraf: "npm:^2.6.3" + checksum: 10c0/ed3233e86e39c0a6a7ea85d8ad0ebc00603078ad408b9c34b4742f707c20028c5731dce2e8aa9a6eb5ae6bee30ccc5405cf7b5d457306520e37c92d0410b6061 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"delegate@npm:^3.1.2": + version: 3.2.0 + resolution: "delegate@npm:3.2.0" + checksum: 10c0/f8512633514f375b8675018088fdd679d92b84246ad6ba1de9fbc4ea7630f7fb0ff8772ac86c37a68233885f58c6b8b70676d7366f38cb2dcbf7baa474e2362d + languageName: node + linkType: hard + +"depd@npm:2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 10c0/acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 + languageName: node + linkType: hard + +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 + languageName: node + linkType: hard + +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: 10c0/e562f00de23f10c27d7119e1af0e7388407eb4b06596a25f6d79a360094a109ff285de317f02b090faae093d314cf6e73ac3214f8a5bb3a0def5bece94557fbe + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + +"devtools-protocol@npm:0.0.1312386": + version: 0.0.1312386 + resolution: "devtools-protocol@npm:0.0.1312386" + checksum: 10c0/1073b2edcee76db094fdce97fe8869f3469866513e864379e04311a429b439ba51e54809fdffb09b67bf0c37b5ac5bfd2b0536ae217b7ea2cbe2e571fbed7e8e + languageName: node + linkType: hard + +"devtools-protocol@npm:0.0.1367902": + version: 0.0.1367902 + resolution: "devtools-protocol@npm:0.0.1367902" + checksum: 10c0/be4017f2bfd04474d718daca0e88e062f4afceb2f311662d717f4eae5bda3473da748a68ff1bf2326a67ce35c37af33932190fe8ef1d36c8ef22576befdc57c4 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + +"diff@npm:^4.0.2": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"dns-packet@npm:^5.2.2": + version: 5.6.1 + resolution: "dns-packet@npm:5.6.1" + dependencies: + "@leichtgewicht/ip-codec": "npm:^2.0.1" + checksum: 10c0/8948d3d03063fb68e04a1e386875f8c3bcc398fc375f535f2b438fad8f41bf1afa6f5e70893ba44f4ae884c089247e0a31045722fa6ff0f01d228da103f1811d + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"dom-helpers@npm:^5.0.1": + version: 5.2.1 + resolution: "dom-helpers@npm:5.2.1" + dependencies: + "@babel/runtime": "npm:^7.8.7" + csstype: "npm:^3.0.2" + checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.2" + entities: "npm:^4.2.0" + checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 + languageName: node + linkType: hard + +"domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 + languageName: node + linkType: hard + +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/774277cd9d4df033f852196e3c0077a34dbd15a96baa4d166e0e47138a80f4c0bdf0d94e4703e6ff5883cec56bb821a6fff84402d8a498e31de7c87eb932a294 + languageName: node + linkType: hard + +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: "npm:^2.3.0" + checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a + languageName: node + linkType: hard + +"domutils@npm:^3.0.1": + version: 3.2.2 + resolution: "domutils@npm:3.2.2" + dependencies: + dom-serializer: "npm:^2.0.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada + languageName: node + linkType: hard + +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 + languageName: node + linkType: hard + +"dot-prop@npm:^5.2.0": + version: 5.3.0 + resolution: "dot-prop@npm:5.3.0" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 10c0/93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + +"duplexer@npm:^0.1.2": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.73": + version: 1.5.83 + resolution: "electron-to-chromium@npm:1.5.83" + checksum: 10c0/12380962d057c4679add1047cdddb18b909904614272da0527e505a3859eaffde2022dd0688ce7f230582de96405c3d33b667680614475cdafd3f629caa2fee1 + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 + languageName: node + linkType: hard + +"emoji-regex@npm:^7.0.1": + version: 7.0.3 + resolution: "emoji-regex@npm:7.0.3" + checksum: 10c0/a8917d695c3a3384e4b7230a6a06fd2de6b3db3709116792e8b7b36ddbb3db4deb28ad3e983e70d4f2a1f9063b5dab9025e4e26e9ca08278da4fbb73e213743f + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b + languageName: node + linkType: hard + +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec + languageName: node + linkType: hard + +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + +"encoding@npm:^0.1.12, encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.17.1": + version: 5.18.0 + resolution: "enhanced-resolve@npm:5.18.0" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/5fcc264a6040754ab5b349628cac2bb5f89cee475cbe340804e657a5b9565f70e6aafb338d5895554eb0ced9f66c50f38a255274a0591dcb64ee17c549c459ce + languageName: node + linkType: hard + +"enquirer@npm:^2.3.6": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: "npm:^4.1.1" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/43850479d7a51d36a9c924b518dcdc6373b5a8ae3401097d336b7b7e258324749d0ad37a1fcaa5706f04799baa05585cd7af19ebdf7667673e7694435fcea918 + languageName: node + linkType: hard + +"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"entities@npm:~2.1.0": + version: 2.1.0 + resolution: "entities@npm:2.1.0" + checksum: 10c0/dd96ed95f7e017b7fbbcdd39bd6dc3dea6638f747c00610b53f23ea461ac409af87670f313805d85854bfce04f96e17d83575f75b3b2920365d78678ccd2a405 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"envinfo@npm:^7.14.0, envinfo@npm:^7.7.3": + version: 7.14.0 + resolution: "envinfo@npm:7.14.0" + bin: + envinfo: dist/cli.js + checksum: 10c0/059a031eee101e056bd9cc5cbfe25c2fab433fe1780e86cf0a82d24a000c6931e327da6a8ffb3dce528a24f83f256e7efc0b36813113eff8fdc6839018efe327 + languageName: node + linkType: hard + +"equivalent-key-map@npm:^0.2.2": + version: 0.2.2 + resolution: "equivalent-key-map@npm:0.2.2" + checksum: 10c0/6b93021113a163a8a4189cd5f5e0f32d024f82d66bb4fb0d27e5ab96a9bf1348053acde6d1bca93f7380475a856ee71e8ffe86c761fa4b53b688fbd155b55430 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"err-code@npm:^3.0.1": + version: 3.0.1 + resolution: "err-code@npm:3.0.1" + checksum: 10c0/78b1c50500adebde6699b8d27b8ce4728c132dcaad75b5d18ba44f6ccb28769d1fff8368ae1164be4559dac8b95d4e26bb15b480ba9999e0cd0f0c64beaf1b24 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"error-stack-parser@npm:^2.0.6": + version: 2.1.4 + resolution: "error-stack-parser@npm:2.1.4" + dependencies: + stackframe: "npm:^1.3.4" + checksum: 10c0/7679b780043c98b01fc546725484e0cfd3071bf5c906bbe358722972f04abf4fc3f0a77988017665bab367f6ef3fc2d0185f7528f45966b83e7c99c02d5509b9 + languageName: node + linkType: hard + +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.0" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.3" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.6" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + iterator.prototype: "npm:^1.1.4" + safe-array-concat: "npm:^1.1.3" + checksum: 10c0/97e3125ca472d82d8aceea11b790397648b52c26d8768ea1c1ee6309ef45a8755bb63225a43f3150c7591cffc17caf5752459f1e70d583b4184370a8f04ebd2f + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.6.0 + resolution: "es-module-lexer@npm:1.6.0" + checksum: 10c0/667309454411c0b95c476025929881e71400d74a746ffa1ff4cb450bd87f8e33e8eef7854d68e401895039ac0bac64e7809acbebb6253e055dd49ea9e3ea9212 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.2": + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" + dependencies: + hasown: "npm:^2.0.0" + checksum: 10c0/f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.2": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"escodegen@npm:^2.0.0, escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 + languageName: node + linkType: hard + +"eslint-config-airbnb-base@npm:^15.0.0": + version: 15.0.0 + resolution: "eslint-config-airbnb-base@npm:15.0.0" + dependencies: + confusing-browser-globals: "npm:^1.0.10" + object.assign: "npm:^4.1.2" + object.entries: "npm:^1.1.5" + semver: "npm:^6.3.0" + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + checksum: 10c0/93639d991654414756f82ad7860aac30b0dc6797277b7904ddb53ed88a32c470598696bbc6c503e066414024d305221974d3769e6642de65043bedf29cbbd30f + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.3.0": + version: 8.10.0 + resolution: "eslint-config-prettier@npm:8.10.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/19f8c497d9bdc111a17a61b25ded97217be3755bbc4714477dfe535ed539dddcaf42ef5cf8bb97908b058260cf89a3d7c565cb0be31096cbcd39f4c2fa5fe43c + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.0": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.25.2, eslint-plugin-import@npm:^2.31.0": + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.8" + array.prototype.findlastindex: "npm:^1.2.5" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.0" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.15.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.0" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10c0/e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a + languageName: node + linkType: hard + +"eslint-plugin-jest@npm:^27.4.3": + version: 27.9.0 + resolution: "eslint-plugin-jest@npm:27.9.0" + dependencies: + "@typescript-eslint/utils": "npm:^5.10.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: "*" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + checksum: 10c0/b8b09f7d8ba3d84a8779a6e95702a6e4dce45ab034e4edf5ddb631e77cd38dcdf791dfd9228e0a0d1d80d1eb2d278deb62ad2ec39f10fb8fd43cec07304e0c38 + languageName: node + linkType: hard + +"eslint-plugin-jsdoc@npm:^46.4.6": + version: 46.10.1 + resolution: "eslint-plugin-jsdoc@npm:46.10.1" + dependencies: + "@es-joy/jsdoccomment": "npm:~0.41.0" + are-docs-informative: "npm:^0.0.2" + comment-parser: "npm:1.4.1" + debug: "npm:^4.3.4" + escape-string-regexp: "npm:^4.0.0" + esquery: "npm:^1.5.0" + is-builtin-module: "npm:^3.2.1" + semver: "npm:^7.5.4" + spdx-expression-parse: "npm:^4.0.0" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 10c0/2c9db7e621e6393c4e22c312e8d729a1c5698a31a62b0985421bb64741eb737d95b65ea0523ea87df3456ff4b3452ed015e463cc5a3b98646f2e7a3f68dd6e1a + languageName: node + linkType: hard + +"eslint-plugin-jsx-a11y@npm:^6.5.1": + version: 6.10.2 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" + dependencies: + aria-query: "npm:^5.3.2" + array-includes: "npm:^3.1.8" + array.prototype.flatmap: "npm:^1.3.2" + ast-types-flow: "npm:^0.0.8" + axe-core: "npm:^4.10.0" + axobject-query: "npm:^4.1.0" + damerau-levenshtein: "npm:^1.0.8" + emoji-regex: "npm:^9.2.2" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^3.3.5" + language-tags: "npm:^1.0.9" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + safe-regex-test: "npm:^1.0.3" + string.prototype.includes: "npm:^2.0.1" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10c0/d93354e03b0cf66f018d5c50964e074dffe4ddf1f9b535fa020d19c4ae45f89c1a16e9391ca61ac3b19f7042c751ac0d361a056a65cbd1de24718a53ff8daa6e + languageName: node + linkType: hard + +"eslint-plugin-playwright@npm:^0.15.3": + version: 0.15.3 + resolution: "eslint-plugin-playwright@npm:0.15.3" + peerDependencies: + eslint: ">=7" + eslint-plugin-jest: ">=25" + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + checksum: 10c0/be96ce7e4157dfb52dcb38107cbdeebb1d1445b4a52d4909f62831ac060d8ff155c18cceb7ef2cdbbf4149e7f3465731975fb95587591144663cf72b1a541df6 + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^5.0.0, eslint-plugin-prettier@npm:^5.2.1": + version: 5.2.2 + resolution: "eslint-plugin-prettier@npm:5.2.2" + dependencies: + prettier-linter-helpers: "npm:^1.0.0" + synckit: "npm:^0.9.1" + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" + peerDependenciesMeta: + "@types/eslint": + optional: true + eslint-config-prettier: + optional: true + checksum: 10c0/c2522d573d7682c7e23c8598e16abfaae6d9b9b79e9aa70b902eb75122b503cc0d3c9934db6d22862e90c58910004ce9386a177b2fd4e69884e0e63de964e253 + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^4.3.0": + version: 4.6.2 + resolution: "eslint-plugin-react-hooks@npm:4.6.2" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 10c0/4844e58c929bc05157fb70ba1e462e34f1f4abcbc8dd5bbe5b04513d33e2699effb8bca668297976ceea8e7ebee4e8fc29b9af9d131bcef52886feaa2308b2cc + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^5.1.0": + version: 5.1.0 + resolution: "eslint-plugin-react-hooks@npm:5.1.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + checksum: 10c0/37ef76e1d916d46ab8e93a596078efcf2162e2c653614437e0c54e31d02a5dadabec22802fab717effe257aeb4bdc20c2a710666a89ab1cf07e01e614dde75d8 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.27.0, eslint-plugin-react@npm:^7.37.3": + version: 7.37.4 + resolution: "eslint-plugin-react@npm:7.37.4" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.3" + array.prototype.tosorted: "npm:^1.1.4" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.2.1" + estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.8" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.1" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.5" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.12" + string.prototype.repeat: "npm:^1.0.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10c0/4acbbdb19669dfa9a162ed8847c3ad1918f6aea1ceb675ee320b5d903b4e463fdef25e15233295b6d0a726fef2ea8b015c527da769c7690932ddc52d5b82ba12 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^2.1.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: 10c0/9f0e3a2db751d84067d15977ac4b4472efd6b303e369e6ff241a99feac04da758f46d5add022c33d06b53596038dbae4b4aceb27c7e68b8dfc1055b35e495787 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint-webpack-plugin@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-webpack-plugin@npm:4.2.0" + dependencies: + "@types/eslint": "npm:^8.56.10" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.5" + normalize-path: "npm:^3.0.0" + schema-utils: "npm:^4.2.0" + peerDependencies: + eslint: ^8.0.0 || ^9.0.0 + webpack: ^5.0.0 + checksum: 10c0/cf5c9b7afa3c025fffadb3e1451e7a55d914c3070614bb4d57f887774d164ca4298bb777f7c3afa16f47af9869174a19d6aebb4d1ca719bc2cc49f2eccd71a3b + languageName: node + linkType: hard + +"eslint@npm:^8.2.0, eslint@npm:^8.3.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2, esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + +"ev-emitter@npm:^2.0.0, ev-emitter@npm:^2.1.2": + version: 2.1.2 + resolution: "ev-emitter@npm:2.1.2" + checksum: 10c0/3c7a7983d1b964ca58e4ed025aeb1f4201b1a76ffd1c1f59677518f4d4a3bd82cd4d94fa1f1646b29949744c30725e4607505c75a1fb81832846537d65ac026f + languageName: node + linkType: hard + +"eventemitter3@npm:^4.0.0": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 + languageName: node + linkType: hard + +"expand-tilde@npm:^1.2.2": + version: 1.2.2 + resolution: "expand-tilde@npm:1.2.2" + dependencies: + os-homedir: "npm:^1.0.1" + checksum: 10c0/2342695a9d50bd5497454a0fad471b9394579f27c88c05334ef868ba85fbecf88fe2aeac6789ffc2a887b5fe120c0db295e34e65e308885cff0bd949a70f8aac + languageName: node + linkType: hard + +"expect-puppeteer@npm:^4.4.0": + version: 4.4.0 + resolution: "expect-puppeteer@npm:4.4.0" + checksum: 10c0/1be2b28b2c8b68cbc2dbdd80556565166bd32b0e4d38f3db4ebef0c78cef29cfb289736687bc282da75c5a1bcfc1469acdc1bc9c9b39319643e1c9829c5c65a6 + languageName: node + linkType: hard + +"expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"express@npm:^4.17.3": + version: 4.21.2 + resolution: "express@npm:4.21.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.3" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.7.1" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.3.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.12" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.13.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/38168fd0a32756600b56e6214afecf4fc79ec28eca7f7a91c2ab8d50df4f47562ca3f9dee412da7f5cea6b1a1544b33b40f9f8586dbacfbdada0fe90dbb10a1f + languageName: node + linkType: hard + +"extract-zip@npm:^2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + languageName: node + linkType: hard + +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.5 + resolution: "fast-uri@npm:3.0.5" + checksum: 10c0/f5501fd849e02f16f1730d2c8628078718c492b5bc00198068bc5c2880363ae948287fdc8cebfff47465229b517dbeaf668866fbabdff829b4138a899e5c2ba3 + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12, fastest-levenshtein@npm:^1.0.16": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.18.0 + resolution: "fastq@npm:1.18.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/7be87ecc41762adbddf558d24182f50a4b1a3ef3ee807d33b7623da7aee5faecdcc94fce5aa13fe91df93e269f383232bbcdb2dc5338cd1826503d6063221f36 + languageName: node + linkType: hard + +"faye-websocket@npm:^0.11.3": + version: 0.11.4 + resolution: "faye-websocket@npm:0.11.4" + dependencies: + websocket-driver: "npm:>=0.5.1" + checksum: 10c0/c6052a0bb322778ce9f89af92890f6f4ce00d5ec92418a35e5f4c6864a4fe736fec0bcebd47eac7c0f0e979b01530746b1c85c83cb04bae789271abf19737420 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 + languageName: node + linkType: hard + +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + +"file-entry-cache@npm:^10.0.5": + version: 10.0.5 + resolution: "file-entry-cache@npm:10.0.5" + dependencies: + flat-cache: "npm:^6.1.5" + checksum: 10c0/c7d9bd537d1862db5357ecc688a22dc9287c2590e9eba04e85e0601d6143905eaa5edc5534f1dd92e24713f230ee69d99e150d7b6120c6d940f40beccdd5caf3 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"filename-reserved-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "filename-reserved-regex@npm:2.0.0" + checksum: 10c0/453740b7f9fd126e508da555b37e38c1f7ff19f5e9f3d297b2de1beb09854957baddd74c83235e87b16e9ce27a2368798896669edad5a81b5b7bd8cb57c942fc + languageName: node + linkType: hard + +"filenamify@npm:^4.2.0": + version: 4.3.0 + resolution: "filenamify@npm:4.3.0" + dependencies: + filename-reserved-regex: "npm:^2.0.0" + strip-outer: "npm:^1.0.1" + trim-repeated: "npm:^1.0.0" + checksum: 10c0/dcfd2f116d66f78c9dd58bb0f0d9b6529d89c801a9f37a4f86e7adc0acecb6881c7fb7c3231dc9e6754b767edcfdca89cba3a492a58afd2b48479b30d14ccf8f + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f + languageName: node + linkType: hard + +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" + dependencies: + common-path-prefix: "npm:^3.0.0" + pkg-dir: "npm:^7.0.0" + checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff + languageName: node + linkType: hard + +"find-file-up@npm:^0.1.2": + version: 0.1.3 + resolution: "find-file-up@npm:0.1.3" + dependencies: + fs-exists-sync: "npm:^0.1.0" + resolve-dir: "npm:^0.1.0" + checksum: 10c0/5ad62a983ef1371084074911daaec93dae7f0a0e73478024341884d923a56598a4c1bd2e5c949919e47e86141e4e5576ad073f612cb56739f6b3f5dbe2e7e7c1 + languageName: node + linkType: hard + +"find-parent-dir@npm:~0.3.0": + version: 0.3.1 + resolution: "find-parent-dir@npm:0.3.1" + checksum: 10c0/4817c60ff382a989da31cfa63ac748e6add98433f00a6d236b91d5a23dba8cfc80723b43ff45f47a2dbb54032737dd8643fe12834a60cbee0512021e64bfbf00 + languageName: node + linkType: hard + +"find-pkg@npm:^0.1.2": + version: 0.1.2 + resolution: "find-pkg@npm:0.1.2" + dependencies: + find-file-up: "npm:^0.1.2" + checksum: 10c0/794899048f204c08dc5cb340cf6e5cbadc2394c43b2a1a23e91f023de46cb81501dadd540eb9a6d022db2cf6541bbb5e194f514f6a3dcb1183035ef8606d857e + languageName: node + linkType: hard + +"find-process@npm:^1.4.7": + version: 1.4.10 + resolution: "find-process@npm:1.4.10" + dependencies: + chalk: "npm:~4.1.2" + commander: "npm:^12.1.0" + loglevel: "npm:^1.9.2" + bin: + find-process: bin/find-process.js + checksum: 10c0/5f570ba55dca0659d7c063e2296b44fd3329eabff3660399c9db39a59a5f47a5925e0520dd6ea5eae6a36e28592c27701ca75d595c7a6ed12bae421995f5e59f + languageName: node + linkType: hard + +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: 10c0/1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa + languageName: node + linkType: hard + +"find-up@npm:^3.0.0": + version: 3.0.0 + resolution: "find-up@npm:3.0.0" + dependencies: + locate-path: "npm:^3.0.0" + checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + +"fizzy-ui-utils@npm:^3.0.0": + version: 3.0.0 + resolution: "fizzy-ui-utils@npm:3.0.0" + checksum: 10c0/09a64d0e482d02eb87f4a70689f6f02866cb488b472739d5781046805127f2027a30101b5aefc1b66b21b408e110f097c3f268a2fc0fdf7cfe7bb1b693f2e1f8 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flat-cache@npm:^6.1.5": + version: 6.1.5 + resolution: "flat-cache@npm:6.1.5" + dependencies: + cacheable: "npm:^1.8.7" + flatted: "npm:^3.3.2" + hookified: "npm:^1.6.0" + checksum: 10c0/b107edc1c24a8fabe89645001fb8b1479016177d92be45dc6ba739e688131fe35fffbf13516d2f7bb3dc5c1256ff8721f16ec1858c4ee77e46f93c9093c53689 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + +"flatted@npm:^3.2.9, flatted@npm:^3.3.2": + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 + languageName: node + linkType: hard + +"flickity-as-nav-for@npm:^3.0.0": + version: 3.0.0 + resolution: "flickity-as-nav-for@npm:3.0.0" + dependencies: + fizzy-ui-utils: "npm:^3.0.0" + peerDependencies: + flickity: ^3.0.0 + checksum: 10c0/6c2bb72e23d98ef271f67a18ab424cf15599f85ff204660b29c9924e39b36dc4ca180a3712c84c166fda506fe16e89a94553f5f0ac9e8d988c4ae50b6da6feb7 + languageName: node + linkType: hard + +"flickity@npm:^3.0.0": + version: 3.0.0 + resolution: "flickity@npm:3.0.0" + dependencies: + ev-emitter: "npm:^2.1.2" + fizzy-ui-utils: "npm:^3.0.0" + get-size: "npm:^3.0.0" + imagesloaded: "npm:^5.0.0" + unidragger: "npm:^3.0.0" + checksum: 10c0/f6dbab582dff320bf5d4eaaec82ba8496313469db9354dd22f69b00e9e27e10a48610e25a71b9325db0e7fa0cc4a8be83811e709949be6dbd69a76c339b360c2 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + languageName: node + linkType: hard + +"for-in@npm:^0.1.3": + version: 0.1.8 + resolution: "for-in@npm:0.1.8" + checksum: 10c0/11070c49646ba859f1076fb9abf0bb2774fafb224b20bb161de70c0ecf91cbf23107f5ce7c337901dd4938609b592068b10a947e3185b42fa1a27f640300238a + languageName: node + linkType: hard + +"for-in@npm:^1.0.1": + version: 1.0.2 + resolution: "for-in@npm:1.0.2" + checksum: 10c0/42bb609d564b1dc340e1996868b67961257fd03a48d7fdafd4f5119530b87f962be6b4d5b7e3a3fc84c9854d149494b1d358e0b0ce9837e64c4c6603a49451d6 + languageName: node + linkType: hard + +"for-own@npm:^0.1.3": + version: 0.1.5 + resolution: "for-own@npm:0.1.5" + dependencies: + for-in: "npm:^1.0.1" + checksum: 10c0/3f82c2ea489ce2eb74c0eb8634d89b30a620801c2cb5f2a83d2d797fe6990d40c1aeac8968783e157b1404cf35bac9acb0a6c46065ec37b38a21b5d896e500bd + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.1 + resolution: "form-data@npm:4.0.1" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: 10c0/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + +"fraction.js@npm:^4.3.7": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: 10c0/df291391beea9ab4c263487ffd9d17fed162dbb736982dee1379b2a8cc94e4e24e46ed508c6d278aded9080ba51872f1bc5f3a5fd8d7c74e5f105b508ac28711 + languageName: node + linkType: hard + +"framer-motion@npm:^11.1.9": + version: 11.18.0 + resolution: "framer-motion@npm:11.18.0" + dependencies: + motion-dom: "npm:^11.16.4" + motion-utils: "npm:^11.16.0" + tslib: "npm:^2.4.0" + peerDependencies: + "@emotion/is-prop-valid": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/is-prop-valid": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 10c0/7f3c1e420bca2d920b7f48dfb54b072938771f9237feed02d576884398f4a68ccb2d1ae36b28cf2410dbfe2db6edb4c03429a1d896e789d08a972360c6ad82b1 + languageName: node + linkType: hard + +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + +"fs-exists-sync@npm:^0.1.0": + version: 0.1.0 + resolution: "fs-exists-sync@npm:0.1.0" + checksum: 10c0/3067957c9394aabfce5f7351b6a70fcc423483131c7c0fa9ba8e48cbe00ecd866fb98e43e3c534b60e03354a520cfc27e9dc488bd057317c66b97714ad9bf673 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs-monkey@npm:^1.0.4": + version: 1.0.6 + resolution: "fs-monkey@npm:1.0.6" + checksum: 10c0/6f2508e792a47e37b7eabd5afc79459c1ea72bce2a46007d2b7ed0bfc3a4d64af38975c6eb7e93edb69ac98bbb907c13ff1b1579b2cf52d3d02dbc0303fca79f + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin<compat/fsevents>": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin<compat/fsevents>::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin<compat/fsevents>, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin<compat/fsevents>": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin<compat/fsevents>::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + functions-have-names: "npm:^1.2.3" + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-browser-rtc@npm:^1.1.0": + version: 1.1.0 + resolution: "get-browser-rtc@npm:1.1.0" + checksum: 10c0/ec59dab0e1a79ebcbc7da4bb5bef2e96d6728c1bf3707ef2d7124f9e1f64bc7678c16adb96dc8dbb8dddeefea4cf8d5175cd94f9c4931230cc0f8ae9c5dd2a2d + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7": + version: 1.2.7 + resolution: "get-intrinsic@npm:1.2.7" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.0" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/b475dec9f8bff6f7422f51ff4b7b8d0b68e6776ee83a753c1d627e3008c3442090992788038b37eff72e93e43dceed8c1acbdf2d6751672687ec22127933080d + languageName: node + linkType: hard + +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: 10c0/2d7df55279060bf0568549e1ffc9b84bc32a32b7541675ca092dce56317cdd1a59a98dcc4072c9f6a980779440139a3221d7486f52c488e69dc0fd27b1efb162 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be + languageName: node + linkType: hard + +"get-port@npm:^5.1.1": + version: 5.1.1 + resolution: "get-port@npm:5.1.1" + checksum: 10c0/2873877a469b24e6d5e0be490724a17edb39fafc795d1d662e7bea951ca649713b4a50117a473f9d162312cb0e946597bd0e049ed2f866e79e576e8e213d3d1c + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"get-size@npm:^3.0.0": + version: 3.0.0 + resolution: "get-size@npm:3.0.0" + checksum: 10c0/dcfed978a6671941ca2ac8618e300cb8726fa6c01a072506bc67330790b81d5590c1e080f24e983d92782c32a7d17cc276d84156cd90275e13f9acf310ce0f05 + languageName: node + linkType: hard + +"get-stdin@npm:~9.0.0": + version: 9.0.0 + resolution: "get-stdin@npm:9.0.0" + checksum: 10c0/7ef2edc0c81a0644ca9f051aad8a96ae9373d901485abafaabe59fd347a1c378689d8a3d8825fb3067415d1d09dfcaa43cb9b9516ecac6b74b3138b65a8ccc6b + languageName: node + linkType: hard + +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b + languageName: node + linkType: hard + +"get-uri@npm:^6.0.1": + version: 6.0.4 + resolution: "get-uri@npm:6.0.4" + dependencies: + basic-ftp: "npm:^5.0.2" + data-uri-to-buffer: "npm:^6.0.2" + debug: "npm:^4.3.4" + checksum: 10c0/07c87abe1f97a4545fae329a37a45e276ec57e6ad48dad2a97780f87c96b00a82c2043ab49e1a991f99bb5cff8f8ed975e44e4f8b3c9600f35493a97f123499f + languageName: node + linkType: hard + +"gettext-parser@npm:^1.3.1": + version: 1.4.0 + resolution: "gettext-parser@npm:1.4.0" + dependencies: + encoding: "npm:^0.1.12" + safe-buffer: "npm:^5.1.1" + checksum: 10c0/c498f38346f5d8dce4731ee4577df4d7e349c808820542be8ccf706a6dae0c8e2cd18505d6cc574e108695963066d3d67d324b88630b3149f96b46078e6b9980 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"glob@npm:^7.0.3, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:~7.2.0": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"global-modules@npm:^0.2.3": + version: 0.2.3 + resolution: "global-modules@npm:0.2.3" + dependencies: + global-prefix: "npm:^0.1.4" + is-windows: "npm:^0.2.0" + checksum: 10c0/45f1c89dc0625a88fd1a9f8c2584f2a55662594f1771c301677c38a48cd7d850b91ee60ca0d3b931593d462576f2107f8ab03d50efcd5d95e8c343b68af2827e + languageName: node + linkType: hard + +"global-modules@npm:^2.0.0": + version: 2.0.0 + resolution: "global-modules@npm:2.0.0" + dependencies: + global-prefix: "npm:^3.0.0" + checksum: 10c0/43b770fe24aa6028f4b9770ea583a47f39750be15cf6e2578f851e4ccc9e4fa674b8541928c0b09c21461ca0763f0d36e4068cec86c914b07fd6e388e66ba5b9 + languageName: node + linkType: hard + +"global-prefix@npm:^0.1.4": + version: 0.1.5 + resolution: "global-prefix@npm:0.1.5" + dependencies: + homedir-polyfill: "npm:^1.0.0" + ini: "npm:^1.3.4" + is-windows: "npm:^0.2.0" + which: "npm:^1.2.12" + checksum: 10c0/ad3bbc8e6b7d3e7e5f60c55dd0dbe74f5364ac232c827219d0dd6be58a493f2b119d6672bc26d9774d204d5edf857dc4df24d020bba25e0e36d1b7c8712a8439 + languageName: node + linkType: hard + +"global-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "global-prefix@npm:3.0.0" + dependencies: + ini: "npm:^1.3.5" + kind-of: "npm:^6.0.2" + which: "npm:^1.3.1" + checksum: 10c0/510f489fb68d1cc7060f276541709a0ee6d41356ef852de48f7906c648ac223082a1cc8fce86725ca6c0e032bcdc1189ae77b4744a624b29c34a9d0ece498269 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.12.0, globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + languageName: node + linkType: hard + +"globby@npm:^12.0.2": + version: 12.2.0 + resolution: "globby@npm:12.2.0" + dependencies: + array-union: "npm:^3.0.1" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.7" + ignore: "npm:^5.1.9" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 10c0/121fee62bb9a43a35a32731cda9540241003ef578f9cee5ad87b27d3020b94857ff62f8d82cb99dbeedf6f26981c9fa62509d873392642ceb37674f3d6ec4e52 + languageName: node + linkType: hard + +"globby@npm:^6.1.0": + version: 6.1.0 + resolution: "globby@npm:6.1.0" + dependencies: + array-union: "npm:^1.0.1" + glob: "npm:^7.0.3" + object-assign: "npm:^4.0.1" + pify: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + checksum: 10c0/656ad1f0d02c6ef378c07589519ed3ec27fe988ea177195c05b8aff280320f3d67b91fa0baa6f7e49288f9bf1f92fc84f783a79ac3ed66278f3fa082e627ed84 + languageName: node + linkType: hard + +"globjoin@npm:^0.1.4": + version: 0.1.4 + resolution: "globjoin@npm:0.1.4" + checksum: 10c0/236e991b48f1a9869fe2aa7bb5141fb1f32973940567a3c012f8ccb58c3c85ab78ce594d374fa819410fff3b48cfd24584d7ef726939f8a3c3772890e62ea16b + languageName: node + linkType: hard + +"good-listener@npm:^1.2.2": + version: 1.2.2 + resolution: "good-listener@npm:1.2.2" + dependencies: + delegate: "npm:^3.1.2" + checksum: 10c0/5c532f2e223f1f3a12504077d6d960986979a7923fb428a26bde012b88ac57ffba1b28507f95bd16a73c1ae805fdb38d26d9442d538dd559fad159a7f58243fe + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"gradient-parser@npm:^0.1.5": + version: 0.1.5 + resolution: "gradient-parser@npm:0.1.5" + checksum: 10c0/00c898cf970062466495a7ca44fa8f7ad5332690250e4c199d77e4327c9912b9f18283b32683b13241cca53c8488ce68b85db9e0ddb609b37b6da7f42b66a37b + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"gzip-size@npm:^6.0.0": + version: 6.0.0 + resolution: "gzip-size@npm:6.0.0" + dependencies: + duplexer: "npm:^0.1.2" + checksum: 10c0/4ccb924626c82125897a997d1c84f2377846a6ef57fbee38f7c0e6b41387fba4d00422274440747b58008b5d60114bac2349c2908e9aba55188345281af40a3f + languageName: node + linkType: hard + +"handle-thing@npm:^2.0.0": + version: 2.0.1 + resolution: "handle-thing@npm:2.0.1" + checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 + languageName: node + linkType: hard + +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 10c0/febc3343a1ad575aedcc112580835b44a89a89e01f400b4eda6e8110869edfdab0b00cd1bd4c3bfec9475a57e79e0b355aecd5be46454b6a62b9a359af60e564 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"header-case@npm:^2.0.4": + version: 2.0.4 + resolution: "header-case@npm:2.0.4" + dependencies: + capital-case: "npm:^1.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/c9f295d9d8e38fa50679281fd70d80726962256e888a76c8e72e526453da7a1832dcb427caa716c1ad5d79841d4537301b90156fa30298fefd3d68f4ea2181bb + languageName: node + linkType: hard + +"highlight-words-core@npm:^1.2.2": + version: 1.2.3 + resolution: "highlight-words-core@npm:1.2.3" + checksum: 10c0/473f4ea898c8c3aa20f97951cb6fe23c60ce016f55d280041ec727fdda6a80c2f46d8aa168b771638e2c7eccd97f6c496a1d8eb2be822d4b94bbd031b597130e + languageName: node + linkType: hard + +"history@npm:^5.3.0": + version: 5.3.0 + resolution: "history@npm:5.3.0" + dependencies: + "@babel/runtime": "npm:^7.7.6" + checksum: 10c0/812ec839386222d6437bd78d9f05db32e47d105ada0ad8834b32626919dd2fee7a10001bc489510f93a8069d02f118214bd8d42a82f7cf9daf8e84fbcbbb2016 + languageName: node + linkType: hard + +"hoist-non-react-statics@npm:^3.3.1": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 + languageName: node + linkType: hard + +"homedir-polyfill@npm:^1.0.0": + version: 1.0.3 + resolution: "homedir-polyfill@npm:1.0.3" + dependencies: + parse-passwd: "npm:^1.0.0" + checksum: 10c0/3c099844f94b8b438f124bd5698bdcfef32b2d455115fb8050d7148e7f7b95fc89ba9922586c491f0e1cdebf437b1053c84ecddb8d596e109e9ac69c5b4a9e27 + languageName: node + linkType: hard + +"hookified@npm:^1.6.0": + version: 1.6.0 + resolution: "hookified@npm:1.6.0" + checksum: 10c0/00ae9502315a21b559c2d057e02d1418a812e015df701b89f590ddbce135e422058e6e97b1047ef4b0b96477bf08e36f3f572fe247c8f3370a126555800ae46f + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + +"hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: "npm:^6.0.0" + checksum: 10c0/150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 + languageName: node + linkType: hard + +"hpack.js@npm:^2.1.6": + version: 2.1.6 + resolution: "hpack.js@npm:2.1.6" + dependencies: + inherits: "npm:^2.0.1" + obuf: "npm:^1.0.0" + readable-stream: "npm:^2.0.1" + wbuf: "npm:^1.1.0" + checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 + languageName: node + linkType: hard + +"hpq@npm:^1.3.0": + version: 1.4.0 + resolution: "hpq@npm:1.4.0" + checksum: 10c0/e4321e60a014a6d94eaa860bda45e0f637e3746d5940df203328f507315abf015015cd11a444db976493fd83cf05ed916b3e9d562391027cd0f374fadb989e3c + languageName: node + linkType: hard + +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: "npm:^2.0.0" + checksum: 10c0/b17b3b0fb5d061d8eb15121c3b0b536376c3e295ecaf09ba48dd69c6b6c957839db124fe1e2b3f11329753a4ee01aa7dedf63b7677999e86da17fbbdd82c5386 + languageName: node + linkType: hard + +"html-entities@npm:^2.1.0, html-entities@npm:^2.3.2": + version: 2.5.2 + resolution: "html-entities@npm:2.5.2" + checksum: 10c0/f20ffb4326606245c439c231de40a7c560607f639bf40ffbfb36b4c70729fd95d7964209045f1a4e62fe17f2364cef3d6e49b02ea09016f207fde51c2211e481 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0, html-escaper@npm:^2.0.2": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"html-tags@npm:^3.3.1": + version: 3.3.1 + resolution: "html-tags@npm:3.3.1" + checksum: 10c0/680165e12baa51bad7397452d247dbcc5a5c29dac0e6754b1187eee3bf26f514bc1907a431dd2f7eb56207611ae595ee76a0acc8eaa0d931e72c791dd6463d79 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-deceiver@npm:^1.2.7": + version: 1.2.7 + resolution: "http-deceiver@npm:1.2.7" + checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 + languageName: node + linkType: hard + +"http-errors@npm:2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: "npm:2.0.0" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + toidentifier: "npm:1.0.1" + checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 + languageName: node + linkType: hard + +"http-errors@npm:~1.6.2": + version: 1.6.3 + resolution: "http-errors@npm:1.6.3" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.3" + setprototypeof: "npm:1.1.0" + statuses: "npm:>= 1.4.0 < 2" + checksum: 10c0/17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 + languageName: node + linkType: hard + +"http-link-header@npm:^1.1.1": + version: 1.1.3 + resolution: "http-link-header@npm:1.1.3" + checksum: 10c0/56698a9d3aee4d5319d1cdfe62ef5d7179f179ec1e6432d23c9e6a0c896be642ba47a4985a45419cff91008032aef920aca9df94ff9e763e646c83bf54b7243d + languageName: node + linkType: hard + +"http-parser-js@npm:>=0.5.1": + version: 0.5.9 + resolution: "http-parser-js@npm:0.5.9" + checksum: 10c0/25aac1096b5270e69b1f6c850c8d4363c1e8b5711f97109cf65d44ecf5dfe3438811036a9b4d4f432474a2519ac46e8feb1a7b6be6e292a956e63bdad12583fb + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": "npm:2" + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/32a05e413430b2c1e542e5c74b38a9f14865301dd69dff2e53ddb684989440e3d2ce0c4b64d25eb63cf6283e6265ff979a61cf93e3ca3d23047ddfdc8df34a32 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http-proxy-middleware@npm:^2.0.3": + version: 2.0.7 + resolution: "http-proxy-middleware@npm:2.0.7" + dependencies: + "@types/http-proxy": "npm:^1.17.8" + http-proxy: "npm:^1.18.1" + is-glob: "npm:^4.0.1" + is-plain-obj: "npm:^3.0.0" + micromatch: "npm:^4.0.2" + peerDependencies: + "@types/express": ^4.17.13 + peerDependenciesMeta: + "@types/express": + optional: true + checksum: 10c0/8d00a61eb215b83826460b07489d8bb095368ec16e02a9d63e228dcf7524e7c20d61561e5476de1391aecd4ec32ea093279cdc972115b311f8e0a95a24c9e47e + languageName: node + linkType: hard + +"http-proxy@npm:^1.18.1": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: "npm:^4.0.0" + follow-redirects: "npm:^1.0.0" + requires-port: "npm:^1.0.0" + checksum: 10c0/148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"humanity-theme@workspace:.": + version: 0.0.0-use.local + resolution: "humanity-theme@workspace:." + dependencies: + "@babel/core": "npm:^7.26.0" + "@babel/plugin-proposal-pipeline-operator": "npm:^7.25.9" + "@braintree/sanitize-url": "npm:^7.1.1" + "@hello-pangea/dnd": "npm:^18.0.1" + "@playwright/test": "npm:^1.49.1" + "@types/react": "npm:^19.0.8" + "@wordpress/api-fetch": "npm:^7.15.1" + "@wordpress/block-editor": "npm:^14.10.1" + "@wordpress/blocks": "npm:^14.4.1" + "@wordpress/components": "npm:^29.1.1" + "@wordpress/compose": "npm:^7.15.1" + "@wordpress/core-data": "npm:^7.15.1" + "@wordpress/data": "npm:^10.15.1" + "@wordpress/dom": "npm:^4.18.0" + "@wordpress/editor": "npm:^14.15.1" + "@wordpress/element": "npm:^6.15.1" + "@wordpress/eslint-plugin": "npm:^22.2.0" + "@wordpress/hooks": "npm:^4.15.0" + "@wordpress/i18n": "npm:^5.15.1" + "@wordpress/plugins": "npm:^7.17.0" + "@wordpress/scripts": "npm:^30.8.1" + "@wordpress/server-side-render": "npm:^5.15.1" + "@wordpress/url": "npm:^4.15.0" + autoprefixer: "npm:^10.4.20" + classnames: "npm:^2.5.1" + core-js: "npm:^3.40.0" + eslint: "npm:^8.2.0" + eslint-config-airbnb-base: "npm:^15.0.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-plugin-import: "npm:^2.31.0" + eslint-plugin-prettier: "npm:^5.2.1" + eslint-plugin-react: "npm:^7.37.3" + eslint-plugin-react-hooks: "npm:^5.1.0" + eslint-webpack-plugin: "npm:^4.2.0" + flickity: "npm:^3.0.0" + flickity-as-nav-for: "npm:^3.0.0" + intersection-observer: "npm:^0.12.2" + js-cookie: "npm:^3.0.5" + lodash: "npm:^4.17.21" + memize: "npm:^2.1.0" + postcss: "npm:^8.4.49" + postcss-pxtorem: "npm:^6.1.0" + postcss-reporter: "npm:^7.1.0" + prettier: "npm:^3.4.2" + react: "npm:18.3.1" + react-dom: "npm:18.3.1" + react-select: "npm:^5.9.0" + sass: "npm:^1.83.1" + sass-loader: "npm:^16.0.4" + stylelint: "npm:^16.12.0" + stylelint-config-recommended-scss: "npm:^14.1.0" + stylelint-scss: "npm:^6.10.0" + stylelint-webpack-plugin: "npm:^5.0.1" + typescript: "npm:^5.7.3" + webpack: "npm:^5.97.1" + webpack-cli: "npm:^6.0.1" + languageName: unknown + linkType: soft + +"iconv-lite@npm:0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"ignore-walk@npm:^4.0.1": + version: 4.0.1 + resolution: "ignore-walk@npm:4.0.1" + dependencies: + minimatch: "npm:^3.0.4" + checksum: 10c0/bda7e6a8fd6eeab83e41bff9e9582f30225bff64e1a58063888f24c8e788d599d937be688afa0190665b9ffb33c071163d622fe4a2798d82dcb388e1de59889c + languageName: node + linkType: hard + +"ignore@npm:^5.1.9, ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"ignore@npm:^7.0.1": + version: 7.0.3 + resolution: "ignore@npm:7.0.3" + checksum: 10c0/8e21637513cbcd888a4873d34d5c651a2e24b3c4c9a6b159335a26bed348c3c386c51d6fab23577f59140e1b226323138fbd50e63882d4568fd12aa6c822029e + languageName: node + linkType: hard + +"ignore@npm:~5.2.0": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 10c0/7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 + languageName: node + linkType: hard + +"image-ssim@npm:^0.2.0": + version: 0.2.0 + resolution: "image-ssim@npm:0.2.0" + checksum: 10c0/9c669c3e66f6bdff2e1c32e88c930db6b832bc2a62bc2c48ab4a11cae208f95b37a86794ddcf000a6fd72f3c51eb3ad6fc0d8b755c4c0574ae3a61304ddba4b1 + languageName: node + linkType: hard + +"imagesloaded@npm:^5.0.0": + version: 5.0.0 + resolution: "imagesloaded@npm:5.0.0" + dependencies: + ev-emitter: "npm:^2.1.2" + checksum: 10c0/7eae70f19d298f411e2359e8f4be532f7e6842481147ac9234ff42d49f02be0f3b2c3c562466feaae699eb9b126d7ef2bec5f58878ab3efe486275997b87512b + languageName: node + linkType: hard + +"immediate@npm:~3.0.5": + version: 3.0.6 + resolution: "immediate@npm:3.0.6" + checksum: 10c0/f8ba7ede69bee9260241ad078d2d535848745ff5f6995c7c7cb41cfdc9ccc213f66e10fa5afb881f90298b24a3f7344b637b592beb4f54e582770cdce3f1f039 + languageName: node + linkType: hard + +"immutable@npm:^5.0.2": + version: 5.0.3 + resolution: "immutable@npm:5.0.3" + checksum: 10c0/3269827789e1026cd25c2ea97f0b2c19be852ffd49eda1b674b20178f73d84fa8d945ad6f5ac5bc4545c2b4170af9f6e1f77129bc1cae7974a4bf9b04a9cdfb9 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 + languageName: node + linkType: hard + +"import-locals@npm:^2.0.0": + version: 2.0.0 + resolution: "import-locals@npm:2.0.0" + checksum: 10c0/b576b794fca1e596c76ed371a4d99bd18bd967a85d33eb00544ad79bd18ff9f1a42ccd9d0af13fd74e2a0ccbdbf6f63cce3fe4d20f1591828bf52a3058fcbb83 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 + languageName: node + linkType: hard + +"ini@npm:^1.3.4, ini@npm:^1.3.5": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"ini@npm:~3.0.0": + version: 3.0.1 + resolution: "ini@npm:3.0.1" + checksum: 10c0/4473d8d42d4b0c4fcf8707e5d37a7eacd5a1d2ed2b99f1b6805c76efddf674c3deba6fb26811eeeb883a71d6c6917c3250d336e545b4e2c8d96081bf05e58df6 + languageName: node + linkType: hard + +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 + languageName: node + linkType: hard + +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 10c0/6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 + languageName: node + linkType: hard + +"intersection-observer@npm:^0.12.2": + version: 0.12.2 + resolution: "intersection-observer@npm:0.12.2" + checksum: 10c0/9591f46b2b742f5801ed69dbc8860f487771b4af8361e7a5dcb28a377beff2ba56336a2b090af261825430d225dae9417121496d2e6925e000e4a469958843ff + languageName: node + linkType: hard + +"intl-messageformat@npm:^10.5.3": + version: 10.7.11 + resolution: "intl-messageformat@npm:10.7.11" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.3.2" + "@formatjs/fast-memoize": "npm:2.2.6" + "@formatjs/icu-messageformat-parser": "npm:2.9.8" + tslib: "npm:2" + checksum: 10c0/7ccd972277cc6798038af876c830203084db6552becfa99c3706541fd67838552013f57f8ed0ed3aed03d4fba436591a83a25f913365d66ad04ee9332eee7b73 + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + +"ipaddr.js@npm:^2.0.1": + version: 2.2.0 + resolution: "ipaddr.js@npm:2.2.0" + checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 + languageName: node + linkType: hard + +"irregular-plurals@npm:^3.2.0": + version: 3.5.0 + resolution: "irregular-plurals@npm:3.5.0" + checksum: 10c0/7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-async-function@npm:^2.0.0": + version: 2.1.0 + resolution: "is-async-function@npm:2.1.0" + dependencies: + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/5209b858c6d18d88a9fb56dea202a050d53d4b722448cc439fdca859b36e23edf27ee8c18958ba49330f1a71b8846576273f4581e1c0bb9d403738129d852fdb + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.2.1": + version: 1.2.1 + resolution: "is-boolean-object@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/2ef601d255a39fdbde79cfe6be80c27b47430ed6712407f29b17d002e20f64c1e3d6692f1d842ba16bf1e9d8ddf1c4f13cac3ed7d9a4a21290f44879ebb4e8f5 + languageName: node + linkType: hard + +"is-buffer@npm:^1.0.2, is-buffer@npm:^1.1.5": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 10c0/ae18aa0b6e113d6c490ad1db5e8df9bdb57758382b313f5a22c9c61084875c6396d50bbf49315f5b1926d142d74dfb8d31b40d993a383e0a158b15fea7a82234 + languageName: node + linkType: hard + +"is-builtin-module@npm:^3.2.1": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0, is-core-module@npm:^2.5.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc + languageName: node + linkType: hard + +"is-extendable@npm:^0.1.1": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 10c0/dd5ca3994a28e1740d1e25192e66eed128e0b2ff161a7ea348e87ae4f616554b486854de423877a2a2c171d5f7cd6e8093b91f54533bc88a59ee1c9838c43879 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^2.0.0": + version: 2.0.0 + resolution: "is-fullwidth-code-point@npm:2.0.0" + checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.10": + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: 10c0/85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e + languageName: node + linkType: hard + +"is-path-cwd@npm:^2.0.0": + version: 2.2.0 + resolution: "is-path-cwd@npm:2.2.0" + checksum: 10c0/afce71533a427a759cd0329301c18950333d7589533c2c90205bd3fdcf7b91eb92d1940493190567a433134d2128ec9325de2fd281e05be1920fbee9edd22e0a + languageName: node + linkType: hard + +"is-path-in-cwd@npm:^2.0.0": + version: 2.1.0 + resolution: "is-path-in-cwd@npm:2.1.0" + dependencies: + is-path-inside: "npm:^2.1.0" + checksum: 10c0/674a4282fb3732cf4b4e9ea31e06380d8b074fb8106c4c1742a9f0f3d5650bf059b2c45e5c4cfa7abe847ca88474de63abec323a7fe1eb14f8ec4de2fa951d3a + languageName: node + linkType: hard + +"is-path-inside@npm:^2.1.0": + version: 2.1.0 + resolution: "is-path-inside@npm:2.1.0" + dependencies: + path-is-inside: "npm:^1.0.2" + checksum: 10c0/50272b9aa301964c0bc4032d5c968e63c516d15bd7800cd06845df97bee637451fcd92a8001b37e309563eff2dffae5fa6d635a0c1d162dc257489c86b1fda51 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c + languageName: node + linkType: hard + +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: 10c0/8e6483bfb051d42ec9c704c0ede051a821c6b6f9a6c7a3e3b55aa855e00981b0580c8f3b1f5e2e62649b39179b1abfee35d6f8086d999bfaa32c1908d29b07bc + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.1, is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: "npm:^3.0.1" + checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: 10c0/b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9 + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 + languageName: node + linkType: hard + +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 + languageName: node + linkType: hard + +"is-typedarray@npm:^1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.0 + resolution: "is-weakref@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + checksum: 10c0/aa835f62e29cb60132ecb3ec7d11bd0f39ec7322325abe8412b805aef47153ec2daefdb21759b049711c674f49b13202a31d8d126bcdff7d8671c78babd4ae5b + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 + languageName: node + linkType: hard + +"is-windows@npm:^0.2.0": + version: 0.2.0 + resolution: "is-windows@npm:0.2.0" + checksum: 10c0/513a1e70bf78a5af1792e7bc58ade5fb51129d5e9d6494b29daff7dc6c55f4767cd4047d3e0a50f5439a3cd1628be74d2d518232491a4288321d40fe1c223df4 + languageName: node + linkType: hard + +"is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: "npm:^2.0.0" + checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db + languageName: node + linkType: hard + +"isomorphic.js@npm:^0.2.4": + version: 0.2.5 + resolution: "isomorphic.js@npm:0.2.5" + checksum: 10c0/7cd268c8e58146a8160c8cd16596291fd1fbf3e8799a325f269accda9dc1238806e371ccef0b66fe2ad957209230c55997248d8b6d02cf2d7c575ffeb759c789 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 + languageName: node + linkType: hard + +"iterator.prototype@npm:^1.1.4": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" + dependencies: + define-data-property: "npm:^1.1.4" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b + languageName: node + linkType: hard + +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e + languageName: node + linkType: hard + +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a + languageName: node + linkType: hard + +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 + languageName: node + linkType: hard + +"jest-dev-server@npm:^10.1.4": + version: 10.1.4 + resolution: "jest-dev-server@npm:10.1.4" + dependencies: + chalk: "npm:^4.1.2" + cwd: "npm:^0.10.0" + find-process: "npm:^1.4.7" + prompts: "npm:^2.4.2" + spawnd: "npm:^10.1.4" + tree-kill: "npm:^1.2.2" + wait-on: "npm:^8.0.1" + checksum: 10c0/cd13e2509fd5f63d4ec58b717a57759590a989c600a4496ba102928611c40ea914b14217b73ce62b5cc63692918a1a13e6723ffc1f689a9934428e91b08e1848 + languageName: node + linkType: hard + +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + languageName: node + linkType: hard + +"jest-environment-jsdom@npm:^29.6.2": + version: 29.7.0 + resolution: "jest-environment-jsdom@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/jsdom": "npm:^20.0.0" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jsdom: "npm:^20.0.0" + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/139b94e2c8ec1bb5a46ce17df5211da65ce867354b3fd4e00fa6a0d1da95902df4cf7881273fc6ea937e5c325d39d6773f0d41b6c469363334de9d489d2c321f + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.6.2, jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.6.2, jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d + languageName: node + linkType: hard + +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 + languageName: node + linkType: hard + +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 + languageName: node + linkType: hard + +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 + languageName: node + linkType: hard + +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + languageName: node + linkType: hard + +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b languageName: node linkType: hard -"flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: 10c0/5c91c5a0a21bbc0b07b272231e5b4efe6b822bcb4ad317caf6bb06984be4042a9e9045026307da0fdb4583f1f545e317a67ef1231a59e71f7fced3cc429cfc53 +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 languageName: node linkType: hard -"flickity-as-nav-for@npm:^2.0.1": - version: 2.0.1 - resolution: "flickity-as-nav-for@npm:2.0.1" +"jest@npm:^29.6.2": + version: 29.7.0 + resolution: "jest@npm:29.7.0" dependencies: - fizzy-ui-utils: "npm:^2.0.0" - flickity: "npm:^2.0.0" - checksum: 10c0/d320a8bc5fae66572693c1cdfd045c2c694c199a1355bd393d7092edf6a844b1a2d2f41ca7f4371953b35801b2a715ac08df1ddda298cedba6e99a10195e827b + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b languageName: node linkType: hard -"flickity@npm:^2.0.0, flickity@npm:^2.2.2": - version: 2.3.0 - resolution: "flickity@npm:2.3.0" +"joi@npm:^17.13.3": + version: 17.13.3 + resolution: "joi@npm:17.13.3" dependencies: - desandro-matches-selector: "npm:^2.0.0" - ev-emitter: "npm:^1.1.1" - fizzy-ui-utils: "npm:^2.0.7" - get-size: "npm:^2.0.3" - unidragger: "npm:^2.4.0" - unipointer: "npm:^2.4.0" - checksum: 10c0/75922e9e01514bd72486be2893412dd25a10e15ca91bb7e517dd8584ca74972ef8e158d00f57ca6b14372ea138b342fbcf9ca65e0bda14b57ca69e108c546bcc + "@hapi/hoek": "npm:^9.3.0" + "@hapi/topo": "npm:^5.1.0" + "@sideway/address": "npm:^4.1.5" + "@sideway/formula": "npm:^3.0.1" + "@sideway/pinpoint": "npm:^2.0.0" + checksum: 10c0/9262aef1da3f1bec5b03caf50c46368899fe03b8ff26cbe3d53af4584dd1049079fc97230bbf1500b6149db7cc765b9ee45f0deb24bb6fc3fa06229d7148c17f languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa +"jpeg-js@npm:^0.4.1, jpeg-js@npm:^0.4.4": + version: 0.4.4 + resolution: "jpeg-js@npm:0.4.4" + checksum: 10c0/4d0d5097f8e55d8bbce6f1dc32ffaf3f43f321f6222e4e6490734fdc6d005322e3bd6fb992c2df7f5b587343b1441a1c333281dc3285bc9116e369fd2a2b43a7 languageName: node linkType: hard -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 +"js-cookie@npm:^3.0.5": + version: 3.0.5 + resolution: "js-cookie@npm:3.0.5" + checksum: 10c0/04a0e560407b4489daac3a63e231d35f4e86f78bff9d792011391b49c59f721b513411cd75714c418049c8dc9750b20fcddad1ca5a2ca616c3aca4874cce5b3a languageName: node linkType: hard -"fraction.js@npm:^4.3.6": - version: 4.3.7 - resolution: "fraction.js@npm:4.3.7" - checksum: 10c0/df291391beea9ab4c263487ffd9d17fed162dbb736982dee1379b2a8cc94e4e24e46ed508c6d278aded9080ba51872f1bc5f3a5fd8d7c74e5f105b508ac28711 +"js-library-detector@npm:^6.7.0": + version: 6.7.0 + resolution: "js-library-detector@npm:6.7.0" + checksum: 10c0/492264f9fb42976fc054b36416bbf4eb760586a4df39f465bc9185186928b16728ecb1ab256b81ebddd16a680fee38a94205f0fb023c816729c0bed2cea73624 languageName: node linkType: hard -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed languageName: node linkType: hard -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b languageName: node linkType: hard -"fs-readdir-recursive@npm:^1.1.0": - version: 1.1.0 - resolution: "fs-readdir-recursive@npm:1.1.0" - checksum: 10c0/7e190393952143e674b6d1ad4abcafa1b5d3e337fcc21b0cb051079a7140a54617a7df193d562ef9faf21bd7b2148a38601b3d5c16261fa76f278d88dc69989c +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f languageName: node linkType: hard -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 languageName: node linkType: hard -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin +"jsdoc-type-pratt-parser@npm:~4.0.0": + version: 4.0.0 + resolution: "jsdoc-type-pratt-parser@npm:4.0.0" + checksum: 10c0/b23ef7bbbe2f56d72630d1c5a233dc9fecaff399063d373c57bef136908c1b05e723dac107177303c03ccf8d75aa51507510b282aa567600477479c5ea0c36d1 languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin<compat/fsevents>": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin<compat/fsevents>::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: "npm:^2.0.6" + acorn: "npm:^8.8.1" + acorn-globals: "npm:^7.0.0" + cssom: "npm:^0.5.0" + cssstyle: "npm:^2.3.0" + data-urls: "npm:^3.0.2" + decimal.js: "npm:^10.4.2" + domexception: "npm:^4.0.0" + escodegen: "npm:^2.0.0" + form-data: "npm:^4.0.0" + html-encoding-sniffer: "npm:^3.0.0" + http-proxy-agent: "npm:^5.0.0" + https-proxy-agent: "npm:^5.0.1" + is-potential-custom-element-name: "npm:^1.0.1" + nwsapi: "npm:^2.2.2" + parse5: "npm:^7.1.1" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^4.1.2" + w3c-xmlserializer: "npm:^4.0.0" + webidl-conversions: "npm:^7.0.0" + whatwg-encoding: "npm:^2.0.0" + whatwg-mimetype: "npm:^3.0.0" + whatwg-url: "npm:^11.0.0" + ws: "npm:^8.11.0" + xml-name-validator: "npm:^4.0.0" + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/b109073bb826a966db7828f46cb1d7371abecd30f182b143c52be5fe1ed84513bbbe995eb3d157241681fcd18331381e61e3dc004d4949f3a63bca02f6214902 languageName: node linkType: hard -"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - functions-have-names: "npm:^1.2.3" - checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b +"jsesc@npm:~3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 languageName: node linkType: hard -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 languageName: node linkType: hard -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 languageName: node linkType: hard -"get-css-data@npm:^2.0.2": - version: 2.1.0 - resolution: "get-css-data@npm:2.1.0" - checksum: 10c0/0587ed0386fcc7820fb454be099ba3e919f3fbe1333a78d62502932cd7192a7841b15fa1b62fe40e4d94fdfb4daf7cf239731d8a982d48a41dab18cf7f81abb3 +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": - version: 1.2.2 - resolution: "get-intrinsic@npm:1.2.2" - dependencies: - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/4e7fb8adc6172bae7c4fe579569b4d5238b3667c07931cd46b4eee74bbe6ff6b91329bec311a638d8e60f5b51f44fe5445693c6be89ae88d4b5c49f7ff12db0b +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 languageName: node linkType: hard -"get-size@npm:^2.0.3": - version: 2.0.3 - resolution: "get-size@npm:2.0.3" - checksum: 10c0/c9703caa61b4d38385eab34aa5068f3a25ab40f6d9cda6dac3f0dc4dcd8da38f7b0283035e71c9f52a47b670b9315372cae46f58d66ad709a4939e57c1fdc6cc +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 languageName: node linkType: hard -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 +"json2php@npm:^0.0.7": + version: 0.0.7 + resolution: "json2php@npm:0.0.7" + checksum: 10c0/b7ef04b9abe6f38b2b60b378b1272fd9b57cad2ecd6ca5485aee8f39b9ab63e50c5d73278f068de454ea1fff0243ae3c2b4029b7187275887e073ad903a038ab languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" - dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.1" - checksum: 10c0/23bc3b44c221cdf7669a88230c62f4b9e30393b61eb21ba4400cb3e346801bd8f95fe4330ee78dbae37aecd874646d53e3e76a17a654d0c84c77f6690526d6bb +"json2php@npm:^0.0.9": + version: 0.0.9 + resolution: "json2php@npm:0.0.9" + checksum: 10c0/a40e594d6efecad764679317ba015bdc89bdd69ae6930a15340645d401debfe9bb25feeeb4c327480ceb0efc6b263a61aaa41288b32a13a27768c80457ccb18e languageName: node linkType: hard -"get-tsconfig@npm:^4.7.0": - version: 4.7.2 - resolution: "get-tsconfig@npm:4.7.2" +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/169b2beababfbb16e8a0ae813ee59d3e14d4960231c816615161ab5be68ec07a394dce59695742ac84295e2efab8d9e89bcf3abaf5e253dfbec3496e01bb9a65 + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f languageName: node linkType: hard -"gettext-parser@npm:^1.3.1": - version: 1.4.0 - resolution: "gettext-parser@npm:1.4.0" - dependencies: - encoding: "npm:^0.1.12" - safe-buffer: "npm:^5.1.1" - checksum: 10c0/c498f38346f5d8dce4731ee4577df4d7e349c808820542be8ccf706a6dae0c8e2cd18505d6cc574e108695963066d3d67d324b88630b3149f96b46078e6b9980 +"json5@npm:^2.1.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c languageName: node linkType: hard -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee +"jsonc-parser@npm:^3.2.0": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 languageName: node linkType: hard -"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 +"jsonc-parser@npm:~3.0.0": + version: 3.0.0 + resolution: "jsonc-parser@npm:3.0.0" + checksum: 10c0/373632ab71f773ce6081dd70297c40fbb05aacde07ab8a5852c78c0a13d1fadb7ad886202e87bfc0168dd78568cda2d4eb36e785dac330f93e5e772d7a67f33f languageName: node linkType: hard -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.10 - resolution: "glob@npm:10.3.10" +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.5" - minimatch: "npm:^9.0.1" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry: "npm:^1.10.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.2.0": - version: 7.2.3 - resolution: "glob@npm:7.2.3" +"keyv@npm:^5.2.3": + version: 5.2.3 + resolution: "keyv@npm:5.2.3" dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + "@keyv/serialize": "npm:^1.0.2" + checksum: 10c0/76b87dd2c21a4c1c5c05e9ff3b85670beab98f153429aaa9aee544b72b65411a7d80d96c29f3fef3e9dcebb672c8268e7209d6f80beb5da939b4e019722948b4 languageName: node linkType: hard -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" +"kind-of@npm:^2.0.1": + version: 2.0.1 + resolution: "kind-of@npm:2.0.1" dependencies: - global-prefix: "npm:^3.0.0" - checksum: 10c0/43b770fe24aa6028f4b9770ea583a47f39750be15cf6e2578f851e4ccc9e4fa674b8541928c0b09c21461ca0763f0d36e4068cec86c914b07fd6e388e66ba5b9 + is-buffer: "npm:^1.0.2" + checksum: 10c0/71bcf16b2dc3b8126fabcba6cdfa52dfb145d738a627108e6deadefc63a1f8b010c64572de534ece75bdd8f4097fe4cea2581d80b84ade5a797236c459ce3f0d languageName: node linkType: hard -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" +"kind-of@npm:^3.0.2": + version: 3.2.2 + resolution: "kind-of@npm:3.2.2" dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 10c0/510f489fb68d1cc7060f276541709a0ee6d41356ef852de48f7906c648ac223082a1cc8fce86725ca6c0e032bcdc1189ae77b4744a624b29c34a9d0ece498269 + is-buffer: "npm:^1.1.5" + checksum: 10c0/7e34bc29d4b02c997f92f080de34ebb92033a96736bbb0bb2410e033a7e5ae6571f1fa37b2d7710018f95361473b816c604234197f4f203f9cf149d8ef1574d9 languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 +"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 languageName: node linkType: hard -"globals@npm:^13.12.0, globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10c0/fc05e184b3be59bffa2580f28551a12a758c3a18df4be91444202982c76f13f52821ad54ffaf7d3f2a4d2498fdf54aeaca8d4540fd9e860a9edb09d34ef4c507 +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b languageName: node linkType: hard -"globalthis@npm:^1.0.3": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" - dependencies: - define-properties: "npm:^1.1.3" - checksum: 10c0/0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 +"klona@npm:^2.0.5": + version: 2.0.6 + resolution: "klona@npm:2.0.6" + checksum: 10c0/94eed2c6c2ce99f409df9186a96340558897b3e62a85afdc1ee39103954d2ebe1c1c4e9fe2b0952771771fa96d70055ede8b27962a7021406374fdb695fd4d01 languageName: node linkType: hard -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.2.9" - ignore: "npm:^5.2.0" - merge2: "npm:^1.4.1" - slash: "npm:^3.0.0" - checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 +"known-css-properties@npm:^0.35.0": + version: 0.35.0 + resolution: "known-css-properties@npm:0.35.0" + checksum: 10c0/04a4a2859d62670bb25b5b28091a1f03f6f0d3298a5ed3e7476397c5287b98c434f6dd9c004a0c67a53b7f21acc93f83c972e98c122f568d4d0bd21fd2b90fb6 languageName: node linkType: hard -"globby@npm:^13.1.1": - version: 13.2.2 - resolution: "globby@npm:13.2.2" - dependencies: - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.3.0" - ignore: "npm:^5.2.4" - merge2: "npm:^1.4.1" - slash: "npm:^4.0.0" - checksum: 10c0/a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 +"language-subtag-registry@npm:^0.3.20": + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 10c0/e9b05190421d2cd36dd6c95c28673019c927947cb6d94f40ba7e77a838629ee9675c94accf897fbebb07923187deb843b8fbb8935762df6edafe6c28dcb0b86c languageName: node linkType: hard -"globjoin@npm:^0.1.4": - version: 0.1.4 - resolution: "globjoin@npm:0.1.4" - checksum: 10c0/236e991b48f1a9869fe2aa7bb5141fb1f32973940567a3c012f8ccb58c3c85ab78ce594d374fa819410fff3b48cfd24584d7ef726939f8a3c3772890e62ea16b +"language-tags@npm:^1.0.9": + version: 1.0.9 + resolution: "language-tags@npm:1.0.9" + dependencies: + language-subtag-registry: "npm:^0.3.20" + checksum: 10c0/9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" +"launch-editor@npm:^2.6.0": + version: 2.9.1 + resolution: "launch-editor@npm:2.9.1" dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + picocolors: "npm:^1.0.0" + shell-quote: "npm:^1.8.1" + checksum: 10c0/891f1d136ed8e4ea12e16c196a0d2e07f23c7b983e3ab532b2be1775fb244909581507cce97c50f9d5ca92680b53e4a75c72ddcf20184aa6c4da6ebbe87703f5 languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 +"lazy-cache@npm:^0.2.3": + version: 0.2.7 + resolution: "lazy-cache@npm:0.2.7" + checksum: 10c0/7aa1a9197a1c6a67fa5c33f6fc8057d405d9168f115205e0398a661faf28b20aad0d33c19c143dc5f9485fd735387613b48f2e989ef325e3db9f05f4518acf9b languageName: node linkType: hard -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 +"lazy-cache@npm:^1.0.3": + version: 1.0.4 + resolution: "lazy-cache@npm:1.0.4" + checksum: 10c0/00f4868a27dc5c491ad86f46068d19bc97c0402d6c7c1449a977fade8ce667d4723beac8e12fdb1d6237156dd25ab0d3c963422bdfcbc76fd25941bfe3c6f015 languageName: node linkType: hard -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 10c0/febc3343a1ad575aedcc112580835b44a89a89e01f400b4eda6e8110869edfdab0b00cd1bd4c3bfec9475a57e79e0b355aecd5be46454b6a62b9a359af60e564 +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 +"lib0@npm:^0.2.42, lib0@npm:^0.2.74, lib0@npm:^0.2.85, lib0@npm:^0.2.99": + version: 0.2.99 + resolution: "lib0@npm:0.2.99" + dependencies: + isomorphic.js: "npm:^0.2.4" + bin: + 0ecdsa-generate-keypair: bin/0ecdsa-generate-keypair.js + 0gentesthtml: bin/gentesthtml.js + 0serve: bin/0serve.js + checksum: 10c0/24f914e5ab025a3e647396a22dcdb748754a9ce9eb1b98ac9a51e4a25d589c4382c82dda8330252c77f2755288097ccb3654e34eb03b1ae957422f8ebeae04d2 languageName: node linkType: hard -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 +"lie@npm:3.1.1": + version: 3.1.1 + resolution: "lie@npm:3.1.1" + dependencies: + immediate: "npm:~3.0.5" + checksum: 10c0/d62685786590351b8e407814acdd89efe1cb136f05cb9236c5a97b2efdca1f631d2997310ad2d565c753db7596799870140e4777c9c9b8c44a0f6bf42d1804a1 languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.1 - resolution: "has-property-descriptors@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.2.2" - checksum: 10c0/d62ba94b40150b00d621bc64a6aedb5bf0ee495308b4b7ed6bac856043db3cdfb1db553ae81cec91c9d2bd82057ff0e94145e7fa25d5aa5985ed32e0921927f6 +"lighthouse-logger@npm:^2.0.1": + version: 2.0.1 + resolution: "lighthouse-logger@npm:2.0.1" + dependencies: + debug: "npm:^2.6.9" + marky: "npm:^1.2.2" + checksum: 10c0/414743d9b1491ad127c78741edfe88bd1c2411b267274c973036b90f56a268c3b8c3e02498bce04b560083da34a149bc3f81d2c47b6c6ad592202354cf781c43 + languageName: node + linkType: hard + +"lighthouse-stack-packs@npm:1.12.2": + version: 1.12.2 + resolution: "lighthouse-stack-packs@npm:1.12.2" + checksum: 10c0/34fb78127792a2036f560f446b28ce2446712e4a18e8036971c80f30127150ef1a85b2cef1713110da52bbc8c526742b8165e517330755e3a94598c1a2bc3eba + languageName: node + linkType: hard + +"lighthouse@npm:^12.2.2": + version: 12.3.0 + resolution: "lighthouse@npm:12.3.0" + dependencies: + "@paulirish/trace_engine": "npm:0.0.39" + "@sentry/node": "npm:^7.0.0" + axe-core: "npm:^4.10.2" + chrome-launcher: "npm:^1.1.2" + configstore: "npm:^5.0.1" + csp_evaluator: "npm:1.1.1" + devtools-protocol: "npm:0.0.1312386" + enquirer: "npm:^2.3.6" + http-link-header: "npm:^1.1.1" + intl-messageformat: "npm:^10.5.3" + jpeg-js: "npm:^0.4.4" + js-library-detector: "npm:^6.7.0" + lighthouse-logger: "npm:^2.0.1" + lighthouse-stack-packs: "npm:1.12.2" + lodash-es: "npm:^4.17.21" + lookup-closest-locale: "npm:6.2.0" + metaviewport-parser: "npm:0.3.0" + open: "npm:^8.4.0" + parse-cache-control: "npm:1.0.1" + puppeteer-core: "npm:^23.10.4" + robots-parser: "npm:^3.0.1" + semver: "npm:^5.3.0" + speedline-core: "npm:^1.4.3" + third-party-web: "npm:^0.26.1" + tldts-icann: "npm:^6.1.16" + ws: "npm:^7.0.0" + yargs: "npm:^17.3.1" + yargs-parser: "npm:^21.0.0" + bin: + chrome-debug: core/scripts/manual-chrome-launcher.js + lighthouse: cli/index.js + smokehouse: cli/test/smokehouse/frontends/smokehouse-bin.js + checksum: 10c0/a4e8bac599594f317a04a3f18b6e8d1eb8ca6536c325dbb6dd53613b7f707968b793454a337cbd7ea999c6746fea1a3842155c43c3e84c360f28bb5ea9a6a92d languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: 10c0/c8a8fe411f810b23a564bd5546a8f3f0fff6f1b692740eb7a2fdc9df716ef870040806891e2f23ff4653f1083e3895bf12088703dd1a0eac3d9202d3a4768cd0 +"lilconfig@npm:^3.1.1": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 10c0/f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 +"line-height@npm:^0.3.1": + version: 0.3.1 + resolution: "line-height@npm:0.3.1" + dependencies: + computed-style: "npm:~0.1.3" + checksum: 10c0/b9cab3ce23dfdb2a036cc45dc3adec118aef66efa56de90598e09c7dcac5bedd98c4631d9b4603b2028aad54f7ec18b862774d150b94686814c7da3db1391061 languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" - dependencies: - has-symbols: "npm:^1.0.2" - checksum: 10c0/1cdba76b7d13f65198a92b8ca1560ba40edfa09e85d182bf436d928f3588a9ebd260451d569f0ed1b849c4bf54f49c862aa0d0a77f9552b1855bb6deb526c011 +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d languageName: node linkType: hard -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" +"linkify-it@npm:^3.0.1": + version: 3.0.3 + resolution: "linkify-it@npm:3.0.3" dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc + uc.micro: "npm:^1.0.1" + checksum: 10c0/468cb4954f85cdfc16e169db89a42d65287e3f121a9448b29c3c00d64c6f5a8f4367bea3978ba9109a0e3a10b19d50632b983639f91b9be9f20d1f63a5ff5bc1 languageName: node linkType: hard -"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1, hoist-non-react-statics@npm:^3.3.2": - version: 3.3.2 - resolution: "hoist-non-react-statics@npm:3.3.2" - dependencies: - react-is: "npm:^16.7.0" - checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 languageName: node linkType: hard -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" +"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" dependencies: - lru-cache: "npm:^6.0.0" - checksum: 10c0/150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^2.1.2" + checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 languageName: node linkType: hard -"html-tags@npm:^3.3.1": - version: 3.3.1 - resolution: "html-tags@npm:3.3.1" - checksum: 10c0/680165e12baa51bad7397452d247dbcc5a5c29dac0e6754b1187eee3bf26f514bc1907a431dd2f7eb56207611ae595ee76a0acc8eaa0d931e72c791dd6463d79 +"localforage@npm:^1.8.1": + version: 1.10.0 + resolution: "localforage@npm:1.10.0" + dependencies: + lie: "npm:3.1.1" + checksum: 10c0/00f19f1f97002e6721587ed5017f502d58faf80dae567d5065d4d1ee0caf0762f40d2e2dba7f0ef7d3f14ee6203242daae9ecad97359bfc10ecff36df11d85a3 languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc +"locate-path@npm:^3.0.0": + version: 3.0.0 + resolution: "locate-path@npm:3.0.0" + dependencies: + p-locate: "npm:^3.0.0" + path-exists: "npm:^3.0.0" + checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "http-proxy-agent@npm:7.0.0" +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": - version: 7.0.2 - resolution: "https-proxy-agent@npm:7.0.2" +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10c0/7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 languageName: node linkType: hard -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 languageName: node linkType: hard -"human-signals@npm:^4.3.0": - version: 4.3.1 - resolution: "human-signals@npm:4.3.1" - checksum: 10c0/40498b33fe139f5cc4ef5d2f95eb1803d6318ac1b1c63eaf14eeed5484d26332c828de4a5a05676b6c83d7b9e57727c59addb4b1dea19cb8d71e83689e5b336c +"lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 10c0/fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 languageName: node linkType: hard -"humanity-theme@workspace:.": - version: 0.0.0-use.local - resolution: "humanity-theme@workspace:." - dependencies: - "@babel/cli": "npm:^7.16.0" - "@babel/core": "npm:^7.16.0" - "@babel/eslint-parser": "npm:^7.16.3" - "@babel/plugin-proposal-pipeline-operator": "npm:^7.16.0" - "@babel/plugin-transform-class-properties": "npm:^7.23.3" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" - "@babel/preset-env": "npm:^7.16.8" - "@babel/preset-react": "npm:^7.16.7" - "@braintree/sanitize-url": "npm:^7.0.1" - "@wordpress/eslint-plugin": "npm:^17.4.0" - "@wordpress/i18n": "npm:^4.2.4" - autoprefixer: "npm:^10.4.0" - babel-loader: "npm:^9.1.0" - classnames: "npm:^2.3.1" - copy-webpack-plugin: "npm:^11.0.0" - core-js: "npm:^3.19.1" - css-loader: "npm:^6.8.1" - css-vars-ponyfill: "npm:^2.4.7" - delegate: "npm:^3.2.0" - esbuild-loader: "npm:^4.0.2" - eslint: "npm:^8.3.0" - eslint-config-airbnb-base: "npm:^15.0.0" - eslint-config-prettier: "npm:^9.1.0" - eslint-plugin-import: "npm:^2.25.3" - eslint-plugin-prettier: "npm:^5.0.1" - eslint-plugin-react: "npm:^7.28.0" - eslint-plugin-react-hooks: "npm:^4.3.0" - eslint-webpack-plugin: "npm:^4.0.1" - expose-loader: "npm:^4.0.0" - file-loader: "npm:^6.2.0" - flickity: "npm:^2.2.2" - flickity-as-nav-for: "npm:^2.0.1" - intersection-observer: "npm:^0.12.0" - js-cookie: "npm:^3.0.1" - memize: "npm:^1.1.0" - mini-css-extract-plugin: "npm:^2.4.5" - node-normalize-scss: "npm:^8.1.2" - object-fit-images: "npm:^3.2.4" - postcss: "npm:^8.4.32" - postcss-banner: "npm:^4.0.1" - postcss-loader: "npm:^7.0.1" - postcss-pxtorem: "npm:^6.0.0" - postcss-reporter: "npm:^7.0.4" - postcss-scss: "npm:^4.0.3" - prettier: "npm:^3.1.0" - react: "npm:^18" - react-beautiful-dnd: "npm:^13.1.0" - react-dom: "npm:^18" - react-select: "npm:^5.7.2" - resolve-url-loader: "npm:^5.0.0" - sass: "npm:^1.62.1" - sass-loader: "npm:^13.2.2" - sass-mq: "npm:^6.0.0" - style-loader: "npm:^3.3.1" - stylelint: "npm:^15.11.0" - stylelint-config-recommended-scss: "npm:^13.1.0" - stylelint-scss: "npm:^5.3.1" - stylelint-webpack-plugin: "npm:^4.1.1" - typescript: "npm:^5.3.2" - webpack: "npm:^5.94.0" - webpack-cli: "npm:^5.0.0" - languageName: unknown - linkType: soft - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 +"lodash.debounce@npm:^4.0.8": + version: 4.0.8 + resolution: "lodash.debounce@npm:4.0.8" + checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 languageName: node linkType: hard -"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": - version: 5.1.0 - resolution: "icss-utils@npm:5.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.0 - resolution: "ignore@npm:5.3.0" - checksum: 10c0/dc06bea5c23aae65d0725a957a0638b57e235ae4568dda51ca142053ed2c352de7e3bc93a69b2b32ac31966a1952e9a93c5ef2e2ab7c6b06aef9808f6b55b571 +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 languageName: node linkType: hard -"immutable@npm:^4.0.0": - version: 4.3.4 - resolution: "immutable@npm:4.3.4" - checksum: 10c0/c15b9f0fa7b3c9315725cb00704fddad59f0e668a7379c39b9a528a8386140ee9effb015ae51a5b423e05c59d15fc0b38c970db6964ad6b3e05d0761db68441f +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: 10c0/4e870d54e8a6c86c8687e057cec4069d2e941446ccab7f40b4d9555fa5872d917d0b6aa73bece7765500a3123f1723bcdba9ae881b679ef120bba9e1a0b0ed70 languageName: node linkType: hard -"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e languageName: node linkType: hard -"import-lazy@npm:^4.0.0": - version: 4.0.0 - resolution: "import-lazy@npm:4.0.0" - checksum: 10c0/a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca +"lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" dependencies: - pkg-dir: "npm:^4.2.0" - resolve-cwd: "npm:^3.0.0" - bin: - import-local-fixture: fixtures/cli.js - checksum: 10c0/c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2 + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 languageName: node linkType: hard -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 +"loglevel@npm:^1.9.2": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7 languageName: node linkType: hard -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f +"lookup-closest-locale@npm:6.2.0": + version: 6.2.0 + resolution: "lookup-closest-locale@npm:6.2.0" + checksum: 10c0/e9b48a011300a4e052b697453115fee0b551820afbf5cd4a71647d5be570e9f67a60a28be8afc6c2d6213d9c4bc154d42bf656f9ca1d7ba18e90a3706a3fdf26 languageName: node linkType: hard -"indent-string@npm:^5.0.0": - version: 5.0.0 - resolution: "indent-string@npm:5.0.0" - checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e languageName: node linkType: hard -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + tslib: "npm:^2.0.3" + checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b languageName: node linkType: hard -"inherits@npm:2": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb languageName: node linkType: hard -"ini@npm:^1.3.5": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 languageName: node linkType: hard -"internal-slot@npm:^1.0.5": - version: 1.0.6 - resolution: "internal-slot@npm:1.0.6" +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" dependencies: - get-intrinsic: "npm:^1.2.2" - hasown: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10c0/aa37cafc8ffbf513a340de58f40d5017b4949d99722d7e4f0e24b182455bdd258000d4bb1d7b4adcf9f8979b97049b99fe9defa9db8e18a78071d2637ac143fb + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 languageName: node linkType: hard -"interpret@npm:^3.1.1": - version: 3.1.1 - resolution: "interpret@npm:3.1.1" - checksum: 10c0/6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 +"lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed languageName: node linkType: hard -"intersection-observer@npm:^0.12.0": - version: 0.12.2 - resolution: "intersection-observer@npm:0.12.2" - checksum: 10c0/9591f46b2b742f5801ed69dbc8860f487771b4af8361e7a5dcb28a377beff2ba56336a2b090af261825430d225dae9417121496d2e6925e000e4a469958843ff +"make-dir@npm:^3.0.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: "npm:^6.0.0" + checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + semver: "npm:^7.5.3" + checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.0" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/40ed13a5f5746ac3ae2f2e463687d9b5a3f5fd0086f970fb4898f0253c2a5ec2e3caea2d664dd8f54761b1c1948609702416921a22faebe160c7640a9217c80e + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 languageName: node linkType: hard -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c languageName: node linkType: hard -"is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: 10c0/ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: "npm:^1.0.1" - checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: 10c0/1c19e1c88513c8abdab25c316367154c6a0a6a0f77e3e8c391bb7c0e093aefed293f539d026dc013d86219e5e4c25f23b0003ea588be2101ccd757bacc12d43b languageName: node linkType: hard -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" +"map-values@npm:^1.0.1": + version: 1.0.1 + resolution: "map-values@npm:1.0.1" + checksum: 10c0/a1e2a4fe64f60e43c6f6508e872a081651544fd654b643ffcbdd2cae72611af1f6e4dfb51484fe3e802db4eb5f340cab4022b9b86075136801e9d1db45053b40 + languageName: node + linkType: hard + +"markdown-it@npm:12.3.2": + version: 12.3.2 + resolution: "markdown-it@npm:12.3.2" dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + argparse: "npm:^2.0.1" + entities: "npm:~2.1.0" + linkify-it: "npm:^3.0.1" + mdurl: "npm:^1.0.1" + uc.micro: "npm:^1.0.5" + bin: + markdown-it: bin/markdown-it.js + checksum: 10c0/7f97b924e6f90e2c5ccdfb486a19bd7885b938f568a86b527bf6f916a16b01a298e6739f86a99e77acb5e7c020f6c8b34bd726364179b3f820e48b2971a6450c languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"markdownlint-cli@npm:^0.31.1": + version: 0.31.1 + resolution: "markdownlint-cli@npm:0.31.1" dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + commander: "npm:~9.0.0" + get-stdin: "npm:~9.0.0" + glob: "npm:~7.2.0" + ignore: "npm:~5.2.0" + js-yaml: "npm:^4.1.0" + jsonc-parser: "npm:~3.0.0" + markdownlint: "npm:~0.25.1" + markdownlint-rule-helpers: "npm:~0.16.0" + minimatch: "npm:~3.0.5" + run-con: "npm:~1.2.10" + bin: + markdownlint: markdownlint.js + checksum: 10c0/d0991fa0ab11cda30ec8697026da2aa7f98e5162b009980951ff49230fc7cd8e5bc5663cda4b77e0f4a23925409c69d7985a0ba14b4c2b40f54189a540130d72 languageName: node linkType: hard -"is-builtin-module@npm:^3.2.1": - version: 3.2.1 - resolution: "is-builtin-module@npm:3.2.1" +"markdownlint-rule-helpers@npm:~0.16.0": + version: 0.16.0 + resolution: "markdownlint-rule-helpers@npm:0.16.0" + checksum: 10c0/accae2686b8b9137e5b857d61b4801496e75a86682e92ce36815ac25bb18896dffb5c02be0f26652d90682f49fa366e22d628bae09796d2e17f5b104777a157e + languageName: node + linkType: hard + +"markdownlint@npm:~0.25.1": + version: 0.25.1 + resolution: "markdownlint@npm:0.25.1" dependencies: - builtin-modules: "npm:^3.3.0" - checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + markdown-it: "npm:12.3.2" + checksum: 10c0/4932eccd2b69259619a4c9e65fd2e100008554343c83be5aaab294ba90ca5859e87f29ffbdb7cedcc113bb7db9dad7f6e56b714a763732448f044ae777d844e6 languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f +"marky@npm:^1.2.2": + version: 1.2.5 + resolution: "marky@npm:1.2.5" + checksum: 10c0/ca8a011f287dab1ac3291df720fc32b366c4cd767347b63722966650405ce71ec6566f71d1e22e1768bf6461a7fd689b9038e7df0fcfb62eacf3a5a6dcac249e languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" - dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e +"mathml-tag-names@npm:^2.1.3": + version: 2.1.3 + resolution: "mathml-tag-names@npm:2.1.3" + checksum: 10c0/e2b094658a2618433efd2678a5a3e551645e09ba17c7c777783cd8dfa0178b0195fda0a5c46a6be5e778923662cf8dde891c894c869ff14fbb4ea3208c31bc4d languageName: node linkType: hard -"is-docker@npm:^2.0.0": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc +"mdn-data@npm:2.0.28": + version: 2.0.28 + resolution: "mdn-data@npm:2.0.28" + checksum: 10c0/20000932bc4cd1cde9cba4e23f08cc4f816398af4c15ec81040ed25421d6bf07b5cf6b17095972577fb498988f40f4cb589e3169b9357bb436a12d8e07e5ea7b languageName: node linkType: hard -"is-docker@npm:^3.0.0": - version: 3.0.0 - resolution: "is-docker@npm:3.0.0" - bin: - is-docker: cli.js - checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: 10c0/a2c472ea16cee3911ae742593715aa4c634eb3d4b9f1e6ada0902aa90df13dcbb7285d19435f3ff213ebaa3b2e0c0265c1eb0e3fb278fda7f8919f046a410cd9 languageName: node linkType: hard -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 +"mdn-data@npm:2.12.2": + version: 2.12.2 + resolution: "mdn-data@npm:2.12.2" + checksum: 10c0/b22443b71d70f72ccc3c6ba1608035431a8fc18c3c8fc53523f06d20e05c2ac10f9b53092759a2ca85cf02f0d37036f310b581ce03e7b99ac74d388ef8152ade languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 +"mdn-data@npm:^2.14.0": + version: 2.15.0 + resolution: "mdn-data@npm:2.15.0" + checksum: 10c0/8a0c83198b013d43c2c43bd19c38d44e397b3fe097d269fa3c093d8c112acf12d0be4d892ba50a4802cccb91dd4f720218a66e675150ea2cc3d8aa0d32247e76 languageName: node linkType: hard -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc +"mdurl@npm:^1.0.1": + version: 1.0.1 + resolution: "mdurl@npm:1.0.1" + checksum: 10c0/ea8534341eb002aaa532a722daef6074cd8ca66202e10a2b4cda46722c1ebdb1da92197ac300bc953d3ef1bf41cd6561ef2cc69d82d5d0237dae00d4a61a4eee languageName: node linkType: hard -"is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" +"memfs@npm:^3.4.3": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + fs-monkey: "npm:^1.0.4" + checksum: 10c0/038fc81bce17ea92dde15aaa68fa0fdaf4960c721ce3ffc7c2cb87a259333f5159784ea48b3b72bf9e054254d9d0d0d5209d0fdc3d07d08653a09933b168fbd7 languageName: node linkType: hard -"is-inside-container@npm:^1.0.0": - version: 1.0.0 - resolution: "is-inside-container@npm:1.0.0" - dependencies: - is-docker: "npm:^3.0.0" - bin: - is-inside-container: cli.js - checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd +"memize@npm:^2.0.1, memize@npm:^2.1.0": + version: 2.1.0 + resolution: "memize@npm:2.1.0" + checksum: 10c0/31259bdc943a08e2cc6483ef60b53460050d131cd68302a1e550fe39bb46ebcf77a80103ca14fa4ec74eca2463bda81c3460b908427c246d7e72ac8c39debcd7 languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d +"memoize-one@npm:^6.0.0": + version: 6.0.0 + resolution: "memoize-one@npm:6.0.0" + checksum: 10c0/45c88e064fd715166619af72e8cf8a7a17224d6edf61f7a8633d740ed8c8c0558a4373876c9b8ffc5518c2b65a960266adf403cc215cb1e90f7e262b58991f54 languageName: node linkType: hard -"is-map@npm:^2.0.1": - version: 2.0.2 - resolution: "is-map@npm:2.0.2" - checksum: 10c0/119ff9137a37fd131a72fab3f4ab8c9d6a24b0a1ee26b4eff14dc625900d8675a97785eea5f4174265e2006ed076cc24e89f6e57ebd080a48338d914ec9168a5 +"meow@npm:^13.2.0": + version: 13.2.0 + resolution: "meow@npm:13.2.0" + checksum: 10c0/d5b339ae314715bcd0b619dd2f8a266891928e21526b4800d49b4fba1cc3fff7e2c1ff5edd3344149fac841bc2306157f858e8c4d5eaee4d52ce52ad925664ce languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: 10c0/eda024c158f70f2017f3415e471b818d314da5ef5be68f801b16314d4a4b6304a74cbed778acf9e2f955bb9c1c5f2935c1be0c7c99e1ad12286f45366217b6a3 +"meow@npm:^9.0.0": + version: 9.0.0 + resolution: "meow@npm:9.0.0" + dependencies: + "@types/minimist": "npm:^1.2.0" + camelcase-keys: "npm:^6.2.2" + decamelize: "npm:^1.2.0" + decamelize-keys: "npm:^1.1.0" + hard-rejection: "npm:^2.1.0" + minimist-options: "npm:4.1.0" + normalize-package-data: "npm:^3.0.0" + read-pkg-up: "npm:^7.0.1" + redent: "npm:^3.0.0" + trim-newlines: "npm:^3.0.0" + type-fest: "npm:^0.18.0" + yargs-parser: "npm:^20.2.3" + checksum: 10c0/998955ecff999dc3f3867ef3b51999218212497f27d75b9cbe10bdb73aac4ee308d484f7801fd1b3cfa4172819065f65f076ca018c1412fab19d0ea486648722 languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"merge-deep@npm:^3.0.3": + version: 3.0.3 + resolution: "merge-deep@npm:3.0.3" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + arr-union: "npm:^3.1.0" + clone-deep: "npm:^0.2.4" + kind-of: "npm:^3.0.2" + checksum: 10c0/c74aec17754d7fefde98b45f2e4c0e0a072d9893418dfd52f90763d9c5bd4631fb2e9feb8aa52d8ca018c8f5427b4727bf50f3169078455f4df5c7fdcedaa6cf languageName: node linkType: hard -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 languageName: node linkType: hard -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb languageName: node linkType: hard -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: "npm:^3.0.1" - checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 +"metaviewport-parser@npm:0.3.0": + version: 0.3.0 + resolution: "metaviewport-parser@npm:0.3.0" + checksum: 10c0/c6bd79013449a4f3d6697c8b931f4c6655c140f42b56e761aff221a506ac6d3aac6b590e845f6a4101877b6b89ef57f08523b49d94236cadba7f9d5d97d27271 languageName: node linkType: hard -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 languageName: node linkType: hard -"is-set@npm:^2.0.1": - version: 2.0.2 - resolution: "is-set@npm:2.0.2" - checksum: 10c0/5f8bd1880df8c0004ce694e315e6e1e47a3452014be792880bb274a3b2cdb952fdb60789636ca6e084c7947ca8b7ae03ccaf54c93a7fcfed228af810559e5432 +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" +"mime-db@npm:>= 1.43.0 < 2": + version: 1.53.0 + resolution: "mime-db@npm:1.53.0" + checksum: 10c0/1dcc37ba8ed5d1c179f5c6f0837e8db19371d5f2ea3690c3c2f3fa8c3858f976851d3460b172b4dee78ebd606762cbb407aa398545fbacd539e519f858cd7bf4 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/cfeee6f171f1b13e6cbc6f3b6cc44e192b93df39f3fcb31aa66ffb1d2df3b91e05664311659f9701baba62f5e98c83b0673c628e7adc30f55071c4874fcdccec + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 languageName: node linkType: hard -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 languageName: node linkType: hard -"is-stream@npm:^3.0.0": +"mime@npm:^3.0.0": version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 10c0/eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: 10c0/402e792a8df1b2cc41cb77f0dcc46472b7944b7ec29cb5bbcd398624b6b97096728f1239766d3fdeb20551dd8d94738344c195a6ea10c4f906eb0356323b0531 languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: "npm:^1.0.2" - checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: 10c0/7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": - version: 1.1.12 - resolution: "is-typed-array@npm:1.1.12" +"mini-css-extract-plugin@npm:^2.9.2": + version: 2.9.2 + resolution: "mini-css-extract-plugin@npm:2.9.2" dependencies: - which-typed-array: "npm:^1.1.11" - checksum: 10c0/9863e9cc7223c6fc1c462a2c3898a7beff6b41b1ee0fabb03b7d278ae7de670b5bcbc8627db56bb66ed60902fa37d53fe5cce0fd2f7d73ac64fe5da6f409b6ae + schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/5d3218dbd7db48b572925ddac05162a7415bf81b321f1a0c07016ec643cb5720c8a836ae68d45f5de826097a3013b601706c9c5aacb7f610dc2041b271de2ce0 languageName: node linkType: hard -"is-weakmap@npm:^2.0.1": - version: 2.0.1 - resolution: "is-weakmap@npm:2.0.1" - checksum: 10c0/9c9fec9efa7bf5030a4a927f33fff2a6976b93646259f92b517d3646c073cc5b98283a162ce75c412b060a46de07032444b530f0a4c9b6e012ef8f1741c3a987 +"minimalistic-assert@npm:^1.0.0": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + brace-expansion: "npm:^2.0.1" + checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac languageName: node linkType: hard -"is-weakset@npm:^2.0.1": - version: 2.0.2 - resolution: "is-weakset@npm:2.0.2" +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.1" - checksum: 10c0/ef5136bd446ae4603229b897f73efd0720c6ab3ec6cc05c8d5c4b51aa9f95164713c4cad0a22ff1fedf04865ff86cae4648bc1d5eead4b6388e1150525af1cc1 + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 languageName: node linkType: hard -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: - is-docker: "npm:^2.0.0" - checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed languageName: node linkType: hard -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d +"minimatch@npm:~3.0.5": + version: 3.0.8 + resolution: "minimatch@npm:3.0.8" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/72b226f452dcfb5075255f53534cb83fc25565b909e79b9be4fad463d735cb1084827f7013ff41d050e77ee6e474408c6073473edd2fb72c2fd630cfb0acc6ad languageName: node linkType: hard -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: "npm:^1.0.1" + is-plain-obj: "npm:^1.1.0" + kind-of: "npm:^6.0.3" + checksum: 10c0/7871f9cdd15d1e7374e5b013e2ceda3d327a06a8c7b38ae16d9ef941e07d985e952c589e57213f7aa90a8744c60aed9524c0d85e501f5478382d9181f2763f54 languageName: node linkType: hard -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db +"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 languageName: node linkType: hard -"iterator.prototype@npm:^1.1.2": - version: 1.1.2 - resolution: "iterator.prototype@npm:1.1.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - define-properties: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - reflect.getprototypeof: "npm:^1.0.4" - set-function-name: "npm:^2.0.1" - checksum: 10c0/a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79 + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e languageName: node linkType: hard -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" dependenciesMeta: - "@pkgjs/parseargs": + encoding: optional: true - checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b languageName: node linkType: hard -"jest-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-util@npm:29.7.0" +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd languageName: node linkType: hard -"jest-worker@npm:^27.4.5": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" dependencies: - "@types/node": "npm:*" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 languageName: node linkType: hard -"jest-worker@npm:^29.5.0": - version: 29.7.0 - resolution: "jest-worker@npm:29.7.0" +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" dependencies: - "@types/node": "npm:*" - jest-util: "npm:^29.7.0" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c languageName: node linkType: hard -"jiti@npm:^1.18.2": - version: 1.21.0 - resolution: "jiti@npm:1.21.0" - bin: - jiti: bin/jiti.js - checksum: 10c0/7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 languageName: node linkType: hard -"js-cookie@npm:^3.0.1": - version: 3.0.5 - resolution: "js-cookie@npm:3.0.5" - checksum: 10c0/04a0e560407b4489daac3a63e231d35f4e86f78bff9d792011391b49c59f721b513411cd75714c418049c8dc9750b20fcddad1ca5a2ca616c3aca4874cce5b3a +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 languageName: node linkType: hard -"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed +"mitt@npm:3.0.1": + version: 3.0.1 + resolution: "mitt@npm:3.0.1" + checksum: 10c0/3ab4fdecf3be8c5255536faa07064d05caa3dd332bd318ff02e04621f7b3069ca1de9106cfe8e7ced675abfc2bec2ce4c4ef321c4a1bb1fb29df8ae090741913 languageName: node linkType: hard -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" +"mixin-object@npm:^2.0.1": + version: 2.0.1 + resolution: "mixin-object@npm:2.0.1" dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + for-in: "npm:^0.1.3" + is-extendable: "npm:^0.1.1" + checksum: 10c0/ae04f7830457deb5eb5be952c8373f8e49ca76a784d71e71bcca3fec0bad95fee31e501592208e42e1afdb3e271139628ded3b0471a9d33c162d7b0883e6010a languageName: node linkType: hard -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d languageName: node linkType: hard -"jsdoc-type-pratt-parser@npm:~4.0.0": - version: 4.0.0 - resolution: "jsdoc-type-pratt-parser@npm:4.0.0" - checksum: 10c0/b23ef7bbbe2f56d72630d1c5a233dc9fecaff399063d373c57bef136908c1b05e723dac107177303c03ccf8d75aa51507510b282aa567600477479c5ea0c36d1 +"moment-timezone@npm:^0.5.40": + version: 0.5.46 + resolution: "moment-timezone@npm:0.5.46" + dependencies: + moment: "npm:^2.29.4" + checksum: 10c0/003fd278d1aa3e63afff340a318735db80157b7a343e3f807cac10e026def214f0e71b52d582b89a11ee0a19f5d9f0da2752b7959d855429f2b715d4859d3722 languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 +"moment@npm:^2.29.4": + version: 2.30.1 + resolution: "moment@npm:2.30.1" + checksum: 10c0/865e4279418c6de666fca7786607705fd0189d8a7b7624e2e56be99290ac846f90878a6f602e34b4e0455c549b85385b1baf9966845962b313699e7cb847543a languageName: node linkType: hard -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 +"motion-dom@npm:^11.16.4": + version: 11.16.4 + resolution: "motion-dom@npm:11.16.4" + dependencies: + motion-utils: "npm:^11.16.0" + checksum: 10c0/66de6d40aef59d3004aaf17e39c7c2d2c679306207fdb28c73917d6a05e8c962747fea53d2e516c25d994109d38e127943a759fed18a0fadfc2572a3335fc0d2 languageName: node linkType: hard -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 +"motion-utils@npm:^11.16.0": + version: 11.16.0 + resolution: "motion-utils@npm:11.16.0" + checksum: 10c0/e68efa08b9546a2fb065537cedcbab1a416d43cdc5773e02ea01408c276e56bbea9ef76d330e80d8536a6ac585b0bbb6f4f2b9d97637d8d36418483e4492ddff languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 +"mousetrap@npm:^1.6.5": + version: 1.6.5 + resolution: "mousetrap@npm:1.6.5" + checksum: 10c0/5c361bdbbff3966fd58d70f39b9fe1f8e32c78f3ce65989d83af7aad32a3a95313ce835a8dd8a55cb5de9eeb7c1f0c2b9048631a3073b5606241589e8fc0ba53 languageName: node linkType: hard -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce +"mrmime@npm:^2.0.0": + version: 2.0.0 + resolution: "mrmime@npm:2.0.0" + checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c languageName: node linkType: hard -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d languageName: node linkType: hard -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard -"json5@npm:^1.0.2": - version: 1.0.2 - resolution: "json5@npm:1.0.2" +"multicast-dns@npm:^7.2.5": + version: 7.2.5 + resolution: "multicast-dns@npm:7.2.5" dependencies: - minimist: "npm:^1.2.0" + dns-packet: "npm:^5.2.2" + thunky: "npm:^1.0.2" bin: - json5: lib/cli.js - checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f + multicast-dns: cli.js + checksum: 10c0/5120171d4bdb1577764c5afa96e413353bff530d1b37081cb29cccc747f989eb1baf40574fe8e27060fc1aef72b59c042f72b9b208413de33bcf411343c69057 languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" +"nanoid@npm:^3.3.8": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + nanoid: bin/nanoid.cjs + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": - version: 3.3.5 - resolution: "jsx-ast-utils@npm:3.3.5" - dependencies: - array-includes: "npm:^3.1.6" - array.prototype.flat: "npm:^1.3.1" - object.assign: "npm:^4.1.4" - object.values: "npm:^1.1.6" - checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 languageName: node linkType: hard -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e +"negotiator@npm:0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 languageName: node linkType: hard -"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b languageName: node linkType: hard -"known-css-properties@npm:^0.29.0": - version: 0.29.0 - resolution: "known-css-properties@npm:0.29.0" - checksum: 10c0/f66e9992097b8f54e97dbe729943d4a11b8d3ba15f68dbb3deb8bb0122cb89c22c90c9221ecb1e3f2e236838fe3c0faae319b43908c81b6e254ac43cafde2906 +"negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea languageName: node linkType: hard -"language-subtag-registry@npm:^0.3.20": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 10c0/d1e09971260a7cd3b9fdeb190d33af0b6e99c8697013537d9aaa15f7856d9d83aee128ba8078e219df0a7cf4b8dd18d1a0c188f6543b500d92a2689d2d114b70 +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d languageName: node linkType: hard -"language-tags@npm:^1.0.9": - version: 1.0.9 - resolution: "language-tags@npm:1.0.9" - dependencies: - language-subtag-registry: "npm:^0.3.20" - checksum: 10c0/9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff +"netmask@npm:^2.0.2": + version: 2.0.2 + resolution: "netmask@npm:2.0.2" + checksum: 10c0/cafd28388e698e1138ace947929f842944d0f1c0b87d3fa2601a61b38dc89397d33c0ce2c8e7b99e968584b91d15f6810b91bef3f3826adf71b1833b61d4bf4f languageName: node linkType: hard -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" dependencies: - prelude-ls: "npm:^1.2.1" - type-check: "npm:~0.4.0" - checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 languageName: node linkType: hard -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 languageName: node linkType: hard -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 +"node-forge@npm:^1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 10c0/e882819b251a4321f9fc1d67c85d1501d3004b4ee889af822fd07f64de3d1a8e272ff00b689570af0465d65d6bf5074df9c76e900e0aff23e60b847f2a46fbe8 languageName: node linkType: hard -"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" +"node-gyp@npm:latest": + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^2.1.2" - checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 languageName: node linkType: hard -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a + languageName: node + linkType: hard + +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" dependencies: - p-locate: "npm:^4.1.0" - checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/19cb986f79abaca2d0f0b560021da7b32ee6fcc3de48f3eaeb0c324d36755c17754f886a754c091f01f740c17caf7d6aea8237b7fbaf39f476ae5e30a249f18f languageName: node linkType: hard -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" dependencies: - p-locate: "npm:^5.0.0" - checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 languageName: node linkType: hard -"locate-path@npm:^7.1.0": - version: 7.2.0 - resolution: "locate-path@npm:7.2.0" +"normalize-package-data@npm:^3.0.0": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" dependencies: - p-locate: "npm:^6.0.0" - checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + hosted-git-info: "npm:^4.0.1" + is-core-module: "npm:^2.5.0" + semver: "npm:^7.3.4" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/e5d0f739ba2c465d41f77c9d950e291ea4af78f8816ddb91c5da62257c40b76d8c83278b0d08ffbcd0f187636ebddad20e181e924873916d03e6e5ea2ef026be languageName: node linkType: hard -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 languageName: node linkType: hard -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 +"normalize-range@npm:^0.1.2": + version: 0.1.2 + resolution: "normalize-range@npm:0.1.2" + checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 languageName: node linkType: hard -"lodash.truncate@npm:^4.4.2": - version: 4.4.2 - resolution: "lodash.truncate@npm:4.4.2" - checksum: 10c0/4e870d54e8a6c86c8687e057cec4069d2e941446ccab7f40b4d9555fa5872d917d0b6aa73bece7765500a3123f1723bcdba9ae881b679ef120bba9e1a0b0ed70 +"normalize-wheel@npm:^1.0.1": + version: 1.0.1 + resolution: "normalize-wheel@npm:1.0.1" + checksum: 10c0/5daf4c97e39f36658a5263a6499bbc148676ae2bd85f12c8d03c46ffe7bc3c68d44564c00413d88d0457ac0d94450559bb1c24c2ce7ae0c107031f82d093ac06 languageName: node linkType: hard -"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" +"npm-bundled@npm:^1.1.1": + version: 1.1.2 + resolution: "npm-bundled@npm:1.1.2" dependencies: - js-tokens: "npm:^3.0.0 || ^4.0.0" - bin: - loose-envify: cli.js - checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + npm-normalize-package-bin: "npm:^1.0.1" + checksum: 10c0/3f2337789afc8cb608a0dd71cefe459531053d48a5497db14b07b985c4cab15afcae88600db9f92eae072c89b982eeeec8e4463e1d77bc03a7e90f5dacf29769 languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.1.0 - resolution: "lru-cache@npm:10.1.0" - checksum: 10c0/778bc8b2626daccd75f24c4b4d10632496e21ba064b126f526c626fbdbc5b28c472013fccd45d7646b9e1ef052444824854aed617b59cd570d01a8b7d651fc1e +"npm-normalize-package-bin@npm:^1.0.1": + version: 1.0.1 + resolution: "npm-normalize-package-bin@npm:1.0.1" + checksum: 10c0/b0c8c05fe419a122e0ff970ccbe7874ae24b4b4b08941a24d18097fe6e1f4b93e3f6abfb5512f9c5488827a5592f2fb3ce2431c41d338802aed24b9a0c160551 languageName: node linkType: hard -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" +"npm-package-json-lint@npm:^6.4.0": + version: 6.4.0 + resolution: "npm-package-json-lint@npm:6.4.0" dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + ajv: "npm:^6.12.6" + ajv-errors: "npm:^1.0.1" + chalk: "npm:^4.1.2" + cosmiconfig: "npm:^8.0.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + ignore: "npm:^5.2.0" + is-plain-obj: "npm:^3.0.0" + jsonc-parser: "npm:^3.2.0" + log-symbols: "npm:^4.1.0" + meow: "npm:^9.0.0" + plur: "npm:^4.0.0" + semver: "npm:^7.3.8" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + type-fest: "npm:^3.2.0" + validate-npm-package-name: "npm:^5.0.0" + bin: + npmPkgJsonLint: dist/cli.js + checksum: 10c0/3258a8a67a2251fe40198320cd97412a0d41994273f7c53da7caf039a1df521458aa5f512ff43be860d433aaeab28f29e437022bd34b71f524dccb0bc5b2acde languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" +"npm-packlist@npm:^3.0.0": + version: 3.0.0 + resolution: "npm-packlist@npm:3.0.0" dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + glob: "npm:^7.1.6" + ignore-walk: "npm:^4.0.1" + npm-bundled: "npm:^1.1.1" + npm-normalize-package-bin: "npm:^1.0.1" + bin: + npm-packlist: bin/index.js + checksum: 10c0/88d6c56beee05d0541314813959ea52250f5e9d44cc79854a066d955b204a2c838c66f39f0819f60dd233f8ecb8f10d59ca6bf39464c2f02ecba9de9af128099 languageName: node linkType: hard -"make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" dependencies: - pify: "npm:^4.0.1" - semver: "npm:^5.6.0" - checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.0 - resolution: "make-fetch-happen@npm:13.0.0" +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 + boolbase: "npm:^1.0.0" + checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 + languageName: node + linkType: hard + +"nwsapi@npm:^2.2.2": + version: 2.2.16 + resolution: "nwsapi@npm:2.2.16" + checksum: 10c0/0aa0637f4d51043d0183d994e08336bae996b03b42984381bf09ebdf3ff4909c018eda6b2a8aba0a08f3ea8303db8a0dad0608b38dc0bff15fd87017286ae21a + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 languageName: node linkType: hard -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 10c0/ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 +"object-filter@npm:^1.0.2": + version: 1.0.2 + resolution: "object-filter@npm:1.0.2" + checksum: 10c0/15ce6852c1826db20b7c65ddc7519ce76f9cf06b1cf5140b49a2d06b265ab897692cfc90627c0a907f4d1e8fd0c1fe6d36e20931d4ced5e2e30c49451b7d4b70 languageName: node linkType: hard -"map-obj@npm:^4.1.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: 10c0/1c19e1c88513c8abdab25c316367154c6a0a6a0f77e3e8c391bb7c0e093aefed293f539d026dc013d86219e5e4c25f23b0003ea588be2101ccd757bacc12d43b +"object-inspect@npm:^1.13.3": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 languageName: node linkType: hard -"mathml-tag-names@npm:^2.1.3": - version: 2.1.3 - resolution: "mathml-tag-names@npm:2.1.3" - checksum: 10c0/e2b094658a2618433efd2678a5a3e551645e09ba17c7c777783cd8dfa0178b0195fda0a5c46a6be5e778923662cf8dde891c894c869ff14fbb4ea3208c31bc4d +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d languageName: node linkType: hard -"mdn-data@npm:2.0.30": - version: 2.0.30 - resolution: "mdn-data@npm:2.0.30" - checksum: 10c0/a2c472ea16cee3911ae742593715aa4c634eb3d4b9f1e6ada0902aa90df13dcbb7285d19435f3ff213ebaa3b2e0c0265c1eb0e3fb278fda7f8919f046a410cd9 +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc languageName: node linkType: hard -"memize@npm:^1.1.0": - version: 1.1.0 - resolution: "memize@npm:1.1.0" - checksum: 10c0/3900a074751edac0363a8e80c27a35570855342ba900b75bfd8872611d3b68a84c253adfffda4bbe397ed7005a815ac5d01d5bc12b15fd525038ae174d2aecff +"object.entries@npm:^1.1.5, object.entries@npm:^1.1.8": + version: 1.1.8 + resolution: "object.entries@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/db9ea979d2956a3bc26c262da4a4d212d36f374652cc4c13efdd069c1a519c16571c137e2893d1c46e1cb0e15c88fd6419eaf410c945f329f09835487d7e65d3 languageName: node linkType: hard -"memize@npm:^2.1.0": - version: 2.1.0 - resolution: "memize@npm:2.1.0" - checksum: 10c0/31259bdc943a08e2cc6483ef60b53460050d131cd68302a1e550fe39bb46ebcf77a80103ca14fa4ec74eca2463bda81c3460b908427c246d7e72ac8c39debcd7 +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b languageName: node linkType: hard -"memoize-one@npm:^5.1.1": - version: 5.2.1 - resolution: "memoize-one@npm:5.2.1" - checksum: 10c0/fd22dbe9a978a2b4f30d6a491fc02fb90792432ad0dab840dc96c1734d2bd7c9cdeb6a26130ec60507eb43230559523615873168bcbe8fafab221c30b11d54c1 +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10c0/60d0455c85c736fbfeda0217d1a77525956f76f7b2495edeca9e9bbf8168a45783199e77b894d30638837c654d0cc410e0e02cbfcf445bc8de71c3da1ede6a9c languageName: node linkType: hard -"memoize-one@npm:^6.0.0": - version: 6.0.0 - resolution: "memoize-one@npm:6.0.0" - checksum: 10c0/45c88e064fd715166619af72e8cf8a7a17224d6edf61f7a8633d740ed8c8c0558a4373876c9b8ffc5518c2b65a960266adf403cc215cb1e90f7e262b58991f54 +"object.values@npm:^1.1.6, object.values@npm:^1.2.0, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 languageName: node linkType: hard -"meow@npm:^10.1.5": - version: 10.1.5 - resolution: "meow@npm:10.1.5" - dependencies: - "@types/minimist": "npm:^1.2.2" - camelcase-keys: "npm:^7.0.0" - decamelize: "npm:^5.0.0" - decamelize-keys: "npm:^1.1.0" - hard-rejection: "npm:^2.1.0" - minimist-options: "npm:4.1.0" - normalize-package-data: "npm:^3.0.2" - read-pkg-up: "npm:^8.0.0" - redent: "npm:^4.0.0" - trim-newlines: "npm:^4.0.2" - type-fest: "npm:^1.2.2" - yargs-parser: "npm:^20.2.9" - checksum: 10c0/a513849022edd5ddcc41d28c679d31978abe414d9db5bc457e95e537a4327b2910fd2f699cdd883293f9a5da8951a50939bf60fbd62f7fe12b9ddf96a84b1b27 +"obuf@npm:^1.0.0, obuf@npm:^1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 languageName: node linkType: hard -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb +"on-headers@npm:~1.0.2": + version: 1.0.2 + resolution: "on-headers@npm:1.0.2" + checksum: 10c0/f649e65c197bf31505a4c0444875db0258e198292f34b884d73c2f751e91792ef96bb5cf89aa0f4fecc2e4dc662461dda606b1274b0e564f539cae5d2f5fc32f languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 languageName: node linkType: hard -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f languageName: node linkType: hard -"mime-types@npm:^2.1.27": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" +"open@npm:^8.0.9, open@npm:^8.4.0": + version: 8.4.2 + resolution: "open@npm:8.4.2" dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + define-lazy-prop: "npm:^2.0.0" + is-docker: "npm:^2.1.1" + is-wsl: "npm:^2.2.0" + checksum: 10c0/bb6b3a58401dacdb0aad14360626faf3fb7fba4b77816b373495988b724fb48941cad80c1b65d62bb31a17609b2cd91c41a181602caea597ca80dfbcc27e84c9 languageName: node linkType: hard -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 languageName: node linkType: hard -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 languageName: node linkType: hard -"min-indent@npm:^1.0.1": - version: 1.0.1 - resolution: "min-indent@npm:1.0.1" - checksum: 10c0/7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c +"os-homedir@npm:^1.0.1": + version: 1.0.2 + resolution: "os-homedir@npm:1.0.2" + checksum: 10c0/6be4aa67317ee247b8d46142e243fb4ef1d2d65d3067f54bfc5079257a2f4d4d76b2da78cba7af3cb3f56dbb2e4202e0c47f26171d11ca1ed4008d842c90363f languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.4.5": - version: 2.7.6 - resolution: "mini-css-extract-plugin@npm:2.7.6" +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" dependencies: - schema-utils: "npm:^4.0.0" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/4862da928f52c18b37daa52d548c9f2a1ac65c900a48b63f7faa3354d8cfcd21618c049696559e73e2e27fc12d46748e6a490e0b885e54276429607d0d08c156 + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a languageName: node linkType: hard -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" +"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a languageName: node linkType: hard -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" dependencies: - arrify: "npm:^1.0.1" - is-plain-obj: "npm:^1.1.0" - kind-of: "npm:^6.0.3" - checksum: 10c0/7871f9cdd15d1e7374e5b013e2ceda3d327a06a8c7b38ae16d9ef941e07d985e952c589e57213f7aa90a8744c60aed9524c0d85e501f5478382d9181f2763f54 + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 +"p-locate@npm:^3.0.0": + version: 3.0.0 + resolution: "p-locate@npm:3.0.0" + dependencies: + p-limit: "npm:^2.0.0" + checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 languageName: node linkType: hard -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a languageName: node linkType: hard -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 languageName: node linkType: hard -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 +"p-map@npm:^2.0.0": + version: 2.1.0 + resolution: "p-map@npm:2.1.0" + checksum: 10c0/735dae87badd4737a2dd582b6d8f93e49a1b79eabbc9815a4d63a528d5e3523e978e127a21d784cccb637010e32103a40d2aaa3ab23ae60250b1a820ca752043 languageName: node linkType: hard -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c languageName: node linkType: hard -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" +"p-retry@npm:^4.5.0": + version: 4.6.2 + resolution: "p-retry@npm:4.6.2" dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + "@types/retry": "npm:0.12.0" + retry: "npm:^0.13.1" + checksum: 10c0/d58512f120f1590cfedb4c2e0c42cb3fa66f3cea8a4646632fcb834c56055bb7a6f138aa57b20cc236fb207c9d694e362e0b5c2b14d9b062f67e8925580c73b0 languageName: node linkType: hard -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 10c0/6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 +"pac-proxy-agent@npm:^7.1.0": + version: 7.1.0 + resolution: "pac-proxy-agent@npm:7.1.0" + dependencies: + "@tootallnate/quickjs-emscripten": "npm:^0.23.0" + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + get-uri: "npm:^6.0.1" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.6" + pac-resolver: "npm:^7.0.1" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10c0/072528e3e7a0bb1187d5c09687a112ae230f6fa0d974e7460eaa0c1406666930ed53ffadfbfadfe8e1c7a8cc8d6ae26a4db96e27723d40a918c8454f0f1a012a languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" +"pac-resolver@npm:^7.0.1": + version: 7.0.1 + resolution: "pac-resolver@npm:7.0.1" dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + degenerator: "npm:^5.0.0" + netmask: "npm:^2.0.2" + checksum: 10c0/5f3edd1dd10fded31e7d1f95776442c3ee51aa098c28b74ede4927d9677ebe7cebb2636750c24e945f5b84445e41ae39093d3a1014a994e5ceb9f0b1b88ebff5 languageName: node linkType: hard -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 languageName: node linkType: hard -"ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 languageName: node linkType: hard -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 +"parse-cache-control@npm:1.0.1": + version: 1.0.1 + resolution: "parse-cache-control@npm:1.0.1" + checksum: 10c0/330a0d9e3a22a7b0f6e8a973c0b9f51275642ee28544cd0d546420273946d555d20a5c7b49fca24d68d2e698bae0186f0f41f48d62133d3153c32454db05f2df languageName: node linkType: hard -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 languageName: node linkType: hard -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 +"parse-passwd@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-passwd@npm:1.0.0" + checksum: 10c0/1c05c05f95f184ab9ca604841d78e4fe3294d46b8e3641d305dcc28e930da0e14e602dbda9f3811cd48df5b0e2e27dbef7357bf0d7c40e41b18c11c3a8b8d17b languageName: node linkType: hard -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.2.1 + resolution: "parse5@npm:7.2.1" + dependencies: + entities: "npm:^4.5.0" + checksum: 10c0/829d37a0c709215a887e410a7118d754f8e1afd7edb529db95bc7bbf8045fb0266a7b67801331d8e8d9d073ea75793624ec27ce9ff3b96862c3b9008f4d68e80 languageName: node linkType: hard -"node-gyp@npm:latest": - version: 10.0.1 - resolution: "node-gyp@npm:10.0.1" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" - semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa +"parsel-js@npm:^1.1.2": + version: 1.2.1 + resolution: "parsel-js@npm:1.2.1" + checksum: 10c0/f5daf5bc9058d10c4101c0bb126d1e3af8a148757d22e475f520c4e5d970fe884b053e62c15e0730e140751897da79d7dbb577d61691062bd6bdedc5fc18282d + languageName: node + linkType: hard + +"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 languageName: node linkType: hard -"node-normalize-scss@npm:^8.1.2": - version: 8.1.2 - resolution: "node-normalize-scss@npm:8.1.2" +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" dependencies: - normalize.css: "npm:^8.0.1" - checksum: 10c0/2c4481018476b809c0cf41f3df0545088768163c6f1ace2e84e866584c196b4b34ce3372773250bc3fd46ccfd0e3f2ec2c505599cbcff047d8079565b143bc85 + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 +"path-case@npm:^3.0.4": + version: 3.0.4 + resolution: "path-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/b6b14637228a558793f603aaeb2fcd981e738b8b9319421b713532fba96d75aa94024b9f6b9ae5aa33d86755144a5b36697d28db62ae45527dbd672fcc2cf0b7 languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.0 - resolution: "nopt@npm:7.2.0" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 languageName: node linkType: hard -"normalize-package-data@npm:^3.0.2": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: "npm:^4.0.1" - is-core-module: "npm:^2.5.0" - semver: "npm:^7.3.4" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/e5d0f739ba2c465d41f77c9d950e291ea4af78f8816ddb91c5da62257c40b76d8c83278b0d08ffbcd0f187636ebddad20e181e924873916d03e6e5ea2ef026be +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a languageName: node linkType: hard -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 languageName: node linkType: hard -"normalize.css@npm:^8.0.1": - version: 8.0.1 - resolution: "normalize.css@npm:8.0.1" - checksum: 10c0/4ddf56d1af5ca755fa5e692e718316d8758ecb792aa96e1ad206824b5810a043763d681d6f7697d46573515f5e9690038b4c91a95c1997567128815545fb8cd7 +"path-is-inside@npm:^1.0.2": + version: 1.0.2 + resolution: "path-is-inside@npm:1.0.2" + checksum: 10c0/7fdd4b41672c70461cce734fc222b33e7b447fa489c7c4377c95e7e6852d83d69741f307d88ec0cc3b385b41cb4accc6efac3c7c511cd18512e95424f5fa980c languageName: node linkType: hard -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": - version: 5.1.0 - resolution: "npm-run-path@npm:5.1.0" +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: - path-key: "npm:^4.0.0" - checksum: 10c0/ff6d77514489f47fa1c3b1311d09cd4b6d09a874cc1866260f9dea12cbaabda0436ed7f8c2ee44d147bf99a3af29307c6f63b0f83d242b0b6b0ab25dff2629e3 + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d languageName: node linkType: hard -"object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 +"path-to-regexp@npm:0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b languageName: node linkType: hard -"object-fit-images@npm:^3.2.4": - version: 3.2.4 - resolution: "object-fit-images@npm:3.2.4" - checksum: 10c0/cf8f53e0783e761fda1ef4321237c82007694fab8869569faaf87d1059e87dfcd325f1396ca6b8e9ec0660c17c69f6219d34c9db5127094545eea5a0670dd46e +"path-to-regexp@npm:^6.2.1": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c languageName: node linkType: hard -"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 languageName: node linkType: hard -"object-keys@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.1": version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard -"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" - dependencies: - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - object-keys: "npm:^1.1.1" - checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be languageName: node linkType: hard -"object.entries@npm:^1.1.5, object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": - version: 1.1.7 - resolution: "object.entries@npm:1.1.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/3ad1899cc7bf14546bf28f4a9b363ae8690b90948fcfbcac4c808395435d760f26193d9cae95337ce0e3c1e5c1f4fa45f7b46b31b68d389e9e117fce38775d86 +"pify@npm:^2.0.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc languageName: node linkType: hard -"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": - version: 2.0.7 - resolution: "object.fromentries@npm:2.0.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/071745c21f6fc9e6c914691f2532c1fb60ad967e5ddc52801d09958b5de926566299d07ae14466452a7efd29015f9145d6c09c573d93a0dc6f1683ee0ec2b93b +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf languageName: node linkType: hard -"object.groupby@npm:^1.0.1": - version: 1.0.1 - resolution: "object.groupby@npm:1.0.1" +"pinkie-promise@npm:^2.0.0": + version: 2.0.1 + resolution: "pinkie-promise@npm:2.0.1" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/61e41fbf08cc04ed860363db9629eedeaa590fce243c0960e948fd7b11f78a9d4350065c339936d118a2dd8775d7259e26207340cc8ce688bec66cb615fec6fe + pinkie: "npm:^2.0.0" + checksum: 10c0/11b5e5ce2b090c573f8fad7b517cbca1bb9a247587306f05ae71aef6f9b2cd2b923c304aa9663c2409cfde27b367286179f1379bc4ec18a3fbf2bb0d473b160a languageName: node linkType: hard -"object.hasown@npm:^1.1.2": - version: 1.1.3 - resolution: "object.hasown@npm:1.1.3" - dependencies: - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/8a41ba4fb1208a85c2275e9b5098071beacc24345b9a71ab98ef0a1c61b34dc74c6b460ff1e1884c33843d8f2553df64a10eec2b74b3ed009e3b2710c826bd2c +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: 10c0/25228b08b5597da42dc384221aa0ce56ee0fbf32965db12ba838e2a9ca0193c2f0609c45551ee077ccd2060bf109137fdb185b00c6d7e0ed7e35006d20fdcbc6 languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.1.7": - version: 1.1.7 - resolution: "object.values@npm:1.1.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/e869d6a37fb7afdd0054dea49036d6ccebb84854a8848a093bbd1bc516f53e690bba88f0bc3e83fdfa74c601469ee6989c9b13359cda9604144c6e732fad3b6b +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 languageName: node linkType: hard -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 languageName: node linkType: hard -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + find-up: "npm:^6.3.0" + checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 languageName: node linkType: hard -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 10c0/4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c +"playwright-core@npm:1.49.1": + version: 1.49.1 + resolution: "playwright-core@npm:1.49.1" + bin: + playwright-core: cli.js + checksum: 10c0/990b619c75715cd98b2c10c1180a126e3a454b247063b8352bc67792fe01183ec07f31d30c8714c3768cefed12886d1d64ac06da701f2baafc2cad9b439e3919 languageName: node linkType: hard -"open@npm:^9.1.0": - version: 9.1.0 - resolution: "open@npm:9.1.0" +"playwright@npm:1.49.1": + version: 1.49.1 + resolution: "playwright@npm:1.49.1" dependencies: - default-browser: "npm:^4.0.0" - define-lazy-prop: "npm:^3.0.0" - is-inside-container: "npm:^1.0.0" - is-wsl: "npm:^2.2.0" - checksum: 10c0/8073ec0dd8994a7a7d9bac208bd17d093993a65ce10f2eb9b62b6d3a91c9366ae903938a237c275493c130171d339f6dcbdd2a2de7e32953452c0867b97825af + fsevents: "npm:2.3.2" + playwright-core: "npm:1.49.1" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 10c0/2368762c898920d4a0a5788b153dead45f9c36c3f5cf4d2af5228d0b8ea65823e3bbe998877950a2b9bb23a211e4633996f854c6188769dc81a25543ac818ab5 languageName: node linkType: hard -"optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" +"plur@npm:^4.0.0": + version: 4.0.0 + resolution: "plur@npm:4.0.0" dependencies: - "@aashutoshrathi/word-wrap": "npm:^1.2.3" - deep-is: "npm:^0.1.3" - fast-levenshtein: "npm:^2.0.6" - levn: "npm:^0.4.1" - prelude-ls: "npm:^1.2.1" - type-check: "npm:^0.4.0" - checksum: 10c0/66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c + irregular-plurals: "npm:^3.2.0" + checksum: 10c0/4d3010843dac60b980c9b83d4cdecc2c6bb4bf0a1d7620ba7229b5badcbc3c3767fddfdb61746f6253c3bd33ada3523375983cbe0b3f94868f4a475b9b6bd7d7 languageName: node linkType: hard -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd languageName: node linkType: hard -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" +"postcss-calc@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-calc@npm:9.0.1" dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + postcss-selector-parser: "npm:^6.0.11" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.2 + checksum: 10c0/e0df07337162dbcaac5d6e030c7fd289e21da8766a9daca5d6b2b3c8094bb524ae5d74c70048ea7fe5fe4960ce048c60ac97922d917c3bbff34f58e9d2b0eb0e languageName: node linkType: hard -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" +"postcss-colormin@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-colormin@npm:6.1.0" dependencies: - yocto-queue: "npm:^1.0.0" - checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + colord: "npm:^2.9.3" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/0802963fa0d8f2fe408b2e088117670f5303c69a58c135f0ecf0e5ceff69e95e87111b22c4e29c9adb2f69aa8d3bc175f4e8e8708eeb99c9ffc36c17064de427 languageName: node linkType: hard -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" +"postcss-convert-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-convert-values@npm:6.1.0" dependencies: - p-limit: "npm:^2.2.0" - checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + browserslist: "npm:^4.23.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/a80066965cb58fe8fcaf79f306b32c83fc678e1f0678e43f4db3e9fee06eed6db92cf30631ad348a17492769d44757400493c91a33ee865ee8dedea9234a11f5 languageName: node linkType: hard -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a +"postcss-discard-comments@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-comments@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/338a1fcba7e2314d956e5e5b9bd1e12e6541991bf85ac72aed6e229a029bf60edb31f11576b677623576169aa7d9c75e1be259ac7b50d0b735b841b5518f9da9 languageName: node linkType: hard -"p-locate@npm:^6.0.0": - version: 6.0.0 - resolution: "p-locate@npm:6.0.0" - dependencies: - p-limit: "npm:^4.0.0" - checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 +"postcss-discard-duplicates@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-duplicates@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/24d2f00e54668f2837eb38a64b1751d7a4a73b2752f9749e61eb728f1fae837984bc2b339f7f5207aff5f66f72551253489114b59b9ba21782072677a81d7d1b languageName: node linkType: hard -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" +"postcss-discard-empty@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-empty@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/1af08bb29f18eda41edf3602b257d89a4cf0a16f79fc773cfebd4a37251f8dbd9b77ac18efe55d0677d000b43a8adf2ef9328d31961c810e9433a38494a1fa65 + languageName: node + linkType: hard + +"postcss-discard-overridden@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-overridden@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/fda70ef3cd4cb508369c5bbbae44d7760c40ec9f2e65df1cd1b6e0314317fb1d25ae7f64987ca84e66889c1e9d1862487a6ce391c159dfe04d536597bfc5030d + languageName: node + linkType: hard + +"postcss-loader@npm:^6.2.1": + version: 6.2.1 + resolution: "postcss-loader@npm:6.2.1" dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + cosmiconfig: "npm:^7.0.0" + klona: "npm:^2.0.5" + semver: "npm:^7.3.5" + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + checksum: 10c0/736a1bf43a3e09e2351b5cc97cc26790a1c3261412c9dee063f3f6f2969a6ff7d8d194d9adcad01cee1afd1de071482318d9699e6157b67d46b3dccf3be1b58b languageName: node linkType: hard -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f +"postcss-media-query-parser@npm:^0.2.3": + version: 0.2.3 + resolution: "postcss-media-query-parser@npm:0.2.3" + checksum: 10c0/252c8cf24f0e9018516b0d70b7b3d6f5b52e81c4bab2164b49a4e4c1b87bb11f5dbe708c0076990665cb24c70d5fd2f3aee9c922b0f67c7c619e051801484688 languageName: node linkType: hard -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" +"postcss-merge-longhand@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-merge-longhand@npm:6.0.5" dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + postcss-value-parser: "npm:^4.2.0" + stylehacks: "npm:^6.1.1" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/5a223a7f698c05ab42e9997108a7ff27ea1e0c33a11a353d65a04fc89c3b5b750b9e749550d76b6406329117a055adfc79dde7fee48dca5c8e167a2854ae3fea languageName: node linkType: hard -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" +"postcss-merge-rules@npm:^6.1.1": + version: 6.1.1 + resolution: "postcss-merge-rules@npm:6.1.1" dependencies: - "@babel/code-frame": "npm:^7.0.0" - error-ex: "npm:^1.3.1" - json-parse-even-better-errors: "npm:^2.3.0" - lines-and-columns: "npm:^1.1.6" - checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + cssnano-utils: "npm:^4.0.2" + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/6d8952dbb19b1e59bf5affe0871fa1be6515103466857cff5af879d6cf619659f8642ec7a931cabb7cdbd393d8c1e91748bf70bee70fa3edea010d4e25786d04 languageName: node linkType: hard -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b +"postcss-minify-font-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-font-values@npm:6.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/0d6567170c22a7db42096b5eac298f041614890fbe01759a9fa5ccda432f2bb09efd399d92c11bf6675ae13ccd259db4602fad3c358317dee421df5f7ab0a003 languageName: node linkType: hard -"path-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "path-exists@npm:5.0.0" - checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a +"postcss-minify-gradients@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-gradients@npm:6.0.3" + dependencies: + colord: "npm:^2.9.3" + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/7fcbcec94fe5455b89fe1b424a451198e60e0407c894bbacdc062d9fdef2f8571b483b5c3bb17f22d2f1249431251b2de22e1e4e8b0614d10624f8ee6e71afd2 languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 +"postcss-minify-params@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-params@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/e5c38c3e5fb42e2ca165764f983716e57d854a63a477f7389ccc94cd2ab8123707006613bd7f29acc6eafd296fff513aa6d869c98ac52590f886d641cb21a59e languageName: node linkType: hard -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c +"postcss-minify-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-minify-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/695ec2e1e3a7812b0cabe1105d0ed491760be3d8e9433914fb5af1fc30a84e6dc24089cd31b7e300de620b8e7adf806526c1acf8dd14077a7d1d2820c60a327c languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 languageName: node linkType: hard -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/b0b83feb2a4b61f5383979d37f23116c99bc146eba1741ca3cf1acca0e4d0dbf293ac1810a6ab4eccbe1ee76440dd0a9eb2db5b3bba4f99fc1b3ded16baa6358 languageName: node linkType: hard -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" dependencies: - lru-cache: "npm:^9.1.1 || ^10.0.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b languageName: node linkType: hard -"path-type@npm:^4.0.0": +"postcss-modules-values@npm:^4.0.0": version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: "npm:^5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 +"postcss-normalize-charset@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-charset@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/af32a3b4cf94163d728b8aa935b2494c9f69fbc96a33b35f67ae15dbdef7fcc8732569df97cbaaf20ca6c0103c39adad0cfce2ba07ffed283796787f6c36f410 languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be +"postcss-normalize-display-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-display-values@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/782761850c7e697fdb6c3ff53076de716a71b60f9e835efb2f7ef238de347c88b5d55f0d43cf5c608e1ee58de65360e3d9fccd5f20774bba08ded7c87d8a5651 languageName: node linkType: hard -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf +"postcss-normalize-positions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-positions@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/9fdd42a47226bbda5f68774f3c4c3a90eb4fa708aef5a997c6a52fe6cac06585c9774038fe3bc1aa86a203c29223b8d8db6ebe7580c1aa293154f2b48db0b038 languageName: node linkType: hard -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" +"postcss-normalize-repeat-style@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-repeat-style@npm:6.0.2" dependencies: - find-up: "npm:^4.0.0" - checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/9133ccbdf1286920c1cd0d01c1c5fa0bd3251b717f2f3e47d691dcc44978ac1dc419d20d9ae5428bd48ee542059e66b823ba699356f5968ccced5606c7c7ca34 languageName: node linkType: hard -"pkg-dir@npm:^7.0.0": - version: 7.0.0 - resolution: "pkg-dir@npm:7.0.0" +"postcss-normalize-string@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-string@npm:6.0.2" dependencies: - find-up: "npm:^6.3.0" - checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/fecc2d52c4029b24fecf2ca2fb45df5dbdf9f35012194ad4ea80bc7be3252cdcb21a0976400902320595aa6178f2cc625cc804c6b6740aef6efa42105973a205 languageName: node linkType: hard -"postcss-banner@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-banner@npm:4.0.1" +"postcss-normalize-timing-functions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-timing-functions@npm:6.0.2" dependencies: - postcss: "npm:^8.2.2" - checksum: 10c0/cf4222a152876f8f3175354c2f1d2dc02c26cd0d9a8d09f585190b438d460630b6e2482fdb834129a5d677e2fa0129157c8ca8bb68831d28042e9289cc46bca4 + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/a22af0b3374704e59ae70bbbcc66b7029137e284f04e30a2ad548818d1540d6c1ed748dd8f689b9b6df5c1064085a00ad07b6f7e25ffaad49d4e661b616cdeae languageName: node linkType: hard -"postcss-loader@npm:^7.0.1": - version: 7.3.3 - resolution: "postcss-loader@npm:7.3.3" +"postcss-normalize-unicode@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-normalize-unicode@npm:6.1.0" dependencies: - cosmiconfig: "npm:^8.2.0" - jiti: "npm:^1.18.2" - semver: "npm:^7.3.8" + browserslist: "npm:^4.23.0" + postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - checksum: 10c0/d039654273f858be1f75dfdf8b550869d88905b73a7684b3e48a2937a6087619e84fd1a3551cdef78685a965a2573e985b29a532c3878d834071ecd2da0eb304 + postcss: ^8.4.31 + checksum: 10c0/ff5746670d94dd97b49a0955c3c71ff516fb4f54bbae257f877d179bacc44a62e50a0fd6e7ddf959f2ca35c335de4266b0c275d880bb57ad7827189339ab1582 languageName: node linkType: hard -"postcss-media-query-parser@npm:^0.2.3": - version: 0.2.3 - resolution: "postcss-media-query-parser@npm:0.2.3" - checksum: 10c0/252c8cf24f0e9018516b0d70b7b3d6f5b52e81c4bab2164b49a4e4c1b87bb11f5dbe708c0076990665cb24c70d5fd2f3aee9c922b0f67c7c619e051801484688 +"postcss-normalize-url@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-url@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/4718f1c0657788d2c560b340ee8e0a4eb3eb053eba6fbbf489e9a6e739b4c5f9ce1957f54bd03497c50a1f39962bf6ab9ff6ba4976b69dd160f6afd1670d69b7 languageName: node linkType: hard -"postcss-modules-extract-imports@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-extract-imports@npm:3.0.0" +"postcss-normalize-whitespace@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-whitespace@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/f8879d66d8162fb7a3fcd916d37574006c584ea509107b1cfb798a5e090175ef9470f601e46f0a305070d8ff2500e07489a5c1ac381c29a1dc1120e827ca7943 + postcss: ^8.4.31 + checksum: 10c0/d5275a88e29a894aeb83a2a833e816d2456dbf3f39961628df596ce205dcc4895186a023812ff691945e0804241ccc53e520d16591b5812288474b474bbaf652 languageName: node linkType: hard -"postcss-modules-local-by-default@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-modules-local-by-default@npm:4.0.3" +"postcss-ordered-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-ordered-values@npm:6.0.2" dependencies: - icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" - postcss-value-parser: "npm:^4.1.0" + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/be49b86efbfb921f42287e227584aac91af9826fc1083db04958ae283dfe215ca539421bfba71f9da0f0b10651f28e95a64b5faca7166f578a1933b8646051f7 + postcss: ^8.4.31 + checksum: 10c0/aece23a289228aa804217a85f8da198d22b9123f02ca1310b81834af380d6fbe115e4300683599b4a2ab7f1c6a1dbd6789724c47c38e2b0a3774f2ea4b4f0963 languageName: node linkType: hard -"postcss-modules-scope@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-scope@npm:3.0.0" - dependencies: - postcss-selector-parser: "npm:^6.0.4" +"postcss-prefix-selector@npm:^1.16.0": + version: 1.16.1 + resolution: "postcss-prefix-selector@npm:1.16.1" peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/60af503910363689568c2c3701cb019a61b58b3d739391145185eec211bea5d50ccb6ecbe6955b39d856088072fd50ea002e40a52b50e33b181ff5c41da0308a + postcss: ">4 <9" + checksum: 10c0/e72d3fc000252ce22d000e7de5b74b718fe794a191e79598634ba73bbff3f1493a877d04e7fbf649b79f7d47428741324c5b157cf946bb63328d5e9883cea14c languageName: node linkType: hard -"postcss-modules-values@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-modules-values@npm:4.0.0" +"postcss-pxtorem@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-pxtorem@npm:6.1.0" + peerDependencies: + postcss: ^8.0.0 + checksum: 10c0/dbf72b4683962ccff49033a25ad0c2e514f7a4a3a203d648314246d6a81b793912b3e00ff70f54da22774d032f4c4c109d6ffbb1f13c834c6cf483a5226bd5db + languageName: node + linkType: hard + +"postcss-reduce-initial@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-reduce-initial@npm:6.1.0" dependencies: - icss-utils: "npm:^5.0.0" + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc + postcss: ^8.4.31 + checksum: 10c0/a8f28cf51ce9a1b9423cce1a01c1d7cbee90125930ec36435a0073e73aef402d90affe2fd3600c964b679cf738869fda447b95a9acce74414e9d67d5c6ba8646 languageName: node linkType: hard -"postcss-pxtorem@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-pxtorem@npm:6.0.0" +"postcss-reduce-transforms@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-reduce-transforms@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.0.0 - checksum: 10c0/f7d31f08707fcb3c0c96043f39ead8ff085fc6599fd2ec74b54b71d64fcc338cb1d9dcac52487194e94a67df7ad72a7c4b0567ddb76cf152a244bfcc85c0555d + postcss: ^8.4.31 + checksum: 10c0/755ef27b3d083f586ac831f0c611a66e76f504d27e2100dc7674f6b86afad597901b4520cb889fe58ca70e852aa7fd0c0acb69a63d39dfe6a95860b472394e7c languageName: node linkType: hard -"postcss-reporter@npm:^7.0.4": - version: 7.0.5 - resolution: "postcss-reporter@npm:7.0.5" +"postcss-reporter@npm:^7.1.0": + version: 7.1.0 + resolution: "postcss-reporter@npm:7.1.0" dependencies: picocolors: "npm:^1.0.0" thenby: "npm:^1.3.4" peerDependencies: postcss: ^8.1.0 - checksum: 10c0/5bd96e9681b0f1a557dbd8e8e802c112a220cd93951b7a3c4ddfd90be8910a9001ebef0a16c277f93c37f6710c73aeb22698165f7ec17b0d76892a691ddb38a4 + checksum: 10c0/c58280a58efd689645a1e59e5cd31f9e8bebef0581177cbe0db23b52f2de5fdc60027ec2fa18d82f5d2d947058570f6e230dfdd88c70b0cedb45b708512f1931 languageName: node linkType: hard -"postcss-resolve-nested-selector@npm:^0.1.1": - version: 0.1.1 - resolution: "postcss-resolve-nested-selector@npm:0.1.1" - checksum: 10c0/e86412064c5d805fbee20f4e851395304102addd7d583b6a991adaa5616e8d5f45549864eb6292d4cf15075cd261c289f069acdf6a2556689fc44fe72bcb306e +"postcss-resolve-nested-selector@npm:^0.1.6": + version: 0.1.6 + resolution: "postcss-resolve-nested-selector@npm:0.1.6" + checksum: 10c0/84213a2bccce481b1569c595a3c547b25c6ef1cca839fbd6c82c12ab407559966e968613c7454b573aa54f38cfd7e900c1fd603f0efc9f51939ab9f93f115455 languageName: node linkType: hard -"postcss-safe-parser@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-safe-parser@npm:6.0.0" +"postcss-safe-parser@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-safe-parser@npm:7.0.1" peerDependencies: - postcss: ^8.3.3 - checksum: 10c0/5b0997b63de6ab4afb4b718a52dd7902e465c21d1f2e516762bcb59047787459b4dc5713132f6a19c9c8c483043b20b8a380a55fb61152ee66cbffcddf3b57f0 + postcss: ^8.4.31 + checksum: 10c0/6957b10b818bd8d4664ec0e548af967f7549abedfb37f844d389571d36af681340f41f9477b9ccf34bcc7599bdef222d1d72e79c64373001fae77089fba6d965 languageName: node linkType: hard -"postcss-scss@npm:^4.0.3, postcss-scss@npm:^4.0.9": +"postcss-scss@npm:^4.0.9": version: 4.0.9 resolution: "postcss-scss@npm:4.0.9" peerDependencies: @@ -7160,13 +14221,57 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.0.13 - resolution: "postcss-selector-parser@npm:6.0.13" +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.1.2": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/51f099b27f7c7198ea1826470ef0adfa58b3bd3f59b390fda123baa0134880a5fa9720137b6009c4c1373357b144f700b0edac73335d0067422063129371444e + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-selector-parser@npm:7.0.0" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/e96e096afcce70bf5c97789f5ea09d7415ae5eb701d82b05b5e8532885d31363b484fcb1ca9488c9a331f30508d9e5bb6c3109eb2eb5067ef3d3919f9928cd9d + languageName: node + linkType: hard + +"postcss-svgo@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-svgo@npm:6.0.3" + dependencies: + postcss-value-parser: "npm:^4.2.0" + svgo: "npm:^3.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/994b15a88cbb411f32cfa98957faa5623c76f2d75fede51f5f47238f06b367ebe59c204fecbdaf21ccb9e727239a4b290087e04c502392658a0c881ddfbd61f2 + languageName: node + linkType: hard + +"postcss-unique-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-unique-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/bfb99d8a7c675c93f2e65c9d9d563477bfd46fdce9e2727d42d57982b31ccbaaf944e8034bfbefe48b3119e77fba7eb1b181c19b91cb3a5448058fa66a7c9ae9 + languageName: node + linkType: hard + +"postcss-urlrebase@npm:^1.4.0": + version: 1.4.0 + resolution: "postcss-urlrebase@npm:1.4.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.3.0 + checksum: 10c0/8a60ca96269230dd3feb97af7ee4456a3fbddae0345155c8fe6e0142988da3899ff705a55caf0cc01ac70fda35f5c26864c1b9eea73d981fa6b297c0ca99b1f2 languageName: node linkType: hard @@ -7177,14 +14282,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.14, postcss@npm:^8.2.2, postcss@npm:^8.4.21, postcss@npm:^8.4.28, postcss@npm:^8.4.32": - version: 8.4.32 - resolution: "postcss@npm:8.4.32" +"postcss@npm:^8.4.21, postcss@npm:^8.4.33, postcss@npm:^8.4.49, postcss@npm:^8.4.5": + version: 8.5.1 + resolution: "postcss@npm:8.5.1" dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 10c0/39308a9195fa34d4dbdd7b58a896cff0c7809f84f7a4ac1b95b68ca86c9138a395addff33075668ed3983d41b90aac05754c445237a9365eb1c3a5602ebd03ad + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/c4d90c59c98e8a0c102b77d3f4cac190f883b42d63dc60e2f3ed840f16197c0c8e25a4327d2e9a847b45a985612317dc0534178feeebd0a1cf3eb0eecf75cae4 languageName: node linkType: hard @@ -7204,19 +14309,53 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.1.0": - version: 3.1.0 - resolution: "prettier@npm:3.1.0" +"prettier@npm:^3.4.2": + version: 3.4.2 + resolution: "prettier@npm:3.4.2" bin: prettier: bin/prettier.cjs - checksum: 10c0/a45ea70aa97fde162ea4c4aba3dfc7859aa6a732a1db34458d9535dc3c2c16d3bc3fb5689e6cd76aa835562555303b02d9449fd2e15af3b73c8053557e25c5b6 + checksum: 10c0/99e076a26ed0aba4ebc043880d0f08bbb8c59a4c6641cdee6cdadf2205bdd87aa1d7823f50c3aea41e015e99878d37c58d7b5f0e663bba0ef047f94e36b96446 languageName: node linkType: hard -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc +"prettier@npm:wp-prettier@3.0.3": + version: 3.0.3 + resolution: "wp-prettier@npm:3.0.3" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/a8026c481a9d7957826da0ab8bfa6d79032d159a0bb99a322a53962874913b08b9f0470803fc465da0a8287b78004079cba606fdcd89f3086edefd42de2a545c + languageName: node + linkType: hard + +"pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c languageName: node linkType: hard @@ -7230,7 +14369,17 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prompts@npm:^2.0.1, prompts@npm:^2.4.2": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + +"prop-types@npm:^15.5.6, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -7241,28 +14390,124 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + +"proxy-agent@npm:^6.5.0": + version: 6.5.0 + resolution: "proxy-agent@npm:6.5.0" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + http-proxy-agent: "npm:^7.0.1" + https-proxy-agent: "npm:^7.0.6" + lru-cache: "npm:^7.14.1" + pac-proxy-agent: "npm:^7.1.0" + proxy-from-env: "npm:^1.1.0" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10c0/7fd4e6f36bf17098a686d4aee3b8394abfc0b0537c2174ce96b0a4223198b9fafb16576c90108a3fcfc2af0168bd7747152bfa1f58e8fee91d3780e79aab7fd8 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"psl@npm:^1.1.33": + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/d8d45a99e4ca62ca12ac3c373e63d80d2368d38892daa40cfddaa1eb908be98cd549ac059783ef3a56cfd96d57ae8e2fd9ae53d1378d90d42bc661ff924e102a + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.2 + resolution: "pump@npm:3.0.2" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard -"queue-microtask@npm:^1.2.2": +"puppeteer-core@npm:^23.10.1, puppeteer-core@npm:^23.10.4": + version: 23.11.1 + resolution: "puppeteer-core@npm:23.11.1" + dependencies: + "@puppeteer/browsers": "npm:2.6.1" + chromium-bidi: "npm:0.11.0" + debug: "npm:^4.4.0" + devtools-protocol: "npm:0.0.1367902" + typed-query-selector: "npm:^2.12.0" + ws: "npm:^8.18.0" + checksum: 10c0/6512a3dca8c7bea620219332b84c4442754fead6c5021c26ea395ddc2f84610a54accf185ba1450e02885cb063c2d12f96eb5f18e7e1b6795f3e32a4b8a2102e + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 10c0/3258bc3dbdf322ff2663619afe5947c7926a6ef5fb78ad7d384602974c467fadfc8272af44f5eb8cddd0d011aae8fabf3a929a8eee4b86edcc0a21e6bd10f9aa + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 languageName: node linkType: hard -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da +"queue-tick@npm:^1.0.1": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 10c0/0db998e2c9b15215317dbcf801e9b23e6bcde4044e115155dae34f8e7454b9a783f737c9a725528d677b7a66c775eb7a955cf144fe0b87f62b575ce5bfd515a9 languageName: node linkType: hard -"raf-schd@npm:^4.0.2": +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: 10c0/f9b1596fa7595a35c2f9d913ac312fede13d37dc8a747a51557ab36e11ce113bbe88ef4c0154968845559a7709cb6a7e7cbe75f7972182451cd45e7f057a334d + languageName: node + linkType: hard + +"raf-schd@npm:^4.0.3": version: 4.0.3 resolution: "raf-schd@npm:4.0.3" checksum: 10c0/ecabf0957c05fad059779bddcd992f1a9d3a35dfea439a6f0935c382fcf4f7f7fa60489e467b4c2db357a3665167d2a379782586b59712bb36c766e02824709b @@ -7278,33 +14523,81 @@ __metadata: languageName: node linkType: hard -"react-beautiful-dnd@npm:^13.1.0": - version: 13.1.1 - resolution: "react-beautiful-dnd@npm:13.1.1" +"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" dependencies: - "@babel/runtime": "npm:^7.9.2" - css-box-model: "npm:^1.2.0" - memoize-one: "npm:^5.1.1" - raf-schd: "npm:^4.0.2" - react-redux: "npm:^7.2.0" - redux: "npm:^4.0.4" - use-memo-one: "npm:^1.1.1" + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 + languageName: node + linkType: hard + +"re-resizable@npm:^6.4.0": + version: 6.10.3 + resolution: "re-resizable@npm:6.10.3" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/f1ac57c8ffa5136ea55e9b8430ac34e287f2d1b6795a59b1c8f30bd3b2d7240d3155c10ad712fa1bb981556f418e8614ac2f6561c00831c404eca3ca4d856d54 + languageName: node + linkType: hard + +"react-autosize-textarea@npm:^7.1.0": + version: 7.1.0 + resolution: "react-autosize-textarea@npm:7.1.0" + dependencies: + autosize: "npm:^4.0.2" + line-height: "npm:^0.3.1" + prop-types: "npm:^15.5.6" + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0 + react-dom: ^0.14.0 || ^15.0.0 || ^16.0.0 + checksum: 10c0/3b791f2455808682241c9fc00cccce31804cb696c489a4800cd124fce8be6b624a4c21836e06568b6d7d45b6a8e4945460249c77235990ce015f9899cda10a7f + languageName: node + linkType: hard + +"react-colorful@npm:^5.3.1": + version: 5.6.1 + resolution: "react-colorful@npm:5.6.1" peerDependencies: - react: ^16.8.5 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 - checksum: 10c0/5bc04f6dcfededc6e5c90e696cda07816a018eada52f7438ded839f03786e3f319aa8a0bc7b14b86fb26a12c0e5ba53e8c5a4bf3832a8f827dd70f1410675525 + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/48eb73cf71e10841c2a61b6b06ab81da9fffa9876134c239bfdebcf348ce2a47e56b146338e35dfb03512c85966bfc9a53844fc56bc50154e71f8daee59ff6f0 languageName: node linkType: hard -"react-dom@npm:^18": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" +"react-dom@npm:18.3.1, react-dom@npm:^18.3.0": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.0" + scheduler: "npm:^0.23.2" peerDependencies: - react: ^18.2.0 - checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a + react: ^18.3.1 + checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 + languageName: node + linkType: hard + +"react-easy-crop@npm:^5.0.6": + version: 5.2.0 + resolution: "react-easy-crop@npm:5.2.0" + dependencies: + normalize-wheel: "npm:^1.0.1" + tslib: "npm:^2.0.1" + peerDependencies: + react: ">=16.4.0" + react-dom: ">=16.4.0" + checksum: 10c0/fef93b4a234c380f2bbe331ff263e4d9ca18fc66dd698504aa1f6a15dc56521b52ec0492d04501c760c4bf8aa35ce6eb4e3511179ea2b372afb78c8358db653b languageName: node linkType: hard @@ -7315,37 +14608,77 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^17.0.2": - version: 17.0.2 - resolution: "react-is@npm:17.0.2" - checksum: 10c0/2bdb6b93fbb1820b024b496042cce405c57e2f85e777c9aabd55f9b26d145408f9f74f5934676ffdc46f3dcff656d78413a6e43968e7b3f92eea35b3052e9053 +"react-is@npm:^18.0.0, react-is@npm:^18.3.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 languageName: node linkType: hard -"react-redux@npm:^7.2.0": - version: 7.2.9 - resolution: "react-redux@npm:7.2.9" +"react-redux@npm:^9.2.0": + version: 9.2.0 + resolution: "react-redux@npm:9.2.0" dependencies: - "@babel/runtime": "npm:^7.15.4" - "@types/react-redux": "npm:^7.1.20" - hoist-non-react-statics: "npm:^3.3.2" - loose-envify: "npm:^1.4.0" - prop-types: "npm:^15.7.2" - react-is: "npm:^17.0.2" + "@types/use-sync-external-store": "npm:^0.0.6" + use-sync-external-store: "npm:^1.4.0" peerDependencies: - react: ^16.8.3 || ^17 || ^18 + "@types/react": ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 peerDependenciesMeta: - react-dom: + "@types/react": + optional: true + redux: + optional: true + checksum: 10c0/00d485f9d9219ca1507b4d30dde5f6ff8fb68ba642458f742e0ec83af052f89e65cd668249b99299e1053cc6ad3d2d8ac6cb89e2f70d2ac5585ae0d7fa0ef259 + languageName: node + linkType: hard + +"react-refresh@npm:^0.14.0": + version: 0.14.2 + resolution: "react-refresh@npm:0.14.2" + checksum: 10c0/875b72ef56b147a131e33f2abd6ec059d1989854b3ff438898e4f9310bfcc73acff709445b7ba843318a953cb9424bcc2c05af2b3d80011cee28f25aef3e2ebb + languageName: node + linkType: hard + +"react-remove-scroll-bar@npm:^2.3.7": + version: 2.3.8 + resolution: "react-remove-scroll-bar@npm:2.3.8" + dependencies: + react-style-singleton: "npm:^2.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": optional: true - react-native: + checksum: 10c0/9a0675c66cbb52c325bdbfaed80987a829c4504cefd8ff2dd3b6b3afc9a1500b8ec57b212e92c1fb654396d07bbe18830a8146fe77677d2a29ce40b5e1f78654 + languageName: node + linkType: hard + +"react-remove-scroll@npm:^2.6.1": + version: 2.6.2 + resolution: "react-remove-scroll@npm:2.6.2" + dependencies: + react-remove-scroll-bar: "npm:^2.3.7" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.3" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": optional: true - checksum: 10c0/904fac7f493942585ed7ebbd693b4f6b5c09c292366b4550e887ba1a2e83a92c55f0ddc35161d4ba87e3fadb6c681a59003f58df6335e5d2ddd72b06a557851d + checksum: 10c0/8273e3f67a460af84b3387c93459b33920d48be15091c5ea10e8c1c4f514ad41f71dad028ee13df25370e5de16cadf02697fe28adaacbdacdf8b57bbf03ee559 languageName: node linkType: hard -"react-select@npm:^5.7.2": - version: 5.8.0 - resolution: "react-select@npm:5.8.0" +"react-select@npm:^5.9.0": + version: 5.9.0 + resolution: "react-select@npm:5.9.0" dependencies: "@babel/runtime": "npm:^7.12.0" "@emotion/cache": "npm:^11.4.0" @@ -7355,11 +14688,27 @@ __metadata: memoize-one: "npm:^6.0.0" prop-types: "npm:^15.6.0" react-transition-group: "npm:^4.3.0" - use-isomorphic-layout-effect: "npm:^1.1.2" + use-isomorphic-layout-effect: "npm:^1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/f21f18ca41a8c866ab69f9c65253e86dcc5323477bbfc729bf6aa9d897e04e27cfffd13c07f10b70dc554e15ad1d238c1283e05e457bf4ead8526a1dd7fbc8b0 + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.1, react-style-singleton@npm:^2.2.2": + version: 2.2.3 + resolution: "react-style-singleton@npm:2.2.3" + dependencies: + get-nonce: "npm:^1.0.0" + tslib: "npm:^2.0.0" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/b4b98aaf117ee5cc4642871b7bd51fd0e2697988d0b880f30b21e933ca90258959147117d8aada36713b622e0e4cb06bd18ec02069f3f108896e0d31e69e3c16 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/841938ff16d16a6b76895f4cb2e1fea957e5fe3b30febbf03a54892dae1c9153f2383e231dea0b3ba41192ad2f2849448fa859caccd288943bce32639e971bee languageName: node linkType: hard @@ -7378,35 +14727,68 @@ __metadata: languageName: node linkType: hard -"react@npm:^18, react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" +"react@npm:18.3.1, react@npm:^18.3.0": + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 languageName: node linkType: hard -"read-pkg-up@npm:^8.0.0": - version: 8.0.0 - resolution: "read-pkg-up@npm:8.0.0" +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" dependencies: - find-up: "npm:^5.0.0" - read-pkg: "npm:^6.0.0" - type-fest: "npm:^1.0.1" - checksum: 10c0/cf3905ccbe5cd602f23192cc7ca65ed17561bab117eadb9aed817441d5bfc6b9a11215c2a3e9505f501d046818f3c4180dbea61fa83c42083e0b4e407d5cc745 + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" + checksum: 10c0/82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 languageName: node linkType: hard -"read-pkg@npm:^6.0.0": - version: 6.0.0 - resolution: "read-pkg@npm:6.0.0" +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" dependencies: "@types/normalize-package-data": "npm:^2.4.0" - normalize-package-data: "npm:^3.0.2" - parse-json: "npm:^5.2.0" - type-fest: "npm:^1.0.1" - checksum: 10c0/b51ee5eed75324f4fac34c9a40b5e4b403de4c532242be01959c9bbdb1ff9db1c6c2aefaba569622fec49d1ead866e97ba856ab145f6e11039b11f7bec1318ba + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" + checksum: 10c0/b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.1": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readdirp@npm:^4.0.1": + version: 4.1.1 + resolution: "readdirp@npm:4.1.1" + checksum: 10c0/a1afc90d0e57ce4caa28046875519453fd09663ade0d0c29fe0d6a117eca4596cfdf1a9ebb0859ad34cca7b9351d4f0d8d962a4363d40f3f37e57dba51ffb6b6 languageName: node linkType: hard @@ -7428,45 +14810,45 @@ __metadata: languageName: node linkType: hard -"redent@npm:^4.0.0": - version: 4.0.0 - resolution: "redent@npm:4.0.0" +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" dependencies: - indent-string: "npm:^5.0.0" - strip-indent: "npm:^4.0.0" - checksum: 10c0/a9b640c8f4b2b5b26a1a908706475ff404dd50a97d6f094bc3c59717be922622927cc7d601d4ae2857d897ad243fd979bd76d751a0481cee8be7024e5fb4c662 + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: 10c0/d64a6b5c0b50eb3ddce3ab770f866658a2b9998c678f797919ceb1b586bab9259b311407280bd80b804e2a7c7539b19238ae6a2a20c843f1a7fcff21d48c2eae languageName: node linkType: hard -"redux@npm:^4.0.0, redux@npm:^4.0.4": - version: 4.2.1 - resolution: "redux@npm:4.2.1" - dependencies: - "@babel/runtime": "npm:^7.9.2" - checksum: 10c0/136d98b3d5dbed1cd6279c8c18a6a74c416db98b8a432a46836bdd668475de6279a2d4fd9d1363f63904e00f0678a8a3e7fa532c897163340baf1e71bb42c742 +"redux@npm:^5.0.1": + version: 5.0.1 + resolution: "redux@npm:5.0.1" + checksum: 10c0/b10c28357194f38e7d53b760ed5e64faa317cc63de1fb95bc5d9e127fab956392344368c357b8e7a9bedb0c35b111e7efa522210cfdc3b3c75e5074718e9069c languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.4 - resolution: "reflect.getprototypeof@npm:1.0.4" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - globalthis: "npm:^1.0.3" - which-builtin-type: "npm:^1.1.3" - checksum: 10c0/02104cdd22658b637efe6b1df73658edab539268347327c8250a72d0cb273dcdf280c284e2d94155d22601d022d16be1a816a8616d679e447cbcbde9860d15cb + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.1 - resolution: "regenerate-unicode-properties@npm:10.1.1" +"regenerate-unicode-properties@npm:^10.2.0": + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" dependencies: regenerate: "npm:^1.4.2" - checksum: 10c0/89adb5ee5ba081380c78f9057c02e156a8181969f6fcca72451efc45612e0c3df767b4333f8d8479c274d9c6fe52ec4854f0d8a22ef95dccbe87da8e5f2ac77d + checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 languageName: node linkType: hard @@ -7478,9 +14860,9 @@ __metadata: linkType: hard "regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: 10c0/e25f062c1a183f81c99681691a342760e65c55e8d3a4d4fe347ebe72433b123754b942b70b622959894e11f8a9131dc549bd3c9a5234677db06a4af42add8d12 + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 languageName: node linkType: hard @@ -7493,46 +14875,77 @@ __metadata: languageName: node linkType: hard -"regex-parser@npm:^2.2.11": - version: 2.2.11 - resolution: "regex-parser@npm:2.2.11" - checksum: 10c0/6572acbd46b5444215a73cf164f3c6fdbd73b8a2cde6a31a97307e514d20f5cbb8609f9e4994a7744207f2d1bf9e6fca4bbc0c9854f2b3da77ae0063efdc3f98 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - set-function-name: "npm:^2.0.0" - checksum: 10c0/1de7d214c0a726c7c874a7023e47b0e27b9f7fdb64175bfe1861189de1704aaeca05c3d26c35aa375432289b99946f3cf86651a92a8f7601b90d8c226a23bcd8 + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 languageName: node linkType: hard -"regexpu-core@npm:^5.3.1": - version: 5.3.2 - resolution: "regexpu-core@npm:5.3.2" +"regexpu-core@npm:^6.2.0": + version: 6.2.0 + resolution: "regexpu-core@npm:6.2.0" dependencies: - "@babel/regjsgen": "npm:^0.8.0" regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.1.0" - regjsparser: "npm:^0.9.1" + regenerate-unicode-properties: "npm:^10.2.0" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.12.0" unicode-match-property-ecmascript: "npm:^2.0.0" unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10c0/7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770 + checksum: 10c0/bbcb83a854bf96ce4005ee4e4618b71c889cda72674ce6092432f0039b47890c2d0dfeb9057d08d440999d9ea03879ebbb7f26ca005ccf94390e55c348859b98 + languageName: node + linkType: hard + +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: 10c0/44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd languageName: node linkType: hard -"regjsparser@npm:^0.9.1": - version: 0.9.1 - resolution: "regjsparser@npm:0.9.1" +"regjsparser@npm:^0.12.0": + version: 0.12.0 + resolution: "regjsparser@npm:0.12.0" dependencies: - jsesc: "npm:~0.5.0" + jsesc: "npm:~3.0.2" bin: regjsparser: bin/parser - checksum: 10c0/fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225 + checksum: 10c0/99d3e4e10c8c7732eb7aa843b8da2fd8b647fe144d3711b480e4647dc3bff4b1e96691ccf17f3ace24aa866a50b064236177cb25e6e4fbbb18285d99edaed83b + languageName: node + linkType: hard + +"rememo@npm:^4.0.2": + version: 4.0.2 + resolution: "rememo@npm:4.0.2" + checksum: 10c0/de253eda9eb8d4b9d8f7e0fce16eb7e2a2c547e59bdb332e7dde326b74482e8f1fb5bca793df699f6f6cccf67e480fdd7c6fc7b8d4d180e6670fbeb4b6371853 + languageName: node + linkType: hard + +"remove-accents@npm:^0.5.0": + version: 0.5.0 + resolution: "remove-accents@npm:0.5.0" + checksum: 10c0/a75321aa1b53d9abe82637115a492770bfe42bb38ed258be748bf6795871202bc8b4badff22013494a7029f5a241057ad8d3f72adf67884dbe15a9e37e87adc4 + languageName: node + linkType: hard + +"requestidlecallback@npm:^0.3.0": + version: 0.3.0 + resolution: "requestidlecallback@npm:0.3.0" + checksum: 10c0/68a2ff3154788643ccf96436cfaf8ad5bbe2f4d3f4b4d7858ec74681bf7d6a487d17df6a238130ff1e73d0a4a85bdc44b5f945eb79ef7d5552e23fc6288e795f + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 languageName: node linkType: hard @@ -7543,6 +14956,13 @@ __metadata: languageName: node linkType: hard +"require-main-filename@npm:^2.0.0": + version: 2.0.0 + resolution: "require-main-filename@npm:2.0.0" + checksum: 10c0/db91467d9ead311b4111cbd73a4e67fa7820daed2989a32f7023785a2659008c6d119752d9c4ac011ae07e537eb86523adff99804c5fdb39cd3a017f9b401bb6 + languageName: node + linkType: hard + "requireindex@npm:^1.2.0": version: 1.2.0 resolution: "requireindex@npm:1.2.0" @@ -7550,6 +14970,22 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 + languageName: node + linkType: hard + +"resolve-bin@npm:^0.4.0": + version: 0.4.3 + resolution: "resolve-bin@npm:0.4.3" + dependencies: + find-parent-dir: "npm:~0.3.0" + checksum: 10c0/1392d7dba09c19d8750cfae63bb4c42bb63d3171fab841692363e06de9986729d2343185345ea3d610bc656ebe99b6744166849d5001dafca40e75c9915e9bcc + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -7559,6 +14995,16 @@ __metadata: languageName: node linkType: hard +"resolve-dir@npm:^0.1.0": + version: 0.1.1 + resolution: "resolve-dir@npm:0.1.1" + dependencies: + expand-tilde: "npm:^1.2.2" + global-modules: "npm:^0.2.3" + checksum: 10c0/1eb263821986d9abba8e221b92ae5447e2ceb9e2f4a598bd1dd1e48d2b96dc2c36ed9491d4863a57db3e51067058c93d410fd8b65a94b54ea044d9fba5668adc + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -7573,40 +15019,27 @@ __metadata: languageName: node linkType: hard -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab - languageName: node - linkType: hard - -"resolve-url-loader@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-url-loader@npm:5.0.0" - dependencies: - adjust-sourcemap-loader: "npm:^4.0.0" - convert-source-map: "npm:^1.7.0" - loader-utils: "npm:^2.0.0" - postcss: "npm:^8.2.14" - source-map: "npm:0.6.1" - checksum: 10c0/53eef3620332f2fc35a4deffaa4395064b2ffd1bc28be380faa3f1e99c2fb7bbf0f705700b4539387d5b6c39586df54a92cd5d031606f19de4bf9e0ff1b6a522 +"resolve.exports@npm:^2.0.0": + version: 2.0.3 + resolution: "resolve.exports@npm:2.0.3" + checksum: 10c0/1ade1493f4642a6267d0a5e68faeac20b3d220f18c28b140343feb83694d8fed7a286852aef43689d16042c61e2ddb270be6578ad4a13990769e12065191200d languageName: node linkType: hard -"resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.4": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" +"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.4": + version: 1.22.10 + resolution: "resolve@npm:1.22.10" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 languageName: node linkType: hard -"resolve@npm:^2.0.0-next.4": +"resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" dependencies: @@ -7619,20 +15052,20 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin<compat/resolve>": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>::version=1.22.8&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin<compat/resolve>": + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin<compat/resolve>::version=1.22.10&hash=c3c19d" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.4#optional!builtin<compat/resolve>": +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin<compat/resolve>": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin<compat/resolve>::version=2.0.0-next.5&hash=c3c19d" dependencies: @@ -7652,6 +15085,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -7659,6 +15099,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -7670,16 +15121,60 @@ __metadata: languageName: node linkType: hard -"run-applescript@npm:^5.0.0": - version: 5.0.0 - resolution: "run-applescript@npm:5.0.0" +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" dependencies: - execa: "npm:^5.0.0" - checksum: 10c0/f9977db5770929f3f0db434b8e6aa266498c70dec913c84320c0a06add510cf44e3a048c44da088abee312006f9cbf572fd065cdc8f15d7682afda8755f4114c + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc + languageName: node + linkType: hard + +"robots-parser@npm:^3.0.1": + version: 3.0.1 + resolution: "robots-parser@npm:3.0.1" + checksum: 10c0/91443b15ab1b39f69ac998a2dae8859ad35c981504e5facbb34d494fd6163877e821ce7ed830d14e9efdd6ed28c347491c3d699738943501dec2b6bedfdd6a81 + languageName: node + linkType: hard + +"route-recognizer@npm:^0.3.4": + version: 0.3.4 + resolution: "route-recognizer@npm:0.3.4" + checksum: 10c0/dee14947275d6ee4d48371983590b7c9835d612a9e8347038476424da83db5631affe3b04085a13a9f7b0bd042da5c50d79a81ccbbc490e18978fd860a0f9ddd + languageName: node + linkType: hard + +"rtlcss@npm:^4.3.0": + version: 4.3.0 + resolution: "rtlcss@npm:4.3.0" + dependencies: + escalade: "npm:^3.1.1" + picocolors: "npm:^1.0.0" + postcss: "npm:^8.4.21" + strip-json-comments: "npm:^3.1.1" + bin: + rtlcss: bin/rtlcss.js + checksum: 10c0/ec59db839e1446b4cd6dcef618c8986f00d67e0ac3c2d40bd9041f1909aaacd668072c90849906ca692dea25cd993f46e9188b4c36adfa5bd3eebeb945fb28f2 languageName: node linkType: hard -"run-parallel@npm:^1.1.9": +"run-con@npm:~1.2.10": + version: 1.2.12 + resolution: "run-con@npm:1.2.12" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~3.0.0" + minimist: "npm:^1.2.8" + strip-json-comments: "npm:~3.1.1" + bin: + run-con: cli.js + checksum: 10c0/c749a463cf6160cc0745ebb901920eeaf7700488f2cecd90fb3794b08c84ffd819568324c239bffb2174bf828bf3d754dd245b85f1b2a0badad88765b0b09752 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.4, run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" dependencies: @@ -7688,56 +15183,90 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-array-concat@npm:1.0.1" +"rungen@npm:^0.3.2": + version: 0.3.2 + resolution: "rungen@npm:0.3.2" + checksum: 10c0/b32e89966f004720f40e1aa0f32a0bea521c2153e2d6740ec06f5a44c7d4cc7074d395b026dab1aa8dd1758e9d9e5bbe0fcc6b391d40a273c3716da4e3b88155 + languageName: node + linkType: hard + +"rxjs@npm:^7.8.1": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" + tslib: "npm:^2.1.0" + checksum: 10c0/3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" isarray: "npm:^2.0.5" - checksum: 10c0/4b15ce5fce5ce4d7e744a63592cded88d2f27806ed229eadb2e42629cbcd40e770f7478608e75f455e7fe341acd8c0a01bdcd7146b10645ea7411c5e3c1d1dd8 + checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d languageName: node linkType: hard -"safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1": +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-push-apply@npm:^1.0.0": version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.3" - is-regex: "npm:^1.1.4" - checksum: 10c0/14a81a7e683f97b2d6e9c8be61fddcf8ed7a02f4e64a825515f96bb1738eb007145359313741d2704d28b55b703a0f6300c749dde7c1dbc13952a2b85048ede2 + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 languageName: node linkType: hard -"sass-loader@npm:^13.2.2": - version: 13.3.2 - resolution: "sass-loader@npm:13.3.2" +"sass-loader@npm:^16.0.3, sass-loader@npm:^16.0.4": + version: 16.0.4 + resolution: "sass-loader@npm:16.0.4" dependencies: neo-async: "npm:^2.6.2" peerDependencies: - fibers: ">= 3.1.0" + "@rspack/core": 0.x || 1.x node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 sass: ^1.3.0 sass-embedded: "*" webpack: ^5.0.0 peerDependenciesMeta: - fibers: + "@rspack/core": optional: true node-sass: optional: true @@ -7745,40 +15274,48 @@ __metadata: optional: true sass-embedded: optional: true - checksum: 10c0/7db8132101ed663f3cf936ce765b9b960a48b14f13f17d367a4e0c2ae259e91b6c401e33ab0f27ee88c98c8b5893c778848fc8366f1f387ac788ebef244e000a - languageName: node - linkType: hard - -"sass-mq@npm:^6.0.0": - version: 6.0.0 - resolution: "sass-mq@npm:6.0.0" - checksum: 10c0/0f8ec468bb479327e988e2533b93a7eb84c64d6db45b52af16bff0ec8cd1eae18e806e29b0a1cf0136645f9a529e446ea4ce51b1d72c7f96798149b3616255c5 + webpack: + optional: true + checksum: 10c0/d57c5fa35620e9022cfa3e5d49f3f9b3e54fb8b2fa9d021c10fe26c8c2f77103e038b6540eb20123a6f73aef23d2beb04033d3b7772588ca3f3c0ba2a4ee40ac languageName: node linkType: hard -"sass@npm:^1.62.1": - version: 1.69.5 - resolution: "sass@npm:1.69.5" +"sass@npm:^1.54.0, sass@npm:^1.83.1": + version: 1.83.4 + resolution: "sass@npm:1.83.4" dependencies: - chokidar: "npm:>=3.0.0 <4.0.0" - immutable: "npm:^4.0.0" + "@parcel/watcher": "npm:^2.4.1" + chokidar: "npm:^4.0.0" + immutable: "npm:^5.0.2" source-map-js: "npm:>=0.6.2 <2.0.0" + dependenciesMeta: + "@parcel/watcher": + optional: true bin: sass: sass.js - checksum: 10c0/a9003a9482f2e467fc412cfe58ba4fa14fb78bef7e1283ce5d64a065f8a31114ec3bbf5d4e724f94eb8512c32c768a6f91f228c7f16a26a300bbf4db293b5608 + checksum: 10c0/6f27f0eebfeb50222b14baaeef548ef58a05daf8abd9797e6c499334ed7ad40541767056c8693780d06ca83d8836348ea7396a923d3be439b133507993ca78be languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 10c0/3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74 + languageName: node + linkType: hard + +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.2.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -7789,19 +15326,43 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" dependencies: "@types/json-schema": "npm:^7.0.9" ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" ajv-keywords: "npm:^5.1.0" - checksum: 10c0/8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 + checksum: 10c0/c23f0fa73ef71a01d4a2bb7af4c91e0d356ec640e071aa2d06ea5e67f042962bb7ac7c29a60a295bb0125878801bc3209197a2b8a833dd25bd38e37c3ed21427 languageName: node linkType: hard -"semver@npm:^5.6.0": +"select-hose@npm:^2.0.0": + version: 2.0.0 + resolution: "select-hose@npm:2.0.0" + checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 + languageName: node + linkType: hard + +"select@npm:^1.1.2": + version: 1.1.2 + resolution: "select@npm:1.1.2" + checksum: 10c0/5dbd871c03a52aa70ce29ab46e9115d26cb34404717e7e705e678b3b4d535bacfa0a4c4c2d32262acec7b6fdfb6827e8980ea4ef969a8681f8a0b752331a0a02 + languageName: node + linkType: hard + +"selfsigned@npm:^2.1.1": + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" + dependencies: + "@types/node-forge": "npm:^1.3.0" + node-forge: "npm:^1" + checksum: 10c0/521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -7810,7 +15371,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -7819,103 +15380,295 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: "npm:^6.0.0" +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 10c0/5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf languageName: node linkType: hard -"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": - version: 6.0.1 - resolution: "serialize-javascript@npm:6.0.1" +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + +"sentence-case@npm:^3.0.4": + version: 3.0.4 + resolution: "sentence-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case-first: "npm:^2.0.2" + checksum: 10c0/9a90527a51300cf5faea7fae0c037728f9ddcff23ac083883774c74d180c0a03c31aab43d5c3347512e8c1b31a0d4712512ec82beb71aa79b85149f9abeb5467 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.2": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" dependencies: randombytes: "npm:^2.1.0" - checksum: 10c0/1af427f4fee3fee051f54ffe15f77068cff78a3c96d20f5c1178d20630d3ab122d8350e639d5e13cde8111ef9db9439b871305ffb185e24be0a2149cec230988 + checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 languageName: node linkType: hard -"set-function-length@npm:^1.1.1": - version: 1.1.1 - resolution: "set-function-length@npm:1.1.1" +"serve-index@npm:^1.9.1": + version: 1.9.1 + resolution: "serve-index@npm:1.9.1" + dependencies: + accepts: "npm:~1.3.4" + batch: "npm:0.6.1" + debug: "npm:2.6.9" + escape-html: "npm:~1.0.3" + http-errors: "npm:~1.6.2" + mime-types: "npm:~2.1.17" + parseurl: "npm:~1.3.2" + checksum: 10c0/a666471a24196f74371edf2c3c7bcdd82adbac52f600804508754b5296c3567588bf694258b19e0cb23a567acfa20d9721bfdaed3286007b81f9741ada8a3a9c + languageName: node + linkType: hard + +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - define-data-property: "npm:^1.1.1" - get-intrinsic: "npm:^1.2.1" + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - checksum: 10c0/a29e255c116c29e3323b851c4f46c58c91be9bb8b065f191e2ea1807cb2c839df56e3175732a498e0c6d54626ba6b6fef896bf699feb7ab70c42dc47eb247c95 + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c languageName: node linkType: hard -"set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": - version: 2.0.1 - resolution: "set-function-name@npm:2.0.1" +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" dependencies: - define-data-property: "npm:^1.0.1" + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" functions-have-names: "npm:^1.2.3" - has-property-descriptors: "npm:^1.0.0" - checksum: 10c0/6be7d3e15be47f4db8a5a563a35c60b5e7c4af91cc900e8972ffad33d3aaa227900faa55f60121cdb04b85866a734bb7fe4cd91f654c632861cc86121a48312a + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + +"setprototypeof@npm:1.1.0": + version: 1.1.0 + resolution: "setprototypeof@npm:1.1.0" + checksum: 10c0/a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc + languageName: node + linkType: hard + +"shallow-clone@npm:^0.1.2": + version: 0.1.2 + resolution: "shallow-clone@npm:0.1.2" + dependencies: + is-extendable: "npm:^0.1.1" + kind-of: "npm:^2.0.1" + lazy-cache: "npm:^0.2.3" + mixin-object: "npm:^2.0.1" + checksum: 10c0/d513b94a55420c22bcb984d571931a144a06a3d327bf4caf52791287ae55cd34ad961d5227b505e2b3566c13911767b8881b2af10efb32d7d5fc3703937be30c + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shell-quote@npm:^1.8.1": + version: 1.8.2 + resolution: "shell-quote@npm:1.8.2" + checksum: 10c0/85fdd44f2ad76e723d34eb72c753f04d847ab64e9f1f10677e3f518d0e5b0752a176fd805297b30bb8c3a1556ebe6e77d2288dbd7b7b0110c7e941e9e9c20ce1 + languageName: node + linkType: hard + +"showdown@npm:^1.9.1": + version: 1.9.1 + resolution: "showdown@npm:1.9.1" + dependencies: + yargs: "npm:^14.2" + bin: + showdown: bin/showdown.js + checksum: 10c0/46c904390bbb7b7e367acb62b0d8498da9fade25ff468b4f5c0a601f6938e977ce6f8df3cd7de66e9573edf0320e62f54cbbaf81c940de084fa138e32f9ac4e3 languageName: node linkType: hard -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - kind-of: "npm:^6.0.2" - checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d languageName: node linkType: hard -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 languageName: node linkType: hard -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.0" - get-intrinsic: "npm:^1.0.2" - object-inspect: "npm:^1.9.0" - checksum: 10c0/054a5d23ee35054b2c4609b9fd2a0587760737782b5d765a9c7852264710cc39c6dcb56a9bbd6c12cd84071648aea3edb2359d2f6e560677eedadce511ac1da5 + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 languageName: node linkType: hard -"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 languageName: node linkType: hard -"signal-exit@npm:^4.0.1": +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 languageName: node linkType: hard -"slash@npm:^2.0.0": - version: 2.0.0 - resolution: "slash@npm:2.0.0" - checksum: 10c0/f83dbd3cb62c41bb8fcbbc6bf5473f3234b97fa1d008f571710a9d3757a28c7169e1811cad1554ccb1cc531460b3d221c9a7b37f549398d9a30707f0a5af9193 +"simple-html-tokenizer@npm:^0.5.7": + version: 0.5.11 + resolution: "simple-html-tokenizer@npm:0.5.11" + checksum: 10c0/086864c3f499f5988dd6ad65a8c72b8c3c8a443edf469cb531f8091b6524b435b173651e543782a88060a55f05c6fe9a249ac5c971a2d0f451cba02c5156b9e5 + languageName: node + linkType: hard + +"simple-peer@npm:^9.11.0": + version: 9.11.1 + resolution: "simple-peer@npm:9.11.1" + dependencies: + buffer: "npm:^6.0.3" + debug: "npm:^4.3.2" + err-code: "npm:^3.0.1" + get-browser-rtc: "npm:^1.1.0" + queue-microtask: "npm:^1.2.3" + randombytes: "npm:^2.1.0" + readable-stream: "npm:^3.6.0" + checksum: 10c0/69089d2977ededc7e193754169dc92ad0b7d83aac2883d7cfe51b0c40bd589dec0ab8bfcecb9205c37bed5f589e5275fd64bffff43069d4b35c69bdca02283c8 + languageName: node + linkType: hard + +"sirv@npm:^2.0.3": + version: 2.0.4 + resolution: "sirv@npm:2.0.4" + dependencies: + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10c0/68f8ee857f6a9415e9c07a1f31c7c561df8d5f1b1ba79bee3de583fa37da8718def5309f6b1c6e2c3ef77de45d74f5e49efc7959214443aa92d42e9c99180a4e + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 languageName: node linkType: hard @@ -7951,38 +15704,75 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1": - version: 8.0.2 - resolution: "socks-proxy-agent@npm:8.0.2" +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ab19a913969f58f4474fe9f6e8a026c8a2142a01f40b52b79368068343177f818cdfef0b0c6b9558f298782441d5ca8ed5932eb57822439fad791d866e62cecd + languageName: node + linkType: hard + +"sockjs@npm:^0.3.24": + version: 0.3.24 + resolution: "sockjs@npm:0.3.24" + dependencies: + faye-websocket: "npm:^0.11.3" + uuid: "npm:^8.3.2" + websocket-driver: "npm:^0.7.4" + checksum: 10c0/aa102c7d921bf430215754511c81ea7248f2dcdf268fbdb18e4d8183493a86b8793b164c636c52f474a886f747447c962741df2373888823271efdb9d2594f33 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3, socks-proxy-agent@npm:^8.0.5": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^7.0.2" + agent-base: "npm:^7.1.2" debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 10c0/a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 languageName: node linkType: hard -"socks@npm:^2.7.1": - version: 2.8.0 - resolution: "socks@npm:2.8.0" +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" dependencies: ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 10c0/208fa5d5ae47857653c4fc039d47e4c1e76313b24052151a949aa98f027f9aaba8fc6c5dc0f7f2d9ceeb94e9940217581f2d9798436563c1494b67a6cb68611f + checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 languageName: node linkType: hard -"source-list-map@npm:^2.0.0": - version: 2.0.1 - resolution: "source-list-map@npm:2.0.1" - checksum: 10c0/2e5e421b185dcd857f46c3c70e2e711a65d717b78c5f795e2e248c9d67757882ea989b80ebc08cf164eeeda5f4be8aa95d3b990225070b2daaaf3257c5958149 +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: 10c0/32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 +"source-map-loader@npm:^3.0.0": + version: 3.0.2 + resolution: "source-map-loader@npm:3.0.2" + dependencies: + abab: "npm:^2.0.5" + iconv-lite: "npm:^0.6.3" + source-map-js: "npm:^1.0.1" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/ce38822d10ac0fc09f3a3f320f184d5a5c7e66a6c447e5f2c36476d901e3224a00cc7843be615212a50b8607beee565f08b526fbb0621357a1a6247f48fd09bc + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e languageName: node linkType: hard @@ -7996,17 +15786,34 @@ __metadata: languageName: node linkType: hard -"source-map@npm:0.6.1, source-map@npm:^0.6.0, source-map@npm:~0.6.1": +"source-map@npm:^0.5.7": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard -"source-map@npm:^0.5.7": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 +"source-map@npm:^0.7.3": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc + languageName: node + linkType: hard + +"spawnd@npm:^10.1.4": + version: 10.1.4 + resolution: "spawnd@npm:10.1.4" + dependencies: + signal-exit: "npm:^4.1.0" + tree-kill: "npm:^1.2.2" + checksum: 10c0/fcdc0c692a4ac7cde0e47f57de82769e58c74d055725ec7d026c5897079ebe113bcc0fa5a309ae36ad0713fd447e2ac6ad0877d9c6d5b42c824cd702b853a29c languageName: node linkType: hard @@ -8021,13 +15828,13 @@ __metadata: linkType: hard "spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: 10c0/83089e77d2a91cb6805a5c910a2bedb9e50799da091f532c2ba4150efdef6e53f121523d3e2dc2573a340dc0189e648b03157097f65465b3a0c06da1f18d7e8a + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 languageName: node linkType: hard -"spdx-expression-parse@npm:^3.0.0, spdx-expression-parse@npm:^3.0.1": +"spdx-expression-parse@npm:^3.0.0": version: 3.0.1 resolution: "spdx-expression-parse@npm:3.0.1" dependencies: @@ -8037,10 +15844,58 @@ __metadata: languageName: node linkType: hard +"spdx-expression-parse@npm:^4.0.0": + version: 4.0.0 + resolution: "spdx-expression-parse@npm:4.0.0" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/965c487e77f4fb173f1c471f3eef4eb44b9f0321adc7f93d95e7620da31faa67d29356eb02523cd7df8a7fc1ec8238773cdbf9e45bd050329d2b26492771b736 + languageName: node + linkType: hard + "spdx-license-ids@npm:^3.0.0": - version: 3.0.16 - resolution: "spdx-license-ids@npm:3.0.16" - checksum: 10c0/7d88b8f01308948bb3ea69c066448f2776cf3d35a410d19afb836743086ced1566f6824ee8e6d67f8f25aa81fa86d8076a666c60ac4528caecd55e93edb5114e + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: 10c0/ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 + languageName: node + linkType: hard + +"spdy-transport@npm:^3.0.0": + version: 3.0.0 + resolution: "spdy-transport@npm:3.0.0" + dependencies: + debug: "npm:^4.1.0" + detect-node: "npm:^2.0.4" + hpack.js: "npm:^2.1.6" + obuf: "npm:^1.1.2" + readable-stream: "npm:^3.0.6" + wbuf: "npm:^1.7.3" + checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb + languageName: node + linkType: hard + +"spdy@npm:^4.0.2": + version: 4.0.2 + resolution: "spdy@npm:4.0.2" + dependencies: + debug: "npm:^4.1.0" + handle-thing: "npm:^2.0.0" + http-deceiver: "npm:^1.2.7" + select-hose: "npm:^2.0.0" + spdy-transport: "npm:^3.0.0" + checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf + languageName: node + linkType: hard + +"speedline-core@npm:^1.4.3": + version: 1.4.3 + resolution: "speedline-core@npm:1.4.3" + dependencies: + "@types/node": "npm:*" + image-ssim: "npm:^0.2.0" + jpeg-js: "npm:^0.4.1" + checksum: 10c0/4fa7bb838ddb83a0d9dbcbae79247b7357d7d00832541bbeca428a19a2530a91fb6487bd6bf67cd9b972156fafa3bd8ee7261092a9e8026695a7ab67e48fedff languageName: node linkType: hard @@ -8051,16 +15906,78 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" dependencies: minipass: "npm:^7.0.3" - checksum: 10c0/b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"stackframe@npm:^1.3.4": + version: 1.3.4 + resolution: "stackframe@npm:1.3.4" + checksum: 10c0/18410f7a1e0c5d211a4effa83bdbf24adbe8faa8c34db52e1cd3e89837518c592be60b60d8b7270ac53eeeb8b807cd11b399a41667f6c9abb41059c3ccc8a989 + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 + languageName: node + linkType: hard + +"statuses@npm:>= 1.4.0 < 2": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 + languageName: node + linkType: hard + +"streamx@npm:^2.15.0, streamx@npm:^2.21.0": + version: 2.21.1 + resolution: "streamx@npm:2.21.1" + dependencies: + bare-events: "npm:^2.2.0" + fast-fifo: "npm:^1.3.2" + queue-tick: "npm:^1.0.1" + text-decoder: "npm:^1.1.0" + dependenciesMeta: + bare-events: + optional: true + checksum: 10c0/752297e877bdeba4a4c180335564c446636c3a33f1c8733b4773746dab6212266e97cd71be8cade9748bbb1b9e2fee61f81e46bcdaf1ff396b79c9cb9355f26e + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -8071,6 +15988,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^3.0.0, string-width@npm:^3.1.0": + version: 3.1.0 + resolution: "string-width@npm:3.1.0" + dependencies: + emoji-regex: "npm:^7.0.1" + is-fullwidth-code-point: "npm:^2.0.0" + strip-ansi: "npm:^5.1.0" + checksum: 10c0/85fa0d4f106e7999bb68c1c640c76fa69fb8c069dab75b009e29c123914e2d3b532e6cfa4b9d1bd913176fc83dedd7a2d7bf40d21a81a8a1978432cedfb65b91 + languageName: node + linkType: hard + "string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" @@ -8082,53 +16010,101 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.8": - version: 4.0.10 - resolution: "string.prototype.matchall@npm:4.0.10" +"string.prototype.includes@npm:^2.0.1": + version: 2.0.1 + resolution: "string.prototype.includes@npm:2.0.1" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.5" - regexp.prototype.flags: "npm:^1.5.0" - set-function-name: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10c0/cd7495fb0de16d43efeee3887b98701941f3817bd5f09351ad1825b023d307720c86394d56d56380563d97767ab25bf5448db239fcecbb85c28e2180f23e324a + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + checksum: 10c0/25ce9c9b49128352a2618fbe8758b46f945817a58a4420f4799419e40a8d28f116e176c7590d767d5327a61e75c8f32c86171063f48e389b9fdd325f1bd04ee5 languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.8": - version: 1.2.8 - resolution: "string.prototype.trim@npm:1.2.8" +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/4f76c583908bcde9a71208ddff38f67f24c9ec8093631601666a0df8b52fad44dad2368c78895ce83eb2ae8e7068294cc96a02fc971ab234e4d5c9bb61ea4e34 + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + regexp.prototype.flags: "npm:^1.5.3" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/1a53328ada73f4a77f1fdf1c79414700cf718d0a8ef6672af5603e709d26a24f2181208144aed7e858b1bcc1a0d08567a570abfb45567db4ae47637ed2c2f85c languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimend@npm:1.0.7" +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/53c24911c7c4d8d65f5ef5322de23a3d5b6b4db73273e05871d5ab4571ae5638f38f7f19d71d09116578fb060e5a145cc6a208af2d248c8baf7a34f44d32ce57 + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimstart@npm:1.0.7" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-object-atoms: "npm:^1.0.0" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8, string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - checksum: 10c0/0bcf391b41ea16d4fda9c9953d0a7075171fe090d33b4cf64849af94944c50862995672ac03e0c5dba2940a213ad7f53515a668dac859ce22a0276289ae5cf4f + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e languageName: node linkType: hard @@ -8141,6 +16117,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0": + version: 5.2.0 + resolution: "strip-ansi@npm:5.2.0" + dependencies: + ansi-regex: "npm:^4.1.0" + checksum: 10c0/de4658c8a097ce3b15955bc6008f67c0790f85748bdc025b7bc8c52c7aee94bc4f9e50624516150ed173c3db72d851826cd57e7a85fe4e4bb6dbbebd5d297fdf + languageName: node + linkType: hard + "strip-ansi@npm:^7.0.1": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" @@ -8157,6 +16142,13 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef + languageName: node + linkType: hard + "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -8164,35 +16156,28 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": +"strip-indent@npm:^3.0.0": version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 10c0/a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce - languageName: node - linkType: hard - -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" + resolution: "strip-indent@npm:3.0.0" dependencies: - min-indent: "npm:^1.0.1" - checksum: 10c0/6b1fb4e22056867f5c9e7a6f3f45922d9a2436cac758607d58aeaac0d3b16ec40b1c43317de7900f1b8dd7a4107352fa47fb960f2c23566538c51e8585c8870e + min-indent: "npm:^1.0.0" + checksum: 10c0/ae0deaf41c8d1001c5d4fbe16cb553865c1863da4fae036683b474fa926af9fc121e155cb3fc57a68262b2ae7d5b8420aa752c97a6428c315d00efe2a3875679 languageName: node linkType: hard -"strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd languageName: node linkType: hard -"style-loader@npm:^3.3.1": - version: 3.3.3 - resolution: "style-loader@npm:3.3.3" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/104bae8abd0627579dc14f3917cf65f1117e8098e3529872f09c26b5eee07933567b7be5c8ebf94d16e322b6e726dc569c5787111bf3786915850db4e351ef33 +"strip-outer@npm:^1.0.1": + version: 1.0.1 + resolution: "strip-outer@npm:1.0.1" + dependencies: + escape-string-regexp: "npm:^1.0.2" + checksum: 10c0/c0f38e6f37563d878a221b1c76f0822f180ec5fc39be5ada30ee637a7d5b59d19418093bad2b4db1e69c40d7a7a7ac50828afce07276cf3d51ac8965cb140dfb languageName: node linkType: hard @@ -8203,110 +16188,123 @@ __metadata: languageName: node linkType: hard -"stylelint-config-recommended-scss@npm:^13.1.0": - version: 13.1.0 - resolution: "stylelint-config-recommended-scss@npm:13.1.0" +"stylehacks@npm:^6.1.1": + version: 6.1.1 + resolution: "stylehacks@npm:6.1.1" + dependencies: + browserslist: "npm:^4.23.0" + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/2dd2bccfd8311ff71492e63a7b8b86c3d7b1fff55d4ba5a2357aff97743e633d351cdc2f5ae3c0057637d00dab4ef5fc5b218a1b370e4585a41df22b5a5128be + languageName: node + linkType: hard + +"stylelint-config-recommended-scss@npm:^14.1.0": + version: 14.1.0 + resolution: "stylelint-config-recommended-scss@npm:14.1.0" dependencies: postcss-scss: "npm:^4.0.9" - stylelint-config-recommended: "npm:^13.0.0" - stylelint-scss: "npm:^5.3.0" + stylelint-config-recommended: "npm:^14.0.1" + stylelint-scss: "npm:^6.4.0" peerDependencies: postcss: ^8.3.3 - stylelint: ^15.10.0 + stylelint: ^16.6.1 peerDependenciesMeta: postcss: optional: true - checksum: 10c0/e07d0172c7936b4f644138e4129df2f187d297f1f96ce5865ab21ccd1c22caf94220f7caf9d6985e93e515de4c0356f6cb9c924d00df2eee5b3bc237f7e5bb48 + checksum: 10c0/0a1c1bb6d9f7a21acea82e12fee1b36a195181ae1dd0d8b59145a56f76232a80d5b706269bc4ca4929680d36f10371bd8a7d0aeeee468fa9119a3b56410b052f languageName: node linkType: hard -"stylelint-config-recommended@npm:^13.0.0": - version: 13.0.0 - resolution: "stylelint-config-recommended@npm:13.0.0" +"stylelint-config-recommended@npm:^14.0.1": + version: 14.0.1 + resolution: "stylelint-config-recommended@npm:14.0.1" peerDependencies: - stylelint: ^15.10.0 - checksum: 10c0/80420a1ab616e8637b66223f88c597388990d9991cd6a28b8372049b83329d893412f83029bb253a82b52387e497b62e042bc898064a2f22574b0d8921f01dd2 + stylelint: ^16.1.0 + checksum: 10c0/a0a0ecd91f4d193bbe2cc3408228f8a2d8fcb2b2578d77233f86780c9247c796a04e16aad7a91d97cb918e2de34b6a8062bab66ee017c3835d855081d94f4828 languageName: node linkType: hard -"stylelint-scss@npm:^5.3.0, stylelint-scss@npm:^5.3.1": - version: 5.3.1 - resolution: "stylelint-scss@npm:5.3.1" +"stylelint-scss@npm:^6.10.0, stylelint-scss@npm:^6.4.0": + version: 6.10.1 + resolution: "stylelint-scss@npm:6.10.1" dependencies: - known-css-properties: "npm:^0.29.0" + css-tree: "npm:^3.0.1" + is-plain-object: "npm:^5.0.0" + known-css-properties: "npm:^0.35.0" + mdn-data: "npm:^2.14.0" postcss-media-query-parser: "npm:^0.2.3" - postcss-resolve-nested-selector: "npm:^0.1.1" - postcss-selector-parser: "npm:^6.0.13" + postcss-resolve-nested-selector: "npm:^0.1.6" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: - stylelint: ^14.5.1 || ^15.0.0 - checksum: 10c0/5dfed5f9ac9812cd2ac6ef0272c720dee0326aaaee2998315a23bdcd71b8f04427f29cad634793eea2b45984182e20f03e90d43501e8e4d55bc956f80e2de477 + stylelint: ^16.0.2 + checksum: 10c0/3fc9b456bff649840783b92365fc30f5e54539794711744f09df45020d2a3d86164e8e16948a35b3b167f6fc8109837d487253faebd8b1ac29800e67a7f7adc9 languageName: node linkType: hard -"stylelint-webpack-plugin@npm:^4.1.1": - version: 4.1.1 - resolution: "stylelint-webpack-plugin@npm:4.1.1" +"stylelint-webpack-plugin@npm:^5.0.1": + version: 5.0.1 + resolution: "stylelint-webpack-plugin@npm:5.0.1" dependencies: globby: "npm:^11.1.0" - jest-worker: "npm:^29.5.0" + jest-worker: "npm:^29.7.0" micromatch: "npm:^4.0.5" normalize-path: "npm:^3.0.0" - schema-utils: "npm:^4.0.0" + schema-utils: "npm:^4.2.0" peerDependencies: - stylelint: ^13.0.0 || ^14.0.0 || ^15.0.0 + stylelint: ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 webpack: ^5.0.0 - checksum: 10c0/3ccde5ac47a3fa0363070c4b61db8204fbae49594be2f0f358c3338837cab9948b535b645f727a6d03edd6aa45dd8458ae39435a1d2801aa1fca54db676ec750 + checksum: 10c0/b9bda634dda6ed9ceee4cb7b270633a788f707f0015bc195761eaa74aabb30b679b04bd348203288ca7dc8c367be587b9d62bcb98c1f2c0186a10b4d51d8d17d languageName: node linkType: hard -"stylelint@npm:^15.11.0": - version: 15.11.0 - resolution: "stylelint@npm:15.11.0" +"stylelint@npm:^16.12.0, stylelint@npm:^16.8.2": + version: 16.13.2 + resolution: "stylelint@npm:16.13.2" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.3.1" - "@csstools/css-tokenizer": "npm:^2.2.0" - "@csstools/media-query-list-parser": "npm:^2.1.4" - "@csstools/selector-specificity": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/media-query-list-parser": "npm:^4.0.2" + "@csstools/selector-specificity": "npm:^5.0.0" + "@dual-bundle/import-meta-resolve": "npm:^4.1.0" balanced-match: "npm:^2.0.0" colord: "npm:^2.9.3" - cosmiconfig: "npm:^8.2.0" - css-functions-list: "npm:^3.2.1" - css-tree: "npm:^2.3.1" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.1" + cosmiconfig: "npm:^9.0.0" + css-functions-list: "npm:^3.2.3" + css-tree: "npm:^3.1.0" + debug: "npm:^4.3.7" + fast-glob: "npm:^3.3.3" fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^7.0.0" + file-entry-cache: "npm:^10.0.5" global-modules: "npm:^2.0.0" globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" html-tags: "npm:^3.3.1" - ignore: "npm:^5.2.4" - import-lazy: "npm:^4.0.0" + ignore: "npm:^7.0.1" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" - known-css-properties: "npm:^0.29.0" + known-css-properties: "npm:^0.35.0" mathml-tag-names: "npm:^2.1.3" - meow: "npm:^10.1.5" - micromatch: "npm:^4.0.5" + meow: "npm:^13.2.0" + micromatch: "npm:^4.0.8" normalize-path: "npm:^3.0.0" - picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.28" - postcss-resolve-nested-selector: "npm:^0.1.1" - postcss-safe-parser: "npm:^6.0.0" - postcss-selector-parser: "npm:^6.0.13" + picocolors: "npm:^1.1.1" + postcss: "npm:^8.4.49" + postcss-resolve-nested-selector: "npm:^0.1.6" + postcss-safe-parser: "npm:^7.0.1" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.2.0" resolve-from: "npm:^5.0.0" string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - style-search: "npm:^0.1.0" - supports-hyperlinks: "npm:^3.0.0" + supports-hyperlinks: "npm:^3.1.0" svg-tags: "npm:^1.0.0" - table: "npm:^6.8.1" + table: "npm:^6.9.0" write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/2d88b7293e308b7e418c14ba4130777b1a28b214304957f03b41a6dc8e00005266caf47479f718a6ec5e572cb52e903ca34aabf3febbe3a3ae32fff6b018d9fd + checksum: 10c0/07d5f6f80a6671d0a02ef448977c45b2ba45060b2942a5619297694b6b653b931284a174b36154b03c23ae302abfdbbba0ca61f4142734e98e6703511f1f363b languageName: node linkType: hard @@ -8317,15 +16315,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - "supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -8344,13 +16333,13 @@ __metadata: languageName: node linkType: hard -"supports-hyperlinks@npm:^3.0.0": - version: 3.0.0 - resolution: "supports-hyperlinks@npm:3.0.0" +"supports-hyperlinks@npm:^3.1.0": + version: 3.1.0 + resolution: "supports-hyperlinks@npm:3.1.0" dependencies: has-flag: "npm:^4.0.0" supports-color: "npm:^7.0.0" - checksum: 10c0/36aaa55e67645dded8e0f846fd81d7dd05ce82ea81e62347f58d86213577eb627b2b45298656ce7a70e7155e39f071d0d3f83be91e112aed801ebaa8db1ef1d0 + checksum: 10c0/78cc3e17eb27e6846fa355a8ebf343befe36272899cd409e45317a06c1997e95c23ff99d91080a517bd8c96508d4fa456e6ceb338c02ba5d7544277dbec0f10f languageName: node linkType: hard @@ -8361,6 +16350,13 @@ __metadata: languageName: node linkType: hard +"svg-parser@npm:^2.0.4": + version: 2.0.4 + resolution: "svg-parser@npm:2.0.4" + checksum: 10c0/02f6cb155dd7b63ebc2f44f36365bc294543bebb81b614b7628f1af3c54ab64f7e1cec20f06e252bf95bdde78441ae295a412c68ad1678f16a6907d924512b7a + languageName: node + linkType: hard + "svg-tags@npm:^1.0.0": version: 1.0.0 resolution: "svg-tags@npm:1.0.0" @@ -8368,26 +16364,50 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.8.5": - version: 0.8.6 - resolution: "synckit@npm:0.8.6" +"svgo@npm:^3.0.2, svgo@npm:^3.2.0": + version: 3.3.2 + resolution: "svgo@npm:3.3.2" + dependencies: + "@trysound/sax": "npm:0.2.0" + commander: "npm:^7.2.0" + css-select: "npm:^5.1.0" + css-tree: "npm:^2.3.1" + css-what: "npm:^6.1.0" + csso: "npm:^5.0.5" + picocolors: "npm:^1.0.0" + bin: + svgo: ./bin/svgo + checksum: 10c0/a6badbd3d1d6dbb177f872787699ab34320b990d12e20798ecae915f0008796a0f3c69164f1485c9def399e0ce0a5683eb4a8045e51a5e1c364bb13a0d9f79e1 + languageName: node + linkType: hard + +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 10c0/dfbe201ae09ac6053d163578778c53aa860a784147ecf95705de0cd23f42c851e1be7889241495e95c37cabb058edb1052f141387bef68f705afc8f9dd358509 + languageName: node + linkType: hard + +"synckit@npm:^0.9.1": + version: 0.9.2 + resolution: "synckit@npm:0.9.2" dependencies: - "@pkgr/utils": "npm:^2.4.2" + "@pkgr/core": "npm:^0.1.0" tslib: "npm:^2.6.2" - checksum: 10c0/200528062e3915a0190a4c6b1e01436fcfdf812e2e8d977746746f3998bb4182d758af760e51b06a64f8323e705735aff7b4b3efc4a0ab5f75eaccc044a8cfcc + checksum: 10c0/e0c262817444e5b872708adb6f5ad37951ba33f6b2d1d4477d45db1f57573a784618ceed5e6614e0225db330632b1f6b95bb74d21e4d013e45ad4bde03d0cb59 languageName: node linkType: hard -"table@npm:^6.8.1": - version: 6.8.1 - resolution: "table@npm:6.8.1" +"table@npm:^6.9.0": + version: 6.9.0 + resolution: "table@npm:6.9.0" dependencies: ajv: "npm:^8.0.1" lodash.truncate: "npm:^4.4.2" slice-ansi: "npm:^4.0.0" string-width: "npm:^4.2.3" strip-ansi: "npm:^6.0.1" - checksum: 10c0/591ed84b2438b01c9bc02248e2238e21e8bfb73654bc5acca0d469053eb39be3db2f57d600dcf08ac983b6f50f80842c44612c03877567c2afee3aec4a033e5f + checksum: 10c0/35646185712bb65985fbae5975dda46696325844b78735f95faefae83e86df0a265277819a3e67d189de6e858c509b54e66ca3958ffd51bde56ef1118d455bf4 languageName: node linkType: hard @@ -8400,36 +16420,64 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.1 - resolution: "tar@npm:6.2.1" +"tar-fs@npm:^3.0.6": + version: 3.0.8 + resolution: "tar-fs@npm:3.0.8" dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + bare-fs: "npm:^4.0.1" + bare-path: "npm:^3.0.0" + pump: "npm:^3.0.0" + tar-stream: "npm:^3.1.5" + dependenciesMeta: + bare-fs: + optional: true + bare-path: + optional: true + checksum: 10c0/b70bb2ad0490ab13b48edd10bd648bb54c52b681981cdcdc3aa4517e98ad94c94659ddca1925872ee658d781b9fcdd2b1c808050647f06b1bca157dd2fcae038 + languageName: node + linkType: hard + +"tar-stream@npm:^3.1.5": + version: 3.1.7 + resolution: "tar-stream@npm:3.1.7" + dependencies: + b4a: "npm:^1.6.4" + fast-fifo: "npm:^1.2.0" + streamx: "npm:^2.15.0" + checksum: 10c0/a09199d21f8714bd729993ac49b6c8efcb808b544b89f23378ad6ffff6d1cb540878614ba9d4cfec11a64ef39e1a6f009a5398371491eb1fda606ffc7f70f718 + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d languageName: node linkType: hard "terser-webpack-plugin@npm:^5.3.10": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" + version: 5.3.11 + resolution: "terser-webpack-plugin@npm:5.3.11" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" + "@jridgewell/trace-mapping": "npm:^0.3.25" jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" + schema-utils: "npm:^4.3.0" + serialize-javascript: "npm:^6.0.2" + terser: "npm:^5.31.1" peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -8439,21 +16487,41 @@ __metadata: optional: true uglify-js: optional: true - checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + checksum: 10c0/4794274f445dc589f4c113c75a55ce51364ccf09bfe8a545cdb462e3f752bf300ea91f072fa28bbed291bbae03274da06fe4eca180e784fb8a43646aa7dbcaef + languageName: node + linkType: hard + +"terser@npm:^5.31.1": + version: 5.37.0 + resolution: "terser@npm:5.37.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/ff0dc79b0a0da821e7f5bf7a047eab6d04e70e88b62339a0f1d71117db3310e255f5c00738fa3b391f56c3571f800a00047720261ba04ced0241c1f9922199f4 + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 languageName: node linkType: hard -"terser@npm:^5.26.0": - version: 5.31.6 - resolution: "terser@npm:5.31.6" +"text-decoder@npm:^1.1.0": + version: 1.2.3 + resolution: "text-decoder@npm:1.2.3" dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 10c0/b17d02b65a52a5041430572b3c514475820f5e7590fa93773c0f5b4be601ccf3f6d745bf5a79f3ee58187cf85edf61c24ddf4345783839fccb44c9c8fa9b427e + b4a: "npm:^1.6.4" + checksum: 10c0/569d776b9250158681c83656ef2c3e0a5d5c660c27ca69f87eedef921749a4fbf02095e5f9a0f862a25cf35258379b06e31dee9c125c9f72e273b7ca1a6d1977 languageName: node linkType: hard @@ -8471,24 +16539,61 @@ __metadata: languageName: node linkType: hard +"third-party-web@npm:^0.26.1, third-party-web@npm:latest": + version: 0.26.2 + resolution: "third-party-web@npm:0.26.2" + checksum: 10c0/1048de38f57d11a9fe74fffcef110ed03f67999fd651e6b647a4fc475fcd66a62b2dd74cc5b8644c9947fd670f5778b25ff3d7bd8d0124a0d90a5142ecc4af28 + languageName: node + linkType: hard + +"through@npm:^2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"thunky@npm:^1.0.2": + version: 1.1.0 + resolution: "thunky@npm:1.1.0" + checksum: 10c0/369764f39de1ce1de2ba2fa922db4a3f92e9c7f33bcc9a713241bc1f4a5238b484c17e0d36d1d533c625efb00e9e82c3e45f80b47586945557b45abb890156d2 + languageName: node + linkType: hard + +"tiny-emitter@npm:^2.0.0": + version: 2.1.0 + resolution: "tiny-emitter@npm:2.1.0" + checksum: 10c0/459c0bd6e636e80909898220eb390e1cba2b15c430b7b06cec6ac29d87acd29ef618b9b32532283af749f5d37af3534d0e3bde29fdf6bcefbf122784333c953d + languageName: node + linkType: hard + "tiny-invariant@npm:^1.0.6": - version: 1.3.1 - resolution: "tiny-invariant@npm:1.3.1" - checksum: 10c0/5b87c1d52847d9452b60d0dcb77011b459044e0361ca8253bfe7b43d6288106e12af926adb709a6fc28900e3864349b91dad9a4ac93c39aa15f360b26c2ff4db + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 10c0/65af4a07324b591a059b35269cd696aba21bef2107f29b9f5894d83cc143159a204b299553435b03874ebb5b94d019afa8b8eff241c8a4cfee95872c2e1c1c4a languageName: node linkType: hard -"titleize@npm:^3.0.0": - version: 3.0.0 - resolution: "titleize@npm:3.0.0" - checksum: 10c0/5ae6084ba299b5782f95e3fe85ea9f0fa4d74b8ae722b6b3208157e975589fbb27733aeba4e5080fa9314a856044ef52caa61b87caea4b1baade951a55c06336 +"tldts-core@npm:^6.1.72": + version: 6.1.72 + resolution: "tldts-core@npm:6.1.72" + checksum: 10c0/6cc0226c0b68264ee58f43aeb2165aae5ca058dd86ba83cc015c15494df6c9b9630553ae9d4d3bff5916f9952d4e4cc2b17853ee5aaebac978b21bf98d6f9b14 languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 +"tldts-icann@npm:^6.1.16": + version: 6.1.72 + resolution: "tldts-icann@npm:6.1.72" + dependencies: + tldts-core: "npm:^6.1.72" + checksum: 10c0/b093b295772bf3e8103e45e1936d75917300f7137ad17096cca3ba50d118a8368d1ed7756230b15110c661b4e57387a0f5438bbd952583858dfe3da2b670fbb5 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 languageName: node linkType: hard @@ -8501,31 +16606,91 @@ __metadata: languageName: node linkType: hard -"trim-newlines@npm:^4.0.2": - version: 4.1.1 - resolution: "trim-newlines@npm:4.1.1" - checksum: 10c0/70e60e652305efd0dda1f2bce1a5edc9bb5834a2e00d05dfde178715ec48faa8264a2bc1a7efc593b7936d03f6d42c398616329eef44b7bd5070180a02056981 +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 + languageName: node + linkType: hard + +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 10c0/4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 + languageName: node + linkType: hard + +"tough-cookie@npm:^4.1.2": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" + dependencies: + psl: "npm:^1.1.33" + punycode: "npm:^2.1.1" + universalify: "npm:^0.2.0" + url-parse: "npm:^1.5.3" + checksum: 10c0/aca7ff96054f367d53d1e813e62ceb7dd2eda25d7752058a74d64b7266fd07be75908f3753a32ccf866a2f997604b414cfb1916d6e7f69bc64d9d9939b0d6c45 + languageName: node + linkType: hard + +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: "npm:^2.1.1" + checksum: 10c0/cdc47cad3a9d0b6cb293e39ccb1066695ae6fdd39b9e4f351b010835a1f8b4f3a6dc3a55e896b421371187f22b48d7dac1b693de4f6551bdef7b6ab6735dfe3b + languageName: node + linkType: hard + +"tree-kill@npm:^1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 + languageName: node + linkType: hard + +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: 10c0/03cfefde6c59ff57138412b8c6be922ecc5aec30694d784f2a65ef8dcbd47faef580b7de0c949345abdc56ec4b4abf64dd1e5aea619b200316e471a3dd5bf1f6 + languageName: node + linkType: hard + +"trim-repeated@npm:^1.0.0": + version: 1.0.0 + resolution: "trim-repeated@npm:1.0.0" + dependencies: + escape-string-regexp: "npm:^1.0.2" + checksum: 10c0/89acada0142ed0cdb113615a3e82fdb09e7fdb0e3504ded62762dd935bc27debfcc38edefa497dc7145d8dc8602d40dd9eec891e0ea6c28fa0cc384200b692db languageName: node linkType: hard "ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" + version: 1.4.3 + resolution: "ts-api-utils@npm:1.4.3" peerDependencies: typescript: ">=4.2.0" - checksum: 10c0/9408338819c3aca2a709f0bc54e3f874227901506cacb1163612a6c8a43df224174feb965a5eafdae16f66fc68fd7bfee8d3275d0fa73fbb8699e03ed26520c9 + checksum: 10c0/e65dc6e7e8141140c23e1dc94984bf995d4f6801919c71d6dc27cf0cd51b100a91ffcfe5217626193e5bea9d46831e8586febdc7e172df3f1091a7384299e23a languageName: node linkType: hard -"tsconfig-paths@npm:^3.14.2": - version: 3.14.2 - resolution: "tsconfig-paths@npm:3.14.2" +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" dependencies: "@types/json5": "npm:^0.0.29" json5: "npm:^1.0.2" minimist: "npm:^1.2.6" strip-bom: "npm:^3.0.0" - checksum: 10c0/fdc92bb7b18b31c0e76f8ec4f98d07236b09590fd6578e587ad024792c8b2235d65125a8fd007fa47a84400f84ceccbf33f24e5198d953249e7204f4cef3517c + checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 + languageName: node + linkType: hard + +"tslib@npm:2, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 languageName: node linkType: hard @@ -8536,13 +16701,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.6.0, tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb - languageName: node - linkType: hard - "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -8563,6 +16721,20 @@ __metadata: languageName: node linkType: hard +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + +"type-fest@npm:^0.18.0": + version: 0.18.1 + resolution: "type-fest@npm:0.18.1" + checksum: 10c0/303f5ecf40d03e1d5b635ce7660de3b33c18ed8ebc65d64920c02974d9e684c72483c23f9084587e9dd6466a2ece1da42ddc95b412a461794dd30baca95e2bac + languageName: node + linkType: hard + "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -8570,103 +16742,173 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^1.0.1, type-fest@npm:^1.2.1, type-fest@npm:^1.2.2": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: 10c0/a3c0f4ee28ff6ddf800d769eafafcdeab32efa38763c1a1b8daeae681920f6e345d7920bf277245235561d8117dab765cb5f829c76b713b4c9de0998a5397141 +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: 10c0/0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 + languageName: node + linkType: hard + +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 + languageName: node + linkType: hard + +"type-fest@npm:^3.2.0": + version: 3.13.1 + resolution: "type-fest@npm:3.13.1" + checksum: 10c0/547d22186f73a8c04590b70dcf63baff390078c75ea8acd366bbd510fd0646e348bd1970e47ecf795b7cff0b41d26e9c475c1fedd6ef5c45c82075fbf916b629 + languageName: node + linkType: hard + +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/ebad66cdf00c96b1395dffc7873169cf09801fca5954507a484f41f253feb1388d815db297b0b3bb8ce7421eac6f7ff45e2ec68450a3d68408aa4ae02fcf3a6c + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-length@npm:1.0.0" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.2" - for-each: "npm:^0.3.3" - has-proto: "npm:^1.0.1" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/6696435d53ce0e704ff6760c57ccc35138aec5f87859e03eb2a3246336d546feae367952dbc918116f3f0dffbe669734e3cbd8960283c2fa79aac925db50d888 + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-offset@npm:1.0.0" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.2" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - has-proto: "npm:^1.0.1" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/4036ce007ae9752931bed3dd61e0d6de2a3e5f6a5a85a05f3adb35388d2c0728f9b1a1e638d75579f168e49c289bfb5417f00e96d4ab081f38b647fc854ff7a5 + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e languageName: node linkType: hard -"typed-array-length@npm:^1.0.4": +"typed-array-byte-offset@npm:^1.0.4": version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: - call-bind: "npm:^1.0.2" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - is-typed-array: "npm:^1.1.9" - checksum: 10c0/c5163c0103d07fefc8a2ad0fc151f9ca9a1f6422098c00f695d55f9896e4d63614cd62cf8d8a031c6cee5f418e8980a533796597174da4edff075b3d275a7e23 + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 languageName: node linkType: hard -"typescript@npm:^5.3.2": - version: 5.3.2 - resolution: "typescript@npm:5.3.2" +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + reflect.getprototypeof: "npm:^1.0.6" + checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 + languageName: node + linkType: hard + +"typed-query-selector@npm:^2.12.0": + version: 2.12.0 + resolution: "typed-query-selector@npm:2.12.0" + checksum: 10c0/069509887ecfff824a470f5f93d300cc9223cb059a36c47ac685f2812c4c9470340e07615893765e4264cef1678507532fa78f642fd52f276b589f7f5d791f79 + languageName: node + linkType: hard + +"typedarray-to-buffer@npm:^3.1.5": + version: 3.1.5 + resolution: "typedarray-to-buffer@npm:3.1.5" + dependencies: + is-typedarray: "npm:^1.0.0" + checksum: 10c0/4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 + languageName: node + linkType: hard + +"typescript@npm:^5.7.3": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/d7dbe1fbe19039e36a65468ea64b5d338c976550394ba576b7af9c68ed40c0bc5d12ecce390e4b94b287a09a71bd3229f19c2d5680611f35b7c53a3898791159 + checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.3.2#optional!builtin<compat/typescript>": - version: 5.3.2 - resolution: "typescript@patch:typescript@npm%3A5.3.2#optional!builtin<compat/typescript>::version=5.3.2&hash=e012d7" +"typescript@patch:typescript@npm%3A^5.7.3#optional!builtin<compat/typescript>": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin<compat/typescript>::version=5.7.3&hash=379a07" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/73c8bad74e732d93211c9d77f28b03307e2f5fc6a0afc73f4b783261ab567686a16d6ae958bdaef383a00be1b0b8c8b6741dd6ca3d13af4963fa7e47456d49c7 + checksum: 10c0/3b56d6afa03d9f6172d0b9cdb10e6b1efc9abc1608efd7a3d2f38773d5d8cfb9bbc68dfb72f0a7de5e8db04fc847f4e4baeddcd5ad9c9feda072234f0d788896 languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": + version: 1.0.6 + resolution: "uc.micro@npm:1.0.6" + checksum: 10c0/9bde2afc6f2e24b899db6caea47dae778b88862ca76688d844ef6e6121dec0679c152893a74a6cfbd2e6fde34654e6bd8424fee8e0166cdfa6c9ae5d42b8a17b + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.2" + call-bound: "npm:^1.0.3" has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.0.3" - which-boxed-primitive: "npm:^1.0.2" - checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 + languageName: node + linkType: hard + +"unbzip2-stream@npm:^1.4.3": + version: 1.4.3 + resolution: "unbzip2-stream@npm:1.4.3" + dependencies: + buffer: "npm:^5.2.1" + through: "npm:^2.3.8" + checksum: 10c0/2ea2048f3c9db3499316ccc1d95ff757017ccb6f46c812d7c42466247e3b863fb178864267482f7f178254214247779daf68e85f50bd7736c3c97ba2d58b910a languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf languageName: node linkType: hard "unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 10c0/0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de + version: 2.0.1 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" + checksum: 10c0/f83bc492fdbe662860795ef37a85910944df7310cac91bd778f1c19ebc911e8b9cde84e703de631e5a2fcca3905e39896f8fc5fc6a44ddaf7f4aff1cda24f381 languageName: node linkType: hard @@ -8681,9 +16923,9 @@ __metadata: linkType: hard "unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 10c0/f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 + version: 2.2.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" + checksum: 10c0/1d0a2deefd97974ddff5b7cb84f9884177f4489928dfcebb4b2b091d6124f2739df51fc6ea15958e1b5637ac2a24cff9bf21ea81e45335086ac52c0b4c717d6d languageName: node linkType: hard @@ -8694,121 +16936,350 @@ __metadata: languageName: node linkType: hard -"unidragger@npm:^2.4.0": - version: 2.4.0 - resolution: "unidragger@npm:2.4.0" - dependencies: - unipointer: "npm:^2.4.0" - checksum: 10c0/108d519d2a3653299ad9ac5fdf25ae851696fbd4769b2139af34613162772acfbfb3e72aee463c5bb42f79203da08118581ff0a2df7b049ea3e2d30022cc0427 +"unidragger@npm:^3.0.0": + version: 3.0.1 + resolution: "unidragger@npm:3.0.1" + dependencies: + ev-emitter: "npm:^2.0.0" + checksum: 10c0/d9751e6641b56fd92001ffafaa1b352ca5c80392de4f451926a75685a268bbabde6bb337a4fe45043c14ef8e632931dab60ba120bc7371768c1ad7011963af39 + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"unique-string@npm:^2.0.0": + version: 2.0.0 + resolution: "unique-string@npm:2.0.0" + dependencies: + crypto-random-string: "npm:^2.0.0" + checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b + languageName: node + linkType: hard + +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: 10c0/cedbe4d4ca3967edf24c0800cfc161c5a15e240dac28e3ce575c689abc11f2c81ccc6532c8752af3b40f9120fb5e454abecd359e164f4f6aa44c29cd37e194fe + languageName: node + linkType: hard + +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.1": + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/9cb353998d6d7d6ba1e46b8fa3db888822dd972212da4eda609d185eb5c3557a93fd59780ceb757afd4d84240518df08542736969e6a5d6d6ce2d58e9363aac6 + languageName: node + linkType: hard + +"upper-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case-first@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/ccad6a0b143310ebfba2b5841f30bef71246297385f1329c022c902b2b5fc5aee009faf1ac9da5ab3ba7f615b88f5dc1cd80461b18a8f38cb1d4c3eb92538ea9 + languageName: node + linkType: hard + +"upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/5ac176c9d3757abb71400df167f9abb46d63152d5797c630d1a9f083fbabd89711fb4b3dc6de06ff0138fe8946fa5b8518b4fcdae9ca8a3e341417075beae069 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"url-loader@npm:^4.1.1": + version: 4.1.1 + resolution: "url-loader@npm:4.1.1" + dependencies: + loader-utils: "npm:^2.0.0" + mime-types: "npm:^2.1.27" + schema-utils: "npm:^3.0.0" + peerDependencies: + file-loader: "*" + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + checksum: 10c0/71b6300e02ce26c70625eae1a2297c0737635038c62691bb3007ac33e85c0130efc74bfb444baf5c6b3bad5953491159d31d66498967d1417865d0c7e7cd1a64 + languageName: node + linkType: hard + +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: "npm:^2.1.1" + requires-port: "npm:^1.0.0" + checksum: 10c0/bd5aa9389f896974beb851c112f63b466505a04b4807cea2e5a3b7092f6fbb75316f0491ea84e44f66fed55f1b440df5195d7e3a8203f64fcefa19d182f5be87 + languageName: node + linkType: hard + +"use-callback-ref@npm:^1.3.3": + version: 1.3.3 + resolution: "use-callback-ref@npm:1.3.3" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/f887488c6e6075cdad4962979da1714b217bcb1ee009a9e57ce9a844bcfc4c3a99e93983dfc2e5af9e0913824d24e730090ff255e902c516dcb58d2d3837e01c + languageName: node + linkType: hard + +"use-isomorphic-layout-effect@npm:^1.2.0": + version: 1.2.0 + resolution: "use-isomorphic-layout-effect@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/2e4bdee68d65893b37e716ebdcc111550775189c80e662eda87d6f5b54dc431d3383a18914ea01a893ee5478902a878012713eaebcacbb6611ab88c463accb83 + languageName: node + linkType: hard + +"use-memo-one@npm:^1.1.1": + version: 1.1.3 + resolution: "use-memo-one@npm:1.1.3" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/3d596e65a6b47b2f1818061599738e00daad1f9a9bb4e5ce1f014b20a35b297e50fe4bf1d8c1699ab43ea97f01f84649a736c15ceff96de83bfa696925f6cc6b + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.2": + version: 1.1.3 + resolution: "use-sidecar@npm:1.1.3" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/161599bf921cfaa41c85d2b01c871975ee99260f3e874c2d41c05890d41170297bdcf314bc5185e7a700de2034ac5b888e3efc8e9f35724f4918f53538d717c9 + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:^1.2.2": + version: 1.4.0 + resolution: "use-sync-external-store@npm:1.4.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/ec011a5055962c0f6b509d6e78c0b143f8cd069890ae370528753053c55e3b360d3648e76cfaa854faa7a59eb08d6c5fb1015e60ffde9046d32f5b2a295acea5 + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.4.0": + version: 1.5.0 + resolution: "use-sync-external-store@npm:1.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 + languageName: node + linkType: hard + +"uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 10c0/1607dd32ac7fc22f2d8f77051e6a64845c9bce5cd3dd8aa0070c074ec73e666a1f63c7b4e0f4bf2bc8b9d59dc85a15e17807446d9d2b17c8485fbc2147b27f9b languageName: node linkType: hard -"unipointer@npm:^2.4.0": - version: 2.4.0 - resolution: "unipointer@npm:2.4.0" +"v8-to-istanbul@npm:^9.0.1": + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" dependencies: - ev-emitter: "npm:^1.0.1" - checksum: 10c0/cb824e5dce62094509d71ab9fc857901191082649febf6d5ffc00a7b9a27977b3e2429c2ccce49d9923cbed18f551c58038f08638734b0737b32d70181a9d5ac + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10c0/968bcf1c7c88c04df1ffb463c179558a2ec17aa49e49376120504958239d9e9dad5281aa05f2a78542b8557f2be0b0b4c325710262f3b838b40d703d5ed30c23 languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 +"validate-npm-package-name@npm:^5.0.0": + version: 5.0.1 + resolution: "validate-npm-package-name@npm:5.0.1" + checksum: 10c0/903e738f7387404bb72f7ac34e45d7010c877abd2803dc2d614612527927a40a6d024420033132e667b1bade94544b8a1f65c9431a4eb30d0ce0d80093cd1f74 + languageName: node + linkType: hard + +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f languageName: node linkType: hard -"untildify@npm:^4.0.0": +"w3c-xmlserializer@npm:^4.0.0": version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: 10c0/d758e624c707d49f76f7511d75d09a8eda7f2020d231ec52b67ff4896bcf7013be3f9522d8375f57e586e9a2e827f5641c7e06ee46ab9c435fc2b2b2e9de517a + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: "npm:^4.0.0" + checksum: 10c0/02cc66d6efc590bd630086cd88252444120f5feec5c4043932b0d0f74f8b060512f79dc77eb093a7ad04b4f02f39da79ce4af47ceb600f2bf9eacdc83204b1a8 languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"wait-on@npm:^8.0.1": + version: 8.0.2 + resolution: "wait-on@npm:8.0.2" dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" - peerDependencies: - browserslist: ">= 4.21.0" + axios: "npm:^1.7.9" + joi: "npm:^17.13.3" + lodash: "npm:^4.17.21" + minimist: "npm:^1.2.8" + rxjs: "npm:^7.8.1" bin: - update-browserslist-db: cli.js - checksum: 10c0/e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 + wait-on: bin/wait-on + checksum: 10c0/7a2a2193f601eb30d3125595fbed1abeb3ce0c9e164146aed27d12469d9b665273dc8e508a3a869c997f37b92d93478c202b38253a95c5c29e6fc64d0a317f5b languageName: node linkType: hard -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + makeerror: "npm:1.0.12" + checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e languageName: node linkType: hard -"use-isomorphic-layout-effect@npm:^1.1.2": - version: 1.1.2 - resolution: "use-isomorphic-layout-effect@npm:1.1.2" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/d8deea8b85e55ac6daba237a889630bfdbf0ebf60e9e22b6a78a78c26fabe6025e04ada7abef1e444e6786227d921e648b2707db8b3564daf757264a148a6e23 +"watchpack@npm:^2.4.1": + version: 2.4.2 + resolution: "watchpack@npm:2.4.2" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 languageName: node linkType: hard -"use-memo-one@npm:^1.1.1": - version: 1.1.3 - resolution: "use-memo-one@npm:1.1.3" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/3d596e65a6b47b2f1818061599738e00daad1f9a9bb4e5ce1f014b20a35b297e50fe4bf1d8c1699ab43ea97f01f84649a736c15ceff96de83bfa696925f6cc6b +"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": + version: 1.7.3 + resolution: "wbuf@npm:1.7.3" + dependencies: + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 languageName: node linkType: hard -"util-deprecate@npm:^1.0.2": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 +"web-vitals@npm:^4.2.1": + version: 4.2.4 + resolution: "web-vitals@npm:4.2.4" + checksum: 10c0/383c9281d5b556bcd190fde3c823aeb005bb8cf82e62c75b47beb411014a4ed13fa5c5e0489ed0f1b8d501cd66b0bebcb8624c1a75750bd5df13e2a3b1b2d194 languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" +"webpack-bundle-analyzer@npm:^4.9.1": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 + "@discoveryjs/json-ext": "npm:0.5.7" + acorn: "npm:^8.0.4" + acorn-walk: "npm:^8.0.0" + commander: "npm:^7.2.0" + debounce: "npm:^1.2.1" + escape-string-regexp: "npm:^4.0.0" + gzip-size: "npm:^6.0.0" + html-escaper: "npm:^2.0.2" + opener: "npm:^1.5.2" + picocolors: "npm:^1.0.0" + sirv: "npm:^2.0.3" + ws: "npm:^7.3.1" + bin: + webpack-bundle-analyzer: lib/bin/analyzer.js + checksum: 10c0/00603040e244ead15b2d92981f0559fa14216381349412a30070a7358eb3994cd61a8221d34a3b3fb8202dc3d1c5ee1fbbe94c5c52da536e5b410aa1cf279a48 languageName: node linkType: hard -"webpack-cli@npm:^5.0.0": +"webpack-cli@npm:^5.1.4": version: 5.1.4 resolution: "webpack-cli@npm:5.1.4" dependencies: @@ -8840,6 +17311,98 @@ __metadata: languageName: node linkType: hard +"webpack-cli@npm:^6.0.1": + version: 6.0.1 + resolution: "webpack-cli@npm:6.0.1" + dependencies: + "@discoveryjs/json-ext": "npm:^0.6.1" + "@webpack-cli/configtest": "npm:^3.0.1" + "@webpack-cli/info": "npm:^3.0.1" + "@webpack-cli/serve": "npm:^3.0.1" + colorette: "npm:^2.0.14" + commander: "npm:^12.1.0" + cross-spawn: "npm:^7.0.3" + envinfo: "npm:^7.14.0" + fastest-levenshtein: "npm:^1.0.12" + import-local: "npm:^3.0.2" + interpret: "npm:^3.1.1" + rechoir: "npm:^0.8.0" + webpack-merge: "npm:^6.0.1" + peerDependencies: + webpack: ^5.82.0 + peerDependenciesMeta: + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: ./bin/cli.js + checksum: 10c0/2aaca78e277427f03f528602abd707d224696048fb46286ea636c7975592409c4381ca94d68bbbb3900f195ca97f256e619583e8feb34a80da531461323bf3e2 + languageName: node + linkType: hard + +"webpack-dev-middleware@npm:^5.3.4": + version: 5.3.4 + resolution: "webpack-dev-middleware@npm:5.3.4" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^3.4.3" + mime-types: "npm:^2.1.31" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10c0/257df7d6bc5494d1d3cb66bba70fbdf5a6e0423e39b6420f7631aeb52435afbfbff8410a62146dcdf3d2f945c62e03193aae2ac1194a2f7d5a2523b9d194e9e1 + languageName: node + linkType: hard + +"webpack-dev-server@npm:^4.15.1": + version: 4.15.2 + resolution: "webpack-dev-server@npm:4.15.2" + dependencies: + "@types/bonjour": "npm:^3.5.9" + "@types/connect-history-api-fallback": "npm:^1.3.5" + "@types/express": "npm:^4.17.13" + "@types/serve-index": "npm:^1.9.1" + "@types/serve-static": "npm:^1.13.10" + "@types/sockjs": "npm:^0.3.33" + "@types/ws": "npm:^8.5.5" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.0.11" + chokidar: "npm:^3.5.3" + colorette: "npm:^2.0.10" + compression: "npm:^1.7.4" + connect-history-api-fallback: "npm:^2.0.0" + default-gateway: "npm:^6.0.3" + express: "npm:^4.17.3" + graceful-fs: "npm:^4.2.6" + html-entities: "npm:^2.3.2" + http-proxy-middleware: "npm:^2.0.3" + ipaddr.js: "npm:^2.0.1" + launch-editor: "npm:^2.6.0" + open: "npm:^8.0.9" + p-retry: "npm:^4.5.0" + rimraf: "npm:^3.0.2" + schema-utils: "npm:^4.0.0" + selfsigned: "npm:^2.1.1" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^5.3.4" + ws: "npm:^8.13.0" + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 10c0/625bd5b79360afcf98782c8b1fd710b180bb0e96d96b989defff550c546890010ceea82ffbecb2a0a23f7f018bc72f2dee7b3070f7b448fb0110df6657fb2904 + languageName: node + linkType: hard + "webpack-merge@npm:^5.7.3": version: 5.10.0 resolution: "webpack-merge@npm:5.10.0" @@ -8851,13 +17414,14 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^1.4.3": - version: 1.4.3 - resolution: "webpack-sources@npm:1.4.3" +"webpack-merge@npm:^6.0.1": + version: 6.0.1 + resolution: "webpack-merge@npm:6.0.1" dependencies: - source-list-map: "npm:^2.0.0" - source-map: "npm:~0.6.1" - checksum: 10c0/78dafb3e1e297d3f4eb6204311e8c64d28cd028f82887ba33aaf03fffc82482d8e1fdf6de25a60f4dde621d3565f4c3b1bfb350f09add8f4e54e00279ff3db5e + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.1" + checksum: 10c0/bf1429567858b353641801b8a2696ca0aac270fc8c55d4de8a7b586fe07d27fdcfc83099a98ab47e6162383db8dd63bb8cc25b1beb2ec82150422eec843b0dc0 languageName: node linkType: hard @@ -8868,17 +17432,17 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5.94.0": - version: 5.94.0 - resolution: "webpack@npm:5.94.0" +"webpack@npm:^5.97.0, webpack@npm:^5.97.1": + version: 5.97.1 + resolution: "webpack@npm:5.97.1" dependencies: - "@types/estree": "npm:^1.0.5" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-attributes: "npm:^1.9.5" - browserslist: "npm:^4.21.10" + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.6" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" + acorn: "npm:^8.14.0" + browserslist: "npm:^4.24.0" chrome-trace-event: "npm:^1.0.2" enhanced-resolve: "npm:^5.17.1" es-module-lexer: "npm:^1.2.1" @@ -8900,69 +17464,122 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/b4d1b751f634079bd177a89eef84d80fa5bb8d6fc15d72ab40fc2b9ca5167a79b56585e1a849e9e27e259803ee5c4365cb719e54af70a43c06358ec268ff4ebf + checksum: 10c0/a12d3dc882ca582075f2c4bd88840be8307427245c90a8a0e0b372d73560df13fcf25a61625c9e7edc964981d16b5a8323640562eb48347cf9dd2f8bd1b39d35 languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" +"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": + version: 0.7.4 + resolution: "websocket-driver@npm:0.7.4" dependencies: - is-bigint: "npm:^1.0.1" - is-boolean-object: "npm:^1.1.0" - is-number-object: "npm:^1.0.4" - is-string: "npm:^1.0.5" - is-symbol: "npm:^1.0.3" - checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + http-parser-js: "npm:>=0.5.1" + safe-buffer: "npm:>=5.1.0" + websocket-extensions: "npm:>=0.1.1" + checksum: 10c0/5f09547912b27bdc57bac17b7b6527d8993aa4ac8a2d10588bb74aebaf785fdcf64fea034aae0c359b7adff2044dd66f3d03866e4685571f81b13e548f9021f1 languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" +"websocket-extensions@npm:>=0.1.1": + version: 0.1.4 + resolution: "websocket-extensions@npm:0.1.4" + checksum: 10c0/bbc8c233388a0eb8a40786ee2e30d35935cacbfe26ab188b3e020987e85d519c2009fe07cfc37b7f718b85afdba7e54654c9153e6697301f72561bfe429177e0 + languageName: node + linkType: hard + +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10c0/91b90a49f312dc751496fd23a7e68981e62f33afe938b97281ad766235c4872fc4e66319f925c5e9001502b3040dd25a33b02a9c693b73a4cbbfdc4ad10c3e3e + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: 10c0/323895a1cda29a5fb0b9ca82831d2c316309fede0365047c4c323073e3239067a304a09a1f4b123b9532641ab604203f33a1403b5ca6a62ef405bcd7a204080f + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: "npm:^3.0.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/f7ec264976d7c725e0696fcaf9ebe056e14422eacbf92fdbb4462034609cba7d0c85ffa1aab05e9309d42969bcf04632ba5ed3f3882c516d7b093053315bf4c1 + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" dependencies: - function.prototype.name: "npm:^1.1.5" - has-tostringtag: "npm:^1.0.0" + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.0.5" - is-finalizationregistry: "npm:^1.0.2" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.1.4" + is-regex: "npm:^1.2.1" is-weakref: "npm:^1.0.2" isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.0.2" - which-collection: "npm:^1.0.1" - which-typed-array: "npm:^1.1.9" - checksum: 10c0/2b7b234df3443b52f4fbd2b65b731804de8d30bcc4210ec84107ef377a81923cea7f2763b7fb78b394175cea59118bf3c41b9ffd2d643cb1d748ef93b33b6bd4 + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 languageName: node linkType: hard -"which-collection@npm:^1.0.1": - version: 1.0.1 - resolution: "which-collection@npm:1.0.1" +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" dependencies: - is-map: "npm:^2.0.1" - is-set: "npm:^2.0.1" - is-weakmap: "npm:^2.0.1" - is-weakset: "npm:^2.0.1" - checksum: 10c0/249f913e1758ed2f06f00706007d87dc22090a80591a56917376e70ecf8fc9ab6c41d98e1c87208bb9648676f65d4b09c0e4d23c56c7afb0f0a73a27d701df5d + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.1 + resolution: "which-module@npm:2.0.1" + checksum: 10c0/087038e7992649eaffa6c7a4f3158d5b53b14cf5b6c1f0e043dccfacb1ba179d12f17545d5b85ebd94a42ce280a6fe65d0cbcab70f4fc6daad1dfae85e0e6a3e languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.9": - version: 1.1.13 - resolution: "which-typed-array@npm:1.1.13" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": + version: 1.1.18 + resolution: "which-typed-array@npm:1.1.18" dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/9f5f1c42918df3d5b91c4315ed0051d5d874370998bf095c9ae0df374f0881f85094e3c384b8fb08ab7b4d4f54ba81c0aff75da6226e7c0589b83dfbec1cd4c9 + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/0412f4a91880ca1a2a63056187c2e3de6b129b2b5b6c17bc3729f0f7041047ae48fb7424813e51506addb2c97320003ee18b8c57469d2cde37983ef62126143c languageName: node linkType: hard -"which@npm:^1.3.1": +"which@npm:^1.2.12, which@npm:^1.3.1": version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: @@ -8984,25 +17601,32 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: isexe: "npm:^3.1.1" bin: node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b languageName: node linkType: hard -"wildcard@npm:^2.0.0": +"wildcard@npm:^2.0.0, wildcard@npm:^2.0.1": version: 2.0.1 resolution: "wildcard@npm:2.0.1" checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: @@ -9013,6 +17637,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^5.1.0": + version: 5.1.0 + resolution: "wrap-ansi@npm:5.1.0" + dependencies: + ansi-styles: "npm:^3.2.0" + string-width: "npm:^3.0.0" + strip-ansi: "npm:^5.0.0" + checksum: 10c0/fcd0b39b7453df512f2fe8c714a1c1b147fe3e6a4b5a2e4de6cadc3af47212f335eceaffe588e98322d6345e72672137e2c0b834d8a662e73a32296c1c8216bb + languageName: node + linkType: hard + "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -9031,6 +17666,28 @@ __metadata: languageName: node linkType: hard +"write-file-atomic@npm:^3.0.0": + version: 3.0.3 + resolution: "write-file-atomic@npm:3.0.3" + dependencies: + imurmurhash: "npm:^0.1.4" + is-typedarray: "npm:^1.0.0" + signal-exit: "npm:^3.0.2" + typedarray-to-buffer: "npm:^3.1.5" + checksum: 10c0/7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + "write-file-atomic@npm:^5.0.1": version: 5.0.1 resolution: "write-file-atomic@npm:5.0.1" @@ -9041,6 +17698,112 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.0.0, ws@npm:^7.3.1": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + +"ws@npm:^8.11.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + languageName: node + linkType: hard + +"xdg-basedir@npm:^4.0.0": + version: 4.0.0 + resolution: "xdg-basedir@npm:4.0.0" + checksum: 10c0/1b5d70d58355af90363a4e0a51c992e77fc5a1d8de5822699c7d6e96a6afea9a1e048cb93312be6870f338ca45ebe97f000425028fa149c1e87d1b5b8b212a06 + languageName: node + linkType: hard + +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: 10c0/c1bfa219d64e56fee265b2bd31b2fcecefc063ee802da1e73bad1f21d7afd89b943c9e2c97af2942f60b1ad46f915a4c81e00039c7d398b53cf410e29d3c30bd + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 10c0/b64b535861a6f310c5d9bfa10834cf49127c71922c297da9d4d1b45eeaae40bf9b4363275876088fbe2667e5db028d2cd4f8ee72eed9bede840a67d57dab7593 + languageName: node + linkType: hard + +"y-indexeddb@npm:~9.0.11": + version: 9.0.12 + resolution: "y-indexeddb@npm:9.0.12" + dependencies: + lib0: "npm:^0.2.74" + peerDependencies: + yjs: ^13.0.0 + checksum: 10c0/b31fbc12ef4a7d71f09212db02570af07c6a17b02537ce4cbb29f0549137adcbebf613cb2af63fa1d13e0932645be0293a4e7189cb5bf5dc6263cf2f72b65004 + languageName: node + linkType: hard + +"y-protocols@npm:^1.0.5, y-protocols@npm:^1.0.6": + version: 1.0.6 + resolution: "y-protocols@npm:1.0.6" + dependencies: + lib0: "npm:^0.2.85" + peerDependencies: + yjs: ^13.0.0 + checksum: 10c0/fae7d63d4609e75eac8114320aa3581311993cd0c1b7ac03d13dc30c9a95d7b1680e4500786bb417c1fb3d11a69e1bed3e50d08e15febde9b8abf70f133eb917 + languageName: node + linkType: hard + +"y-webrtc@npm:~10.2.5": + version: 10.2.6 + resolution: "y-webrtc@npm:10.2.6" + dependencies: + lib0: "npm:^0.2.42" + simple-peer: "npm:^9.11.0" + ws: "npm:^8.14.2" + y-protocols: "npm:^1.0.6" + peerDependencies: + yjs: ^13.6.8 + dependenciesMeta: + ws: + optional: true + bin: + y-webrtc-signaling: bin/server.js + checksum: 10c0/47284dccab2f8e16db03e2201d47f96b32a7427c72a19f9b21f5dee7d45047817a9faee4c7b3c6a7475f9127223f83a7606edbf60ebdce5a79be4648fc1521c9 + languageName: node + linkType: hard + +"y18n@npm:^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" @@ -9055,6 +17818,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + "yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" @@ -9062,13 +17832,83 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.9": +"yargs-parser@npm:^15.0.1": + version: 15.0.3 + resolution: "yargs-parser@npm:15.0.3" + dependencies: + camelcase: "npm:^5.0.0" + decamelize: "npm:^1.2.0" + checksum: 10c0/396bba6fd8cbe568ea64c85583c6814d886719980ebadce03f34dd5f6b339e0260a364ab65a3e3b97db93ba2ecf0f544aac13b389f682b16170fabbfd2a20b1b + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 languageName: node linkType: hard +"yargs-parser@npm:^21.0.0, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^14.2": + version: 14.2.3 + resolution: "yargs@npm:14.2.3" + dependencies: + cliui: "npm:^5.0.0" + decamelize: "npm:^1.2.0" + find-up: "npm:^3.0.0" + get-caller-file: "npm:^2.0.1" + require-directory: "npm:^2.1.1" + require-main-filename: "npm:^2.0.0" + set-blocking: "npm:^2.0.0" + string-width: "npm:^3.0.0" + which-module: "npm:^2.0.0" + y18n: "npm:^4.0.0" + yargs-parser: "npm:^15.0.1" + checksum: 10c0/dceba0f167f182dfea9ab7e8924e3c0eff7197746e2c2776bf1ca5a342ccdf27d8ee995616670f558388502b2a19b9d809f88a4192da67cc0a83f01acc2f7c74 + languageName: node + linkType: hard + +"yargs@npm:^17.3.1, yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + +"yjs@npm:~13.6.6": + version: 13.6.23 + resolution: "yjs@npm:13.6.23" + dependencies: + lib0: "npm:^0.2.99" + checksum: 10c0/85a6b29d647b11451644f99649175c028c48f7c3b7bab986bbf344662d8b6e31a06aad898ed7c16979824b0ef130806a3a44e93542266d5e25c0e2a1d2af279b + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -9077,8 +17917,15 @@ __metadata: linkType: hard "yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 10c0/856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 + languageName: node + linkType: hard + +"zod@npm:3.23.8": + version: 3.23.8 + resolution: "zod@npm:3.23.8" + checksum: 10c0/8f14c87d6b1b53c944c25ce7a28616896319d95bc46a9660fe441adc0ed0a81253b02b5abdaeffedbeb23bdd25a0bf1c29d2c12dd919aef6447652dd295e3e69 languageName: node linkType: hard diff --git a/private/src/static/fonts/lato/Lato-Italic.ttf b/wp-content/themes/humanity-theme/fonts/lato/Lato-Italic.ttf similarity index 100% rename from private/src/static/fonts/lato/Lato-Italic.ttf rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Italic.ttf diff --git a/private/src/static/fonts/lato/Lato-Italic.woff b/wp-content/themes/humanity-theme/fonts/lato/Lato-Italic.woff similarity index 100% rename from private/src/static/fonts/lato/Lato-Italic.woff rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Italic.woff diff --git a/private/src/static/fonts/lato/Lato-Italic.woff2 b/wp-content/themes/humanity-theme/fonts/lato/Lato-Italic.woff2 similarity index 100% rename from private/src/static/fonts/lato/Lato-Italic.woff2 rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Italic.woff2 diff --git a/private/src/static/fonts/lato/Lato-Light.ttf b/wp-content/themes/humanity-theme/fonts/lato/Lato-Light.ttf similarity index 100% rename from private/src/static/fonts/lato/Lato-Light.ttf rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Light.ttf diff --git a/private/src/static/fonts/lato/Lato-Light.woff b/wp-content/themes/humanity-theme/fonts/lato/Lato-Light.woff similarity index 100% rename from private/src/static/fonts/lato/Lato-Light.woff rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Light.woff diff --git a/private/src/static/fonts/lato/Lato-Light.woff2 b/wp-content/themes/humanity-theme/fonts/lato/Lato-Light.woff2 similarity index 100% rename from private/src/static/fonts/lato/Lato-Light.woff2 rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Light.woff2 diff --git a/private/src/static/fonts/lato/Lato-LightItalic.ttf b/wp-content/themes/humanity-theme/fonts/lato/Lato-LightItalic.ttf similarity index 100% rename from private/src/static/fonts/lato/Lato-LightItalic.ttf rename to wp-content/themes/humanity-theme/fonts/lato/Lato-LightItalic.ttf diff --git a/private/src/static/fonts/lato/Lato-LightItalic.woff b/wp-content/themes/humanity-theme/fonts/lato/Lato-LightItalic.woff similarity index 100% rename from private/src/static/fonts/lato/Lato-LightItalic.woff rename to wp-content/themes/humanity-theme/fonts/lato/Lato-LightItalic.woff diff --git a/private/src/static/fonts/lato/Lato-LightItalic.woff2 b/wp-content/themes/humanity-theme/fonts/lato/Lato-LightItalic.woff2 similarity index 100% rename from private/src/static/fonts/lato/Lato-LightItalic.woff2 rename to wp-content/themes/humanity-theme/fonts/lato/Lato-LightItalic.woff2 diff --git a/private/src/static/fonts/lato/Lato-Regular.ttf b/wp-content/themes/humanity-theme/fonts/lato/Lato-Regular.ttf similarity index 100% rename from private/src/static/fonts/lato/Lato-Regular.ttf rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Regular.ttf diff --git a/private/src/static/fonts/lato/Lato-Regular.woff b/wp-content/themes/humanity-theme/fonts/lato/Lato-Regular.woff similarity index 100% rename from private/src/static/fonts/lato/Lato-Regular.woff rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Regular.woff diff --git a/private/src/static/fonts/lato/Lato-Regular.woff2 b/wp-content/themes/humanity-theme/fonts/lato/Lato-Regular.woff2 similarity index 100% rename from private/src/static/fonts/lato/Lato-Regular.woff2 rename to wp-content/themes/humanity-theme/fonts/lato/Lato-Regular.woff2 diff --git a/private/src/static/fonts/playfair/PlayfairDisplay-Bold.ttf b/wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Bold.ttf similarity index 100% rename from private/src/static/fonts/playfair/PlayfairDisplay-Bold.ttf rename to wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Bold.ttf diff --git a/private/src/static/fonts/playfair/PlayfairDisplay-Bold.woff b/wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Bold.woff similarity index 100% rename from private/src/static/fonts/playfair/PlayfairDisplay-Bold.woff rename to wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Bold.woff diff --git a/private/src/static/fonts/playfair/PlayfairDisplay-Bold.woff2 b/wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Bold.woff2 similarity index 100% rename from private/src/static/fonts/playfair/PlayfairDisplay-Bold.woff2 rename to wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Bold.woff2 diff --git a/private/src/static/fonts/playfair/PlayfairDisplay-Italic.ttf b/wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Italic.ttf similarity index 100% rename from private/src/static/fonts/playfair/PlayfairDisplay-Italic.ttf rename to wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Italic.ttf diff --git a/private/src/static/fonts/playfair/PlayfairDisplay-Italic.woff b/wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Italic.woff similarity index 100% rename from private/src/static/fonts/playfair/PlayfairDisplay-Italic.woff rename to wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Italic.woff diff --git a/private/src/static/fonts/playfair/PlayfairDisplay-Italic.woff2 b/wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Italic.woff2 similarity index 100% rename from private/src/static/fonts/playfair/PlayfairDisplay-Italic.woff2 rename to wp-content/themes/humanity-theme/fonts/playfair/PlayfairDisplay-Italic.woff2 diff --git a/private/src/static/fonts/roboto-condensed/roboto-condensed-200-italic.woff2 b/wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-200-italic.woff2 similarity index 100% rename from private/src/static/fonts/roboto-condensed/roboto-condensed-200-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-200-italic.woff2 diff --git a/private/src/static/fonts/roboto-condensed/roboto-condensed-200.woff2 b/wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-200.woff2 similarity index 100% rename from private/src/static/fonts/roboto-condensed/roboto-condensed-200.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-200.woff2 diff --git a/private/src/static/fonts/roboto-condensed/roboto-condensed-400-italic.woff2 b/wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-400-italic.woff2 similarity index 100% rename from private/src/static/fonts/roboto-condensed/roboto-condensed-400-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-400-italic.woff2 diff --git a/private/src/static/fonts/roboto-condensed/roboto-condensed-400.woff2 b/wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-400.woff2 similarity index 100% rename from private/src/static/fonts/roboto-condensed/roboto-condensed-400.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-400.woff2 diff --git a/private/src/static/fonts/roboto-condensed/roboto-condensed-700-italic.woff2 b/wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-700-italic.woff2 similarity index 100% rename from private/src/static/fonts/roboto-condensed/roboto-condensed-700-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-700-italic.woff2 diff --git a/private/src/static/fonts/roboto-condensed/roboto-condensed-700.woff2 b/wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-700.woff2 similarity index 100% rename from private/src/static/fonts/roboto-condensed/roboto-condensed-700.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto-condensed/roboto-condensed-700.woff2 diff --git a/private/src/static/fonts/roboto/roboto-100-italic.woff2 b/wp-content/themes/humanity-theme/fonts/roboto/roboto-100-italic.woff2 similarity index 100% rename from private/src/static/fonts/roboto/roboto-100-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto/roboto-100-italic.woff2 diff --git a/private/src/static/fonts/roboto/roboto-100.woff2 b/wp-content/themes/humanity-theme/fonts/roboto/roboto-100.woff2 similarity index 100% rename from private/src/static/fonts/roboto/roboto-100.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto/roboto-100.woff2 diff --git a/private/src/static/fonts/roboto/roboto-400-italic.woff2 b/wp-content/themes/humanity-theme/fonts/roboto/roboto-400-italic.woff2 similarity index 100% rename from private/src/static/fonts/roboto/roboto-400-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto/roboto-400-italic.woff2 diff --git a/private/src/static/fonts/roboto/roboto-400.woff2 b/wp-content/themes/humanity-theme/fonts/roboto/roboto-400.woff2 similarity index 100% rename from private/src/static/fonts/roboto/roboto-400.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto/roboto-400.woff2 diff --git a/private/src/static/fonts/roboto/roboto-700-italic.woff2 b/wp-content/themes/humanity-theme/fonts/roboto/roboto-700-italic.woff2 similarity index 100% rename from private/src/static/fonts/roboto/roboto-700-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto/roboto-700-italic.woff2 diff --git a/private/src/static/fonts/roboto/roboto-700.woff2 b/wp-content/themes/humanity-theme/fonts/roboto/roboto-700.woff2 similarity index 100% rename from private/src/static/fonts/roboto/roboto-700.woff2 rename to wp-content/themes/humanity-theme/fonts/roboto/roboto-700.woff2 diff --git a/private/src/static/fonts/rubik/rubik-300-italic.woff2 b/wp-content/themes/humanity-theme/fonts/rubik/rubik-300-italic.woff2 similarity index 100% rename from private/src/static/fonts/rubik/rubik-300-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/rubik/rubik-300-italic.woff2 diff --git a/private/src/static/fonts/rubik/rubik-300.woff2 b/wp-content/themes/humanity-theme/fonts/rubik/rubik-300.woff2 similarity index 100% rename from private/src/static/fonts/rubik/rubik-300.woff2 rename to wp-content/themes/humanity-theme/fonts/rubik/rubik-300.woff2 diff --git a/private/src/static/fonts/rubik/rubik-400-italic.woff2 b/wp-content/themes/humanity-theme/fonts/rubik/rubik-400-italic.woff2 similarity index 100% rename from private/src/static/fonts/rubik/rubik-400-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/rubik/rubik-400-italic.woff2 diff --git a/private/src/static/fonts/rubik/rubik-400.woff2 b/wp-content/themes/humanity-theme/fonts/rubik/rubik-400.woff2 similarity index 100% rename from private/src/static/fonts/rubik/rubik-400.woff2 rename to wp-content/themes/humanity-theme/fonts/rubik/rubik-400.woff2 diff --git a/private/src/static/fonts/rubik/rubik-700-italic.woff2 b/wp-content/themes/humanity-theme/fonts/rubik/rubik-700-italic.woff2 similarity index 100% rename from private/src/static/fonts/rubik/rubik-700-italic.woff2 rename to wp-content/themes/humanity-theme/fonts/rubik/rubik-700-italic.woff2 diff --git a/private/src/static/fonts/rubik/rubik-700.woff2 b/wp-content/themes/humanity-theme/fonts/rubik/rubik-700.woff2 similarity index 100% rename from private/src/static/fonts/rubik/rubik-700.woff2 rename to wp-content/themes/humanity-theme/fonts/rubik/rubik-700.woff2 diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.eot b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.eot similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.eot rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.eot diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.ttf b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.ttf similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.ttf rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.ttf diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff2 b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff2 similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff2 rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff2 diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.eot b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.eot similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.eot rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.eot diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.ttf b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.ttf similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.ttf rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.ttf diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff diff --git a/private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff2 b/wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff2 similarity index 100% rename from private/src/static/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff2 rename to wp-content/themes/humanity-theme/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff2 diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.eot b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.eot similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.eot rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.eot diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.ttf b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.ttf similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.ttf rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.ttf diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.woff b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.woff similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.woff rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.woff diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.woff2 b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.woff2 similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Light.woff2 rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Light.woff2 diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.eot b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.eot similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.eot rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.eot diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.ttf b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.ttf similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.ttf rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.ttf diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff2 b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff2 similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff2 rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff2 diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.eot b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.eot similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.eot rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.eot diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.ttf b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.ttf similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.ttf rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.ttf diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff2 b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff2 similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff2 rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff2 diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.eot b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.eot similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.eot rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.eot diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.ttf b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.ttf similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.ttf rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.ttf diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.woff b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.woff similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.woff rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.woff diff --git a/private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.woff2 b/wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.woff2 similarity index 100% rename from private/src/static/fonts/trade-gothic/TradeGothicLTW05-Roman.woff2 rename to wp-content/themes/humanity-theme/fonts/trade-gothic/TradeGothicLTW05-Roman.woff2 diff --git a/wp-content/themes/humanity-theme/functions.php b/wp-content/themes/humanity-theme/functions.php index 93b5d9ee..bbc7af59 100644 --- a/wp-content/themes/humanity-theme/functions.php +++ b/wp-content/themes/humanity-theme/functions.php @@ -100,7 +100,6 @@ require_once realpath( __DIR__ . '/includes/theme-setup/class-desktop-nav-walker.php' ); require_once realpath( __DIR__ . '/includes/theme-setup/class-mobile-nav-walker.php' ); require_once realpath( __DIR__ . '/includes/theme-setup/navigation.php' ); -require_once realpath( __DIR__ . '/includes/theme-setup/scripts-and-styles.php' ); require_once realpath( __DIR__ . '/includes/theme-setup/analytics/google-tag-manager.php' ); require_once realpath( __DIR__ . '/includes/theme-setup/analytics/google-analytics.php' ); require_once realpath( __DIR__ . '/includes/theme-setup/analytics/hotjar.php' ); @@ -114,7 +113,6 @@ #region kses require_once realpath( __DIR__ . '/includes/kses/checkbox-filter.php' ); require_once realpath( __DIR__ . '/includes/kses/wp-kses-post.php' ); -require_once realpath( __DIR__ . '/includes/blocks/slider/kses.php' ); #endregion kses /** @@ -136,7 +134,9 @@ #endregion blocks #region fse-blocks -require_once realpath( __DIR__ . '/includes/full-site-editing/blocks/register.php' ); +if ( file_exists( realpath( __DIR__ . '/build/register-blocks.php' ) ) ) { + require_once realpath( __DIR__ . '/build/register-blocks.php' ); +} #endregion fse-blocks /** @@ -188,6 +188,7 @@ */ #region features require_once realpath( __DIR__ . '/includes/features/related-content/class-related-content.php' ); +require_once realpath( __DIR__ . '/includes/features/related-content/rest-api-field.php' ); require_once realpath( __DIR__ . '/includes/features/related-content/class-wp-rest-related-content-controller.php' ); #endregion features diff --git a/private/src/static/images/icon-facebook.svg b/wp-content/themes/humanity-theme/images/icon-facebook.svg similarity index 100% rename from private/src/static/images/icon-facebook.svg rename to wp-content/themes/humanity-theme/images/icon-facebook.svg diff --git a/private/src/static/images/icon-twitter.svg b/wp-content/themes/humanity-theme/images/icon-twitter.svg similarity index 100% rename from private/src/static/images/icon-twitter.svg rename to wp-content/themes/humanity-theme/images/icon-twitter.svg diff --git a/wp-content/themes/humanity-theme/images/sprite.svg b/wp-content/themes/humanity-theme/images/sprite.svg new file mode 100644 index 00000000..dc8bb2a1 --- /dev/null +++ b/wp-content/themes/humanity-theme/images/sprite.svg @@ -0,0 +1,450 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="300" viewBox="0 0 313 300" width="313"> + <svg height="46" viewBox="0 0 50 46" width="50" x="184" y="82"> + <path fill="#FFFFFF" d="M23.9,13.6l1.5,1.5L17.6,23l7.9,7.9l-1.6,1.5L14.5,23L23.9,13.6z"/> + <path fill="#FFFFFF" d="M33.9,13.6l1.5,1.5L27.6,23l7.9,7.9l-1.6,1.5L24.5,23L33.9,13.6z"/> + </svg> + <svg height="46" viewBox="0 0 50 46" width="50" x="5" y="159"> + <path fill="#FFFFFF" d="M15.6,24.1l1.5-1.5l7.9,7.8l7.9-7.9l1.5,1.6L25,33.5L15.6,24.1z"/> + <path fill="#FFFFFF" d="M15.6,14.1l1.5-1.5l7.9,7.8l7.9-7.9l1.5,1.6L25,23.5L15.6,14.1z"/> + </svg> + <svg height="46" viewBox="0 0 50 46" width="50" x="60" y="159"> + <path fill="#FFFFFF" d="M26.1,32.4l-1.5-1.5l7.8-7.9l-7.9-7.9l1.6-1.5l9.4,9.4L26.1,32.4z"/> + <path fill="#FFFFFF" d="M16.1,32.4l-1.5-1.5l7.8-7.9l-7.9-7.9l1.6-1.5l9.4,9.4L16.1,32.4z"/> + </svg> + <svg height="17.2" viewBox="0 0 32 18" width="31.3" x="184" y="133"> + <circle fill="#FFFFFF" cx="15.6" cy="8.6" r="2.1"/> + <path fill="#FFFFFF" d="M30.7,8.1c-3.1-4.5-8.7-7.4-14.8-7.4c-0.1,0-0.2,0-0.3,0s-0.2,0-0.3,0C9.3,0.7,3.6,3.6,0.6,8.1L0.2,8.6 l0.4,0.5c3.1,4.5,8.7,7.4,14.8,7.4c0.1,0,0.2,0,0.3,0s0.2,0,0.3,0c6.1-0.1,11.7-2.9,14.8-7.4L31,8.6L30.7,8.1z M15.6,14.6 c-3.4,0-6.2-2.7-6.2-6s2.8-6,6.2-6s6.2,2.7,6.2,6S19,14.6,15.6,14.6z M2.5,8.6c1.6-2.1,3.9-3.8,6.6-4.8C8,5.1,7.4,6.8,7.4,8.6 s0.7,3.5,1.7,4.8C6.4,12.4,4.1,10.8,2.5,8.6z M22.1,13.5c1.1-1.3,1.7-3,1.7-4.8s-0.7-3.5-1.7-4.8c2.6,1,4.9,2.7,6.6,4.8 C27.1,10.8,24.8,12.4,22.1,13.5z"/> + </svg> + <svg height="17.2" viewBox="0 0 32 18" width="31.3" x="115" y="159"> + <circle fill="#000000" cx="15.6" cy="8.6" r="2.1"/> + <path fill="#000000" d="M30.7,8.1c-3.1-4.5-8.7-7.4-14.8-7.4c-0.1,0-0.2,0-0.3,0s-0.2,0-0.3,0C9.3,0.7,3.6,3.6,0.6,8.1L0.2,8.6 l0.4,0.5c3.1,4.5,8.7,7.4,14.8,7.4c0.1,0,0.2,0,0.3,0s0.2,0,0.3,0c6.1-0.1,11.7-2.9,14.8-7.4L31,8.6L30.7,8.1z M15.6,14.6 c-3.4,0-6.2-2.7-6.2-6s2.8-6,6.2-6s6.2,2.7,6.2,6S19,14.6,15.6,14.6z M2.5,8.6c1.6-2.1,3.9-3.8,6.6-4.8C8,5.1,7.4,6.8,7.4,8.6 s0.7,3.5,1.7,4.8C6.4,12.4,4.1,10.8,2.5,8.6z M22.1,13.5c1.1-1.3,1.7-3,1.7-4.8s-0.7-3.5-1.7-4.8c2.6,1,4.9,2.7,6.6,4.8 C27.1,10.8,24.8,12.4,22.1,13.5z"/> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="5" y="210"> + <g> + <path fill="#ffffff" d="M12.4,12.2L5.4,24.6H0.1L5,12.2H0.5V0.4h11.8V12.2z M30.9,12.2L24,24.6h-5.3l4.9-12.4h-4.5V0.4h11.8V12.2z"/> + </g> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="41" y="210"> + <g> + <path d="M0.1,12.8L7,0.4h5.3L7.4,12.8h4.5v11.8H0.1V12.8z M18.7,12.8l6.9-12.4h5.3L26,12.8h4.5v11.8H18.7V12.8z"/> + </g> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="77" y="210"> + <g> + <path fill="#ffffff" d="M0.1,12.8L7,0.4h5.3L7.4,12.8h4.5v11.8H0.1V12.8z M18.7,12.8l6.9-12.4h5.3L26,12.8h4.5v11.8H18.7V12.8z"/> + </g> + </svg> + <svg height="25" viewBox="0 0 31 25" width="31" x="113" y="210"> + <g> + <path d="M12.4,12.2L5.4,24.6H0.1L5,12.2H0.5V0.4h11.8V12.2z M30.9,12.2L24,24.6h-5.3l4.9-12.4h-4.5V0.4h11.8V12.2z"/> + </g> + </svg> + <svg height="21" viewBox="0 0 30 21" width="30" x="115" y="182"> + <!-- Generator: Sketch 44 (41411) - http://www.bohemiancoding.com/sketch --> + <title>youtube-play-dark</title> + <desc>Created with Sketch.</desc> + <defs/> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="youtube-play-dark" fill-rule="nonzero"> + <polygon id="Shape" fill="#FFFFFF" points="11.6665665 14.1560367 19.6126029 10.0390685 11.6665665 5.89331037"/> + <polygon id="Shape" fill="#000000" opacity="0.12" points="11.6665665 5.89331037 18.6337434 10.546636 19.6126029 10.0390685"/> + <path d="M29.1132987,4.46187221 C29.1132987,4.46187221 28.8253988,2.43534501 27.945001,1.54314331 C26.8267979,0.371678734 25.5721303,0.365632837 24.9983458,0.297400567 C20.8831051,0 14.7102439,0 14.7102439,0 L14.6975763,0 C14.6975763,0 8.5247152,0 4.40947443,0.297400567 C3.83568999,0.365632837 2.58159815,0.371678734 1.46281925,1.54314331 C0.58242144,2.43534501 0.294521569,4.46187221 0.294521569,4.46187221 C0.294521569,4.46187221 0,6.84165255 0,9.22143289 L0,11.452369 C0,13.8321493 0.294521569,16.2119297 0.294521569,16.2119297 C0.294521569,16.2119297 0.58242144,18.2384569 1.46281925,19.1309465 C2.58159815,20.3021231 4.05103909,20.265272 4.7054355,20.3879173 C7.05815325,20.6136308 14.7039101,20.6833026 14.7039101,20.6833026 C14.7039101,20.6833026 20.8831051,20.6740898 24.9983458,20.3764013 C25.5741456,20.3078811 26.82651,20.3021231 27.945001,19.1306586 C28.8253988,18.2384569 29.1132987,16.2119297 29.1132987,16.2119297 C29.1132987,16.2119297 29.4069566,13.8321493 29.4069566,11.452369 L29.4069566,9.22143289 C29.4075324,6.84165255 29.1132987,4.46187221 29.1132987,4.46187221 Z M11.6665665,14.1560367 L11.6665665,5.89331037 L19.6126029,10.0390685 L11.6665665,14.1560367 Z" id="Shape" fill="#282928"/> + </g> + </g> + </svg> + <svg height="20" viewBox="0 0 29 20" width="29" x="150" y="182"> + <!-- Generator: Sketch 44 (41411) - http://www.bohemiancoding.com/sketch --> + <title>youtube-play-red</title> + <desc>Created with Sketch.</desc> + <defs> + <linearGradient x1="50.0014671%" y1="0%" x2="50.0014671%" y2="100%" id="linearGradient-1"> + <stop stop-color="#E52D27" offset="0%"/> + <stop stop-color="#BF171D" offset="100%"/> + </linearGradient> + </defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="youtube-play-red"> + <polygon id="Shape" fill="#FFFFFF" fill-rule="nonzero" points="11.2720445 13.6773296 18.9493741 9.69958275 11.2720445 5.69401947"/> + <polygon id="Shape" fill="#420000" opacity="0.12" points="11.2720445 5.69401947 18.0036161 10.1899861 18.9493741 9.69958275"/> + <path d="M28.12879,4.31098748 C28.12879,4.31098748 27.8506259,2.35299026 27,1.49095967 C25.9196106,0.359109875 24.7073713,0.353268428 24.1529903,0.287343533 C20.1769124,0 14.2127955,0 14.2127955,0 L14.2005563,0 C14.2005563,0 8.2364395,0 4.26036161,0.287343533 C3.70598053,0.353268428 2.49429764,0.359109875 1.41335188,1.49095967 C0.562726008,2.35299026 0.284561892,4.31098748 0.284561892,4.31098748 C0.284561892,4.31098748 0,6.61029207 0,8.90959666 L0,11.0650904 C0,13.364395 0.284561892,15.6636996 0.284561892,15.6636996 C0.284561892,15.6636996 0.562726008,17.6216968 1.41335188,18.4840056 C2.49429764,19.6155772 3.91404729,19.5799722 4.54631433,19.6984701 C6.81947149,19.9165508 14.2066759,19.9838665 14.2066759,19.9838665 C14.2066759,19.9838665 20.1769124,19.9749652 24.1529903,19.6873435 C24.7093185,19.6211405 25.9193324,19.6155772 27,18.4837274 C27.8506259,17.6216968 28.12879,15.6636996 28.12879,15.6636996 C28.12879,15.6636996 28.4125174,13.364395 28.4125174,11.0650904 L28.4125174,8.90959666 C28.4130737,6.61029207 28.12879,4.31098748 28.12879,4.31098748 Z M11.2720445,13.6773296 L11.2720445,5.69401947 L18.9493741,9.69958275 L11.2720445,13.6773296 Z" id="Shape" fill="url(#linearGradient-1)" fill-rule="nonzero"/> + </g> + </g> + </svg> + <svg height="25" viewBox="0 0 25 25" width="25" x="149" y="210"> + <defs id="defs3348"/> + <g transform="matrix(0.27121977,0,0,0.27121977,-0.88977756,-1.016128)" id="g3338"> + <path id="path3340" d="m 21.207,39.091 c 0,0.174 0,0.336 0,0.511 0.395,0.278 1.323,0.186 1.161,-0.511 -0.221,-0.187 -0.952,-0.187 -1.161,0 z"/> + <path id="path3342" d="m 82.124,64.929 c 0.012,-0.371 0.186,-0.545 0.104,-0.998 0.674,-0.487 0.615,-1.068 0.882,-2.078 0.396,-1.485 2.183,-4.016 0.662,-5.153 -0.558,0.511 -0.162,0.917 -0.441,1.428 -0.452,0.848 -1.694,0.952 -2.193,1.648 -0.546,0.766 -0.72,2.159 -0.325,2.855 -0.801,0.894 -1.288,2.274 -0.558,3.609 1.011,-0.046 1.312,-0.812 1.869,-1.311 z"/> + <path id="path3344" d="M 92.037,33.937 C 89.75,27.948 86.233,22.565 81.776,18.125 73.731,10.109 62.67,5.123 50.436,5.002 c -0.151,0 -0.29,-0.006 -0.43,-0.006 -8.091,0 -15.671,2.147 -22.229,5.873 -9.542,5.438 -16.901,14.257 -20.441,24.832 -1.497,4.457 -2.321,9.228 -2.333,14.185 0,0.046 0,0.069 0,0.115 0,2.658 0.244,5.271 0.685,7.812 0.615,3.517 1.637,6.883 3.019,10.075 6.87,15.822 22.553,26.919 40.857,27.105 0.151,0 0.29,0.011 0.441,0.011 8.067,0 15.624,-2.136 22.171,-5.85 13.627,-7.73 22.82,-22.368 22.82,-39.153 C 94.997,44.337 93.94,38.928 92.037,33.937 Z M 63.761,85.822 c -0.673,-0.081 -0.882,-0.429 -1.474,-0.104 0.022,-0.58 -1.011,-0.104 -1.057,-0.638 -1.672,0.221 -3.238,0.395 -4.504,1.056 -0.464,0.244 -0.801,0.743 -1.266,0.848 -0.312,0.058 -0.754,-0.15 -1.056,-0.104 -0.929,0.116 -2.473,1.393 -3.563,1.579 -0.499,0.069 -1.01,-0.07 -1.591,0 -0.127,0.058 -0.278,0.104 -0.418,0.162 -3.354,-0.104 -6.593,-0.627 -9.669,-1.532 0.081,-0.128 0.174,-0.255 0.116,-0.534 -1.66,-0.998 -2.832,-2.483 -4.411,-3.575 -0.034,-0.801 0.639,-0.894 1.266,-1.044 -0.418,-0.999 -2.612,-0.569 -2.519,0.835 0.022,0.477 0.359,0.441 0.417,1.057 -0.476,-0.221 -0.545,-0.859 -1.16,-0.94 0.29,-0.197 0.243,-0.72 -0.209,-0.743 -0.487,-0.093 -0.197,0.581 -0.418,0.743 -0.522,0 -0.511,-0.116 -0.94,0 0.047,0.65 0.905,0.871 1.358,0.522 0.221,0.371 0.221,0.569 0,0.952 0.395,0.58 1.369,0.522 1.996,0.406 0.209,0.034 -0.022,-0.29 -0.104,-0.313 0.221,-0.278 0.465,0.302 0.522,0.534 -0.313,0.139 -0.639,0.209 -0.951,0.243 -1.104,-0.499 -2.171,-1.045 -3.216,-1.637 -0.116,-0.255 -0.395,-0.359 -0.708,-0.418 l 0,0 c -0.221,-0.116 -0.43,-0.255 -0.639,-0.383 0,0 0,0 0,-0.012 -0.012,0 -0.012,0 -0.034,-0.012 -2.821,-1.764 -5.387,-3.877 -7.661,-6.291 -0.07,-0.14 -0.175,-0.255 -0.302,-0.313 C 15.228,69.283 11.363,60.09 11.363,50.002 c 0,-3.842 0.557,-7.544 1.602,-11.05 0.15,0.441 0.128,1.057 0.487,1.288 0.639,-0.383 -0.081,-1.462 -0.186,-2.217 0,-0.023 0.012,-0.058 0.023,-0.081 0.243,0.673 0.812,1.276 0.998,1.984 0.104,0.406 -0.14,0.686 -0.104,1.045 0.128,1.254 1.103,1.394 2.205,2.217 0.522,0.128 0.441,-0.324 0.836,-0.312 0.302,1.404 2.356,1.079 2.426,2.716 0.209,0.348 0.697,0.418 0.72,0.951 0.558,-0.104 0.499,0.406 1.161,0.43 0.197,-0.162 0.023,-0.685 0.418,-0.639 0.534,0.453 0.568,1.405 0.522,2.415 -0.384,0.963 -1.684,2.345 -0.731,3.366 -0.812,0.836 0.046,2.193 0.731,2.519 0.406,1.532 1.01,2.844 1.892,3.877 0.883,0.186 1.23,0.882 1.684,1.475 0.012,2.229 0.302,4.155 0.522,6.094 0.139,1.057 -0.244,2.112 -0.197,3.146 0.058,1.428 1.114,2.356 0.939,3.889 -0.174,0.012 -0.406,-0.047 -0.418,0.104 -0.174,0.639 0.406,0.499 0.522,0.848 0.453,1.497 0.767,3.146 2.206,3.668 0.325,0.046 0.081,-0.488 0.325,-0.511 0.104,-0.279 0.034,0.894 -0.313,0.836 0.452,0.661 1.856,1.032 2.728,0.73 -0.929,-0.673 -1.788,-1.428 -2.311,-2.519 0.303,-0.464 0.569,-0.975 0.836,-1.463 -0.058,-0.511 -0.592,-0.522 -0.836,-0.847 -0.093,-0.441 0.465,-0.232 0.627,-0.418 -0.162,-0.151 -0.093,-0.534 -0.104,-0.848 0.128,-0.14 0.511,-0.035 0.522,-0.313 0.047,-0.522 -0.836,-0.14 -0.731,-0.731 0.268,0.093 0.558,0.14 0.94,0.104 0.174,-0.359 0,-0.696 0,-1.044 1.556,0.533 2.438,-0.639 1.684,-1.788 0.302,0.012 0.685,-0.058 0.847,0.104 1.23,-0.72 1.637,-2.275 2.52,-3.366 0.034,-0.487 -0.197,-0.72 -0.104,-1.254 0.395,-0.649 1.242,-0.847 1.775,-1.369 0.477,-0.047 0.895,0.15 1.266,0 0.963,-0.384 1.358,-3.354 1.161,-5.038 0.395,-0.313 2.414,-2.391 1.984,-3.575 -0.464,-1.3 -3.319,-2.635 -5.246,-2.414 -0.488,-1.126 -1.765,-0.976 -2.729,-1.475 -0.359,-1.88 -1.138,-3.343 -3.575,-3.146 -0.476,-1.045 -1.961,-1.463 -2.101,-2.519 -0.674,-0.081 -1.138,0.047 -1.358,0.418 -0.395,-0.256 -0.592,-0.14 -1.16,-0.104 -0.187,-0.383 -0.593,-0.522 -0.731,-0.94 -0.487,0 -0.441,0.349 -0.639,-0.116 -0.87,0.395 -1.741,0.778 -1.996,1.787 -0.384,-0.197 -1.23,-0.464 -1.881,0 -1.126,-0.916 0.696,-4.085 -1.996,-3.261 0.197,-0.871 0.568,-1.591 0.73,-2.508 -0.127,-0.093 -0.255,-0.139 -0.359,-0.186 0.302,-0.383 0.801,-0.557 1.556,-0.487 0,-1.451 -1.567,-1.475 -2.705,-1.149 -0.186,-0.337 -0.627,-0.731 -1.149,-1.079 0.256,-0.418 0.604,-0.731 1.08,-0.883 0.511,-0.046 0.522,0.395 0.952,0.418 0.278,-0.104 0.348,-0.43 0.312,-0.847 0.802,-0.163 0.895,0.186 1.579,0 0.093,0.882 0.278,1.694 0.627,2.31 1.184,-1.045 -0.163,-2.855 0.627,-4.086 0.58,-0.894 1.671,-0.894 1.996,-1.996 0.059,-0.349 -0.069,-0.488 -0.104,-0.731 0.627,-0.395 0.812,-1.23 1.161,-1.904 0.673,-0.231 0.858,-0.951 1.566,-1.148 0.14,-0.418 -0.336,-0.209 -0.209,-0.627 0.302,-0.674 1.22,-0.755 1.684,-1.254 0.14,0.162 -0.093,0.615 0.209,0.836 0.673,-0.476 1.567,-0.743 2.205,-1.266 0.093,-0.464 -0.186,-0.58 -0.522,-0.627 0.012,-0.302 0.441,-0.186 0.418,-0.521 -0.069,-0.372 -0.801,-0.116 -1.044,-0.313 0.081,-0.932 0.975,-0.418 1.566,-0.836 0.104,-0.525 -0.661,-0.183 -0.836,-0.427 0.65,-0.36 1.8,-0.232 1.893,-1.161 0.94,-0.139 1.428,-0.736 1.671,-1.572 -0.046,-0.54 -0.812,-0.36 -0.73,-1.051 -0.384,0.035 -0.686,-0.018 -0.94,-0.099 -0.244,-1.021 -0.511,-2.014 -0.848,-2.948 -0.302,0.041 -0.487,0.191 -0.639,0.383 -0.022,-0.012 -0.034,-0.029 -0.058,-0.035 -0.104,0.14 -0.349,0.094 -0.546,-0.028 2.275,-1.358 4.701,-2.49 7.255,-3.366 0.116,0.15 0.244,0.296 0.499,0.319 -0.197,0.435 -0.209,0.615 0.104,0.939 0.43,0.082 0.604,-0.099 0.952,-0.099 0.209,0.14 0.267,0.436 0.522,0.522 0.801,-0.493 1.903,-1.213 1.578,-2.205 0.256,-0.128 0.396,-0.383 0.511,-0.662 2.717,-0.604 5.525,-0.923 8.416,-0.923 4.353,0 8.531,0.731 12.443,2.061 -0.349,1.01 0.069,2.728 0.998,2.885 0.72,0.122 0.894,-0.447 1.684,-0.627 0.162,0.737 0.627,1.189 1.044,1.678 0.023,0.517 -0.777,0.203 -0.626,0.841 0.209,0.645 1.647,0.662 2.101,0.418 0.128,-0.923 0.081,-2.014 0.848,-2.31 0.012,-0.093 0.012,-0.174 0,-0.238 0.731,0.4 1.439,0.824 2.136,1.271 0.116,0.342 0.476,0.568 0.487,1.073 -0.499,0.029 -0.325,-0.598 -0.848,-0.528 -0.685,0.215 -0.499,1.312 -0.836,1.893 -1.265,-0.465 -2.402,0.54 -3.459,-0.424 0.325,-0.708 -0.464,-0.667 -0.742,-1.051 0.278,-0.754 0.313,-1.103 0,-1.886 -1.405,0.075 -1.219,1.59 -0.731,2.519 -0.465,0.041 -1.23,0.012 -1.788,0.215 -0.359,0.412 -0.418,1.126 -1.265,1.051 -0.325,-0.29 0.359,-0.522 0,-0.848 -0.151,-0.203 -0.534,-0.156 -0.731,-0.313 -0.023,-0.72 -0.43,-1.045 -0.952,-1.265 0.081,-0.39 0.14,-0.743 -0.418,-0.731 -0.069,-0.447 0.337,-0.424 0.313,-0.842 -0.069,-0.267 -0.336,-0.365 -0.731,-0.313 -0.093,-0.296 0.151,-0.272 0.104,-0.522 -0.174,-0.18 -0.615,-0.087 -0.951,-0.11 -0.499,0.308 -0.418,1.185 -0.836,1.579 -0.047,0.331 0.511,0.034 0.418,0.418 0.069,0.418 -0.499,0.133 -0.522,0 -0.685,0.272 -0.859,0.853 -1.684,0.736 0.094,0.401 0.14,0.848 0.104,1.364 0.268,0.267 0.743,0.313 0.94,0.633 0.627,-0.128 1.08,-0.389 1.37,-0.848 0,-0.313 0,-0.627 0,-0.94 0.255,-0.093 0.464,-0.249 0.848,-0.209 -0.104,0.412 0.312,0.313 0.208,0.726 -0.255,-0.006 -0.511,-0.012 -0.626,0.11 -0.082,0.395 0.174,0.447 0.104,0.842 -0.268,-0.018 -0.511,-0.018 -0.627,0.11 0.022,0.272 0.243,0.371 0.627,0.313 -0.047,0.436 -0.5,0.481 -0.627,0.836 0.731,0.249 1.973,0.093 2.623,-0.104 -0.209,0.522 0.337,0.278 0.313,0.627 -1.033,-0.528 -1.068,0.423 -2.31,0.214 -0.151,0.134 -0.104,0.453 -0.104,0.737 0.928,0.482 2.298,1.033 1.671,2.72 -1.474,0.243 -3.122,-0.812 -3.981,0.115 0.615,1.277 -0.139,2.543 0.104,3.784 0.627,0.163 1.532,0.059 1.881,0.511 -0.313,0.291 -0.627,0.569 -0.627,1.161 -1.544,0.349 -1.335,2.461 -2.31,3.366 -1.893,0.708 -2.392,2.798 -3.471,4.295 0.905,0.917 0.476,2.972 -0.104,3.9 0.162,0.359 0.44,0.604 0.313,1.253 0.312,0.5 0.858,0.755 1.369,1.057 0.731,1.66 1.556,3.784 3.354,3.981 0.79,0.093 1.196,-0.592 1.893,-0.627 0.673,-0.023 0.87,0.476 1.578,0.522 1.08,-0.29 2.066,-1.23 3.157,-1.045 0.905,0.162 1.532,1.741 2.624,0.94 0.383,0.731 0.231,2.205 -0.116,2.832 0.406,1.358 1.428,2.09 1.683,3.575 1.985,1.404 -0.29,3.506 -0.104,5.363 0.093,0.928 0.929,1.625 1.057,2.623 0.232,1.95 0.824,3.378 1.787,4.828 0.012,0.303 -0.359,0.209 -0.209,0.627 0.406,1.637 2.136,-0.081 3.146,0.313 1.01,-0.638 2.182,-1.103 2.519,-2.414 1.347,-0.511 1.416,-2.299 2.101,-3.471 0.175,0 0.349,0 0.522,0 0.383,-0.558 0.418,-1.741 0,-2.299 0.477,-0.998 1.382,-1.566 2.206,-2.205 0.046,-1.323 0.557,-2.136 0.209,-3.157 -0.163,-0.487 -0.778,-0.731 -0.836,-1.161 -0.256,-1.659 1.927,-2.089 2.101,-3.877 0.278,-0.069 0.395,-0.302 0.627,-0.418 0.337,-1.845 1.637,-3.272 1.475,-5.258 -0.79,0.383 -1.765,0.477 -2.52,0.639 -0.278,-0.337 0.186,-0.592 0.313,-0.848 -0.858,-1.312 -2.611,-2.739 -2.31,-4.515 -0.696,-0.917 -1.475,-2.311 -1.579,-3.46 0.65,-0.139 0.859,1.011 1.057,1.672 0.093,0.43 0.557,0.499 0.731,0.848 0.093,1.938 1.578,2.473 1.671,4.411 0.418,0.324 0.36,1.114 0.952,1.253 0.418,0.07 0.302,-0.395 0.313,-0.731 1.126,-0.766 2.496,-1.276 3.459,-2.205 0,-0.777 0.487,-0.859 0.43,-1.475 -0.069,-0.673 -0.952,-0.917 -0.952,-1.671 0.546,0.046 0.917,0.267 1.416,0.371 1.138,3.634 1.741,7.487 1.741,11.479 0,15.59 -9.251,29.031 -22.554,35.125 -1.007,-0.046 -1.843,0.047 -2.33,0.696 z M 28.996,23.861 c -0.29,-0.093 0.093,-0.369 0.093,-0.525 0.406,0.053 0.522,-0.191 0.952,-0.104 -0.059,0.501 -0.767,0.354 -1.045,0.629 z m 0.523,1.254 c 0.243,0.034 0.43,0.127 0.627,0.22 -0.094,0.221 -0.767,0.14 -0.627,-0.22 z m -5.364,-1.779 c -0.359,-0.558 -0.127,-1.271 0,-1.892 0.012,-0.07 -0.023,-0.094 -0.069,-0.104 0.661,-0.599 1.347,-1.161 2.043,-1.719 -0.128,0.993 -0.894,1.353 -1.451,1.928 0.267,0.574 0.313,1.74 -0.523,1.787 z m -0.836,3.996 c -0.452,-0.406 -0.557,0.221 -0.626,0.522 -0.104,-0.313 -0.256,-0.592 -0.325,-0.952 0.325,0.151 0.383,-0.046 0.847,0 -0.011,0.198 0.128,0.221 0.104,0.43 z M 21.01,26.38 c 0.151,-0.197 0.441,-0.255 0.522,-0.522 0.337,0.093 0.546,0.29 0.522,0.731 -0.36,-0.081 -0.395,0.163 -0.731,0.104 0.116,-0.325 0.105,-0.337 -0.313,-0.313 z m -0.314,0.43 c -0.186,-0.081 -0.012,-0.197 0,-0.325 0.186,0.08 0.012,0.185 0,0.325 z m -2.449,11.63 c -0.023,0.244 0.151,0.29 0.128,0.522 -0.36,-0.023 -0.696,-0.012 -0.639,0.383 0.232,0.615 0.848,0.325 1.3,0.569 -0.812,0.104 -0.685,1.973 -2.02,1.706 -0.104,-0.313 -0.197,-0.662 -0.255,-1.01 0.116,-0.023 0.267,-0.047 0.464,-0.104 -0.116,-0.65 -0.371,-0.812 -0.592,-0.755 -0.023,-0.302 -0.012,-0.615 0.012,-0.917 0.697,0.036 1.08,-0.254 1.602,-0.394 z m 6.547,6.628 c -0.012,-0.255 0.162,-0.313 0.209,-0.522 0.383,0.081 0.128,0.569 -0.209,0.522 z m 60.383,-7.765 c -0.336,0.511 -0.464,1.207 -1.369,1.161 -0.232,-0.29 -0.302,-0.755 -0.313,-1.266 -0.197,-0.197 -0.384,-0.034 -0.627,0 -0.174,-0.673 -0.604,-1.079 -0.639,-1.892 1.138,0.313 0.894,1.973 2.008,2.31 0.452,0.035 0.534,-0.302 0.94,-0.313 z m -2.844,-8.474 c 0,0.023 0,0.047 0.012,0.07 0.081,0.115 0.174,0.231 0.256,0.348 0.046,0.069 0.081,0.14 0.115,0.197 0.256,0.395 0.453,0.836 0.465,1.451 -1.591,0.069 -2.206,-1.161 -1.672,-2.623 -0.673,-0.674 -1.3,-1.684 -1.566,-2.693 0.846,1.033 1.647,2.124 2.39,3.25 z m -11.225,4.794 c -1.66,-0.58 -2.6,-1.88 -4.202,-2.519 0.244,-0.859 -0.487,-1.01 -0.209,-1.579 -0.313,-0.116 -0.615,-0.22 -0.847,-0.418 -0.313,0.035 -0.465,0.232 -0.731,0.325 -1.312,-0.162 -2.473,-0.278 -3.68,0 -1.126,0.244 -2.264,1.149 -3.354,0.209 1.357,-0.081 2.321,-0.43 3.041,-1.16 -0.232,-1.776 1.335,-1.753 1.578,-3.053 0.999,0.371 1.765,0.104 2.52,-0.313 0.848,1.323 2.763,1.578 3.146,3.366 -0.546,0.093 -1.021,0.267 -1.567,-0.104 -0.197,0.615 0.488,1.172 0.836,1.578 0.325,0.081 0.383,-0.116 0.627,-0.104 0.047,-0.371 -0.035,-0.592 -0.104,-0.848 0.313,0 0.534,0.313 0.743,0.116 0.058,-0.324 0.29,-0.487 0.627,-0.533 0.069,-0.384 -0.232,-0.406 -0.209,-0.731 0.348,0 0.511,0.499 0.835,0.209 0.035,-0.94 -0.998,-0.824 -1.148,-1.579 0.627,-0.186 0.824,0.081 1.253,0.325 0.256,1.729 0.895,3.088 2.311,3.668 0.174,0.081 0.174,-0.487 0,-0.418 0.104,-0.325 0.29,0.116 0.418,0.104 0.255,0.035 -0.059,-0.476 0.324,-0.313 -0.267,-0.836 -0.429,-1.138 -0.429,-2.205 0.824,0 0.754,1.276 0.742,1.787 0.488,0.674 1.208,1.625 2.415,1.254 0.371,-0.023 0.336,0.359 0.627,0.418 0.452,0 0.673,-0.244 1.16,-0.209 -0.116,0.998 -0.023,1.787 -0.209,2.832 -2.055,-0.162 -4.062,-0.325 -5.142,-1.671 -0.313,0.312 -1.207,0.058 -1.475,0.406 -0.082,0.511 0.162,0.684 0.103,1.16 z m -9.982,-13.02 c 0.325,-0.151 0.15,0.609 -0.104,0.522 -0.047,-0.25 0.185,-0.227 0.104,-0.522 z m 13.546,6.729 c -0.197,-0.256 -0.359,-0.546 -0.627,-0.743 0.337,-0.534 0.558,-1.184 0.94,-1.683 0.499,-0.035 0.476,0.429 1.057,0.313 -0.128,0.312 -0.035,0.359 0.093,0.638 0.464,-0.231 0.94,0.012 1.381,0.104 0.082,-0.406 -0.231,-0.406 -0.429,-0.533 0.162,-0.209 0.742,-0.023 0.951,-0.209 -0.034,0.243 0.023,0.406 0.209,0.429 0.012,0.221 -0.371,0.047 -0.522,0.093 0.07,0.221 0.197,0.372 0.337,0.522 -0.151,0.012 -0.302,0.035 -0.441,0.104 -0.058,0.755 0.372,0.999 0.778,1.277 0.255,-0.209 0.708,-0.221 0.963,-0.441 0.268,0.209 0.477,0.465 0.558,0.859 -1.882,0.047 -2.961,-1.369 -5.248,-0.73 z"/> + </g> + </svg> + <svg height="24" viewBox="0 0 24 24" width="24" x="179" y="210"> + <g> + <path fill="#FFFFFF" d="M24,2.5L14.5,12l9.5,9.5L21.5,24L12,14.5L2.5,24L0,21.5L9.5,12L0,2.5L2.5,0L12,9.5L21.5,0L24,2.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="184" y="182"> + <path fill="#000000" d="M17.1,0c0.8,0,1.5,0.3,2.1,0.9C19.7,1.4,20,2.1,20,2.9v14.2c0,0.8-0.3,1.5-0.9,2.1c-0.6,0.6-1.3,0.9-2.1,0.9 H2.9c-0.8,0-1.5-0.3-2.1-0.9S0,17.9,0,17.1V2.9c0-0.8,0.3-1.5,0.9-2.1S2.1,0,2.9,0C2.9,0,17.1,0,17.1,0z M10,6.2 c-1,0-1.9,0.4-2.7,1.1S6.3,9,6.3,10s0.4,1.9,1.1,2.7c0.7,0.7,1.6,1.1,2.7,1.1c1,0,1.9-0.4,2.7-1.1c0.7-0.7,1.1-1.6,1.1-2.7 s-0.4-1.9-1.1-2.7C11.9,6.6,11,6.2,10,6.2z M17.9,17.5V8.7h-2.2c0.1,0.4,0.1,0.8,0.1,1.2c0,1.1-0.3,2-0.8,2.9s-1.2,1.6-2.1,2.1 c-0.9,0.5-1.9,0.8-2.9,0.8S8,15.6,7.1,15c-0.9-0.5-1.6-1.2-2.1-2.1C4.4,12,4.2,11.1,4.2,10c0-0.4,0-0.9,0.1-1.2H2.1v8.7 c0,0.1,0,0.2,0.1,0.3s0.2,0.1,0.3,0.1h15c0.1,0,0.2,0,0.3-0.1C17.9,17.7,17.9,17.6,17.9,17.5L17.9,17.5z M17.9,5V2.5 c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.2-0.1-0.3-0.1H15c-0.1,0-0.2,0-0.3,0.1c-0.1,0.1-0.1,0.2-0.1,0.3V5c0,0.1,0,0.2,0.1,0.3 c0.1,0.1,0.2,0.1,0.3,0.1h2.5c0.1,0,0.2,0,0.3-0.1C17.9,5.2,17.9,5.1,17.9,5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="209" y="182"> + <g> + <path fill="#ffffff" d="M11.4,7.3c-0.2-0.2-0.5-0.3-0.8-0.3C10,6.9,9.5,7.3,9,8.1c-0.5,0.8-0.7,1.5-0.7,2.3c0,0.4,0.1,0.8,0.3,1.1 c0.2,0.3,0.5,0.4,0.9,0.4c0.6,0,1.2-0.5,1.6-1.5c0.4-1,0.6-1.7,0.6-2.3C11.7,7.8,11.6,7.5,11.4,7.3z"/> + <path fill="#ffffff" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M10.8,12.5 c-0.5,0.5-1.1,0.7-1.8,0.7c-0.7,0-1.3-0.3-1.8-0.8c-0.5-0.5-0.7-1.3-0.7-2.2c0-1.1,0.4-2.1,1.1-3.1c0.7-1,1.7-1.4,2.7-1.4 c0.6,0,1.1,0.2,1.5,0.5c0.3,0.3,0.4,0.6,0.5,0.9L12.5,6h1.7l-1.2,3.9c-0.1,0.3-0.2,0.6-0.2,0.7c0,0.2-0.1,0.3-0.1,0.4 c0,0.2,0.1,0.4,0.2,0.5c0.1,0.2,0.3,0.2,0.6,0.2c0.5,0,1-0.3,1.6-1c0.5-0.7,0.8-1.6,0.8-2.7c0-1.7-0.7-2.8-2.1-3.6 c-0.9-0.5-1.9-0.7-3-0.7c-2,0-3.7,0.6-4.9,1.9C4.7,6.9,4.2,8.2,4.2,9.8c0,1.8,0.7,3.2,2,4.2c1.2,0.9,2.6,1.4,4.3,1.4 c1.1,0,2.2-0.2,3.2-0.6c0.5-0.2,1.1-0.5,1.7-0.9l0.2-0.2l0.7,1c-0.9,0.7-1.8,1.2-2.8,1.5c-1,0.3-2,0.5-3.1,0.5 c-2.5,0-4.4-0.8-5.8-2.3C3.3,13,2.8,11.5,2.8,9.7c0-2,0.7-3.7,2.1-5c1.5-1.5,3.4-2.2,5.7-2.2c1.9,0,3.5,0.5,4.7,1.5 c1.3,1,2,2.4,2,4.2c0,1.4-0.4,2.5-1.2,3.5c-0.8,1-1.8,1.5-2.8,1.5c-0.6,0-1-0.2-1.3-0.5c-0.3-0.3-0.4-0.6-0.4-1c0,0,0-0.1,0-0.1 c0-0.1,0-0.1,0-0.2C11.3,11.9,11.1,12.2,10.8,12.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="208" y="210"> + <g> + <path fill="#000000" d="M11.4,7.3c-0.2-0.2-0.5-0.3-0.8-0.3C10,6.9,9.5,7.3,9,8.1c-0.5,0.8-0.7,1.5-0.7,2.3c0,0.4,0.1,0.8,0.3,1.1 c0.2,0.3,0.5,0.4,0.9,0.4c0.6,0,1.2-0.5,1.6-1.5c0.4-1,0.6-1.7,0.6-2.3C11.7,7.8,11.6,7.5,11.4,7.3z"/> + <path fill="#000000" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M10.8,12.5 c-0.5,0.5-1.1,0.7-1.8,0.7c-0.7,0-1.3-0.3-1.8-0.8c-0.5-0.5-0.7-1.3-0.7-2.2c0-1.1,0.4-2.1,1.1-3.1c0.7-1,1.7-1.4,2.7-1.4 c0.6,0,1.1,0.2,1.5,0.5c0.3,0.3,0.4,0.6,0.5,0.9L12.5,6h1.7l-1.2,3.9c-0.1,0.3-0.2,0.6-0.2,0.7c0,0.2-0.1,0.3-0.1,0.4 c0,0.2,0.1,0.4,0.2,0.5c0.1,0.2,0.3,0.2,0.6,0.2c0.5,0,1-0.3,1.6-1c0.5-0.7,0.8-1.6,0.8-2.7c0-1.7-0.7-2.8-2.1-3.6 c-0.9-0.5-1.9-0.7-3-0.7c-2,0-3.7,0.6-4.9,1.9C4.7,6.9,4.2,8.2,4.2,9.8c0,1.8,0.7,3.2,2,4.2c1.2,0.9,2.6,1.4,4.3,1.4 c1.1,0,2.2-0.2,3.2-0.6c0.5-0.2,1.1-0.5,1.7-0.9l0.2-0.2l0.7,1c-0.9,0.7-1.8,1.2-2.8,1.5c-1,0.3-2,0.5-3.1,0.5 c-2.5,0-4.4-0.8-5.8-2.3C3.3,13,2.8,11.5,2.8,9.7c0-2,0.7-3.7,2.1-5c1.5-1.5,3.4-2.2,5.7-2.2c1.9,0,3.5,0.5,4.7,1.5 c1.3,1,2,2.4,2,4.2c0,1.4-0.4,2.5-1.2,3.5c-0.8,1-1.8,1.5-2.8,1.5c-0.6,0-1-0.2-1.3-0.5c-0.3-0.3-0.4-0.6-0.4-1c0,0,0-0.1,0-0.1 c0-0.1,0-0.1,0-0.2C11.3,11.9,11.1,12.2,10.8,12.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="5"> + <path fill="#FFFFFF" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M15,5h-1.4c-1.1,0-1.1,0.9-1.1,1.6 v2.1h2.4l-0.3,2.5h-2.1v6.2H10v-6.2H7.5V8.8H10V6.4c0-2.2,1.2-3.4,3.2-3.4C14.1,2.9,15,3,15,3V5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="30"> + <path fill="#000000" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M15,5h-1.4c-1.1,0-1.1,0.9-1.1,1.6 v2.1h2.4l-0.3,2.5h-2.1v6.2H10v-6.2H7.5V8.8H10V6.4c0-2.2,1.2-3.4,3.2-3.4C14.1,2.9,15,3,15,3V5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="55"> + <path fill="#FFFFFF" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="80"> + <path fill="#000000" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="105"> + <path fill="#27346A" d="M15.8 1.7C14.9.7 13.3.2 11.2.2H5.1c-.4.1-.8.4-.8.8L1.8 17c-.1.3.2.6.5.6H6l.9-6v.2c.1-.4.4-.7.9-.7h1.8c3.5 0 6.2-1.4 7-5.5 0-.1 0-.2.1-.4-.1-.1-.1-.1 0 0 .2-1.5-.1-2.5-.9-3.5"/> + <path fill="#27346A" d="M8.4 4.7c.1 0 .2-.1.3-.1h4.7c.6 0 1.1 0 1.6.1.1 0 .3 0 .4.1.2 0 .4.1.6.2.2.1.5.2.7.3.2-1.5 0-2.5-.8-3.5C15 .8 13.4.3 11.3.3H5.1c-.4 0-.8.3-.8.7L1.8 17c-.1.3.2.6.5.6H6L8 5.2c0-.2.1-.4.4-.5z"/> + <path fill="#2790C3" d="M16.6 5.6c-.8 4.1-3.5 5.5-7 5.5H7.8c-.4 0-.8.3-.9.7l-1.2 7.4c0 .3.2.5.4.5h3.1c.4 0 .7-.3.7-.6v-.2l.6-3.8v-.2c.1-.4.4-.6.7-.6h.8c3.1 0 5.4-1.2 6.1-4.8.3-1.5.1-2.7-.6-3.6-.2-.3-.5-.5-.9-.7v.4z"/> + <path fill="#1F264F" d="M15.8 4.9c-.1 0-.2-.1-.4-.1-.1 0-.3-.1-.4-.1-.5-.1-1-.1-1.6-.1H8.7c-.1 0-.2 0-.3.1-.3.1-.4.3-.4.5l-1 6.4v.2c.1-.4.4-.7.9-.7h1.8c3.5 0 6.2-1.4 7-5.5 0-.1 0-.2.1-.4-.4-.1-.6-.2-.8-.3h-.2"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="130"> + <path fill="#55acee" d="M20,3.6c-0.5,0.8-1.2,1.5-2,2.1v0.5c0,0.9-0.1,1.8-0.3,2.7c-0.2,0.9-0.6,1.8-1,2.7s-1,1.7-1.7,2.4 c-0.7,0.8-1.4,1.4-2.3,2c-0.8,0.6-1.8,1-2.9,1.3c-1.1,0.3-2.3,0.5-3.5,0.5c-2.5,0-4.6-0.6-6.3-1.7c0.3,0,0.6,0.1,1,0.1 c0.9,0,1.8-0.2,2.7-0.5s1.7-0.8,2.4-1.4c-0.9,0-1.7-0.3-2.4-0.8s-1.2-1.2-1.4-2c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.7,0,1.1-0.1 c-0.9-0.2-1.7-0.7-2.4-1.4S0.8,8.4,0.8,7.4v0C1.4,7.7,2,7.9,2.7,7.9C2.1,7.5,1.6,7,1.3,6.4S0.8,5.2,0.8,4.5c0-0.7,0.2-1.3,0.6-2 c1,1.3,2.3,2.2,3.7,3c1.5,0.7,3,1.1,4.7,1.2C9.8,6.5,9.7,6.1,9.7,5.8c0-1.1,0.4-2.1,1.2-2.9s1.8-1.2,2.9-1.2c1.2,0,2.2,0.4,3,1.3 c0.9-0.2,1.8-0.5,2.6-1c-0.3,1-0.9,1.7-1.8,2.3C18.4,4.1,19.2,3.9,20,3.6L20,3.6z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="155"> + <g> + <path fill="#FFF" d="M9.2,3.1c-0.3-0.3-0.6-0.4-1-0.4c-0.5,0-1,0.2-1.3,0.6c-0.4,0.5-0.5,1-0.5,1.5C6.4,5.5,6.6,6.2,7,7 c0.2,0.4,0.5,0.7,0.8,0.9c0.3,0.3,0.7,0.4,1.1,0.4c0.5,0,0.9-0.2,1.3-0.6c0.2-0.2,0.3-0.5,0.3-0.8c0-0.3,0-0.5,0-0.7 c0-0.8-0.2-1.6-0.6-2.3C9.8,3.6,9.5,3.3,9.2,3.1z"/> + <path fill="#FFF" d="M9.1,11.4c-0.1,0-0.4,0-0.8,0c-0.4,0.1-0.8,0.1-1.2,0.3c-0.1,0-0.2,0.1-0.4,0.2c-0.2,0.1-0.4,0.2-0.6,0.4 c-0.2,0.2-0.3,0.4-0.5,0.6c-0.1,0.2-0.2,0.5-0.2,0.9c0,0.7,0.3,1.3,0.9,1.7c0.6,0.4,1.4,0.7,2.4,0.7c0.9,0,1.6-0.2,2.1-0.6 c0.6-0.4,0.8-0.9,0.8-1.6c0-0.5-0.2-0.9-0.5-1.3c-0.3-0.4-0.9-0.8-1.6-1.3C9.4,11.4,9.2,11.4,9.1,11.4z"/> + <path fill="#FFF" d="M18,0H2C0.9,0,0,0.9,0,2v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V2C20,0.9,19.1,0,18,0z M11.3,3.3 c0.1,0.2,0.3,0.2,0.4,0.4C11.9,4,12,4.2,12.1,4.5c0.1,0.3,0.1,0.6,0.1,1c0,0.7-0.2,1.2-0.5,1.7c-0.1,0.2-0.3,0.4-0.5,0.6 s-0.4,0.3-0.6,0.5c-0.1,0.1-0.2,0.3-0.3,0.4c-0.1,0.2-0.2,0.3-0.2,0.6c0,0.2,0.1,0.4,0.2,0.5c0.1,0.1,0.2,0.2,0.3,0.3l0.7,0.5 c0.4,0.3,0.8,0.7,1.1,1.1c0.3,0.4,0.4,1,0.5,1.6c0,1-0.4,1.8-1.3,2.5C10.8,16.6,9.5,17,7.9,17c-1.4,0-2.4-0.3-3.1-0.9 c-0.7-0.5-1-1.2-1-1.9c0-0.4,0.1-0.8,0.3-1.2c0.2-0.4,0.6-0.8,1.2-1.2c0.6-0.4,1.3-0.6,2-0.7C8,11,8.5,10.9,9,10.9 c-0.1-0.2-0.3-0.4-0.4-0.6c-0.1-0.2-0.2-0.5-0.2-0.7s0-0.3,0.1-0.4c0-0.1,0.1-0.2,0.1-0.3c-0.2,0-0.4,0-0.6,0c-1,0-1.8-0.3-2.4-1 C5,7.2,4.7,6.5,4.7,5.8c0-1,0.4-1.8,1.2-2.6C6.5,2.7,7,2.4,7.6,2.3C8.3,2.1,8.9,2,9.4,2h3.9l-1.2,1.2h-1.2 C11,3.2,11.2,3.2,11.3,3.3z M18.8,5.2h-1.8v0.5V6v1h-1.3V6.1V5.7V5.2H15h-0.3h-1V3.8h0.9H15h0.5V2h1.3v1.8h1.8V5.2z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="180"> + <path fill="#FFFFFF" d="M17.1,0c0.8,0,1.5,0.3,2.1,0.9C19.7,1.4,20,2.1,20,2.9v14.2c0,0.8-0.3,1.5-0.9,2.1c-0.6,0.6-1.3,0.9-2.1,0.9 H2.9c-0.8,0-1.5-0.3-2.1-0.9S0,17.9,0,17.1V2.9c0-0.8,0.3-1.5,0.9-2.1S2.1,0,2.9,0C2.9,0,17.1,0,17.1,0z M10,6.2 c-1,0-1.9,0.4-2.7,1.1S6.3,9,6.3,10s0.4,1.9,1.1,2.7c0.7,0.7,1.6,1.1,2.7,1.1c1,0,1.9-0.4,2.7-1.1c0.7-0.7,1.1-1.6,1.1-2.7 s-0.4-1.9-1.1-2.7C11.9,6.6,11,6.2,10,6.2z M17.9,17.5V8.7h-2.2c0.1,0.4,0.1,0.8,0.1,1.2c0,1.1-0.3,2-0.8,2.9s-1.2,1.6-2.1,2.1 c-0.9,0.5-1.9,0.8-2.9,0.8S8,15.6,7.1,15c-0.9-0.5-1.6-1.2-2.1-2.1C4.4,12,4.2,11.1,4.2,10c0-0.4,0-0.9,0.1-1.2H2.1v8.7 c0,0.1,0,0.2,0.1,0.3s0.2,0.1,0.3,0.1h15c0.1,0,0.2,0,0.3-0.1C17.9,17.7,17.9,17.6,17.9,17.5L17.9,17.5z M17.9,5V2.5 c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.2-0.1-0.3-0.1H15c-0.1,0-0.2,0-0.3,0.1c-0.1,0.1-0.1,0.2-0.1,0.3V5c0,0.1,0,0.2,0.1,0.3 c0.1,0.1,0.2,0.1,0.3,0.1h2.5c0.1,0,0.2,0,0.3-0.1C17.9,5.2,17.9,5.1,17.9,5z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="246" y="205"> + <path fill="#FFFFFF" d="M10,2.9c3,0,5,0,6,0.1c1.4,0.1,2.3,0.4,2.9,0.8c0.5,0.4,0.8,1.1,1,2C19.9,6.5,20,7.8,20,9.7V10 c0,2,0,3.3-0.1,3.9c-0.1,1-0.4,1.7-0.9,2.1c-0.5,0.5-1.4,0.8-2.7,0.9c-1,0.1-2.9,0.2-5.8,0.2H10c-3,0-5,0-6-0.1 c-1.4-0.1-2.3-0.4-2.9-0.8c-0.5-0.4-0.8-1.1-1-2C0.1,13.5,0,12.2,0,10.3V10c0-2,0-3.3,0.1-3.9c0.1-1,0.4-1.7,0.9-2.1 c0.5-0.5,1.4-0.8,2.7-0.9c1-0.1,2.9-0.2,5.8-0.2C9.6,2.9,10,2.9,10,2.9z M7.5,13.7l6.2-3.7L7.5,6.2V13.7L7.5,13.7z"/> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="5" y="240"> + <g> + <path d="M16.2,12.8v2.7c0,1.4-1.1,2.5-2.5,2.5H2.5C1.1,18,0,16.9,0,15.5v-10C0,4.1,1.1,3,2.5,3h7v1C8.1,4.3,6.8,4.8,5.8,5.5H2.5 v9.9h11.2v-1L16.2,12.8z M19.9,8c0,0.1-0.1,0.3-0.2,0.3l-7.9,5.4c-0.1,0-0.1,0.1-0.2,0.1c-0.1,0-0.1,0-0.2,0 c-0.1-0.1-0.2-0.2-0.2-0.4v-2.9c-5,0.1-6.2,1.8-6.2,1.8c-0.1,0.1-0.2,0.2-0.3,0.2H4.5c-0.2,0-0.3-0.2-0.3-0.4C4.2,12,4,9.5,5.9,7.6 c1.2-1.3,3-2,5.4-2.1V2.6c0-0.2,0.1-0.3,0.2-0.4c0.1-0.1,0.3-0.1,0.4,0l7.9,5.4C19.9,7.7,19.9,7.9,19.9,8z"/> + </g> + <g display="none"> + <path display="inline" d="M9.2,18.3c-2.1,2.1-5.5,2.1-7.6,0s-2.1-5.5,0-7.6l2.8-2.8C4.4,9,4.5,10,4.9,11l-1.5,1.5 c-1.1,1.1-1.1,2.9,0,4.1s2.9,1.1,4.1,0l3.1-3.1c1.1-1.1,1.1-2.9,0-4.1c-0.5-0.5-0.5-1.3,0-1.8s1.3-0.5,1.8,0c2.1,2.1,2.1,5.5,0,7.6 L9.2,18.3z M15.5,12.1c0.1-1.1,0-2.1-0.4-3.1l1.5-1.5c1.1-1.1,1.1-2.9,0-4.1c-1.1-1.1-2.9-1.1-4.1,0L9.4,6.5 c-1.1,1.1-1.1,2.9,0,4.1c0.5,0.5,0.5,1.3,0,1.7c-0.5,0.5-1.3,0.5-1.7,0c-2.1-2.1-2.1-5.5,0-7.6l3.1-3.1c2.1-2.1,5.5-2.1,7.6,0 s2.1,5.5,0,7.6L15.5,12.1z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="30" y="240"> + <g display="none"> + <path display="inline" d="M16.2,10.6v2.7c0,1.4-1.1,2.5-2.5,2.5H2.5c-1.4,0-2.5-1.1-2.5-2.5V3.3c0-1.4,1.1-2.5,2.5-2.5h7v1 C8.1,2.1,6.8,2.6,5.8,3.3H2.5v9.9h11.2v-1L16.2,10.6z M19.9,5.8c0,0.1-0.1,0.3-0.2,0.3l-7.9,5.4c-0.1,0-0.1,0.1-0.2,0.1 c-0.1,0-0.1,0-0.2,0c-0.1-0.1-0.2-0.2-0.2-0.4V8.3C6.2,8.4,5,10.1,5,10.1c-0.1,0.1-0.2,0.2-0.3,0.2H4.5c-0.2,0-0.3-0.2-0.3-0.4 c0-0.1-0.2-2.6,1.7-4.5c1.2-1.3,3-2,5.4-2.1V0.4c0-0.2,0.1-0.3,0.2-0.4c0.1-0.1,0.3-0.1,0.4,0l7.9,5.4C19.9,5.5,19.9,5.7,19.9,5.8z "/> + </g> + <g> + <path d="M9.2,18.3c-2.1,2.1-5.5,2.1-7.6,0c-2.1-2.1-2.1-5.5,0-7.6l2.8-2.8C4.4,9,4.5,10,4.9,11l-1.5,1.5c-1.1,1.1-1.1,2.9,0,4.1 s2.9,1.1,4.1,0l3.1-3.1c1.1-1.1,1.1-2.9,0-4.1c-0.5-0.5-0.5-1.3,0-1.8c0.5-0.5,1.3-0.5,1.8,0c2.1,2.1,2.1,5.5,0,7.6L9.2,18.3z M15.5,12.1c0.1-1.1,0-2.1-0.4-3.1l1.5-1.5c1.1-1.1,1.1-2.9,0-4.1c-1.1-1.1-2.9-1.1-4.1,0L9.4,6.5c-1.1,1.1-1.1,2.9,0,4.1 c0.5,0.5,0.5,1.3,0,1.7c-0.5,0.5-1.3,0.5-1.7,0c-2.1-2.1-2.1-5.5,0-7.6l3.1-3.1c2.1-2.1,5.5-2.1,7.6,0c2.1,2.1,2.1,5.5,0,7.6 L15.5,12.1z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="55" y="240"> + <g> + <circle cx="2.7" cy="2.7" r="2.3"/> + <rect x="0.7" y="6.8" width="4" height="12.8"/> + <path d="M14.8,6.5c-1.9,0-3.2,1.1-3.8,2.1H11V6.8H7.2v12.8h4v-6.3c0-1.7,0.3-3.3,2.4-3.3c2,0,2.1,1.9,2.1,3.4v6.2h4v-7 C19.6,9.1,18.8,6.5,14.8,6.5z"/> + </g> + </svg> + <svg height="20" viewBox="0 0 20 20" width="20" x="80" y="240"> + <path d="M16.7 12.6V17H3.3v-4.4H.7v5.7c0 .7.6 1.3 1.3 1.3h16c.7 0 1.3-.6 1.3-1.3v-5.7h-2.6zM9.8 12.2L6.1 7.7s-.6-.5 0-.5h2.1v-.9V.7s-.1-.3.4-.3h2.9c.3 0 .3.3.3.3V7.1h1.9c.7 0 .2.6.2.6s-3.1 4.2-3.6 4.6c-.2.2-.5-.1-.5-.1z"/> + </svg> + <svg height="16" viewBox="0 0 20 16" width="20" x="221" y="133"> + <path fill="#FFFFFF" d="M18.4,2h-5.7l-0.9-1.3c-0.2-0.5-0.6-0.7-1-0.7H8.3c-0.5,0-0.9,0.3-1,0.7L6.4,2H4.5V1h-2v1H0.9 C0.3,2,0.5,2.7,0.5,3.3v11c0,0.6-0.2,1.7,0.4,1.7h17.5c0.6,0,1.1-1.1,1.1-1.7v-11C19.5,2.7,19,2,18.4,2z M9.6,13.1 c-2.4,0-4.3-1.9-4.3-4.3s1.9-4.3,4.3-4.3s4.3,1.9,4.3,4.3S12,13.1,9.6,13.1z M16.5,6.6c-0.8,0-1.4-0.6-1.4-1.4s0.7-1.5,1.5-1.5 c0.8,0,1.5,0.7,1.5,1.5S17.4,6.6,16.5,6.6z"/> + </svg> + <svg height="16" viewBox="0 0 20 16" width="20" x="152" y="159"> + <path fill="#FFFFFF" d="M19.6,0h-6.9c-1.3,0-1.5,0.5-1.5,1.8V1.7C11.2,0.4,9.3,0,8,0H1v12.7V13l2.3,1.9H8c0,0,0.6,0.9,1.1,0.9h2.3 c0.7,0,1.1-0.9,1.1-0.9h4.7l2.3-1.9v-0.3L19.6,0L19.6,0z M1.9,0.9h6l0,0c0.7,0,1.4,0.1,1.4,0.7v10.4H1.9V0.9z M18.7,12.1h-6.5V1.8 c0-0.7-0.1-0.8,0.6-0.8h6V12.1z"/> + <rect x="13.1" y="4.7" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="13.1" y="1.9" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="13.1" y="6.5" fill="#FFFFFF" width="4.7" height="1.9"/> + <rect x="13.1" y="10.2" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="2.8" y="4.7" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="2.8" y="1.9" fill="#FFFFFF" width="4.7" height="0.9"/> + <rect x="2.8" y="6.5" fill="#FFFFFF" width="4.7" height="1.9"/> + <rect x="2.8" y="10.2" fill="#FFFFFF" width="4.7" height="0.9"/> + </svg> + <svg height="16" viewBox="0 0 20 16" width="20" x="177" y="159"> + <path fill="#000000" d="M19.6,0h-6.9c-1.3,0-1.5,0.5-1.5,1.8V1.7C11.2,0.4,9.3,0,8,0H1v12.7V13l2.3,1.9H8c0,0,0.6,0.9,1.1,0.9h2.3 c0.7,0,1.1-0.9,1.1-0.9h4.7l2.3-1.9v-0.3L19.6,0L19.6,0z M1.9,0.9h6l0,0c0.7,0,1.4,0.1,1.4,0.7v10.4H1.9V0.9z M18.7,12.1h-6.5V1.8 c0-0.7-0.1-0.8,0.6-0.8h6V12.1z"/> + <rect x="13.1" y="4.7" fill="#000000" width="4.7" height="0.9"/> + <rect x="13.1" y="1.9" fill="#000000" width="4.7" height="0.9"/> + <rect x="13.1" y="6.5" fill="#000000" width="4.7" height="1.9"/> + <rect x="13.1" y="10.2" fill="#000000" width="4.7" height="0.9"/> + <rect x="2.8" y="4.7" fill="#000000" width="4.7" height="0.9"/> + <rect x="2.8" y="1.9" fill="#000000" width="4.7" height="0.9"/> + <rect x="2.8" y="6.5" fill="#000000" width="4.7" height="1.9"/> + <rect x="2.8" y="10.2" fill="#000000" width="4.7" height="0.9"/> + </svg> + <svg height="17.2" viewBox="0 0 18 18" width="17.5" x="105" y="240"> + <path fill="#FFFFFF" d="M6.9,1.1c3.1,0,5.6,2.5,5.6,5.6s-2.5,5.6-5.6,5.6c-3.1,0-5.6-2.5-5.6-5.6S3.8,1.1,6.9,1.1 M6.9,0 c-3.7,0-6.7,3-6.7,6.7c0,3.7,3,6.7,6.7,6.7c3.7,0,6.7-3,6.7-6.7C13.5,2.9,10.6,0,6.9,0L6.9,0z"/> + <rect x="12.4" y="11.2" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -5.7168 14.1519)" fill="#FFFFFF" width="3.6" height="5.5"/> + </svg> + <svg height="17.2" viewBox="0 0 18 18" width="17.5" x="128" y="240"> + <path fill="#000000" d="M6.9,1.1c3.1,0,5.6,2.5,5.6,5.6s-2.5,5.6-5.6,5.6c-3.1,0-5.6-2.5-5.6-5.6S3.8,1.1,6.9,1.1 M6.9,0 c-3.7,0-6.7,3-6.7,6.7c0,3.7,3,6.7,6.7,6.7c3.7,0,6.7-3,6.7-6.7C13.5,2.9,10.6,0,6.9,0L6.9,0z"/> + <rect x="12.4" y="11.2" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -5.7168 14.1519)" fill="#000000" width="3.6" height="5.5"/> + </svg> + <svg height="16" viewBox="0 0 17 16" width="16.4" x="202" y="159"> + <path fill="#FFFFFF" d="M14.4,5.9l-3.3,3.3V6.7C11.1,6.2,10.5,6,10,6H0.8C0.3,6,0.1,6.2,0.1,6.7v8.1c0,0.6,0.1,1.1,0.7,1.1H10 c0.6,0,1.1-0.6,1.1-1.1v-2.5l3.3,3.3c0.7,0.5,1.7,0,1.7-0.8V6.7C16.1,5.9,15.1,5.4,14.4,5.9z"/> + <g> + <circle fill="#FFFFFF" cx="2.3" cy="2.4" r="2.3"/> + </g> + <g> + <circle fill="#FFFFFF" cx="8.5" cy="2.4" r="2.3"/> + </g> + </svg> + <svg height="16" viewBox="0 0 17 16" width="16.4" x="223" y="159"> + <path fill="#000000" d="M14.4,5.9l-3.3,3.3V6.7C11.1,6.2,10.5,6,10,6H0.8C0.3,6,0.1,6.2,0.1,6.7v8.1c0,0.6,0.1,1.1,0.7,1.1H10 c0.6,0,1.1-0.6,1.1-1.1v-2.5l3.3,3.3c0.7,0.5,1.7,0,1.7-0.8V6.7C16.1,5.9,15.1,5.4,14.4,5.9z"/> + <circle fill="#000000" cx="2.3" cy="2.4" r="2.3"/> + <circle fill="#000000" cx="8.5" cy="2.4" r="2.3"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="150" y="240"> + <path fill="#FFFFFF" d="M7,7.9L8.1,9l-4.9,4.9h4.5v1.6H0.5V8.3h1.6v4.5L7,7.9z M8.3,0.5h7.2v7.2h-1.6V3.2L9,8.1L7.9,7l4.9-4.9H8.3 L8.3,0.5L8.3,0.5z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="171" y="240"> + <g> + <polygon fill="#000000" points="3.3,10.7 4.3,15.7 6.4,15.7 5.4,10.7 "/> + <path fill="#000000" d="M0,6.7c0,2.5,2,3,2,3h5v-6H2C2,3.7,0,4.1,0,6.7z"/> + <path fill="#000000" d="M14.6,0.4L8,3.7v6l6.6,3.3c0.7,0.3,1.4-0.2,1.4-0.9V1.3C16,0.6,15.2,0.1,14.6,0.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="192" y="240"> + <g> + <polygon fill="#FFFFFF" points="3.3,10.7 4.3,15.7 6.4,15.7 5.4,10.7 "/> + <path fill="#FFFFFF" d="M0,6.7c0,2.5,2,3,2,3h5v-6H2C2,3.7,0,4.1,0,6.7z"/> + <path fill="#FFFFFF" d="M14.6,0.4L8,3.7v6l6.6,3.3c0.7,0.3,1.4-0.2,1.4-0.9V1.3C16,0.6,15.2,0.1,14.6,0.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="213" y="240"> + <path fill="#ffffff" d="M11,15l-7-7l7-7l1.1,1.1L6.1,8l5.9,5.9L11,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="234" y="240"> + <path fill="#010101" d="M11,15l-7-7l7-7l1.1,1.1L6.1,8l5.9,5.9L11,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="5"> + <rect id="XMLID_4_" x="6.8" y="1.2" fill="#FFFFFF" width="3" height="10"/> + <rect id="XMLID_1_" x="7" y="12" fill="#FFFFFF" width="3" height="3"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="26"> + <g id="XMLID_5_"> + <polygon id="XMLID_3_" fill="#010101" points="0,15.3 8,0.5 16,15.3 "/> + <rect id="XMLID_2_" x="6.9" y="5.1" fill="#FFFFFF" width="2.3" height="5.7"/> + <rect id="XMLID_1_" x="6.9" y="11.9" fill="#FFFFFF" width="2.3" height="2.3"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="47"> + <path fill="#DF0202" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="68"> + <g id="XMLID_5_"> + <polygon id="XMLID_3_" fill="#FFFFFF" points="0,15.3 8,0.5 16,15.3 "/> + <rect id="XMLID_2_" x="6.9" y="5.1" fill="#000000" width="2.3" height="5.7"/> + <rect id="XMLID_1_" x="6.9" y="11.9" fill="#000000" width="2.3" height="2.3"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="89"> + <g> + <path fill="#FFFFFF" d="M3,0.5v2h10v10.5c0,0.8,0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5V5.8V3.1V0.5H3z"/> + <g> + <path fill="#FFFFFF" d="M12,14.5c0-0.5,0-11,0-11H0v9c0,1.7,1.3,3,3,3c0,0,9.6,0,10,0C12.5,15.5,12,15,12,14.5z M6,12.5H1v-1h5 V12.5z M6,10.5H1v-1h5V10.5z M6,8.5H1v-1h5V8.5z M6,6.5H1v-1h5V6.5z M11,12.5H7v-7h4V12.5z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="110"> + <g> + <path fill="#000000" d="M3,0.5v2h10v10.5c0,0.8,0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5V5.8V3.1V0.5H3z"/> + <g> + <path fill="#000000" d="M12,14.5c0-0.5,0-11,0-11H0v9c0,1.7,1.3,3,3,3c0,0,9.6,0,10,0C12.5,15.5,12,15,12,14.5z M6,12.5H1v-1h5 V12.5z M6,10.5H1v-1h5V10.5z M6,8.5H1v-1h5V8.5z M6,6.5H1v-1h5V6.5z M11,12.5H7v-7h4V12.5z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="131"> + <path fill="#ffffff" d="M15.1,5.1l-7,7l-7-7l1.1-1.1l5.9,6l5.9-5.9L15.1,5.1z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="152"> + <g id="XMLID_6_"> + <path id="XMLID_4_" fill="#000" d="M6.9,8.5l-4.3,5.4H0.5l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + <path id="XMLID_2_" fill="#000" d="M15.5,8.5l-4.3,5.4H9.1l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="173"> + <g id="XMLID_6_"> + <path id="XMLID_4_" fill="#FFF" d="M6.9,8.5l-4.3,5.4H0.5l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + <path id="XMLID_2_" fill="#FFF" d="M15.5,8.5l-4.3,5.4H9.1l2.1-5.4l-2.1,0l0-6.4h6.4V8.5z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="194"> + <path fill="#ffffff" d="M1.1,11l7-7l7,7L14,12.1l-5.9-6L2.2,12L1.1,11z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="215"> + <path fill="#010101" d="M15.1,5.1l-7,7l-7-7l1.1-1.1l5.9,6l5.9-5.9L15.1,5.1z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="271" y="236"> + <path fill="#FFFFFF" d="M13.3,3.8L9.1,8l4.2,4.2l-1.1,1.1L8,9.1l-4.2,4.2l-1.1-1.1L6.9,8L2.7,3.8l1.1-1.1L8,6.9l4.2-4.2L13.3,3.8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="5" y="265"> + <g> + <polygon fill="#FFFFFF" points="15,4.6 16,4.1 8,0.1 0,4.1 8,8.1 14,5.1 14,13.5 13.4,15.9 15.6,15.9 15,13.5 "/> + <path fill="#FFFFFF" d="M3,6.6v4c0,0,1.4,2.5,5,2.5s5-2.5,5-2.5V7.1L8,9.6L3,6.6z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="26" y="265"> + <g> + <path fill="#FFFFFF" d="M12,16H4.5l-1-1H12c0.8,0,1.5-0.6,1.5-1.5v-12l1,0.5v11.5C14.5,14.9,13.4,16,12,16z"/> + <g> + <path fill="#FFFFFF" d="M1.5,0v12c0,1.1,0.9,2,2,2h7c1.1,0,2-0.9,2-2V0H1.5z M8.5,1h1v1h-1V1z M6.5,1h1v1h-1V1z M4.5,1h1v1h-1V1z M2.5,1h1v1h-1V1z M10.5,11h-7v-1h7V11z M10.5,9h-7V8h7V9z M10.5,7h-7V6h7V7z M10.5,5h-7V4h7V5z M11.5,2h-1V1h1V2z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="47" y="265"> + <g> + <path fill="#000000" d="M12,16H4.5l-1-1H12c0.8,0,1.5-0.6,1.5-1.5v-12l1,0.5v11.5C14.5,14.9,13.4,16,12,16z"/> + <g> + <path fill="#000000" d="M1.5,0v12c0,1.1,0.9,2,2,2h7c1.1,0,2-0.9,2-2V0H1.5z M8.5,1h1v1h-1V1z M6.5,1h1v1h-1V1z M4.5,1h1v1h-1V1z M2.5,1h1v1h-1V1z M10.5,11h-7v-1h7V11z M10.5,9h-7V8h7V9z M10.5,7h-7V6h7V7z M10.5,5h-7V4h7V5z M11.5,2h-1V1h1V2z"/> + </g> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="68" y="265"> + <path fill="#010101" d="M8,0.5c1,0,2,0.2,2.9,0.6s1.7,0.9,2.4,1.6c0.7,0.7,1.2,1.5,1.6,2.4C15.3,6,15.5,7,15.5,8c0,1-0.2,2-0.6,2.9 c-0.4,0.9-0.9,1.7-1.6,2.4c-0.7,0.7-1.5,1.3-2.4,1.6C10,15.3,9,15.5,8,15.5c-1,0-2-0.2-2.9-0.6c-0.9-0.4-1.7-0.9-2.4-1.6 c-0.7-0.7-1.2-1.5-1.6-2.4S0.5,9,0.5,8c0-1,0.2-2,0.6-2.9C1.4,4.2,2,3.4,2.7,2.7s1.5-1.3,2.4-1.6C6,0.7,7,0.5,8,0.5z M12.3,12.3 c0.6-0.6,1-1.2,1.3-2C13.9,9.6,14,8.8,14,8c0-1.1-0.3-2.1-0.8-3c-0.5-0.9-1.3-1.7-2.2-2.2S9.1,2,8,2C7.2,2,6.4,2.1,5.7,2.4 C5,2.7,4.3,3.2,3.7,3.7s-1,1.2-1.3,2S2,7.2,2,8c0,1.1,0.3,2.1,0.8,3c0.5,0.9,1.3,1.7,2.2,2.2C5.9,13.8,6.9,14,8,14 c0.8,0,1.6-0.2,2.3-0.5C11.1,13.3,11.7,12.8,12.3,12.3L12.3,12.3z M7.2,5.7V4.2h1.5v1.5H7.2z M7.2,11.8V6.6h1.5v5.2H7.2z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="89" y="265"> + <path fill="#ffffff" d="M5.1,15l-1.1-1.1L9.8,8L3.9,2.1L5.1,1l7,7L5.1,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="110" y="265"> + <path fill="#010101" d="M5.1,15l-1.1-1.1L9.8,8L3.9,2.1L5.1,1l7,7L5.1,15z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="131" y="265"> + <ellipse fill="#FFFFFF" cx="2.5" cy="13.6" rx="2.1" ry="2.1"/> + <path fill="#FFFFFF" d="M10.5,15.7H7.5c0-4-3.2-7.2-7.1-7.2l0,0v-3C6,5.5,10.5,10.1,10.5,15.7z"/> + <path fill="#FFFFFF" d="M12.6,15.7c0-6.8-5.5-12.3-12.2-12.3V0.3c8.4,0,15.2,6.9,15.2,15.4H12.6z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="152" y="265"> + <ellipse fill="#000000" cx="2.5" cy="13.6" rx="2.1" ry="2.1"/> + <path fill="#000000" d="M10.5,15.7H7.5c0-4-3.2-7.2-7.1-7.2l0,0v-3C6,5.5,10.5,10.1,10.5,15.7z"/> + <path fill="#000000" d="M12.6,15.7c0-6.8-5.5-12.3-12.2-12.3V0.3c8.4,0,15.2,6.9,15.2,15.4H12.6z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="173" y="265"> + <g> + <polygon fill="#000000" points="15,4.6 16,4.1 8,0.1 0,4.1 8,8.1 14,5.1 14,13.5 13.4,15.9 15.6,15.9 15,13.5 "/> + <path fill="#000000" d="M3,6.6v4c0,0,1.4,2.5,5,2.5s5-2.5,5-2.5V7.1L8,9.6L3,6.6z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="194" y="265"> + <path fill="#010101" d="M13.3,3.8L9.1,8l4.2,4.2l-1.1,1.1L8,9.1l-4.2,4.2l-1.1-1.1L6.9,8L2.7,3.8l1.1-1.1L8,6.9l4.2-4.2L13.3,3.8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="215" y="265"> + <path fill="#010101" d="M1.1,11l7-7l7,7L14,12.1l-5.9-6L2.2,12L1.1,11z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="236" y="265"> + <g id="XMLID_2_"> + <circle id="XMLID_8_" fill="#FFFFFF" cx="8" cy="8" r="1"/> + <path id="XMLID_3_" fill="#FFFFFF" d="M15.4,7.7c-1.5-2.2-4.3-3.6-7.2-3.6c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-3,0-5.7,1.4-7.2,3.6 L0.5,8l0.2,0.3c1.5,2.2,4.3,3.6,7.2,3.6c0,0,0.1,0,0.1,0s0.1,0,0.1,0c3,0,5.7-1.4,7.2-3.6L15.5,8L15.4,7.7z M8,10.9 c-1.7,0-3-1.3-3-2.9s1.4-2.9,3-2.9s3,1.3,3,2.9S9.7,10.9,8,10.9z M1.6,8c0.8-1,1.9-1.9,3.2-2.4C4.3,6.3,4,7.1,4,8s0.3,1.7,0.8,2.4 C3.5,9.9,2.4,9,1.6,8z M11.2,10.4C11.7,9.7,12,8.9,12,8s-0.3-1.7-0.8-2.4C12.5,6.1,13.6,7,14.4,8C13.6,9,12.5,9.9,11.2,10.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="257" y="265"> + <g id="XMLID_2_"> + <circle id="XMLID_8_" fill="#000000" cx="8" cy="8" r="1"/> + <path id="XMLID_3_" fill="#000000" d="M15.4,7.7c-1.5-2.2-4.3-3.6-7.2-3.6c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-3,0-5.7,1.4-7.2,3.6 L0.5,8l0.2,0.3c1.5,2.2,4.3,3.6,7.2,3.6c0,0,0.1,0,0.1,0s0.1,0,0.1,0c3,0,5.7-1.4,7.2-3.6L15.5,8L15.4,7.7z M8,10.9 c-1.7,0-3-1.3-3-2.9s1.4-2.9,3-2.9s3,1.3,3,2.9S9.7,10.9,8,10.9z M1.6,8c0.8-1,1.9-1.9,3.2-2.4C4.3,6.3,4,7.1,4,8s0.3,1.7,0.8,2.4 C3.5,9.9,2.4,9,1.6,8z M11.2,10.4C11.7,9.7,12,8.9,12,8s-0.3-1.7-0.8-2.4C12.5,6.1,13.6,7,14.4,8C13.6,9,12.5,9.9,11.2,10.4z"/> + </g> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="292" y="5"> + <rect id="XMLID_4_" x="6.8" y="1.2" fill="#000000" width="3" height="10"/> + <rect id="XMLID_1_" x="7" y="12" fill="#000000" width="3" height="3"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="292" y="26"> + <path fill="#2BBD03" d="M13.9,4.5l-1.2-1.2c-0.2-0.2-0.5-0.2-0.6,0l-6,6L4,7.2C3.8,7,3.5,7,3.3,7.2L2.1,8.4C2,8.6,2,8.9,2.1,9.1 l3.5,3.5c0.2,0.2,0.3,0.3,0.5,0.3s0.3-0.2,0.5-0.3l7.3-7.3C14,5,14,4.7,13.9,4.5z"/> + </svg> + <svg height="16" viewBox="0 0 13 16" width="12.1" x="292" y="47"> + <polygon fill="#FFFFFF" points="3.2,0 0.1,3 3.2,3"/> + <path fill="#FFFFFF" d="M4.1,0v4h-4v12h12V0H4.1z M10.1,13h-8v-1h8V13z M10.1,11h-8v-1h8V11z M10.1,9h-8V8h8V9z M10.1,7h-8V6h8V7z"/> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="68"> + <g> + <polygon fill="#000000" points="4.6,0.2 1.9,2.8 4.6,2.8"/> + <path class="st0" d="M5.3,0.2v3.4H1.9v10.1h10.1V0.2H5.3z M10.4,11.2H3.6v-0.8h6.8V11.2z M10.4,9.5H3.6V8.7h6.8V9.5z M10.4,7.8H3.6 V7h6.8V7.8z M10.4,6.2H3.6V5.3h6.8V6.2z"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="87"> + <g> + <path fill="#FFFFFF" d="M13,3H7.7l0.4,1H13v7.1l1-0.9c0,0,0-5.7,0-6.7S12.6,3,12.6,3"/> + <path fill="#FFFFFF" d="M11.1,5H7.3L6.2,3c0,0-0.4-1-1.1-1H4.2H3.1H2.4C1.7,2,1.2,2.8,1.2,2.8L0,4.5v7c0,1,1.1,1.5,1.1,1.5h10 c0,0,0.9-0.5,0.9-1.5v-6C12,4.5,11.1,5,11.1,5z"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="106"> + <g id="XMLID_2_"> + <path id="XMLID_3_" fill="#000000" d="M10.1,3.7c0.9-0.2,1.6-0.4,2.4-0.7C11.6,1.9,10.4,1,9.1,0.6C9.5,1.6,9.8,2.6,10.1,3.7z"/> + <path id="XMLID_9_" fill="#000000" d="M4,3.7c0.3-1.1,0.6-2.2,1-3.3C3.6,0.9,2.4,1.8,1.5,3C2.3,3.3,3.1,3.6,4,3.7z"/> + <path id="XMLID_10_" fill="#000000" d="M4.9,3.9C5.6,4,6.3,4.1,7,4.1S8.4,4,9.1,3.9C8.9,2.6,8.5,1.4,7.9,0.2C7.6,0.2,7.3,0.1,7,0.1 s-0.5,0-0.8,0.1C5.6,1.4,5.2,2.6,4.9,3.9z"/> + <path id="XMLID_11_" fill="#000000" d="M9.3,9.1C9.4,8.5,9.5,7.7,9.5,7S9.4,5.5,9.3,4.9C8.5,4.9,7.8,5,7,5S5.5,4.9,4.8,4.9 C4.7,5.5,4.6,6.2,4.6,7c0,0.7,0.1,1.5,0.2,2.1C5.5,9.1,6.2,9,7,9S8.5,9.1,9.3,9.1z"/> + <path id="XMLID_12_" fill="#000000" d="M13,10.1c0.5-0.9,0.8-2,0.8-3.1S13.5,4.8,13,3.8c-0.9,0.3-1.8,0.7-2.7,0.9 c0.1,0.8,0.2,1.5,0.2,2.3s-0.1,1.5-0.2,2.3C11.2,9.5,12.2,9.7,13,10.1z"/> + <path id="XMLID_13_" fill="#000000" d="M9.1,10.1C8.5,10,7.8,9.9,7.1,9.9S5.7,10,5,10.1c0.3,1.3,0.7,2.5,1.3,3.7 c0.3,0,0.5,0.1,0.8,0.1s0.6,0,0.9-0.1C8.5,12.6,8.9,11.4,9.1,10.1z"/> + <path id="XMLID_14_" fill="#000000" d="M10.1,10.3c-0.3,1.1-0.6,2.2-1,3.3c1.4-0.4,2.6-1.4,3.4-2.5C11.7,10.7,10.9,10.4,10.1,10.3z"/> + <path id="XMLID_15_" fill="#000000" d="M3.8,9.3C3.7,8.5,3.7,7.8,3.7,7s0.1-1.5,0.2-2.3C2.9,4.5,1.9,4.2,1,3.8C0.5,4.8,0.2,5.9,0.2,7 S0.5,9.2,1,10.2C1.9,9.7,2.9,9.5,3.8,9.3z"/> + <path id="XMLID_16_" fill="#000000" d="M4,10.3c-0.9,0.2-1.6,0.4-2.5,0.8c0.9,1.2,2.1,2.1,3.5,2.5C4.5,12.5,4.2,11.4,4,10.3z"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="125"> + <g> + <rect fill="#000000" id="XMLID_2_" x="0.8" y="1.4" width="1.9" height="12.4"/> + <polygon fill="#000000" id="XMLID_1_" points="3.7,1.2 13.2,4.5 3.7,7.9 "/> + <circle fill="#000000" id="XMLID_4_" cx="1.8" cy="1.2" r="1"/> + </g> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="144"> + <path fill="#000000" d="M7,0.2c-2.8,0-5.1,2.3-5.1,5.1C1.9,7,3,8.4,4.3,10l2.9,3.9l3-4.2c1.2-1.5,2-2.6,2-4.2C12.2,2.5,9.8,0.2,7,0.2z M7,7.5c-1.2,0-2.2-0.9-2.2-2.2S5.8,3.1,7,3.1S9.2,4,9.2,5.3S8.2,7.5,7,7.5z"/> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="163"> + <path fill="#FFFFFF" d="M7,0.2c-2.8,0-5.1,2.3-5.1,5.1C1.9,7,3,8.4,4.3,10l2.9,3.9l3-4.2c1.2-1.5,2-2.6,2-4.2C12.2,2.5,9.8,0.2,7,0.2z M7,7.5c-1.2,0-2.2-0.9-2.2-2.2S5.8,3.1,7,3.1S9.2,4,9.2,5.3S8.2,7.5,7,7.5z"/> + </svg> + <svg height="14" viewBox="0 0 14 14" width="14" x="292" y="182"> + <g> + <path fill="#000000" d="M13,3H7.7l0.4,1H13v7.1l1-0.9c0,0,0-5.7,0-6.7S12.6,3,12.6,3"/> + <path fill="#000000" d="M11.1,5H7.3L6.2,3c0,0-0.4-1-1.1-1H4.2H3.1H2.4C1.7,2,1.2,2.8,1.2,2.8L0,4.5v7c0,1,1.1,1.5,1.1,1.5h10 c0,0,0.9-0.5,0.9-1.5v-6C12,4.5,11.1,5,11.1,5z"/> + </g> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="292" y="201"> + <polygon points="3.5,1 3.9,1.4 2.2,3.2 12,3.2 12,3.8 2.2,3.8 3.9,5.6 3.5,6 1,3.5 "/> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="292" y="213"> + <polygon points="9.5,1 9.1,1.4 10.8,3.2 1,3.2 1,3.8 10.8,3.8 9.1,5.6 9.5,6 12,3.5 "/> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="250" y="238"> + <polygon fill="#fff" points="3.5,1 3.9,1.4 2.2,3.2 12,3.2 12,3.8 2.2,3.8 3.9,5.6 3.5,6 1,3.5 "/> + </svg> + <svg height="7" viewBox="0 0 13 7" width="13" x="250" y="251"> + <polygon fill="#fff" points="9.5,1 9.1,1.4 10.8,3.2 1,3.2 1,3.8 10.8,3.8 9.1,5.6 9.5,6 12,3.5 "/> + </svg> + <svg viewBox="0 0 100 100" height="22" width="22" x="283" y="230"> + <path style="text-indent:0;text-transform:none;block-progression:tb" d="M10 13a2 2 0 1 0 0 4h10.375l10.531 49.75c.256 1.23 1.077 2.263 2.094 2.25h50c1.057.015 2.031-.943 2.031-2s-.974-2.015-2.031-2H34.625L23.969 14.563C23.77 13.679 22.906 12.993 22 13zm20 12l6 30h49l7-30zm13 48a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm30 0a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" overflow="visible" color="#000"/> + </svg> + <svg viewBox="0 0 100 100" height="22" width="22" x="283" y="260"> + <path style="text-indent:0;text-transform:none;block-progression:tb" d="M10 13a2 2 0 1 0 0 4h10.375l10.531 49.75c.256 1.23 1.077 2.263 2.094 2.25h50c1.057.015 2.031-.943 2.031-2s-.974-2.015-2.031-2H34.625L23.969 14.563C23.77 13.679 22.906 12.993 22 13zm20 12l6 30h49l7-30zm13 48a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm30 0a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" overflow="visible" fill="#fff"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="0" y="285"> + <path fill="#000" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> + </svg> + <svg height="16" viewBox="0 0 16 16" width="16" x="20" y="285"> + <path fill="#fff" d="M10.1,8l3.7-3.7c0.2-0.2,0.2-0.5,0-0.7l-1.4-1.4C12.3,2,12,2,11.7,2.2L8,5.9L4.3,2.2C4.1,2,3.8,2,3.5,2.2 L2.2,3.5C2,3.7,2,4,2.2,4.3L5.9,8l-3.7,3.7c-0.2,0.2-0.2,0.5,0,0.7l1.5,1.5c0.2,0.2,0.5,0.2,0.7,0L8,10.1l3.7,3.7 c0.2,0.2,0.5,0.2,0.7,0l1.5-1.5c0.2-0.2,0.2-0.5,0-0.7L10.1,8z"/> + </svg> + <svg viewBox="0 0 12 16" width="12" height="16" x="40" y="285"> + <rect y="3" width="12" height="2"></rect> + <rect y="7" width="12" height="2"></rect> + <rect y="11" width="12" height="2"></rect> + </svg> + <svg viewBox="0 0 12 16" width="12" height="16" x="60" y="285" fill="#fff"> + <rect y="3" width="12" height="2"></rect> + <rect y="7" width="12" height="2"></rect> + <rect y="11" width="12" height="2"></rect> + </svg> + <svg width="32" height="32" viewBox="0 0 32 32" fill="none" x="52" y="153"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M5.78754 14.0196C5.83131 14.0344 5.87549 14.0448 5.91963 14.0512C5.96777 14.1644 6.02996 14.3107 6.10252 14.4818C6.27959 14.8994 6.51818 15.4643 6.76446 16.0535C7.2667 17.2552 7.77332 18.4939 7.88521 18.8485C8.02372 19.2868 8.17013 19.5848 8.32996 19.7883C8.4126 19.8935 8.50819 19.9853 8.62003 20.0549C8.67633 20.0899 8.7358 20.1186 8.79788 20.14C8.80062 20.141 8.80335 20.1419 8.80608 20.1428C9.1261 20.2636 9.41786 20.2133 9.60053 20.1518C9.69827 20.1188 9.77735 20.0791 9.8334 20.0469C9.86198 20.0304 9.88612 20.0151 9.90538 20.0021L9.90992 19.9991L12.7361 18.2366L16.0007 20.7394C16.0488 20.7763 16.1014 20.8073 16.157 20.8316C16.5492 21.0027 16.929 21.0624 17.2862 21.0136C17.6429 20.9649 17.926 20.8151 18.1368 20.6464C18.3432 20.4813 18.4832 20.2963 18.5703 20.1589C18.6148 20.0887 18.6482 20.0266 18.6718 19.9791C18.6836 19.9552 18.6931 19.9346 18.7005 19.9181L18.7099 19.8963L18.7135 19.8877L18.715 19.8841L18.7156 19.8824L18.7163 19.8808C18.7334 19.8379 18.7466 19.7935 18.7556 19.7482L21.7358 4.72274C21.7453 4.67469 21.7501 4.62581 21.7501 4.57682C21.7501 4.13681 21.5843 3.71841 21.1945 3.46452C20.8613 3.24752 20.4901 3.23818 20.2556 3.25598C20.0025 3.27519 19.7688 3.33766 19.612 3.38757C19.5304 3.41355 19.4619 3.43861 19.4126 3.45773C19.3878 3.46734 19.3675 3.47559 19.3523 3.48188L19.341 3.48666L2.62725 10.0432L2.62509 10.044C2.61444 10.0479 2.60076 10.053 2.58451 10.0593C2.55215 10.0719 2.50878 10.0896 2.45813 10.1126C2.35935 10.1574 2.22077 10.2273 2.07856 10.3247C1.85137 10.4803 1.32888 10.9064 1.41686 11.6097C1.48705 12.1708 1.87143 12.5154 2.10562 12.6811C2.23421 12.7721 2.35638 12.8371 2.44535 12.8795C2.48662 12.8991 2.57232 12.9339 2.6095 12.9491L2.61889 12.9529L5.78754 14.0196ZM19.9259 4.86786L19.9236 4.86888C19.9152 4.8725 19.9069 4.87596 19.8984 4.87928L3.1644 11.4438C3.15566 11.4472 3.14686 11.4505 3.138 11.4536L3.12869 11.4571C3.11798 11.4613 3.09996 11.4686 3.07734 11.4788C3.06451 11.4846 3.05112 11.491 3.03747 11.4978C3.05622 11.5084 3.07417 11.5175 3.09012 11.5251C3.10543 11.5324 3.11711 11.5374 3.1235 11.54L6.26613 12.598C6.32365 12.6174 6.37727 12.643 6.42649 12.674L16.8033 6.59948L16.813 6.59374C16.8205 6.58927 16.8305 6.58353 16.8424 6.5768C16.866 6.56345 16.8984 6.54568 16.937 6.52603C17.009 6.48938 17.1243 6.43497 17.2541 6.39485C17.3444 6.36692 17.6109 6.28823 17.899 6.38064C18.0768 6.43767 18.2609 6.56028 18.3807 6.76798C18.4401 6.87117 18.4718 6.97483 18.4872 7.06972C18.528 7.2192 18.5215 7.36681 18.4896 7.49424C18.4208 7.76875 18.228 7.98287 18.0525 8.14665C17.9021 8.28706 15.9567 10.1629 14.0376 12.0147C13.0805 12.9381 12.1333 13.8525 11.4252 14.5359L10.9602 14.9849L16.8321 19.4867C16.9668 19.5349 17.0464 19.5325 17.0832 19.5274C17.1271 19.5214 17.163 19.5045 17.1997 19.4752C17.2407 19.4424 17.2766 19.398 17.3034 19.3557L17.3045 19.354L20.195 4.78102C20.1521 4.79133 20.1087 4.80361 20.0669 4.81691C20.0196 4.83198 19.9805 4.84634 19.9547 4.85637C19.9418 4.86134 19.9326 4.86511 19.9276 4.86719L19.9259 4.86786ZM11.4646 17.2618L10.2931 16.3636L10.0093 18.1693L11.4646 17.2618ZM9.21846 14.5814L10.3834 13.4567C11.0915 12.7732 12.0389 11.8588 12.9961 10.9352L13.9686 9.997L7.44853 13.8138L7.48351 13.8963C7.66121 14.3154 7.90087 14.8827 8.14845 15.4751C8.33358 15.918 8.52717 16.3844 8.70349 16.8162L8.98653 15.0158C9.01381 14.8422 9.09861 14.692 9.21846 14.5814Z" fill="white"/> + </svg> +</svg> diff --git a/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation.php b/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation.php index ad8675a2..204853e2 100644 --- a/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation.php +++ b/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation.php @@ -2,6 +2,50 @@ declare( strict_types = 1 ); +add_action( 'init', 'amnesty_register_localisation_setting', 1000 ); + +if ( ! function_exists( 'amnesty_register_localisation_setting' ) ) { + /** + * Register CMB2 setting with the REST API + * + * @return void + */ + function amnesty_register_localisation_setting(): void { + $schema = apply_filters( + 'amnesty_localisation_options_rest_schema', + [ + 'type' => 'object', + 'properties' => [ + 'ol_locale_option' => [ + 'type' => 'string', + 'description' => __( 'Ordered List Character Choice', 'amnesty' ), + 'default' => '', + ], + 'enforce_grouping_separators' => [ + 'type' => 'string', + 'description' => __( 'Always display numeric grouping separators', 'amnesty' ), + 'default' => '', + ], + ], + ], + ); + + register_setting( + 'options', + 'amnesty_localisation_options_page', + [ + 'label' => __( 'Localisation', 'amnesty' ), + 'description' => __( 'Localisation Settings', 'amnesty' ), + 'type' => 'object', + 'show_in_rest' => [ + 'name' => 'amnestyCoreI18n', + 'schema' => $schema, + ], + ], + ); + } +} + if ( ! function_exists( 'amnesty_register_localisation_options' ) ) { /** * Register settings with CMB2 for localisation diff --git a/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation/class-taxonomy-labels.php b/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation/class-taxonomy-labels.php index 98a328c9..54fbbf66 100644 --- a/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation/class-taxonomy-labels.php +++ b/wp-content/themes/humanity-theme/includes/admin/theme-options/localisation/class-taxonomy-labels.php @@ -19,9 +19,56 @@ class Taxonomy_Labels { * Bind hooks */ public function __construct() { + add_action( 'amnesty_localisation_options_rest_schema', [ $this, 'schema' ] ); add_action( 'amnesty_register_localisation_options', [ $this, 'register' ] ); } + /** + * Provide taxonomy label schema to the REST API option + * + * Not typehinting the arrays fully because they're massive + * + * @param array<mixed> $schema the existing schema + * + * @return array<mixed> + */ + public function schema( array $schema ): array { + $taxonomies = get_taxonomies( + [ + 'public' => true, + 'amnesty' => true, + ], + 'objects', + ); + + foreach ( $taxonomies as $tax_object ) { + $properties = []; + + foreach ( $tax_object->labels as $key => $label ) { + $properties[ $key ] = [ + 'type' => 'string', + 'default' => $label, + ]; + } + + $schema['properties'][ $tax_object->name . '_labels' ] = [ + 'description' => $tax_object->description, + 'type' => 'array', + 'schema' => [ + 'items' => [ + 'type' => 'array', + 'schema' => [ + 'type' => 'object', + 'properties' => $properties, + ], + ], + ], + ]; + } + + return $schema; + } + /** * Register taxonomy labels with theme localisation settings * @@ -37,7 +84,7 @@ public function register( CMB2 $localisation ): void { [ 'public' => true, 'amnesty' => true, - ] + ], ); foreach ( $taxonomies as $tax_slug ) { @@ -73,7 +120,7 @@ protected function add_fields_for_taxonomy( string $tax_slug, CMB2 $localisation 'sortable' => false, 'closed' => true, ], - ] + ] ); foreach ( $all_labels as $key => $label ) { @@ -86,7 +133,7 @@ protected function add_fields_for_taxonomy( string $tax_slug, CMB2 $localisation 'tax_slug' => $tax_slug, 'default_labels' => $default_labels, 'config_labels' => $config_labels, - ] + ] ); } } @@ -129,7 +176,7 @@ protected function add_field_for_taxonomy_label( string $key, array $label, arra 'type' => 'text', 'description' => sprintf( $desc, $name ), 'default' => $data['default_labels']->{$key} ?? '', - ] + ] ); } diff --git a/wp-content/themes/humanity-theme/includes/block-patterns/views/links-with-icons-single.html b/wp-content/themes/humanity-theme/includes/block-patterns/views/links-with-icons-single.html deleted file mode 100644 index 11b257d2..00000000 --- a/wp-content/themes/humanity-theme/includes/block-patterns/views/links-with-icons-single.html +++ /dev/null @@ -1,19 +0,0 @@ -<!-- wp:group {"layout":{"type":"constrained"}} --> -<div class="wp-block-group"><!-- wp:heading {"textAlign":"center","fontSize":"x-large"} --> - <h2 class="wp-block-heading has-text-align-center has-x-large-font-size">Heading</h2> - <!-- /wp:heading --> - - <!-- wp:image --> - <figure class="wp-block-image"><img alt=""/></figure> - <!-- /wp:image --> - - <!-- wp:paragraph {"align":"center"} --> - <p class="has-text-align-center">Description</p> - <!-- /wp:paragraph --> - - <!-- wp:buttons --> - <div class="wp-block-buttons"><!-- wp:button --> - <div class="wp-block-button"><a class="wp-block-button__link wp-element-button">button</a></div> - <!-- /wp:button --></div> - <!-- /wp:buttons --></div> - <!-- /wp:group --> diff --git a/wp-content/themes/humanity-theme/includes/blocks/_deprecated/header/register.php b/wp-content/themes/humanity-theme/includes/blocks/_deprecated/header/register.php deleted file mode 100644 index a4b31366..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/_deprecated/header/register.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_header_block' ) ) { - /** - * Register the Header block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_header_block(): void { - register_block_type( - 'amnesty-core/block-hero', - [ - 'render_callback' => '\Amnesty\Blocks\amnesty_render_header_block', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/action/register.php b/wp-content/themes/humanity-theme/includes/blocks/action/register.php deleted file mode 100644 index 15927091..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/action/register.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_action_block' ) ) { - /** - * Register the Action block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_action_block(): void { - register_block_type( - 'amnesty-core/action-block', - [ - 'render_callback' => 'render_action_block', - 'attributes' => [ - 'centred' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'content' => [ - 'type' => 'string', - 'default' => '', - ], - 'imageAlt' => [ - 'type' => 'string', - 'default' => '', - ], - 'imageID' => [ - 'type' => 'number', - 'default' => 0, - ], - 'imageURL' => [ - 'type' => 'string', - 'default' => '', - ], - 'label' => [ - 'type' => 'string', - 'default' => '', - ], - 'largeImageURL' => [ - 'type' => 'string', - 'default' => '', - ], - 'link' => [ - 'type' => 'string', - 'default' => '', - ], - 'linkText' => [ - 'type' => 'string', - 'default' => '', - ], - 'style' => [ - 'type' => 'string', - 'default' => 'standard', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/action/render.php b/wp-content/themes/humanity-theme/includes/blocks/action/render.php deleted file mode 100644 index 9cdd0dc1..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/action/render.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_action_block' ) ) { - /** - * Render the Action block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function render_action_block( array $attributes ): string { - $attributes = wp_parse_args( - $attributes, - [ - 'centred' => false, - 'content' => '', - 'imageAlt' => '', - 'imageID' => 0, - 'imageURL' => '', - 'label' => '', - 'largeImageURL' => '', - 'link' => '', - 'linkText' => '', - 'style' => 'standard', - ] - ); - - spaceless(); - - if ( 'wide' === $attributes['style'] ) { - require realpath( __DIR__ . '/views/wide.php' ); - return endspaceless( false ); - } - - require realpath( __DIR__ . '/views/standard.php' ); - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/action/views/standard.php b/wp-content/themes/humanity-theme/includes/blocks/action/views/standard.php deleted file mode 100644 index e0d2e981..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/action/views/standard.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -$block_classes = classnames( - 'actionBlock', - [ - 'is-centred' => $attributes['centred'], - ] -); - -?> -<figure class="<?php echo esc_attr( $block_classes ); ?>"> - <div class="actionBlock-figure"> - <?php - - if ( 0 !== absint( $attributes['imageID'] ) ) { - echo wp_get_attachment_image( absint( $attributes['imageID'] ), 'action-standard', false, [ 'class' => 'actionBlock-image aiic-ignore' ] ); - } elseif ( '' !== $attributes['imageURL'] ) { - printf( '<img class="actionBlock-image aiic-ignore" src="%s" alt="%s">', esc_url( $attributes['imageURL'] ), esc_attr( $attributes['imageAlt'] ) ); - } - - ?> - <span class="actionBlock-label"><?php echo esc_html( $attributes['label'] ); ?></span> - </div> - <figcaption class="actionBlock-content"> - <p><?php echo esc_html( $attributes['content'] ); ?></p> - <a class="btn btn--fill btn--large" href=<?php echo esc_url( $attributes['link'] ); ?>><?php echo esc_html( $attributes['linkText'] ); ?></a> - </figcaption> -</figure> diff --git a/wp-content/themes/humanity-theme/includes/blocks/action/views/wide.php b/wp-content/themes/humanity-theme/includes/blocks/action/views/wide.php deleted file mode 100644 index b8492ec6..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/action/views/wide.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -$block_classes = classnames( - 'actionBlock', - 'actionBlock--wide', - [ - 'is-centred' => $attributes['centred'], - ] -); - -?> -<figure class="<?php echo esc_attr( $block_classes ); ?>"> - <div class="actionBlock-figure"> - <?php - - if ( 0 !== absint( $attributes['imageID'] ) ) { - echo wp_get_attachment_image( absint( $attributes['imageID'] ), 'action-wide', false, [ 'class' => 'actionBlock-image aiic-ignore' ] ); - } else { - $image_url = $attributes['largeImageURL'] ?: $attributes['imageURL']; - - if ( $image_url ) { - printf( '<img class="actionBlock-image aiic-ignore" src="%s" alt="%s">', esc_url( $image_url ), esc_attr( $attributes['imageAlt'] ) ); - } - } - - ?> - <span class="actionBlock-label"><?php echo esc_html( $attributes['label'] ); ?></span> - </div> - <figcaption class="actionBlock-content"> - <p><?php echo esc_html( $attributes['content'] ); ?></p> - <a class="btn btn--fill btn--large" href=<?php echo esc_url( $attributes['link'] ); ?>><?php echo esc_html( $attributes['linkText'] ); ?></a> - </figcaption> -</figure> diff --git a/wp-content/themes/humanity-theme/includes/blocks/background-media/components/register.php b/wp-content/themes/humanity-theme/includes/blocks/background-media/components/register.php deleted file mode 100644 index 3771414d..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/background-media/components/register.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_background_media_column_block' ) ) { - /** - * Register the Background Media block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_background_media_column_block(): void { - register_block_type( - 'amnesty-core/background-media-column', - [ - 'render_callback' => 'render_background_media_column', - 'attributes' => [ - 'uniqId' => [ - 'type' => 'string', - 'default' => '', - ], - 'horizontalAlignment' => [ - 'type' => 'string', - 'default' => '', - ], - 'verticalAlignment' => [ - 'type' => 'string', - 'default' => '', - ], - 'image' => [ - 'type' => 'number', - 'default' => 0, - ], - 'background' => [ - 'type' => 'string', - 'default' => '', - ], - 'opacity' => [ - 'type' => 'number', - 'default' => 1, - ], - 'focalPoint' => [ - 'type' => 'array', - 'default' => [ - 'x' => 0.5, - 'y' => 0.5, - ], - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/background-media/components/render.php b/wp-content/themes/humanity-theme/includes/blocks/background-media/components/render.php deleted file mode 100644 index 392393b7..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/background-media/components/render.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_background_media_column' ) ) { - /** - * Render a background media inner column block - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * @param mixed $content the block content - * - * @return string - */ - function render_background_media_column( array $attributes, $content = '' ): string { - if ( empty( $attributes['uniqId'] ) ) { - $attributes['uniqId'] = amnesty_rand_str( 4 ); - } - - $classes = classnames( - 'text-media--itemContainer', - [ - "align{$attributes['horizontalAlignment']}" => (bool) $attributes['horizontalAlignment'], - "is-vertically-aligned-{$attributes['verticalAlignment']}" => (bool) $attributes['verticalAlignment'], - "has-{$attributes['background']}-background-color" => (bool) $attributes['background'], - ] - ); - - if ( 0 === absint( $attributes['image'] ) ) { - $markup = sprintf( '<div id="%s" class="%s">', esc_attr( $attributes['uniqId'] ), esc_attr( $classes ) ); - $markup .= $content; - $markup .= '</div>'; - - return $markup; - } - - $opacity = round( 1 - floatval( $attributes['opacity'] ), 2 ); - $x_offset = round( floatval( $attributes['focalPoint']['x'] ) * 100, 2 ); - $y_offset = round( floatval( $attributes['focalPoint']['y'] ) * 100, 2 ); - $gradient = ''; - - if ( 0.0 !== $opacity ) { - $gradient = sprintf( 'linear-gradient(rgba(255,255,255,%1$f),rgba(255,255,255,%1$f)),', $opacity ); - } - - $image_small = wp_get_attachment_image_url( absint( $attributes['image'] ), 'lwi-block-sm@2x' ); - $image_large = wp_get_attachment_image_url( absint( $attributes['image'] ), 'lwi-block-lg@2x' ); - - $css = sprintf( '#%1$s{background-position:%2$f%% %3$f%%}', esc_attr( $attributes['uniqId'] ), $x_offset, $y_offset ); - $css .= sprintf( '#%1$s{background-image:%2$surl("%3$s")}', esc_attr( $attributes['uniqId'] ), $gradient, esc_url( $image_small ) ); - $css .= sprintf( '@media(min-width:1440px){#%1$s{background-image:%2$surl("%3$s")}}', esc_attr( $attributes['uniqId'] ), $gradient, esc_url( $image_large ) ); - - $markup = sprintf( '<style class="aiic-ignore">%s</style>', $css ); - $markup .= sprintf( '<div id="%s" class="%s">', esc_attr( $attributes['uniqId'] ), esc_attr( $classes ) ); - $markup .= $content; - $markup .= '</div>'; - - return $markup; - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/background-media/register.php b/wp-content/themes/humanity-theme/includes/blocks/background-media/register.php deleted file mode 100644 index 0c35524f..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/background-media/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_background_media_block' ) ) { - /** - * Register the Background Media block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_background_media_block(): void { - register_block_type( - 'amnesty-core/background-media', - [ - 'render_callback' => 'render_background_media_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/background-media/render.php b/wp-content/themes/humanity-theme/includes/blocks/background-media/render.php deleted file mode 100644 index fddf2bf4..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/background-media/render.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_background_media_block' ) ) { - /** - * Render the Background Media block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * @param string $content the block content - * - * @return string - */ - function render_background_media_block( array $attributes, $content ) { - return sprintf( - '<div %1$s>%2$s</div>', - wp_kses_data( get_block_wrapper_attributes() ), - $content - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/banner/register.php b/wp-content/themes/humanity-theme/includes/blocks/banner/register.php deleted file mode 100644 index b9e141ca..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/banner/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_banner_block' ) ) { - /** - * Register the banner block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_banner_block(): void { - register_block_type( - 'amnesty-core/header', - [ - 'render_callback' => '\Amnesty\Blocks\amnesty_render_header_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/blockquote/register.php b/wp-content/themes/humanity-theme/includes/blocks/blockquote/register.php deleted file mode 100644 index b40df000..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/blockquote/register.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_blockquote_block' ) ) { - /** - * Register the Blockquote block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_blockquote_block(): void { - register_block_type( - 'amnesty-core/quote', - [ - 'render_callback' => 'render_blockquote_block', - 'attributes' => [ - 'align' => [ - 'type' => 'string', - 'default' => '', - ], - 'size' => [ - 'type' => 'string', - 'default' => '', - ], - 'colour' => [ - 'type' => 'string', - 'default' => '', - ], - 'capitalise' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'lined' => [ - 'type' => 'boolean', - 'default' => true, - ], - 'content' => [ - 'type' => 'string', - 'default' => '', - ], - 'citation' => [ - 'type' => 'string', - 'default' => '', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/blockquote/render.php b/wp-content/themes/humanity-theme/includes/blocks/blockquote/render.php deleted file mode 100644 index f4f5fdf0..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/blockquote/render.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_blockquote_block' ) ) { - /** - * Render a blockquote - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * - * @return string - */ - function render_blockquote_block( array $attributes = [] ): string { - $attrs = wp_parse_args( - $attributes, - [ - 'align' => '', - 'size' => '', - 'colour' => '', - 'capitalise' => false, - 'lined' => true, - 'content' => '', - 'citation' => '', - ] - ); - - $classes = classnames( - 'blockquote', - [ - "align-{$attrs['align']}" => (bool) $attrs['align'], - "is-{$attrs['size']}" => (bool) $attrs['size'], - "is-{$attrs['colour']}" => (bool) $attrs['colour'], - 'is-capitalised' => (bool) $attrs['capitalise'], - 'is-lined' => (bool) $attrs['lined'], - ] - ); - - $output = sprintf( '<blockquote class="%s">', esc_attr( $classes ) ); - - if ( $attrs['content'] ) { - $output .= wp_kses_post( wpautop( $attrs['content'] ) ); - } - - if ( $attrs['citation'] ) { - $output .= sprintf( '<cite>%s</cite>', esc_html( wp_strip_all_tags( $attrs['citation'] ) ) ); - } - - $output .= '</blockquote>'; - - return $output; - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/call-to-action/register.php b/wp-content/themes/humanity-theme/includes/blocks/call-to-action/register.php deleted file mode 100644 index 2d5e20e2..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/call-to-action/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_cta_block' ) ) { - /** - * Register the Download block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_cta_block(): void { - register_block_type( - 'amnesty-core/block-call-to-action', - [ - 'render_callback' => 'amnesty_render_cta_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/call-to-action/render.php b/wp-content/themes/humanity-theme/includes/blocks/call-to-action/render.php deleted file mode 100644 index 196b07cf..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/call-to-action/render.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_cta_block' ) ) { - /** - * Render the call to action block - * - * @package Amnesty\Blocks - * - * @param array $attrs the block attributes - * @param string $content the block content - * - * @return string - */ - function amnesty_render_cta_block( array $attrs, string $content = '' ): string { - if ( false !== strpos( $content, 'class="callToAction' ) ) { - return $content; - } - - $attrs = wp_parse_args( - $attrs, - [ - 'preheading' => '', - 'title' => '', - 'content' => '', - 'background' => '', - ] - ); - - $pre_heading = $attrs['preheading']; - $heading = $attrs['title']; - $cta_content = $attrs['content']; - - // Set the classes - $classes = classnames( - 'callToAction', - [ - "callToAction--{$attrs['background']}" => (bool) $attrs['background'], - ] - ); - - return sprintf( - '<div class="%1$s" role="note" aria-label="%2$s"> - <h2 class="callToAction-preHeading">%3$s</h2> - <h1 class="callToAction-heading">%4$s</h1> - <p class="callToAction-content">%5$s</p> - <div className="innerBlocksContainer"> - %6$s - </div> - </div>', - esc_attr( $classes ), - esc_attr( $heading ), - wp_kses_post( $pre_heading ), - wp_kses_post( $heading ), - wp_kses_post( $cta_content ), - wp_kses_post( $content ), - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/collapsable/register.php b/wp-content/themes/humanity-theme/includes/blocks/collapsable/register.php deleted file mode 100644 index 1d9ae6d1..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/collapsable/register.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_collapsable_block' ) ) { - /** - * Register the collapsable block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_collapsable_block(): void { - register_block_type( - 'amnesty-core/collapsable', - [ - 'render_callback' => 'render_collapsable_block', - 'editor_script' => 'amnesty-core-blocks-js', - 'supports' => [ - 'className' => true, - ], - 'attributes' => [ - 'collapsed' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'title' => [ - 'type' => 'string', - 'default' => '', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/collapsable/render.php b/wp-content/themes/humanity-theme/includes/blocks/collapsable/render.php deleted file mode 100644 index 3a069b55..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/collapsable/render.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_collapsable_block' ) ) { - /** - * Render a collapsable block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * @param mixed $content the block content - * - * @return string - */ - function render_collapsable_block( array $attributes, $content = '' ): string { - $attrs = wp_parse_args( - $attributes, - [ - 'anchor' => '', - 'collapsed' => false, - 'title' => '', - ] - ); - - if ( ! $content ) { - $content = ''; - } - - $wrapper_attrs = []; - - if ( $attrs['collapsed'] ) { - $wrapper_attrs['class'] = 'is-collapsed'; - } - - ob_start(); - require realpath( __DIR__ . '/views/block.php' ); - return ob_get_clean(); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/collapsable/views/block.php b/wp-content/themes/humanity-theme/includes/blocks/collapsable/views/block.php deleted file mode 100644 index f693bc6a..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/collapsable/views/block.php +++ /dev/null @@ -1,9 +0,0 @@ -<figure id="<?php echo esc_attr( $attrs['anchor'] ); ?>" <?php echo get_block_wrapper_attributes( $wrapper_attrs ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>> - <figcaption> - <h2><?php echo wp_kses_post( $attrs['title'] ); ?></h2> - <button class="btn--blank" aria-hidden="true"> - <span class="icon icon-arrow-down"></span> - </button> - </figcaption> - <div class="wp-block-amnesty-core-collapsable-inner"><?php echo wp_kses_post( $content ); ?></div> -</figure> diff --git a/wp-content/themes/humanity-theme/includes/blocks/countdown-timer/register.php b/wp-content/themes/humanity-theme/includes/blocks/countdown-timer/register.php deleted file mode 100644 index da0dc56f..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/countdown-timer/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_countdown_block' ) ) { - /** - * Register the countdown timer block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_countdown_block(): void { - register_block_type( - 'amnesty-core/countdown-timer', - [ - 'render_callback' => 'amnesty_render_countdown_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/countdown-timer/render.php b/wp-content/themes/humanity-theme/includes/blocks/countdown-timer/render.php deleted file mode 100644 index 925ec91a..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/countdown-timer/render.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_countdown_block' ) ) { - /** - * Render a countdown timer block - * - * @package Amnesty\Blocks - * - * @param array $attrs the block attributes - * - * @return string - */ - function amnesty_render_countdown_block( array $attrs = [] ): string { - $attrs = wp_parse_args( - $attrs, - [ - 'alignment' => '', - 'date' => '', - 'expiredText' => '', - ] - ); - - return sprintf( - '<div class="clockdiv" style= text-align:%s;> - <div class="countdownClock" data-timestamp=%s data-expiredText="%s" /> - </div>', - esc_attr( $attrs['alignment'] ), - esc_attr( $attrs['date'] ), - esc_attr( $attrs['expiredText'] ) - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/custom-card/register.php b/wp-content/themes/humanity-theme/includes/blocks/custom-card/register.php deleted file mode 100644 index c5ac7c52..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/custom-card/register.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_custom_card_block' ) ) { - /** - * Register the Custom Card block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_custom_card_block(): void { - register_block_type( - 'amnesty-core/custom-card', - [ - 'render_callback' => 'render_custom_card_block', - 'attributes' => [ - 'centred' => [ - 'type' => 'boolean', - ], - 'content' => [ - 'type' => 'string', - ], - 'imageAlt' => [ - 'type' => 'string', - ], - 'imageID' => [ - 'type' => 'integer', - ], - 'imageURL' => [ - 'type' => 'string', - ], - 'label' => [ - 'type' => 'string', - ], - 'largeImageURL' => [ - 'type' => 'string', - ], - 'link' => [ - 'type' => 'string', - ], - 'linkText' => [ - 'type' => 'string', - ], - 'scrollLink' => [ - 'type' => 'string', - ], - 'style' => [ - 'type' => 'string', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/custom-card/render.php b/wp-content/themes/humanity-theme/includes/blocks/custom-card/render.php deleted file mode 100644 index 21bece5a..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/custom-card/render.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_custom_card_block' ) ) { - /** - * Render the Custom Card block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function render_custom_card_block( array $attributes ): string { - $attributes = wp_parse_args( - $attributes, - [ - 'align' => '', - 'centred' => false, - 'className' => '', - 'content' => '', - 'imageAlt' => '', - 'imageID' => 0, - 'imageURL' => '', - 'label' => '', - 'largeImageURL' => '', - 'link' => '', - 'linkText' => '', - 'scrollLink' => '', - 'style' => 'standard', - ] - ); - - // used in view - // phpcs:disable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned - $block_classes = classnames( - 'customCard', - $attributes['className'], - [ - sprintf( 'align%s', $attributes['align'] ) => (bool) $attributes['align'], - 'actionBlock--wide' => 'wide' === $attributes['style'], - 'is-centred' => (bool) $attributes['centred'], - ] - ); - // phpcs:enable WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned - - // used in view - $button_classes = classnames( 'btn', 'btn--fill', 'btn--large' ); - - spaceless(); - require __DIR__ . '/views/card.php'; - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/custom-card/views/card.php b/wp-content/themes/humanity-theme/includes/blocks/custom-card/views/card.php deleted file mode 100644 index 74b5fa7b..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/custom-card/views/card.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php $image_size = 'wide' === $attributes['style'] ? 'action-wide' : 'post-half'; ?> -<figure class="<?php echo esc_attr( $block_classes ); ?>"> - <span class="customCard-label"><?php echo esc_html( $attributes['label'] ); ?></span> - <div class="customCard-figure"> - <?php echo wp_get_attachment_image( absint( $attributes['imageID'] ), $image_size, false, [ 'class' => 'customCard-image aiic-ignore' ] ); ?> - </div> - <figcaption class="customCard-content"> - <p><?php echo esc_html( $attributes['content'] ); ?></p> - <a class="btn btn--fill btn--large" href="<?php echo esc_url( $attributes['scrollLink'] ?: $attributes['link'] ); ?>"><?php echo esc_html( $attributes['linkText'] ); ?></a> - </figcaption> -</figure> diff --git a/wp-content/themes/humanity-theme/includes/blocks/download/register.php b/wp-content/themes/humanity-theme/includes/blocks/download/register.php deleted file mode 100644 index 88cd8362..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/download/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_download_block' ) ) { - /** - * Register the Download block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_download_block(): void { - register_block_type( - 'amnesty-core/block-download', - [ - 'render_callback' => 'amnesty_render_download_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/download/render.php b/wp-content/themes/humanity-theme/includes/blocks/download/render.php deleted file mode 100644 index dd233852..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/download/render.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_download_block' ) ) { - /** - * Render a download block - * - * @package Amnesty\Blocks - * - * @param array $attrs the block attributes - * - * @return string|null - */ - function amnesty_render_download_block( $attrs = [] ) { - if ( empty( $attrs['files'] ) ) { - return amnesty_render_download_block__deprecated(); - } - - $attrs = apply_filters( 'amnesty_download_block_attributes', $attrs ); - - $files = $attrs['files']; - $text = isset( $attrs['buttonText'] ) ? $attrs['buttonText'] : /* translators: [front] */ __( 'Download', 'amnesty' ); - $colour = sprintf( 'btn--%s', isset( $attrs['style'] ) ? $attrs['style'] : 'dark' ); - $align = isset( $attrs['alignment'] ) ? sprintf( 'align%s', $attrs['alignment'] ) : ''; - - if ( count( $files ) < 2 ) { - if ( empty( $files[0]['id'] ) ) { - return null; - } - - $url = $files[0]['link'] ?? amnesty_get_attachment_url( $files[0]['id'] ); - - if ( ! $url ) { - return ''; - } - - $name = explode( '/', $url ); - $name = array_pop( $name ); - - spaceless(); - require locate_template( 'includes/blocks/download/views/simple.php' ); - return endspaceless( false ); - } - - spaceless(); - require locate_template( 'includes/blocks/download/views/multiple.php' ); - return endspaceless( false ); - } -} - -if ( ! function_exists( 'amnesty_render_download_block__deprecated' ) ) { - /** - * Render a download block (deprecated version) - * - * @package Amnesty\Blocks - * @deprecated 1.0.0 - * - * @return string - */ - function amnesty_render_download_block__deprecated() { - $file_id = amnesty_get_meta_field( 'download_id' ) ?: false; - - if ( ! $file_id ) { - return ''; - } - - $button_text = amnesty_get_meta_field( 'download_text' ) ?: /* translators: [front] Download block https://wordpresstheme.amnesty.org/blocks/015-download-resource/ */ __( 'Download', 'amnesty' ); - $file_url = wp_get_attachment_url( $file_id ); - $file_name = explode( '/', $file_url ); - $file_name = array_pop( $file_name ); - - spaceless(); - ?> - <div> - <a class="btn btn--dark btn--download" href="<?php echo esc_url( $file_url ); ?>" target="_blank" download="<?php echo esc_attr( $file_name ); ?>" role="button"><?php echo esc_html( $button_text ); ?></a> - </div> - <?php - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/download/views/multiple.php b/wp-content/themes/humanity-theme/includes/blocks/download/views/multiple.php deleted file mode 100644 index 51d79756..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/download/views/multiple.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -$first_url = $files[0]['link'] ?? wp_get_attachment_url( $files[0]['id'] ); -$first_name = basename( $files[0]['link'] ?? wp_get_attachment_url( $files[0]['id'] ) ); -$options = []; - -foreach ( $files as $file ) { - $key = $file['link'] ?? wp_get_attachment_url( $file['id'] ); - - $options[ $key ] = $file['title']; -} - -?> -<div class="<?php echo esc_attr( classnames( 'download-block is-multiple', $align, $attrs['className'] ?? null ) ); ?>"> - <?php - - amnesty_render_custom_select( - [ - 'label' => wp_trim_words( $files[0]['title'], 8 ), - 'is_control' => true, - 'options' => $options, - ] - ); - - ?> - <a class="btn btn--download <?php echo esc_attr( $colour ); ?>" role="button" href="<?php echo esc_url( $first_url ); ?>" download="<?php echo esc_attr( $first_name ); ?>"><?php echo esc_html( $text ); ?></a> -</div> diff --git a/wp-content/themes/humanity-theme/includes/blocks/download/views/simple.php b/wp-content/themes/humanity-theme/includes/blocks/download/views/simple.php deleted file mode 100644 index d95bd080..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/download/views/simple.php +++ /dev/null @@ -1,13 +0,0 @@ -<div class="download-block <?php echo esc_attr( $align ); ?>"> -<?php - -printf( - '<a class="btn btn--download %s" href="%s" download="%s" target="_blank" role="button">%s</a>', - esc_attr( $colour ), - esc_url( $url ), - esc_attr( $name ), - esc_html( $text ) -); - -?> -</div> diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-flourish/register.php b/wp-content/themes/humanity-theme/includes/blocks/embed-flourish/register.php deleted file mode 100644 index 591a39ac..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-flourish/register.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_flourish_embed_block' ) ) { - /** - * Register the Flourish Embed block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_flourish_embed_block(): void { - register_block_type( - 'amnesty-core/embed-flourish', - [ - 'render_callback' => 'amnesty_render_flourish_embed', - 'attributes' => [ - 'source' => [ - 'type' => 'string', - 'default' => '', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-flourish/render.php b/wp-content/themes/humanity-theme/includes/blocks/embed-flourish/render.php deleted file mode 100644 index eb6490da..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-flourish/render.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_flourish_embed' ) ) { - /** - * Render the Flourish embed block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function amnesty_render_flourish_embed( array $attributes ): string { - if ( empty( $attributes['source'] ) ) { - return ''; - } - - wp_enqueue_script( 'flourish-embed' ); - - return sprintf( '<div class="flourish-embed" data-src="%s"></div>', esc_attr( $attributes['source'] ) ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-infogram/register.php b/wp-content/themes/humanity-theme/includes/blocks/embed-infogram/register.php deleted file mode 100644 index 080382df..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-infogram/register.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_infogram_embed_block' ) ) { - /** - * Register the Infogram Embed block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_infogram_embed_block(): void { - register_block_type( - 'amnesty-core/embed-infogram', - [ - 'render_callback' => 'amnesty_render_infogram_embed', - 'attributes' => [ - 'identifier' => [ - 'type' => 'string', - 'default' => '', - ], - 'type' => [ - 'type' => 'string', - 'default' => 'interactive', - ], - 'title' => [ - 'type' => 'string', - 'default' => '', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-infogram/render.php b/wp-content/themes/humanity-theme/includes/blocks/embed-infogram/render.php deleted file mode 100644 index 12e64116..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-infogram/render.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_infogram_embed' ) ) { - /** - * Render the Infogram embed block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function amnesty_render_infogram_embed( array $attributes ): string { - if ( empty( $attributes['identifier'] ) ) { - return ''; - } - - $markup = sprintf( - '<div class="infogram-embed" data-id="%1$s" data-type="%2$s" data-title="%3$s"></div>', - esc_attr( $attributes['identifier'] ), - esc_attr( $attributes['type'] ), - esc_attr( $attributes['title'] ) - ); - - $script = "<script>(function(w,i){w[i]&&w[i].initialized&&w[i].process&&w[i].process()}(window,'InfogramEmbeds'))</script>"; - - return $markup . $script; - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-sutori/register.php b/wp-content/themes/humanity-theme/includes/blocks/embed-sutori/register.php deleted file mode 100644 index ea2d38b9..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-sutori/register.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_sutori_embed_block' ) ) { - /** - * Register the Sutori Embed block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_sutori_embed_block(): void { - register_block_type( - 'amnesty-core/embed-sutori', - [ - 'render_callback' => 'amnesty_render_sutori_embed', - 'attributes' => [ - 'source' => [ - 'type' => 'string', - 'default' => '', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-sutori/render.php b/wp-content/themes/humanity-theme/includes/blocks/embed-sutori/render.php deleted file mode 100644 index 2b04235d..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-sutori/render.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_sutori_embed' ) ) { - /** - * Render the Sutori Embed block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function amnesty_render_sutori_embed( array $attributes ): string { - if ( empty( $attributes['source'] ) ) { - return ''; - } - - $classname = $attributes['className'] ?? 'sutori-embed'; - - spaceless(); - - ?> - - <a class="sutori-toggle aligncenter" href="#" data-toggle="<?php echo esc_attr( sprintf( '.%s iframe', $classname ) ); ?>" data-toggle-with="is-open"> - <?php /* translators: [front] no context avalible */ echo esc_html_x( 'Click to show/hide timeline', 'Toggle visibility of Sutori Timeline', 'amnesty' ); ?> - </a> - <div class="<?php echo esc_attr( $classname ); ?>"> - <script src="https://assets.sutori.com/frontend-assets/assets/iframeResizer.js"></script> - <iframe src="<?php echo esc_url( $attributes['source'] ); ?>" width="100%" height="600" frameborder="0"></iframe> - <script src="https://assets.sutori.com/frontend-assets/assets/iframeResizer.executer.js"></script> - </div> - - <?php - - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-tickcounter/register.php b/wp-content/themes/humanity-theme/includes/blocks/embed-tickcounter/register.php deleted file mode 100644 index cc184426..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-tickcounter/register.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_tickcounter_embed_block' ) ) { - /** - * Register the Tickcounter Embed block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_tickcounter_embed_block(): void { - register_block_type( - 'amnesty-core/embed-tickcounter', - [ - 'render_callback' => 'amnesty_render_tickcounter_embed', - 'attributes' => [ - 'alignment' => [ - 'type' => 'string', - 'default' => 'center', - ], - 'source' => [ - 'type' => 'string', - 'default' => '', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/embed-tickcounter/render.php b/wp-content/themes/humanity-theme/includes/blocks/embed-tickcounter/render.php deleted file mode 100644 index 94d8a961..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/embed-tickcounter/render.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_allow_position_inline_style' ) ) { - /** - * Add "position" to the list of allowed CSS properties for inline styles - * - * @package Amnesty\Blocks - * - * @param array<int,string> $safe the existing list of allowed properties - * - * @return array<int,string> - */ - function amnesty_allow_position_inline_style( array $safe ): array { - return array_merge( $safe, [ 'position' ] ); - } -} - -if ( ! function_exists( 'amnesty_render_tickcounter_embed' ) ) { - /** - * Render the Tickcounter embed block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function amnesty_render_tickcounter_embed( array $attributes ): string { - if ( empty( $attributes['source'] ) ) { - return ''; - } - - wp_enqueue_script( 'tickcounter-sdk' ); - - add_filter( 'safe_style_css', 'amnesty_allow_position_inline_style' ); - $output = sprintf( '<div class="align%s">%s</div>', esc_attr( $attributes['alignment'] ), wp_kses_post( $attributes['source'] ) ); - remove_filter( 'safe_style_css', 'amnesty_allow_position_inline_style' ); - - return $output; - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/hero/register.php b/wp-content/themes/humanity-theme/includes/blocks/hero/register.php deleted file mode 100644 index 84bec236..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/hero/register.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php - -if ( ! function_exists( 'register_hero_block' ) ) { - /** - * Register the Hero block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_hero_block(): void { - register_block_type( - 'amnesty-core/hero', - [ - 'render_callback' => 'render_hero_block', - 'attributes' => [ - 'align' => [ - 'type' => 'string', - 'default' => '', - ], - 'background' => [ - 'type' => 'string', - 'default' => '', - ], - 'content' => [ - 'type' => 'string', - 'default' => '', - ], - 'ctaLink' => [ - 'type' => 'string', - 'default' => '', - ], - 'ctaText' => [ - 'type' => 'string', - 'default' => '', - ], - 'featuredVideoId' => [ - 'type' => 'integer', - 'default' => 0, - ], - 'hideImageCaption' => [ - 'type' => 'boolean', - 'default' => true, - ], - 'hideImageCredit' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'imageID' => [ - 'type' => 'integer', - 'default' => 0, - ], - 'title' => [ - 'type' => 'string', - 'default' => '', - ], - 'type' => [ - 'type' => 'string', - 'default' => 'image', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/hero/render.php b/wp-content/themes/humanity-theme/includes/blocks/hero/render.php deleted file mode 100644 index d79f50fd..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/hero/render.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -use Amnesty\Get_Image_Data; - -if ( ! function_exists( 'render_hero_block' ) ) { - /** - * Render a hero block - * - * @param array $attributes the block attributes - * @param string $content the block inner content - * - * @package Amnesty\Blocks - * - * @return string - * - * phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- used in view - */ - function render_hero_block( array $attributes = [], string $content = '' ): string { - // phpcs:enable Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed - $attrs = wp_parse_args( - $attributes, - [ - 'align' => '', - 'background' => '', - 'className' => 'wp-block-amnesty-core-hero', - 'content' => '', - 'ctaLink' => '', - 'ctaText' => '', - 'featuredImageId' => 0, - 'featuredVideoId' => 0, - 'hideImageCaption' => true, - 'hideImageCredit' => false, - 'imageID' => 0, // this overrides the featured image - 'title' => '', - 'type' => 'image', - ] - ); - - // precedence: override -> featured image attribute -> featured image meta - $image_id = $attrs['imageID'] ?: $attrs['featuredImageId'] ?: get_post_thumbnail_id(); - - $image = new Get_Image_Data( (int) $image_id ); - $video = new Get_Image_Data( (int) $attrs['featuredVideoId'] ); - - $video_output = ''; - // If the block has a featured video, get the video URL - if ( $attrs['featuredVideoId'] && 'video' === $attrs['type'] ) { - // $video_output used in hero.php view - $video_output .= sprintf( - '<div class="hero-videoContainer"> - <video class="hero-video" autoplay loop muted> - <source src="%s"> - </video> - </div>', - esc_url( wp_get_attachment_url( $attrs['featuredVideoId'] ) ), - ); - } - - // Build output for the image/video caption and credit - // $media_meta_output used in hero.php view - // Reverse the boolean value of the arguments to match the value of the arguments in the function - $media_meta_output = $image->metadata( ! $attrs['hideImageCaption'], ! $attrs['hideImageCredit'], 'image' ); - $media_meta_output .= $video->metadata( ! $attrs['hideImageCaption'], ! $attrs['hideImageCredit'], 'video' ); - - spaceless(); - require realpath( __DIR__ . '/views/hero.php' ); - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/hero/views/hero.php b/wp-content/themes/humanity-theme/includes/blocks/hero/views/hero.php deleted file mode 100644 index fabfda1e..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/hero/views/hero.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -$classname = []; - -if ( $attrs['align'] ) { - $classname[] = 'is-aligned-' . $attrs['align']; -} - -$classname[] = 'has-' . ( $attrs['background'] ?: 'dark' ) . '-background'; - -if ( 'video' === $attrs['type'] ) { - $classname[] = 'has-video'; -} - -if ( $content ) { - $classname[] = 'has-inner-blocks'; -} - -$classname = classnames( $attrs['className'], $classname ); - -$background_image = wp_get_attachment_image_url( $image_id, 'hero-md' ); - -?> - -<section class="<?php echo esc_attr( $classname ); ?>" style="aiic:ignore;background-image:url('<?php echo esc_url( $background_image ); ?>')"> - <?php echo wp_kses_post( $video_output ); ?> - <div class="container"> - <div class="hero-contentWrapper"> - <?php if ( $attrs['title'] ) : ?> - <h1 class="hero-title"> - <span><?php echo wp_kses_post( $attrs['title'] ); ?></span> - </h1> - <?php endif; ?> - <?php if ( $attrs['content'] ) : ?> - <p class="hero-content"><?php echo wp_kses_post( $attrs['content'] ); ?></p> - <?php endif; ?> - <?php if ( $attrs['ctaText'] || $attrs['ctaLink'] ) : ?> - <div class="hero-cta"> - <div class="btn btn--large"> - <a href="<?php echo esc_url( $attrs['ctaLink'] ); ?>"><?php echo wp_kses_post( $attrs['ctaText'] ); ?></a> - </div> - </div> - <?php endif; ?> - </div> - <?php echo wp_kses_post( $content ); ?> - </div> - <?php echo wp_kses_post( $media_meta_output ); ?> -</section> diff --git a/wp-content/themes/humanity-theme/includes/blocks/iframe-button/register.php b/wp-content/themes/humanity-theme/includes/blocks/iframe-button/register.php deleted file mode 100644 index ecc48c5f..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/iframe-button/register.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_iframe_button_block' ) ) { - /** - * Register the Iframe Button block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_iframe_button_block(): void { - register_block_type( - 'amnesty-core/iframe-button', - [ - 'render_callback' => 'render_iframe_button_block', - 'attributes' => [ - 'iframeUrl' => [ - 'type' => 'string', - ], - 'iframeHeight' => [ - 'type' => 'number', - 'default' => 760, - ], - 'buttonText' => [ - 'type' => 'string', - /* translators: [front] */ - 'default' => __( 'Act Now', 'amnesty' ), - ], - 'alignment' => [ - 'type' => 'string', - 'default' => 'none', - ], - 'title' => [ - 'type' => 'string', - 'default' => '', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/iframe-button/render.php b/wp-content/themes/humanity-theme/includes/blocks/iframe-button/render.php deleted file mode 100644 index 9f5cb162..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/iframe-button/render.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_iframe_button_block' ) ) { - /** - * Render the Iframe Button block - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * - * @return string - */ - function render_iframe_button_block( array $attributes = [] ): string { - $attributes = wp_parse_args( - $attributes, - [ - 'alignment' => 'none', - /* translators: [front] AM I think this is used on the petition index or petition block */ - 'buttonText' => __( 'Act Now', 'amnesty' ), - 'className' => '', - 'iframeHeight' => 760, - 'iframeUrl' => '', - 'title' => '', - ] - ); - - if ( ! esc_url( $attributes['iframeUrl'] ) ) { - return ''; - } - - $alignment = ''; - - if ( 'none' !== $attributes['alignment'] ) { - $alignment = sprintf( 'is-%s-aligned', $attributes['alignment'] ); - } - - $markup = sprintf( '<div class="iframeButton-wrapper %s">', esc_attr( $alignment ) ); - $markup .= sprintf( '<button class="iframeButton btn %s">%s</button>', esc_attr( $attributes['className'] ), esc_html( $attributes['buttonText'] ) ); - $markup .= sprintf( - '<iframe frameborder="0" src="%s" title="%s" height="%d"></iframe>', - esc_url( $attributes['iframeUrl'] ), - esc_attr( $attributes['title'] ), - esc_attr( $attributes['iframeHeight'] ), - ); - $markup .= '</div>'; - - return $markup; - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/iframe/register.php b/wp-content/themes/humanity-theme/includes/blocks/iframe/register.php deleted file mode 100644 index f0d138ea..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/iframe/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_iframe_block' ) ) { - /** - * Register the Iframe block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_iframe_block(): void { - register_block_type( - 'amnesty-core/block-responsive-iframe', - [ - 'render_callback' => 'amnesty_render_iframe_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/iframe/render.php b/wp-content/themes/humanity-theme/includes/blocks/iframe/render.php deleted file mode 100644 index 92313697..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/iframe/render.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_iframe_block' ) ) { - /** - * Render a responsive iframe - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * - * @return string - */ - function amnesty_render_iframe_block( array $attributes = [] ): string { - $atts = wp_parse_args( - $attributes, - [ - 'embedUrl' => false, - 'width' => false, - 'height' => false, - 'minHeight' => false, - 'alignment' => false, - 'title' => '', - ] - ); - - $embed_url = $atts['embedUrl']; - - if ( ! $embed_url ) { - return ''; - } - - $width = $atts['width']; - $height = $atts['height']; - $min_height = $atts['minHeight']; - - $style = ''; - - if ( $width && $height ) { - $ratio = $height / $width * 100; - $ratio = "{$ratio}%"; - $style .= sprintf( 'padding-top: %s;', $ratio ); - } - - if ( ! $width && ! $height && ! $min_height ) { - $min_height = 350; - } - - if ( $min_height ) { - $style .= sprintf( 'min-height: %dpx;', $min_height ); - } - - spaceless(); - require realpath( __DIR__ . '/views/responsive-iframe.php' ); - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/iframe/views/responsive-iframe.php b/wp-content/themes/humanity-theme/includes/blocks/iframe/views/responsive-iframe.php deleted file mode 100644 index 93711207..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/iframe/views/responsive-iframe.php +++ /dev/null @@ -1,11 +0,0 @@ -<figure class="responsive-iframe wp-block-embed <?php echo esc_attr( $atts['alignment'] ); ?>" <?php $width && printf( 'style="%s"', esc_attr( sprintf( 'max-width:%spx', $width ) ) ); ?>> - <div class="fluid-iframe" <?php $style && printf( 'style="%s"', esc_attr( $style ) ); ?>> - <iframe src="<?php echo esc_url( $embed_url ); ?>" title="<?php echo esc_attr( $atts['title'] ); ?>" frameborder="0"></iframe> - </div> - -<?php if ( ! empty( $atts['caption'] ) ) : ?> - <figcaption> - <p><?php echo esc_html( $atts['caption'] ); ?></p> - </figcaption> -<?php endif; ?> -</figure> diff --git a/wp-content/themes/humanity-theme/includes/blocks/image/register.php b/wp-content/themes/humanity-theme/includes/blocks/image/register.php deleted file mode 100644 index 6ef9f21a..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/image/register.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_image_block' ) ) { - /** - * Register the Image block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_image_block(): void { - register_block_type( - 'amnesty-core/image-block', - [ - 'render_callback' => 'render_image_block', - 'attributes' => [ - 'type' => [ - 'type' => 'string', - ], - 'style' => [ - 'type' => 'string', - ], - 'align' => [ - 'type' => 'string', - ], - 'hasOverlay' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'parallax' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'identifier' => [ - 'type' => 'string', - 'source' => 'attribute', - 'selector' => '.imageBlock', - 'attribute' => 'class', - ], - 'imageID' => [ - 'type' => 'integer', - ], - 'imageURL' => [ - 'type' => 'string', - ], - 'videoID' => [ - 'type' => 'integer', - ], - 'videoURL' => [ - 'type' => 'string', - ], - 'title' => [ - 'type' => 'string', - ], - 'content' => [ - 'type' => 'string', - ], - 'buttons' => [ - 'type' => 'array', - 'default' => [], - ], - 'caption' => [ - 'type' => 'string', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/image/render.php b/wp-content/themes/humanity-theme/includes/blocks/image/render.php deleted file mode 100644 index fab4d718..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/image/render.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_image_block' ) ) { - /** - * Render the Amnesty Image Block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function render_image_block( array $attributes = [] ): string { - $attributes = wp_parse_args( - $attributes, - [ - 'align' => 'default', - 'buttons' => [], - 'caption' => '', - 'content' => '', - 'hasOverlay' => false, - 'identifier' => amnesty_rand_str( 4 ), - 'imageID' => 0, - 'imageURL' => '', - 'parallax' => false, - 'style' => 'loose', - 'title' => '', - 'type' => '', - 'videoID' => 0, - 'videoURL' => '', - ] - ); - - // used in views - $block_classes = classnames( - 'imageBlock', - [ - sprintf( 'imageBlock-%s', esc_attr( $attributes['identifier'] ) ) => (bool) $attributes['parallax'], - 'imageBlock--fixed' => 'fixed' === $attributes['style'], - 'has-video' => 'video' === $attributes['type'], - 'has-parallax' => (bool) $attributes['parallax'], - ] - ); - - // used in views - $caption_classes = classnames( - 'imageBlock-caption', - [ - sprintf( 'align%s', $attributes['align'] ) => 'default' !== $attributes['align'], - ] - ); - - if ( $attributes['parallax'] ) { - spaceless(); - require realpath( __DIR__ . '/views/parallax.php' ); - return endspaceless( false ); - } - - // the srcset declaration, for the fixed height style, causes much larger images to load than is necessary - $remove_srcset = function ( array $props ) use ( $attributes ): array { - if ( 'fixed' !== $attributes['style'] ) { - return $props; - } - - unset( $props['srcset'], $props['sizes'] ); - return $props; - }; - - add_filter( 'wp_get_attachment_image_attributes', $remove_srcset ); - spaceless(); - require realpath( __DIR__ . '/views/block.php' ); - $block = endspaceless( false ); - remove_filter( 'wp_get_attachment_image_attributes', $remove_srcset ); - - if ( 'default' === $attributes['align'] ) { - return $block; - } - - $wrapper_classes = classnames( - 'imageBlock-wrapper', - 'u-cf', - [ - sprintf( 'align%s', $attributes['align'] ) => 'default' !== $attributes['align'], - ] - ); - - return sprintf( '<div class="%s">%s</div>', esc_attr( $wrapper_classes ), $block ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/image/views/block.php b/wp-content/themes/humanity-theme/includes/blocks/image/views/block.php deleted file mode 100644 index 4893dfbb..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/image/views/block.php +++ /dev/null @@ -1,26 +0,0 @@ -<div class="<?php echo esc_attr( $block_classes ); ?>"> -<?php if ( ! $attributes['type'] ) : ?> - <?php echo wp_get_attachment_image( absint( $attributes['imageID'] ), 'fixed' === $attributes['style'] ? 'image-block' : 'full' ); ?> -<?php endif; ?> -<?php if ( 'video' === $attributes['type'] ) : ?> - <video class="imageBlock-video" autoPlay loop muted> - <source src="<?php echo esc_url( $attributes['videoURL'] ); ?>"> - </video> -<?php endif; ?> -<?php if ( $attributes['hasOverlay'] ) : ?> - <div class="imageBlock-overlay"> - <div class="imageBlock-title"><?php echo esc_html( $attributes['title'] ); ?></div> - <div class="imageBlock-content"> - <p><?php echo esc_html( $attributes['content'] ); ?></p> - </div> - <div class="imageBlock-buttonWrapper"> - <?php foreach ( $attributes['buttons'] as $button ) : ?> - <a class="btn btn--white" href="<?php echo esc_url( $button['url'] ); ?>"><?php echo esc_html( $button['text'] ); ?></a> - <?php endforeach; ?> - </div> - </div> -<?php endif; ?> -</div> -<?php if ( $attributes['caption'] ) : ?> - <div class="<?php echo esc_attr( $caption_classes ); ?>"><?php echo esc_html( $attributes['caption'] ); ?></div> -<?php endif; ?> diff --git a/wp-content/themes/humanity-theme/includes/blocks/image/views/parallax.php b/wp-content/themes/humanity-theme/includes/blocks/image/views/parallax.php deleted file mode 100644 index d034a10c..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/image/views/parallax.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php $image_url = wp_get_attachment_image_url( absint( $attributes['imageID'] ), 'hero-lg' ); ?> -<div class="<?php echo esc_attr( $block_classes ); ?>"> -<style>.imageBlock-<?php echo esc_attr( $attributes['identifier'] ); ?> .imageBlock-overlay{background-image:url('<?php echo esc_url( $image_url ); ?>')}</style> -<?php if ( $attributes['hasOverlay'] ) : ?> -<div class="imageBlock-overlay"> - <div class="imageBlock-title"><?php echo esc_html( $attributes['title'] ); ?></div> - <div class="imageBlock-content"> - <p><?php echo esc_html( $attributes['content'] ); ?></p> - </div> - <div class="imageBlock-buttonWrapper"> - <?php foreach ( $attributes['buttons'] as $button ) : ?> - <a class="btn btn--white" href="<?php echo esc_url( $button['url'] ); ?>"><?php echo esc_html( $button['text'] ); ?></a> - <?php endforeach; ?> - </div> -</div> -<?php else : ?> - <div class="imageBlock-overlay"></div> -<?php endif; ?> -</div> -<?php if ( $attributes['caption'] ) : ?> - <div class="<?php echo esc_attr( $caption_classes ); ?>"><?php echo esc_html( $attributes['caption'] ); ?></div> -<?php endif; ?> diff --git a/wp-content/themes/humanity-theme/includes/blocks/link-group/register.php b/wp-content/themes/humanity-theme/includes/blocks/link-group/register.php deleted file mode 100644 index 231914a6..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/link-group/register.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_link_group_block' ) ) { - /** - * Register the Amnesty Link Group block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_link_group_block(): void { - register_block_type( - 'amnesty-core/link-group', - [ - 'render_callback' => 'render_link_group_block', - 'attributes' => [ - 'align' => [ - 'type' => 'string', - 'default' => '', - ], - 'title' => [ - 'type' => 'string', - 'default' => '', - ], - 'items' => [ - 'type' => 'array', - 'default' => [], - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/link-group/render.php b/wp-content/themes/humanity-theme/includes/blocks/link-group/render.php deleted file mode 100644 index 9bf58560..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/link-group/render.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_link_group_block' ) ) { - /** - * Render the Amnesty Link Group block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * - * @return string - */ - function render_link_group_block( array $attributes = [] ): string { - $attributes = wp_parse_args( - $attributes, - [ - 'className' => 'wp-block-amnesty-core-link-group', - 'align' => '', - 'title' => '', - 'items' => [], - ] - ); - - $icon = '<svg viewBox="0 0 32 32"><path d="M8 20c0 0 1.838-6 12-6v6l12-8-12-8v6c-8 0-12 4.99-12 10zM22 24h-18v-12h3.934c0.315-0.372 0.654-0.729 1.015-1.068 1.374-1.287 3.018-2.27 4.879-2.932h-13.827v20h26v-8.395l-4 2.667v1.728z" /></svg>'; - - ob_start(); - - require realpath( __DIR__ . '/views/link-group.php' ); - - return ob_get_clean(); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/link-group/views/link-group.php b/wp-content/themes/humanity-theme/includes/blocks/link-group/views/link-group.php deleted file mode 100644 index c1f6edf8..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/link-group/views/link-group.php +++ /dev/null @@ -1,28 +0,0 @@ -<aside class="<?php echo esc_attr( $attributes['className'] ?? '' ); ?>"> -<?php if ( $attributes['title'] ) : ?> - <h2><?php echo esc_html( $attributes['title'] ); ?></h2> -<?php endif; ?> -<ul> -<?php foreach ( $attributes['items'] as $item ) : ?> - <?php - - if ( ! $item['link'] || ! $item['text'] ) { - continue; - } - - ?> - <?php if ( ! $item['blank'] ) : ?> - <li> - <a href="<?php echo esc_url( $item['link'] ); ?>"><?php echo esc_html( $item['text'] ); ?></a> - </li> - <?php else : ?> - <li> - <a class="is-external" href="<?php echo esc_url( $item['link'] ); ?>" rel="noopener noreferrer" target="_blank"> - <?php echo $icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> - <?php echo esc_html( $item['text'] ); ?> - </a> - </li> - <?php endif; ?> -<?php endforeach; ?> -</ul> -</aside> diff --git a/wp-content/themes/humanity-theme/includes/blocks/links-with-icons/register.php b/wp-content/themes/humanity-theme/includes/blocks/links-with-icons/register.php deleted file mode 100644 index 23c77688..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/links-with-icons/register.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_links_with_icons_block' ) ) { - /** - * Register the links with icons block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_links_with_icons_block(): void { - register_block_type( - 'amnesty-core/repeatable-block', - [ - 'render_callback' => 'render_links_with_icons_block', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [ - 'quantity' => [ - 'type' => 'number', - 'default' => 2, - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/links-with-icons/render.php b/wp-content/themes/humanity-theme/includes/blocks/links-with-icons/render.php deleted file mode 100644 index bd892a6d..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/links-with-icons/render.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_links_with_icons_block' ) ) { - /** - * Render a links with icons block - * - * @package Amnesty\Blocks - * - * @param array $attrs the block attributes - * @param string $content the block content - * - * @return string - */ - function render_links_with_icons_block( array $attrs = [], string $content = '' ): string { - if ( false !== strpos( $content, 'linksWithIcons-group' ) ) { - return $content; - } - - $attrs = wp_parse_args( - $attrs, - [ - 'backgroundColor' => '', - 'className' => '', - 'dividerIcon' => 'none', - 'hideLines' => false, - 'orientation' => 'horizontal', - 'quantity' => 2, - ], - ); - - $classes = classnames( - 'linksWithIcons-group', - sprintf( 'is-%s', $attrs['orientation'] ), - sprintf( 'has-%s-items', $attrs['quantity'] ), - $attrs['className'], - [ - 'has-background' => $attrs['backgroundColor'], - 'has-no-lines' => $attrs['hideLines'], - ], - [ - sprintf( 'has-%s-background-color', $attrs['backgroundColor'] ) => $attrs['backgroundColor'], - sprintf( 'icon-%s', $attrs['dividerIcon'] ) => $attrs['dividerIcon'], - ] - ); - - return sprintf( - '<div class="%s">%s</div>', - esc_attr( $classes ), - wp_kses_post( $content ) - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/menu/register.php b/wp-content/themes/humanity-theme/includes/blocks/menu/register.php deleted file mode 100644 index b3f605f3..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/menu/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_menu_block' ) ) { - /** - * Register the Menu block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_menu_block(): void { - register_block_type( - 'amnesty-core/block-menu', - [ - 'render_callback' => 'amnesty_render_menu_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/menu/render.php b/wp-content/themes/humanity-theme/includes/blocks/menu/render.php deleted file mode 100644 index 8f02a3fe..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/menu/render.php +++ /dev/null @@ -1,193 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_menu_block_wp_nav' ) ) { - /** - * Render a wp_nav_menu within a Menu block - * - * @package Amnesty\Blocks - * - * @param array $atts the block attributes - * - * @return string - */ - function amnesty_render_menu_block_wp_nav( array $atts = [] ) { - $menu = wp_get_nav_menu_object( absint( $atts['menuId'] ) ); - - spaceless(); - - ?> - - <section class="postlist-categoriesContainer <?php empty( $atts['color'] ) || printf( 'section--%s', esc_attr( $atts['color'] ) ); ?>" data-slider> - <nav> - <ul class="postlist-categories<?php $menu->count > 4 && print ' use-flickity'; ?>" aria-label="<?php /* translators: [front] ARIA https://isaidotorgstg.wpengine.com/en/latest/ */ esc_attr_e( 'Category List', 'amnesty' ); ?>"> - <?php - - wp_nav_menu( - [ - 'menu' => $atts['menuId'], - 'container' => false, - 'container_class' => 'menu-{menu slug}-container', - 'container_id' => '', - 'menu_class' => 'menu', - 'menu_id' => 'category_style_menu', - 'echo' => true, - 'before' => '', - 'after' => '', - 'link_before' => '', - 'link_after' => '', - 'items_wrap' => '%3$s', - 'depth' => 1, - ] - ); - - ?> - </ul> - </nav> - <button data-slider-prev disabled>Previous</button> - <button data-slider-next>Next</button> - </section> - - <?php - - return endspaceless( false ); - } -} - -if ( ! function_exists( 'amnesty_render_menu_block_in_page' ) ) { - /** - * Render an "in-page" menu block, generated from - * section blocks that have non-empty id attributes - * - * @package Amnesty\Blocks - * - * @param array $atts the block attributes - * - * @return string - */ - function amnesty_render_menu_block_in_page( array $atts = [] ) { - $blocks = parse_blocks( get_post_field( 'post_content' ) ); - $sections = array_filter( - $blocks, - // phpcs:ignore Universal.FunctionDeclarations.NoLongClosures.ExceedsRecommended - function ( $block ) { - if ( 'amnesty-core/block-section' !== $block['blockName'] ) { - return false; - } - - if ( empty( $block['attrs']['sectionId'] ) || empty( $block['attrs']['sectionName'] ) ) { - return false; - } - - return true; - } - ); - - if ( empty( $sections ) ) { - return ''; - } - - spaceless(); - - ?> - - <section class="postlist-categoriesContainer <?php empty( $atts['color'] ) || printf( 'section--%s', esc_attr( $atts['color'] ) ); ?>" data-slider> - <nav> - <ul class="postlist-categories<?php count( $sections ) > 4 && print ' use-flickity'; ?>" aria-label="<?php /* translators: [front] ARIA https://isaidotorgstg.wpengine.com/en/latest/ */ esc_attr_e( 'List of page sections', 'amnesty' ); ?>"> - <?php - - foreach ( $sections as $section ) { - printf( '<li><a class="btn btn--white" href="#%s">%s</a></li>', esc_attr( $section['attrs']['sectionId'] ), esc_html( $section['attrs']['sectionName'] ) ); - } - - ?> - </ul> - </nav> - <button data-slider-prev disabled>Previous</button> - <button data-slider-next>Next</button> - </section> - - <?php - - return endspaceless( false ); - } -} - -if ( ! function_exists( 'amnesty_render_menu_block_custom' ) ) { - /** - * Render an "in-page" menu block, generated from - * manual attribute specification - * - * @package Amnesty\Blocks - * - * @param array $atts the block attributes - * - * @return string - */ - function amnesty_render_menu_block_custom( array $atts = [] ) { - spaceless(); - - ?> - - <section class="postlist-categoriesContainer <?php empty( $atts['color'] ) || printf( 'section--%s', esc_attr( $atts['color'] ) ); ?>" data-slider> - <nav> - <ul class="postlist-categories<?php count( $atts['items'] ) > 4 && print ' use-flickity'; ?>" aria-label="<?php /* translators: [front] ARIA https://isaidotorgstg.wpengine.com/en/latest/ */ esc_attr_e( 'List of page sections', 'amnesty' ); ?>"> - <?php - - foreach ( $atts['items'] as $item ) { - printf( '<li><a class="btn btn--white" href="#%s">%s</a></li>', esc_attr( $item['id'] ), esc_html( $item['label'] ) ); - } - - ?> - </ul> - </nav> - <button data-slider-prev disabled>Previous</button> - <button data-slider-next>Next</button> - </section> - - <?php - - return endspaceless( false ); - } -} - -if ( ! function_exists( 'amnesty_render_menu_block' ) ) { - /** - * Render a menu block - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * - * @return string - */ - function amnesty_render_menu_block( $attributes = [] ) { - $atts = wp_parse_args( - $attributes, - [ - 'menuId' => false, - 'color' => '', - 'type' => 'standard-menu', - ] - ); - - if ( 'standard-menu' === $atts['type'] ) { - if ( ! $atts['menuId'] ) { - return ''; - } - - return amnesty_render_menu_block_wp_nav( $atts ); - } - - if ( 'inpage-menu' === $atts['type'] ) { - return amnesty_render_menu_block_in_page( $atts ); - } - - if ( 'custom-menu' === $atts['type'] && ! empty( $atts['items'] ) ) { - return amnesty_render_menu_block_custom( $atts ); - } - - return ''; - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/meta.php b/wp-content/themes/humanity-theme/includes/blocks/meta.php index 45013498..0dfc205a 100644 --- a/wp-content/themes/humanity-theme/includes/blocks/meta.php +++ b/wp-content/themes/humanity-theme/includes/blocks/meta.php @@ -35,7 +35,7 @@ function amnesty_core_register_meta() { register_meta( 'post', '_hero_show', $args ); register_meta( 'post', '_hero_type', $args ); register_meta( 'post', '_hero_embed', $args ); - register_meta( 'post', '_hero_video_id', $integer ); + register_meta( 'post', '_hero_video_id', $string ); register_meta( 'post', '_hero_hide_image_caption', $bool_true ); register_meta( 'post', '_hero_hide_image_copyright', $bool_false ); diff --git a/wp-content/themes/humanity-theme/includes/blocks/petition-list/register.php b/wp-content/themes/humanity-theme/includes/blocks/petition-list/register.php deleted file mode 100644 index 87c791c6..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/petition-list/register.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_petition_list_block' ) ) { - /** - * Register the Petition List block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_petition_list_block(): void { - $all_types = amnesty_get_post_types(); - - // note: this is always "petition", regardless of what is set in permalinks - if ( ! isset( $all_types['petition'] ) ) { - return; - } - - $default_petition = new stdClass(); - $default_petition->name = $all_types['petition']; - $default_petition->rest_base = $all_types['petition']; - - register_block_type( - 'amnesty-core/petition-list', - [ - 'render_callback' => 'amnesty_render_petition_list_block', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [ - 'style' => [ - 'default' => 'petition', - 'type' => 'string', - ], - 'displayAuthor' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'displayPostDate' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'postTypes' => [ - 'type' => 'object', - 'default' => $default_petition, - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/petition-list/render.php b/wp-content/themes/humanity-theme/includes/blocks/petition-list/render.php deleted file mode 100644 index 63ce182f..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/petition-list/render.php +++ /dev/null @@ -1,281 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_petition_list_process_content' ) ) { - /** - * Process the current attributes by calling the specific function dependant on block type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current block attributes. - * - * @return array|bool - */ - function amnesty_petition_list_process_content( $attributes ) { - if ( empty( $attributes['type'] ) ) { - return amnesty_list_process_category( $attributes ); - } - - switch ( $attributes['type'] ) { - case 'custom': - return amnesty_list_process_custom( $attributes ); - case 'category': - return amnesty_list_process_category( $attributes ); - case 'select': - return amnesty_petition_list_process_select( $attributes ); - case 'feed': - return amnesty_petition_list_process_feed( $attributes ); - case 'template': - if ( empty( $attributes['query'] ) ) { - return ''; - } - return amnesty_petition_list_process_query( $attributes['query'], false ); - default: - return amnesty_list_process_category( $attributes ); - } - } -} - -if ( ! function_exists( 'amnesty_render_petition_item' ) ) { - /** - * Render the current block item as a grid item. - * - * @package Amnesty\Blocks - * - * @param array $data - Item data. - * - * @return void - */ - function amnesty_render_petition_item( $data ) { - $title = isset( $data['title'] ) ? $data['title'] : ''; - - /* translators: [front] https://isaidotorgstg.wpengine.com/en/latest/petition/nigeria-end-impunity-for-police-brutality-end-sars/ */ - $button_text = __( 'Act Now', 'amnesty' ); - if ( ! empty( $data['has_signed'] ) ) { - /* translators: [front] https://isaidotorgstg.wpengine.com/en/latest/petition/nigeria-end-impunity-for-police-brutality-end-sars/ used by sections, when a form rather than an Iframe is used */ - $button_text = _x( 'Signed!', 'User has signed this petition.', 'amnesty' ); - } - - $feature = wp_get_attachment_image_url( absint( $data['featured_image'] ?? 0 ), 'post-half@2x' ); - - ?> - <article class="grid-item petition-item" aria-label="Article: <?php echo esc_attr( format_for_aria_label( $title ) ); ?>" tabindex="0"> - <figure> - <img class="petition-itemImage aiic-ignore" src="<?php echo esc_url( $feature ); ?>" alt=""> - <?php if ( ! empty( $data['tag'] ) ) : ?> - <span class="petition-itemImageCaption"> - <?php - if ( ! empty( $data['tag_link'] ) ) { - printf( '<a href="%s" tabindex="0">%s</a>', esc_url( $data['tag_link'] ), esc_html( $data['tag'] ) ); - } else { - echo esc_attr( $data['tag'] ); - } - ?> - </span> - <?php endif; ?> - </figure> - - <div class="petition-item-content"> - <div class="petition-itemExcerpt"> - <?php - if ( ! empty( $data['excerpt'] ) ) { - echo esc_attr( $data['excerpt'] ); - } - ?> - </div> - <?php if ( $title ) : ?> - <h3 class="petition-itemTitle"> - <?php - if ( ! empty( $data['link'] ) ) { - printf( '<a href="%s" tabindex="0">%s</a>', esc_url( $data['link'] ), esc_html( $title ) ); - } else { - printf( '<span>%s</span>', esc_html( $title ) ); - } - ?> - </h3> - <?php endif; ?> - <a class="btn petition-itemCta" href="<?php echo esc_url( $data['link'] ); ?>"><?php echo esc_html( $button_text ); ?></a> - </div> - </article> - - <?php - } -} - -if ( ! function_exists( 'amnesty_petition_list_process_query' ) ) { - /** - * Processes each post/page to return the the correct data format for our render function. - * - * @package Amnesty\Blocks - * - * @param WP_Query $query Current WP_Query. - * @param object|false $term a term to use, if supplied - * - * @return array - */ - function amnesty_petition_list_process_query( $query, $term = false ) { - $posts = []; - - if ( ! $query->have_posts() ) { - return $posts; - } - - // phpcs:ignore WordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___COOKIE - $user_signed_petitions = sanitize_text_field( $_COOKIE['amnesty_petitions'] ?? '' ); - if ( $user_signed_petitions ) { - $user_signed_petitions = array_map( 'absint', explode( ',', $user_signed_petitions ) ); - } - - while ( $query->have_posts() ) { - $query->the_post(); - - $item = [ - 'id' => get_the_ID(), - 'title' => get_the_title(), - 'link' => get_the_permalink(), - 'tag' => false, - 'tag_link' => false, - 'featured_image' => get_post_meta( get_the_ID(), '_thumbnail_id', true ), - 'excerpt' => get_the_excerpt(), - 'has_signed' => in_array( get_the_ID(), (array) $user_signed_petitions, true ), - ]; - - $term = amnesty_get_a_post_term( get_the_ID(), 'topic' ); - - if ( is_a( $term, 'WP_Term' ) ) { - $item['tag'] = $term->name; - $item['tag_link'] = amnesty_term_link( $term ); - } - - $posts[] = $item; - } - - wp_reset_postdata(); - - return $posts; - } -} - -if ( ! function_exists( 'amnesty_petition_list_process_feed' ) ) { - /** - * Process the attributes for the current block for the object selection type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current Block attributes. - * - * @return array|bool - */ - function amnesty_petition_list_process_feed( $attributes ) { - if ( empty( $attributes ) ) { - return false; - } - - $post_types = [ get_option( 'aip_petition_slug' ) ?: 'petition' ]; - - $amount = 3; // the default - if ( isset( $attributes['amount'] ) ) { - $amount = absint( $attributes['amount'] ); - } - - $query = new WP_Query( - [ - 'post_type' => $post_types, - 'no_found_rows' => true, - 'posts_per_page' => $amount, - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query - 'tax_query' => [ - [ - 'taxonomy' => 'visibility', - 'field' => 'slug', - 'terms' => 'hidden', - 'include_children' => false, - 'operator' => 'NOT IN', - ], - ], - ] - ); - - return amnesty_petition_list_process_query( $query ); - } -} - -if ( ! function_exists( 'amnesty_petition_list_process_select' ) ) { - /** - * Process the attributes for the current block for the object selection type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current Block attributes. - * - * @return array|bool - */ - function amnesty_petition_list_process_select( $attributes ) { - if ( empty( $attributes ) || ! isset( $attributes['selectedPosts'] ) || ! $attributes['selectedPosts'] ) { - return false; - } - - $post_types = [ get_option( 'aip_petition_slug' ) ?: 'petition' ]; - - $query = new WP_Query( - [ - 'post__in' => $attributes['selectedPosts'], - 'post_type' => $post_types, - 'no_found_rows' => true, - ] - ); - - return amnesty_petition_list_process_query( $query ); - } -} - -if ( ! function_exists( 'amnesty_render_petition_list_block' ) ) { - /** - * Render the list item block. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current block attributes. - * - * @return string - */ - function amnesty_render_petition_list_block( $attributes ) { - // Prevent a bug in the admin panel where the editor - // shows a different post if the list item is selected - // using one of the selection methods. - if ( is_admin() ) { - return ''; - } - - if ( doing_filter( 'get_the_excerpt' ) ) { - return false; - } - - $data = amnesty_petition_list_process_content( $attributes ); - - if ( ! $data ) { - return ''; - } - - $grid_classes = [ 'grid' ]; - - if ( 0 === count( $data ) % 4 || count( $data ) > 8 ) { - $grid_classes[] = 'grid-many'; - } else { - $grid_classes[] = 'grid-' . count( $data ); - } - - if ( ! empty( $attributes['grid_class'] ) ) { - $grid_classes[] = $attributes['grid_class']; - } - - ob_start(); - - printf( '<div class="%s">', esc_attr( implode( ' ', $grid_classes ) ) ); - array_map( 'amnesty_render_petition_item', $data ); - print '</div>'; - - return ob_get_clean(); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/register.php b/wp-content/themes/humanity-theme/includes/blocks/post-list/register.php deleted file mode 100644 index f33d0d8f..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/post-list/register.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_list_block' ) ) { - /** - * Register the List block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_list_block(): void { - register_block_type( - 'amnesty-core/block-list', - [ - 'render_callback' => 'amnesty_render_list_block', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [ - 'displayAuthor' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'displayPostDate' => [ - 'type' => 'boolean', - 'default' => false, - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/render.php b/wp-content/themes/humanity-theme/includes/blocks/post-list/render.php deleted file mode 100644 index 9b25fe23..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/post-list/render.php +++ /dev/null @@ -1,468 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_list_process_query' ) ) { - /** - * Processes each post/page to return the the correct data format for our render function. - * - * @package Amnesty\Blocks - * - * @param WP_Query $query Current WP_Query. - * @param object|false $term a term to use, if supplied - * @param bool $show_author whether to render author - * @param bool $show_post_date whether to render post date - * - * @return array|bool - */ - function amnesty_list_process_query( $query, $term = false, $show_author = false, $show_post_date = false ) { - $posts = false; - - if ( $query->have_posts() ) { - $posts = []; - - while ( $query->have_posts() ) { - $query->the_post(); - - $item = [ - 'id' => get_the_ID(), - 'showAuthor' => $show_author, - 'showPostDate' => $show_post_date, - 'author' => get_the_author(), - 'date' => get_the_date(), - 'title' => get_the_title(), - 'link' => get_the_permalink(), - 'tag' => false, - 'tag_link' => false, - 'featured_image' => amnesty_featured_image( get_the_ID(), 'post-half@2x' ), - 'featured_image_id' => get_post_thumbnail_id( get_the_ID() ), - 'excerpt' => get_the_excerpt(), - ]; - - if ( ! $term ) { - $term = amnesty_get_prominent_term( get_the_ID() ); - } - - // check the post has one of the terms from the category list, if it does render the first one as a label - if ( has_category( $term, get_the_ID() ) ) { - $terms = get_the_category( get_the_ID() ); - $item['tag'] = $terms[0]->name; - $item['tag_link'] = amnesty_term_link( $terms[0] ); - } - - $posts[] = $item; - } - - wp_reset_postdata(); - } - - return $posts; - } -} - -if ( ! function_exists( 'amnesty_list_process_category' ) ) { - /** - * Process the attributes for the current block for the category type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current Block attributes. - * - * @return array|bool - */ - function amnesty_list_process_category( $attributes ) { - if ( empty( $attributes ) || ! isset( $attributes['category'] ) || ! $attributes['category'] ) { - return false; - } - - if ( empty( $attributes ) || ! isset( $attributes['amount'] ) || ! $attributes['amount'] ) { - $amount = 3; - } - - $category = json_decode( $attributes['category'] ); - - $category__in = []; - if ( is_object( $category ) ) { - // deprecated variant - $category__in = [ $category->value ]; - } elseif ( is_array( $category ) ) { - $category__in = array_map( - function ( $c ) { - return $c->value; - }, - $category - ); - } - - if ( empty( $category__in ) ) { - return []; - } - - $post_categories = false; - - if ( ! empty( $attributes['categoryRelated'] ) && is_singular( 'post' ) ) { - $post_categories = array_map( - function ( $term ) { - return $term->term_id; - }, - wp_get_post_terms( get_queried_object_id(), 'category' ) - ); - } - - $category_override = false; - - if ( $post_categories ) { - $category__in = $post_categories; - } else { - $category_override = $category__in; - } - - $amount = isset( $amount ) ? $amount : $attributes['amount']; - - $show_author = $attributes['displayAuthor']; - $show_post_date = $attributes['displayPostDate']; - $override_post_type = $attributes['postTypes'] ?? (object) [ - 'name' => 'post', - ]; - - $query = new WP_Query( - [ - 'category__in' => $category__in, - // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in - 'post__not_in' => [ get_the_ID() ], - 'posts_per_page' => $amount, - 'no_found_rows' => true, - 'post_type' => $override_post_type->name, - ] - ); - - return amnesty_list_process_query( $query, $category_override, $show_author, $show_post_date ); - } -} - -if ( ! function_exists( 'amnesty_list_process_author' ) ) { - /** - * Process the attributes for the current block for the category type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current Block attributes. - * - * @return array|bool - */ - function amnesty_list_process_author( $attributes ) { - if ( empty( $attributes ) || ! isset( $attributes['authors'] ) || ! $attributes['authors'] ) { - return false; - } - - if ( empty( $attributes ) || ! isset( $attributes['amount'] ) || ! $attributes['amount'] ) { - $amount = 3; - } - - $authors = json_decode( $attributes['authors'] ); - - $author__in = []; - if ( is_object( $authors ) ) { - // deprecated variant - $author__in = [ $authors->value ]; - } elseif ( is_array( $authors ) ) { - $author__in = array_map( - function ( $c ) { - return $c->value; - }, - $authors - ); - } - - if ( empty( $author__in ) ) { - return []; - } - - $amount = isset( $amount ) ? $amount : $attributes['amount']; - - $query = new WP_Query( - [ - 'author__in' => $author__in, - // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in - 'post__not_in' => [ get_the_ID() ], - 'posts_per_page' => $amount, - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - ] - ); - - return amnesty_list_process_query( $query, false ); - } -} - -if ( ! function_exists( 'amnesty_list_process_custom' ) ) { - /** - * Process the attributes for the current block for the custom type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current Block attributes. - * - * @return array|bool - */ - function amnesty_list_process_custom( $attributes ) { - if ( empty( $attributes ) || ! isset( $attributes['custom'] ) || ! $attributes['custom'] ) { - return false; - } - - $show_author = $attributes['displayAuthor'] ?? false; - $show_date = $attributes['displayPostDate'] ?? false; - - return array_map( - fn ( array $data ): array => amnesty_list_process_custom_item_data( $data, $show_author, $show_date ), - $attributes['custom'] - ); - } -} - -if ( ! function_exists( 'amnesty_list_process_custom_item_data' ) ) { - /** - * Process a custom item's attributes - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $data the item data - * @param bool $show_author whether to render author info - * @param bool $show_date whether to render specified date - * - * @return array<string,mixed> - */ - function amnesty_list_process_custom_item_data( array $data, bool $show_author, bool $show_date ): array { - $image = wp_get_attachment_image_url( $data['featured_image_id'] ?? 0, 'post-half@2x' ); - $date = amnesty_locale_date( strtotime( $data['date'] ?? '' ) ); - - return [ - 'title' => $data['title'] ?? false, - 'link' => $data['titleLink'] ?? false, - 'tag' => $data['tagText'] ?? false, - 'tag_link' => $data['tagLink'] ?? false, - 'featured_image' => $image, - 'featured_image_id' => $data['featured_image_id'] ?? 0, - 'excerpt' => $data['excerpt'] ?? false, - 'showPostDate' => $show_date, - 'date' => $date, - 'showAuthor' => $show_author, - 'author' => $data['authorName'] ?? '', - ]; - } -} - -if ( ! function_exists( 'amnesty_list_process_select' ) ) { - /** - * Process the attributes for the current block for the object selection type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current Block attributes. - * - * @return array|bool - */ - function amnesty_list_process_select( $attributes ) { - if ( empty( $attributes ) || ! isset( $attributes['selectedPosts'] ) || ! $attributes['selectedPosts'] ) { - return false; - } - - $post_types = get_post_types( - [ - 'public' => true, - ] - ); - - $show_author = $attributes['displayAuthor']; - $show_post_date = $attributes['displayPostDate']; - - $query = new WP_Query( - [ - 'post__in' => $attributes['selectedPosts'], - 'post_type' => $post_types, - 'no_found_rows' => true, - 'orderby' => 'post__in', - 'ignore_sticky_posts' => true, - ] - ); - - return amnesty_list_process_query( $query, false, $show_author, $show_post_date ); - } -} - -if ( ! function_exists( 'amnesty_list_process_taxonomy' ) ) { - /** - * Process the attributes for the current block for the category type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current Block attributes. - * - * @return array|bool - */ - function amnesty_list_process_taxonomy( $attributes ) { - if ( empty( $attributes ) || ! isset( $attributes['taxonomy'] ) || ! $attributes['taxonomy'] ) { - return false; - } - - if ( empty( $attributes ) || ! isset( $attributes['amount'] ) || ! $attributes['amount'] ) { - $amount = 3; - } - - if ( empty( $attributes['terms'] ) ) { - return false; - } - - $taxonomy = $attributes['taxonomy']['value']; - $terms = array_column( $attributes['terms'] ?? [], 'value' ); - $amount = isset( $amount ) ? $amount : $attributes['amount']; - $show_author = $attributes['displayAuthor']; - $show_post_date = $attributes['displayPostDate']; - - $query = new WP_Query( - [ - 'type' => 'post', - // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in - 'post__not_in' => [ get_the_ID() ], - 'posts_per_page' => $amount, - 'no_found_rows' => true, - 'tax_query' => [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query - [ - 'taxonomy' => $taxonomy, - 'terms' => $terms, - 'field' => 'term_id', - ], - ], - ] - ); - - return amnesty_list_process_query( $query, false, $show_author, $show_post_date ); - } -} - -if ( ! function_exists( 'amnesty_list_process_content' ) ) { - /** - * Process the current attributes by calling the specific function dependant on block type. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current block attributes. - * - * @return array|bool - */ - function amnesty_list_process_content( $attributes ) { - if ( empty( $attributes['type'] ) ) { - return amnesty_list_process_category( $attributes ); - } - - switch ( $attributes['type'] ) { - case 'custom': - return amnesty_list_process_custom( $attributes ); - case 'category': - return amnesty_list_process_category( $attributes ); - case 'select': - return amnesty_list_process_select( $attributes ); - case 'taxonomy': - return amnesty_list_process_taxonomy( $attributes ); - case 'author': - return amnesty_list_process_author( $attributes ); - default: - return amnesty_list_process_category( $attributes ); - } - } -} - -if ( ! function_exists( 'amnesty_render_list_item' ) ) { - /** - * Render the current block item as a list item. - * - * @package Amnesty\Blocks - * - * @param array $data - Item data. - * - * @return void - */ - function amnesty_render_list_item( $data ) { - $title = isset( $data['title'] ) ? $data['title'] : ''; - $author = isset( $data['author'] ) ? $data['author'] : ''; - $post_date = isset( $data['date'] ) ? $data['date'] : ''; - $show_author = isset( $data['showAuthor'] ) ? $data['showAuthor'] : ''; - $show_post_date = isset( $data['showPostDate'] ) ? $data['showPostDate'] : ''; - $post_updated = isset( $data['id'] ) ? get_post_meta( $data['id'], 'amnesty_updated', true ) : ''; - - if ( $show_post_date && $post_updated ) { - $post_updated = wp_date( get_option( 'date_format' ), strtotime( $post_updated ), new DateTimeZone( 'UTC' ) ); - } - - require realpath( __DIR__ . '/views/list-item.php' ); - } -} - -if ( ! function_exists( 'amnesty_render_grid_item' ) ) { - /** - * Render the current block item as a grid item. - * - * @package Amnesty\Blocks - * - * @param array $data - Item data. - * - * @return void - */ - function amnesty_render_grid_item( $data ) { - $title = isset( $data['title'] ) ? $data['title'] : ''; - - require realpath( __DIR__ . '/views/grid-item.php' ); - } -} - -if ( ! function_exists( 'amnesty_render_list_block' ) ) { - /** - * Render the list item block. - * - * @package Amnesty\Blocks - * - * @param array $attributes - Current block attributes. - * - * @return string - */ - function amnesty_render_list_block( $attributes ) { - // Prevent a bug in the admin panel where the editor - // shows a different post if the list item is selected - // using one of the selection methods. - if ( is_admin() ) { - return ''; - } - - if ( doing_filter( 'get_the_excerpt' ) ) { - return false; - } - - $data = amnesty_list_process_content( $attributes ); - - if ( ! $data ) { - return ''; - } - - ob_start(); - - if ( isset( $attributes['style'] ) && 'grid' === $attributes['style'] ) { - // Checks how many items in the array and outputs a different class based on value - if ( in_array( count( $data ), [ 1, 2, 3, 5, 6, 7 ], true ) ) { - printf( '<div class="grid grid-%s post-list">', esc_attr( count( $data ) ) ); - array_map( 'amnesty_render_grid_item', $data ); - print '</div>'; - } else { - printf( '<div class="grid grid-many">' ); - array_map( 'amnesty_render_grid_item', $data ); - print '</div>'; - } - return ob_get_clean(); - } - - print '<ul class="linkList">'; - array_map( 'amnesty_render_list_item', $data ); - print '</ul>'; - - return ob_get_clean(); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item-meta.php b/wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item-meta.php deleted file mode 100644 index 2411762c..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item-meta.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -if ( ! isset( $data['tag'], $data['tag_link'] ) ) { - return; -} - -$output = esc_html( $data['tag'] ); - -if ( isset( $data['tag_link'] ) && (bool) $data['tag_link'] ) { - $output = sprintf( '<a href="%s" tabindex="0">%s</a>', esc_url( $data['tag_link'] ), esc_html( $data['tag'] ) ); -} - - -?> - -<span class="grid-itemMeta"><?php echo wp_kses_post( $output ); ?></span> diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item.php b/wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item.php deleted file mode 100644 index 6aafbde4..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/grid-item.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -$has_credit = false; - -if ( $data['featured_image_id'] ?? false ) { - $has_credit = (bool) amnesty_get_image_credit( $data['featured_image_id'] ); -} - -// translators: [front] %s: the title of the article -$aria_label = sprintf( __( 'Article: %s', 'amnesty' ), format_for_aria_label( $title ) ); - -spaceless(); -?> -<article class="grid-item <?php echo esc_attr( $has_credit ? 'aimc-ignore' : '' ); ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>" style="aiic:ignore;background-image: url('<?php echo esc_url( $data['featured_image'] ); ?>')" tabindex="0"> - <div class="grid-content"> - <?php require realpath( __DIR__ . '/grid-item-meta.php' ); ?> - <?php require realpath( __DIR__ . '/grid-item-title.php' ); ?> - </div> -</article> -<?php - -endspaceless(); diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item.php b/wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item.php deleted file mode 100644 index ab5e93ad..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/post-list/views/list-item.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -// translators: [front] %s: the title of the article -$aria_label = sprintf( __( 'Article: %s', 'amnesty' ), format_for_aria_label( get_the_title() ) ); - -?> -<li> - <article class="linkList-item" aria-label="<?php echo esc_attr( $aria_label ); ?>"> - <?php require realpath( __DIR__ . '/list-item-meta.php' ); ?> - <?php require realpath( __DIR__ . '/list-item-title.php' ); ?> - - <div class="postInfo-container"> - <?php require realpath( __DIR__ . '/list-item-date.php' ); ?> - - <?php if ( $show_post_date && $show_author ) : ?> - <span class="linkList-authorDivider"></span> - <?php endif; ?> - - <?php require realpath( __DIR__ . '/list-item-author.php' ); ?> - </div> - </article> -</li> diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-meta/register.php b/wp-content/themes/humanity-theme/includes/blocks/post-meta/register.php deleted file mode 100644 index 9e93e914..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/post-meta/register.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_post_meta_block' ) ) { - /** - * Register the Post Meta block for use in the query loop - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_post_meta_block(): void { - register_block_type( - 'amnesty-core/post-meta', - [ - 'render_callback' => 'render_post_meta_block', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [ - 'textAlign' => [ - 'type' => 'string', - 'default' => '', - ], - 'format' => [ - 'type' => 'string', - 'default' => '', - ], - 'isLink' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'displayType' => [ - 'type' => 'string', - 'default' => false, - ], - 'metaKey' => [ - 'type' => 'string', - 'default' => '', - ], - 'isSingle' => [ - 'type' => 'boolean', - 'default' => true, - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/post-meta/render.php b/wp-content/themes/humanity-theme/includes/blocks/post-meta/render.php deleted file mode 100644 index 9fa21239..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/post-meta/render.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_post_meta_block' ) ) { - /** - * Render meta for a post - * - * @package Amnesty\Blocks - * - * @param array $attributes Block attributes. - * @param string $content Block default content. - * @param WP_Block $block Block instance. - * - * @return string - */ - function render_post_meta_block( array $attributes, string $content, WP_Block $block ): string { - if ( ! isset( $block->context['postId'], $attributes['metaKey'] ) ) { - return ''; - } - - $post_id = $block->context['postId']; - $classes = []; - - if ( isset( $attributes['textAlign'] ) ) { - $classes[] = 'has-text-align-' . $attributes['textAlign']; - } - - if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { - $classes[] = 'has-link-color'; - } - - $wrapper_attributes = get_block_wrapper_attributes( [ 'class' => implode( ' ', $classes ) ] ); - - $meta_value = get_post_meta( $post_id, $attributes['metaKey'], $attributes['isSingle'] ?? true ); - $metadata = []; - - if ( $attributes['isSingle'] ?? true ) { - $meta_value = [ $meta_value ]; - } - - $meta_value = apply_filters( - 'amnesty_core_post_meta_meta_value', - $meta_value, - $post_id, - $block->context['postType'], - $attributes['metaKey'], - ); - - if ( $attributes['isLink'] ?? false ) { - foreach ( $meta_value as $row ) { - $metadata[] = sprintf( '<a href="%1s">%2s</a>', get_the_permalink( $post_id ), $row ); - } - } else { - $metadata = $meta_value; - } - - $metadata = implode( ', ', $metadata ); - - return sprintf( - '<div %1$s>%2$s</div>', - $wrapper_attributes, - $metadata, - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/raw-code/register.php b/wp-content/themes/humanity-theme/includes/blocks/raw-code/register.php deleted file mode 100644 index 03ba9d2e..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/raw-code/register.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_raw_code_block' ) ) { - /** - * Register the Raw Code block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_raw_code_block(): void { - register_block_type( 'amnesty-core/code' ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/regions/register.php b/wp-content/themes/humanity-theme/includes/blocks/regions/register.php deleted file mode 100644 index 1bd39a6a..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/regions/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_regions_block' ) ) { - /** - * Register the Regions block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_regions_block(): void { - register_block_type( - 'amnesty-core/regions', - [ - 'render_callback' => 'amnesty_render_regions_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/regions/render.php b/wp-content/themes/humanity-theme/includes/blocks/regions/render.php deleted file mode 100644 index 666b96b5..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/regions/render.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_regions_block' ) ) { - /** - * Render the Regions block - a visual representation of a term hierarchy - * - * @package Amnesty\Blocks - * - * @param array $attributes the block's attributes - * - * @return string - */ - function amnesty_render_regions_block( array $attributes = [] ) { - $args = wp_parse_args( - $attributes, - [ - /* translators: [front] Deafult text can be changed in CMS for https://isaidotorgstg.wpengine.com/en/countries/ https://wordpresstheme.amnesty.org/blocks/b026-regions-list-block/ */ - 'title' => __( 'Explore by Region', 'amnesty' ), - 'taxonomy' => '', - 'background' => '', - 'alignment' => '', - 'depth' => 1, - 'regionsOnly' => false, - ] - ); - - if ( ! taxonomy_exists( $args['taxonomy'] ) ) { - return ''; - } - - $query_args = [ - 'depth' => absint( $args['depth'] ) + 1, - 'hide_empty' => false, - 'taxonomy' => $args['taxonomy'], - 'title_li' => false, - 'show_option_none' => false, - 'use_desc_for_title' => false, - ]; - - if ( $args['regionsOnly'] ) { - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query - $query_args['meta_query'] = [ - [ - 'key' => 'type', - 'value' => [ 'region', 'subregion' ], - 'compare' => 'IN', - ], - ]; - } - - $title_id = sanitize_title_with_dashes( $args['title'] ); - $title_classes = classnames( [ "is-{$args['alignment']}-aligned" => (bool) $args['alignment'] ] ); - $wrap_classes = classnames( - 'wp-block-amnesty-core-regions', - [ - "has-{$args['background']}-background-color" => (bool) $args['background'], - ] - ); - - spaceless(); - - printf( '<aside class="%s" aria-labelledby="%s">', esc_attr( $wrap_classes ), esc_attr( $title_id ) ); - printf( '<h2 id="%s" class="%s">%s</h2>', esc_attr( $title_id ), esc_attr( $title_classes ), esc_html( $args['title'] ) ); - /* translators: [front] https://isaidotorgstg.wpengine.com/en/countries/ https://wordpresstheme.amnesty.org/blocks/b026-regions-list-block/ */ - printf( '<ul class="listItems" aria-label="%s">', esc_html__( 'Hierarchical list of terms', 'amnesty' ) ); - - add_filter( - 'category_css_class', - function ( array $classes, WP_Term $term, int $depth, array $args = [] ) { - if ( isset( $args['has_children'] ) && $args['has_children'] ) { - - $classes[] = 'has-children'; - } - return $classes; - }, - 10, - 4 - ); - - wp_list_categories( $query_args ); - - echo '</ul>'; - echo '</aside>'; - - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/register.php b/wp-content/themes/humanity-theme/includes/blocks/register.php index bf251b88..f405d1aa 100644 --- a/wp-content/themes/humanity-theme/includes/blocks/register.php +++ b/wp-content/themes/humanity-theme/includes/blocks/register.php @@ -3,120 +3,3 @@ declare( strict_types = 1 ); add_filter( 'big_bite_block_tabbed_content_show_tab_id_settings', '__return_true' ); - -if ( ! function_exists( 'register_block_type' ) ) { - return; -} - -require_once __DIR__ . '/_deprecated/header/class-header-block-renderer.php'; -require_once __DIR__ . '/_deprecated/header/register.php'; - -require_once __DIR__ . '/action/register.php'; -require_once __DIR__ . '/action/render.php'; -require_once __DIR__ . '/background-media/components/register.php'; -require_once __DIR__ . '/background-media/components/render.php'; -require_once __DIR__ . '/background-media/register.php'; -require_once __DIR__ . '/background-media/render.php'; -require_once __DIR__ . '/banner/register.php'; -require_once __DIR__ . '/blockquote/register.php'; -require_once __DIR__ . '/blockquote/render.php'; -require_once __DIR__ . '/call-to-action/register.php'; -require_once __DIR__ . '/call-to-action/render.php'; -require_once __DIR__ . '/collapsable/register.php'; -require_once __DIR__ . '/collapsable/render.php'; -require_once __DIR__ . '/countdown-timer/register.php'; -require_once __DIR__ . '/countdown-timer/render.php'; -require_once __DIR__ . '/custom-card/register.php'; -require_once __DIR__ . '/custom-card/render.php'; -require_once __DIR__ . '/download/register.php'; -require_once __DIR__ . '/download/render.php'; -require_once __DIR__ . '/embed-flourish/register.php'; -require_once __DIR__ . '/embed-flourish/render.php'; -require_once __DIR__ . '/embed-infogram/register.php'; -require_once __DIR__ . '/embed-infogram/render.php'; -require_once __DIR__ . '/embed-sutori/register.php'; -require_once __DIR__ . '/embed-sutori/render.php'; -require_once __DIR__ . '/embed-tickcounter/register.php'; -require_once __DIR__ . '/embed-tickcounter/render.php'; -require_once __DIR__ . '/hero/helpers.php'; -require_once __DIR__ . '/hero/register.php'; -require_once __DIR__ . '/hero/render.php'; -require_once __DIR__ . '/iframe-button/register.php'; -require_once __DIR__ . '/iframe-button/render.php'; -require_once __DIR__ . '/iframe/register.php'; -require_once __DIR__ . '/iframe/render.php'; -require_once __DIR__ . '/image/register.php'; -require_once __DIR__ . '/image/render.php'; -require_once __DIR__ . '/link-group/register.php'; -require_once __DIR__ . '/link-group/render.php'; -require_once __DIR__ . '/links-with-icons/register.php'; -require_once __DIR__ . '/links-with-icons/render.php'; -require_once __DIR__ . '/menu/register.php'; -require_once __DIR__ . '/menu/render.php'; -require_once __DIR__ . '/petition-list/register.php'; -require_once __DIR__ . '/petition-list/render.php'; -require_once __DIR__ . '/post-list/register.php'; -require_once __DIR__ . '/post-list/render.php'; -require_once __DIR__ . '/post-meta/register.php'; -require_once __DIR__ . '/post-meta/render.php'; -require_once __DIR__ . '/raw-code/register.php'; -require_once __DIR__ . '/regions/register.php'; -require_once __DIR__ . '/regions/render.php'; -require_once __DIR__ . '/related-content/register.php'; -require_once __DIR__ . '/related-content/render.php'; -require_once __DIR__ . '/section/class-section-block-renderer.php'; -require_once __DIR__ . '/section/register.php'; -require_once __DIR__ . '/slider/register.php'; -require_once __DIR__ . '/slider/render.php'; -require_once __DIR__ . '/stat-counter/register.php'; -require_once __DIR__ . '/stat-counter/render.php'; -require_once __DIR__ . '/term-list/register.php'; -require_once __DIR__ . '/term-list/render.php'; -require_once __DIR__ . '/tweet-action/register.php'; -require_once __DIR__ . '/tweet-action/render.php'; - -if ( ! function_exists( 'amnesty_register_php_rendered_blocks' ) ) { - /** - * Register the blocks that require php to be rendered. - * - * @package Amnesty\Blocks - * - * @return void - */ - function amnesty_register_php_rendered_blocks() { - register_action_block(); - register_background_media_block(); - register_background_media_column_block(); - register_banner_block(); - register_blockquote_block(); - register_collapsable_block(); - register_countdown_block(); - register_cta_block(); - register_custom_card_block(); - register_download_block(); - register_flourish_embed_block(); - register_header_block(); - register_hero_block(); - register_iframe_block(); - register_iframe_button_block(); - register_image_block(); - register_infogram_embed_block(); - register_link_group_block(); - register_links_with_icons_block(); - register_list_block(); - register_menu_block(); - register_petition_list_block(); - register_raw_code_block(); - register_regions_block(); - register_related_content_block(); - register_section_block(); - register_slider_block(); - register_stat_counter_block(); - register_sutori_embed_block(); - register_term_list_block(); - register_tickcounter_embed_block(); - register_tweet_action_block(); - } -} - -add_action( 'init', 'amnesty_register_php_rendered_blocks' ); diff --git a/wp-content/themes/humanity-theme/includes/blocks/related-content/register.php b/wp-content/themes/humanity-theme/includes/blocks/related-content/register.php deleted file mode 100644 index 33a699e6..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/related-content/register.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_related_content_block' ) ) { - /** - * Register the Related Content block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_related_content_block(): void { - register_block_type( - 'amnesty-core/related-content', - [ - 'render_callback' => 'amnesty_render_related_content_block', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/related-content/render.php b/wp-content/themes/humanity-theme/includes/blocks/related-content/render.php deleted file mode 100644 index d8f16cf3..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/related-content/render.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_related_content_block' ) ) { - /** - * Render the Related Content block - * - * @package Amnesty\Blocks - * - * @return string - */ - function amnesty_render_related_content_block(): string { - if ( ! class_exists( '\Amnesty\Related_Content' ) ) { - return ''; - } - - $related_content = new \Amnesty\Related_Content( false ); - - return $related_content->get_rendered(); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/section/class-section-block-renderer.php b/wp-content/themes/humanity-theme/includes/blocks/section/class-section-block-renderer.php deleted file mode 100644 index 8127e41c..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/section/class-section-block-renderer.php +++ /dev/null @@ -1,243 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -namespace Amnesty\Blocks; - -use Amnesty\Get_Image_Data; - -// phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed - -if ( ! function_exists( '\Amnesty\Blocks\amnesty_render_section_block' ) ) { - /** - * Render the Section block - * - * @package Amnesty\Blocks - * - * @param array<string,mixed> $attributes the block attributes - * @param string $content the innerblocks content - * - * @return string - */ - function amnesty_render_section_block( array $attributes, string $content = '' ): string { - $renderer = new Section_Block_Renderer( $attributes, $content ); - return $renderer->render(); - } -} - -/** - * The renderer for the Section Block - * - * @package Amnesty\Blocks - */ -class Section_Block_Renderer { - - /** - * Randomly-generated ID for the block - * - * @var string - */ - protected string $id = ''; - - /** - * Image data object for background image - * - * @var \Amnesty\Get_Image_Data - */ - protected Get_Image_Data $image; - - /** - * The block attributes - * - * @var array<string,mixed> - */ - protected array $attributes = []; - - /** - * The inner blocks HTML - * - * @var string - */ - protected string $content = ''; - - /** - * Constructor - * - * @param array<string,mixed> $attributes the block attributes - * @param string $content the inner blocks HTML - */ - public function __construct( array $attributes, string $content = '' ) { - $this->attributes = wp_parse_args( - $attributes, - [ - 'background' => '', - 'backgroundImage' => '', - 'backgroundImageHeight' => '', - 'backgroundImageId' => 0, - 'backgroundImageOrigin' => '', - 'enableBackgroundGradient' => false, - 'hideImageCaption' => true, - 'hideImageCopyright' => false, - 'minHeight' => 0, - 'padding' => '', - 'sectionId' => substr( md5( uniqid( (string) wp_rand(), true ) ), 0, 8 ), - 'sectionName' => '', - 'textColour' => 'black', - ] - ); - - $this->id = $this->attributes['sectionId']; - $this->image = new Get_Image_Data( absint( $this->attributes['backgroundImageId'] ) ); - $this->content = $content; - } - - /** - * Render the block - * - * @return string - */ - public function render(): string { - ob_start(); - - $this->render_style_tag(); - $this->open_section(); - $this->open_container(); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - echo $this->content; - $this->close_container(); - $this->render_caption(); - $this->close_section(); - - return ob_get_clean(); - } - - /** - * Render the background image style - * - * @return void - */ - protected function render_style_tag() { - $background_image = $this->attributes['backgroundImage']; - - if ( ! $background_image && ! $this->image->id() ) { - return; - } - - if ( 0 === $this->image->id() && $background_image ) { - printf( - '<style class="aiic-ignore">#section-%s{background-image:url("%s")}</style>', - esc_attr( $this->id ), - esc_url( $background_image ) - ); - - return; - } - - $small_bg_image = wp_get_attachment_image_url( $this->image->id(), 'hero-sm' ); - $medium_bg_image = wp_get_attachment_image_url( $this->image->id(), 'hero-md' ); - $large_bg_image = wp_get_attachment_image_url( $this->image->id(), 'hero-lg' ); - - printf( - ( $this->image->credit() ? '<style class="aiic-ignore">' : '<style>' ) . - '#section-%1$s{background-image:url("%2$s")}' . - '@media screen and (min-width:770px){' . - '#section-%1$s{background-image:url("%3$s")}' . - '}' . - '@media screen and (min-width:1444px){' . - '#section-%1$s{background-image:url("%4$s")}' . - '}' . - '</style>', - esc_attr( $this->id ), - esc_url( $small_bg_image ), - esc_url( $medium_bg_image ), - esc_url( $large_bg_image ) - ); - } - - /** - * Render opening section tag - * - * @return void - */ - protected function open_section() { - $origin = $this->attributes['backgroundImageOrigin']; - $padding = $this->attributes['padding']; - - $classes = classnames( - 'section', - [ - 'section--tinted' => 'grey' === $this->attributes['background'], - 'section--textWhite' => 'white' === $this->attributes['textColour'], - 'section--has-bg-image' => (bool) $this->attributes['backgroundImage'], - 'section--has-bg-overlay' => (bool) $this->attributes['enableBackgroundGradient'], - sprintf( 'section--%s', $padding ) => (bool) $padding, - sprintf( 'section--bgOrigin-%s', $origin ) => (bool) $origin, - ] - ); - - $css_attr = ''; - - if ( $this->attributes['backgroundImage'] ) { - if ( 0 === absint( $this->attributes['minHeight'] ) ) { - $css_attr .= 'height:auto;'; - } - - if ( absint( $this->attributes['minHeight'] ) > 0 ) { - $css_attr .= sprintf( - 'min-height:%svw;max-height:%spx;', - absint( $this->attributes['minHeight'] ), - absint( $this->attributes['backgroundImageHeight'] ) - ); - } - } - - printf( '<section id="section-%s" class="%s" style="%s">', esc_html( $this->id ), esc_html( $classes ), esc_attr( $css_attr ) ); - } - - /** - * Render opening container tag - * - * @return void - */ - protected function open_container(): void { - printf( '<div id="%s" class="container">', esc_attr( $this->id ) ); - } - - /** - * Render the closing container tag - * - * @return void - */ - protected function close_container() { - print '</div>'; - } - - /** - * Render the caption - * - * @return void - */ - protected function render_caption(): void { - if ( ! $this->image->id() ) { - return; - } - - $hide_caption = true === amnesty_validate_boolish( $this->attributes['hideImageCaption'] ); - $hide_credit = true === amnesty_validate_boolish( $this->attributes['hideImageCopyright'] ); - - if ( $hide_caption && $hide_credit ) { - return; - } - - echo wp_kses_post( $this->image->metadata( ! $hide_caption, ! $hide_credit ) ); - } - - /** - * Close the section - * - * @return void - */ - protected function close_section() { - print '</section>'; - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/section/register.php b/wp-content/themes/humanity-theme/includes/blocks/section/register.php deleted file mode 100644 index b1771ebe..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/section/register.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_section_block' ) ) { - /** - * Register the Section block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_section_block(): void { - register_block_type( - 'amnesty-core/block-section', - [ - 'render_callback' => '\Amnesty\Blocks\amnesty_render_section_block', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [ - 'background' => [ - 'type' => 'string', - ], - 'backgroundImage' => [ - 'type' => 'string', - 'default' => '', - ], - 'backgroundImageHeight' => [ - 'type' => 'number', - 'default' => 0, - ], - 'backgroundImageId' => [ - 'type' => 'number', - 'default' => 0, - ], - 'backgroundImageOrigin' => [ - 'type' => 'string', - 'default' => '', - ], - 'enableBackgroundGradient' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'hideImageCaption' => [ - 'type' => 'boolean', - 'default' => true, - ], - 'hideImageCopyright' => [ - 'type' => 'boolean', - 'default' => false, - ], - 'minHeight' => [ - 'type' => 'number', - 'default' => 0, - ], - 'padding' => [ - 'type' => 'string', - ], - 'sectionId' => [ - 'type' => 'string', - ], - 'sectionName' => [ - 'type' => 'string', - ], - 'textColour' => [ - 'type' => 'string', - 'default' => 'black', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/slider/kses.php b/wp-content/themes/humanity-theme/includes/blocks/slider/kses.php deleted file mode 100644 index ad3e35e8..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/slider/kses.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_slider_kses' ) ) { - /** - * Declare slider-specific KSES tags - * - * @package Amnesty\Kses - * - * @param array $tags currently-allowed HMTL tags/attributes - * @param string $context the KSES context - * - * @return array - */ - function amnesty_slider_kses( array $tags, string $context ): array { - if ( 'slider' !== $context ) { - return $tags; - } - - return array_merge_recursive( - $tags, - [ - 'style' => [], - 'h1' => _wp_add_global_attributes( [] ), - 'h2' => _wp_add_global_attributes( [] ), - 'li' => _wp_add_global_attributes( [] ), - 'p' => _wp_add_global_attributes( [] ), - 'span' => _wp_add_global_attributes( [] ), - 'nav' => _wp_add_global_attributes( [] ), - 'section' => _wp_add_global_attributes( [] ), - 'input' => _wp_add_global_attributes( - [ - 'type' => true, - 'value' => true, - 'selected' => true, - 'name' => true, - 'checked' => true, - ] - ), - 'label' => _wp_add_global_attributes( [] ), - 'div' => _wp_add_global_attributes( - [ - 'tabindex' => true, - ] - ), - 'select' => _wp_add_global_attributes( [ 'name' => true ] ), - 'option' => _wp_add_global_attributes( - [ - 'value' => true, - 'selected' => true, - ] - ), - 'button' => _wp_add_global_attributes( - [ - 'class' => true, - 'selected' => true, - 'data-slide-index' => true, - 'key' => true, - 'style' => true, - ] - ), - 'a' => _wp_add_global_attributes( - [ - 'value' => true, - 'selected' => true, - 'href' => true, - ] - ), - ] - ); - } -} - -add_filter( 'wp_kses_allowed_html', 'amnesty_slider_kses', 10, 2 ); diff --git a/wp-content/themes/humanity-theme/includes/blocks/slider/register.php b/wp-content/themes/humanity-theme/includes/blocks/slider/register.php deleted file mode 100644 index 5059d35f..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/slider/register.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_slider_block' ) ) { - /** - * Register the Slider block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_slider_block(): void { - register_block_type( - 'amnesty-core/block-slider', - [ - 'render_callback' => 'amnesty_render_block_slider', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [ - 'sliderId' => [ - 'type' => 'string', - ], - 'slides' => [ - 'type' => 'array', - 'default' => [], - ], - 'hasArrows' => [ - 'type' => 'boolean', - 'default' => true, - ], - 'showTabs' => [ - 'type' => 'boolean', - 'default' => true, - ], - 'hasContent' => [ - 'type' => 'boolean', - 'default' => true, - ], - 'sliderTitle' => [ - 'type' => 'string', - 'default' => '', - ], - 'timelineCaptionStyle' => [ - 'type' => 'string', - 'default' => 'dark', - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/slider/render.php b/wp-content/themes/humanity-theme/includes/blocks/slider/render.php deleted file mode 100644 index b7958049..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/slider/render.php +++ /dev/null @@ -1,219 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_slider_buttons' ) ) { - /** - * Render buttons for a slider block - * - * @package Amnesty\Blocks - * - * @return void - */ - function amnesty_render_slider_buttons() { - ?> - <button class="slides-arrow slides-arrow--next" aria-hidden="true"><?php /* translators: [front] ARIA https://wordpresstheme.amnesty.org/blocks/b006-timeline-slider/ */ esc_html_e( 'Next', 'amnesty' ); ?></button> - <button class="slides-arrow slides-arrow--previous" aria-hidden="true"><?php /* translators: [front] ARIA https://wordpresstheme.amnesty.org/blocks/b006-timeline-slider/ */ esc_html_e( 'Previous', 'amnesty' ); ?></button> - <?php - } -} - -if ( ! function_exists( 'amnesty_render_slider_tabs' ) ) { - /** - * Render navigation tabs for a slider block - * - * @package Amnesty\Blocks - * - * @param array $slides the list of slides in the slider - * - * @return void - */ - function amnesty_render_slider_tabs( array $slides ) { - print '<div class="slider-navContainer" aria-hidden="true"><nav class="slider-nav">'; - - // if no topic then grab one - if ( empty( $slides[0]['topics'][0]->name ) && get_the_ID() ) { - $fallback_topic = amnesty_get_prominent_term( get_the_ID() ); - } - - foreach ( $slides as $index => $slide ) { - if ( ! empty( $slide['topics'][0]->name ) ) { - printf( '<button class="slider-navButton" key="%1$s" data-slide-index="%2$s">%1$s</button>', esc_html( $slide['topics'][0]->name ), esc_html( $index ) ); - } elseif ( ! empty( $slide['title'] ) && empty( $slide['topics'][0]->name ) ) { - printf( '<button class="slider-navButton" key="%1$s" data-slide-index="%2$s">%1$s</button>', esc_html( $slide['title'] ), esc_html( $index ) ); - } elseif ( ! empty( $fallback_topic->name ) ) { - printf( '<button class="slider-navButton" key="%1$s" data-slide-index="%2$s">%1$s</button>', esc_html( $fallback_topic->name ), esc_html( $index ) ); - } - } - - print '</nav></div>'; - } -} - -if ( ! function_exists( 'amnesty_render_slider_item' ) ) { - /** - * Render the current slider item. - * - * @package Amnesty\Blocks - * - * @param array $data - slide data. - * @param string $slider_id - slide id. - * @param boolean $has_content - if content is available. - * - * @return void - * - * phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed - */ - function amnesty_render_slider_item( $data, $slider_id, $has_content ) { - // phpcs:enable Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed - $data = wp_parse_args( - $data, - [ - 'alignment' => '', - 'background' => '', - 'callToActionLink' => '', - 'callToActionText' => '', - 'content' => '', - 'heading' => '', - 'hideContent' => '', - 'id' => '', - 'imageId' => 0, - 'subheading' => '', - 'timelineContent' => '', - ] - ); - - $id = $data['id']; - $alignment = $data['alignment']; - $background = $data['background']; - $timeline_content = $data['timelineContent']; - $hide_content = $data['hideContent']; - $title = $data['heading']; - $subtitle = $data['subheading']; - $cta_text = $data['callToActionText']; - $cta_link = $data['callToActionLink']; - $content = $data['content']; - $show_cta_btn = false; - $show_toggle = false; - $has_inner = false; - $image_id = absint( $data['imageId'] ); - - if ( '' !== $cta_text && '' !== $cta_link ) { - $show_cta_btn = true; - } - - if ( $show_cta_btn || '' !== $content ) { - $show_toggle = true; - } - - if ( $show_cta_btn || $show_toggle ) { - $has_inner = true; - } - - require realpath( __DIR__ . '/views/slide.php' ); - } -} - -if ( ! function_exists( 'amnesty_render_slider_styles' ) ) { - /** - * Render the <style> tag for the slider - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * @param string $slider_id the block identifier - * - * @return void - */ - function amnesty_render_slider_styles( array $attributes, string $slider_id ): void { - $slides = $attributes['slides'] ?? []; - - if ( 0 === count( $slides ) ) { - return; - } - - echo '<style class="aiic-ignore">'; - - foreach ( $slides as $slide ) { - if ( ! isset( $slide['id'] ) ) { - continue; - } - - $image_id = $slide['imageId'] ?? ''; - $small_image = wp_get_attachment_image_url( $image_id, 'hero-sm' ); - $large_image = wp_get_attachment_image_url( $image_id, 'hero-lg' ); - - printf( - '#slider-%1$s #slide-%2$s{background-image:url("%3$s")}@media screen and (min-width:1444px){#slider-%1$s #slide-%2$s{background-image:url("%4$s")}}', - esc_attr( $slider_id ), - esc_attr( $slide['id'] ), - esc_url( $small_image ), - esc_url( $large_image ) - ); - } - - echo '</style>'; - } -} - -if ( ! function_exists( 'amnesty_render_block_slider' ) ) { - /** - * Render a slider block - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * - * @return string - */ - function amnesty_render_block_slider( array $attributes = [] ) { - $attributes = wp_parse_args( - $attributes, - [ - 'hasArrows' => true, - 'hasContent' => false, - 'showTabs' => true, - 'sliderId' => '', - 'sliderTitle' => '', - 'slides' => [], - 'timelineCaptionStyle' => '', - ] - ); - - $slider_id = $attributes['sliderId']; - $caption_style = $attributes['timelineCaptionStyle']; - $slider_title = $attributes['sliderTitle']; - $slides = $attributes['slides']; - $has_content = $attributes['hasContent']; - $has_arrows = $attributes['hasArrows']; - $show_tabs = $attributes['showTabs']; - - ob_start(); - printf( '<div id="slider-%1$s" class="slider timeline-%2$s">', esc_html( $slider_id ), esc_html( $caption_style ) ); - - if ( $slider_title ) { - printf( '<div class="slider-title">%1$s</div>', esc_html( $slider_title ) ); - } - - print '<div class="slides-container">'; - amnesty_render_slider_styles( $attributes, $slider_id ); - print '<div class="slides">'; - foreach ( $slides as $slide ) { - amnesty_render_slider_item( $slide, $slider_id, $has_content ); - } - print '</div>'; - - if ( $has_arrows ) { - amnesty_render_slider_buttons(); - } - - if ( $show_tabs ) { - amnesty_render_slider_tabs( $slides ); - } - - print '</div>'; // /.slides-container - print '</div>';// /.slider - - return ob_get_clean(); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/slider/views/slide.php b/wp-content/themes/humanity-theme/includes/blocks/slider/views/slide.php deleted file mode 100644 index 0ff1026b..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/slider/views/slide.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -$slide_classes = classnames( - 'slide', - [ - "is-{$alignment}-aligned" => $alignment, - "has-{$background}-background" => $background, - ] -); - -?> -<div id="slide-<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $slide_classes ); ?>" tabindex="0"> -<?php if ( $timeline_content ) : ?> - <div class="slide-timelineContent"> - <div class="slide-timelineContent-inner"><?php echo wp_kses_post( $timeline_content ); ?></div> - </div> -<?php endif; ?> - -<?php if ( ! $hide_content && $has_content ) : ?> - <div class="slide-contentWrapper" data-tooltip="<?php /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b006-timeline-slider/ AM not seen this in use, might be to close a gallery */ esc_attr_e( 'Tap here to return to gallery', 'amnesty' ); ?>"> - <div class="slide-contentContainer"> - <?php if ( $title ) : ?> - <h1 class="slide-title"><?php echo wp_kses_post( $title ); ?></h1> - <?php endif; ?> - - <?php if ( $subtitle ) : ?> - <h2 class="slide-subtitle"><?php echo wp_kses_post( $subtitle ); ?></h2> - <?php endif; ?> - - <?php if ( $has_inner ) : ?> - <div class="slide-content"> - <?php if ( $content ) : ?> - <div><?php echo wp_kses_post( $content ); ?></div> - <?php endif; ?> - - <?php if ( $show_cta_btn ) : ?> - <a class="btn" href="<?php echo esc_url( $cta_link ); ?>"><?php echo wp_kses_post( $cta_text ); ?></a> - <?php endif; ?> - - <?php if ( $show_toggle ) : ?> - <button class="slider-toggleContent"><?php /* translators: [front] */ esc_html_e( 'Toggle Content', 'amnesty' ); ?></button> - <?php endif; ?> - </div> - <?php endif; ?> - </div> - </div> -<?php endif; ?> -</div> diff --git a/wp-content/themes/humanity-theme/includes/blocks/stat-counter/register.php b/wp-content/themes/humanity-theme/includes/blocks/stat-counter/register.php deleted file mode 100644 index 5475a20a..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/stat-counter/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_stat_counter_block' ) ) { - /** - * Register Stat Counter block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_stat_counter_block(): void { - register_block_type( - 'amnesty-core/counter', - [ - 'editor_script' => 'amnesty-stat-counter-block-editor', - 'render_callback' => 'render_stat_counter_block', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/stat-counter/render.php b/wp-content/themes/humanity-theme/includes/blocks/stat-counter/render.php deleted file mode 100644 index d8d19ce1..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/stat-counter/render.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_stat_counter_block' ) ) { - /** - * Render Stat Counter block - * - * @package Amnesty\Blocks - * - * @param array $attributes Block attributes - * - * @return string - */ - function render_stat_counter_block( array $attributes ): string { - $options = get_option( 'amnesty_localisation_options_page' ); - - $attributes = wp_parse_args( - $attributes, - [ - 'alignment' => '', - 'duration' => 2, - 'value' => '', - ] - ); - - $alignment = 'align' . $attributes['alignment']; - $duration = $attributes['duration']; - $value = $attributes['value']; - - if ( 'on' === ( $options['enforce_grouping_separators'] ?? false ) ) { - $value = number_format_i18n( $value ); - } - - $wrapper_attributes = get_block_wrapper_attributes( - [ - 'class' => $alignment, - ] - ); - - return sprintf( - '<div %1$s data-duration="%2$s" data-value="%3$s">%4$s</div>', - wp_kses_data( $wrapper_attributes ), - esc_attr( $duration ), - esc_attr( $value ), - wp_kses_post( $value ) - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/term-list/register.php b/wp-content/themes/humanity-theme/includes/blocks/term-list/register.php deleted file mode 100644 index 6ef2f4c6..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/term-list/register.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_term_list_block' ) ) { - /** - * Register the Term List block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_term_list_block(): void { - register_block_type( - 'amnesty-core/term-list', - [ - 'render_callback' => 'amnesty_render_term_list_block', - 'editor_script' => 'amnesty-core-blocks-js', - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/term-list/render.php b/wp-content/themes/humanity-theme/includes/blocks/term-list/render.php deleted file mode 100644 index 49566cd6..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/term-list/render.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_term_list_block_get_terms' ) ) { - /** - * Retrieve terms for the term list block - * - * @package Amnesty\Blocks - * - * @param string $taxonomy the taxonomy name - * - * @return array<int,WP_Term> - */ - function amnesty_term_list_block_get_terms( string $taxonomy ) { - return get_terms( - [ - 'taxonomy' => $taxonomy, - 'hide_empty' => false, - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query - 'meta_query' => [ - 'relation' => 'AND', - [ - 'relation' => 'OR', - [ - 'key' => 'type', - 'value' => 'default', - 'compare' => '=', - ], - [ - 'key' => 'type', - 'compare' => 'NOT EXISTS', - ], - ], - ], - ] - ); - } -} - -if ( ! function_exists( 'amnesty_render_term_list_block' ) ) { - /** - * Render the Term List block - an A-Z of terms in a taxonomy - * - * @package Amnesty\Blocks - * - * @param array $attributes the block's attributes - * - * @return string - */ - function amnesty_render_term_list_block( array $attributes = [] ) { - $args = wp_parse_args( - $attributes, - [ - /* translators: [front] default for https://wordpresstheme.amnesty.org/blocks/b028-term-a-z/ editable in CMS */ - 'title' => __( 'A-Z of Countries and Regions', 'amnesty' ), - 'taxonomy' => '', - 'alignment' => '', - ] - ); - - if ( ! taxonomy_exists( $args['taxonomy'] ) ) { - return ''; - } - - $cache_key = md5( sprintf( '%s:%s', __FUNCTION__, $args['taxonomy'] ) ); - $terms = wp_cache_get( $cache_key ); - - if ( ! $terms ) { - $terms = amnesty_term_list_block_get_terms( $args['taxonomy'] ); - wp_cache_add( $cache_key, $terms ); - } - - $groups = group_terms_by_initial_ascii_letter( $terms ); - - foreach ( $groups as $key => &$terms ) { - usort( - $terms, - fn ( WP_Term $a, WP_Term $b ): int => - remove_accents( $a->name ) <=> remove_accents( $b->name ) - ); - } - - $letters = array_keys( $groups ); - $first = $letters[0]; // used in view - - spaceless(); - require realpath( __DIR__ . '/views/term-list.php' ); - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/term-list/views/term-list.php b/wp-content/themes/humanity-theme/includes/blocks/term-list/views/term-list.php deleted file mode 100644 index 2df790fe..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/term-list/views/term-list.php +++ /dev/null @@ -1,21 +0,0 @@ -<aside class="wp-block-amnesty-core-term-list"> - <h2 class="<?php echo esc_attr( $args['alignment'] ? sprintf( 'u-text%s', ucfirst( $args['alignment'] ) ) : '' ); ?>"><?php echo esc_html( $args['title'] ); ?></h2> - <div class="navigation"> - <?php foreach ( $letters as $letter ) : ?> - <button class="<?php echo esc_attr( $first === $letter ? 'is-active' : '' ); ?>" <?php disabled( empty( $groups[ $letter ] ) ); ?>><?php echo esc_html( $letter ); ?></button> - <?php endforeach; ?> - </div> - <div class="listContainer"> - <div class="activeLetter"><?php echo esc_html( $first ); ?></div> - <?php foreach ( $letters as $letter ) : ?> - <?php if ( empty( $groups[ $letter ] ) ) continue; // phpcs:ignore Generic.ControlStructures.InlineControlStructure.NotAllowed ?> - <ul class="listItems" data-key="<?php echo esc_attr( $letter ); ?>" style="display:<?php echo esc_attr( $first === $letter ? 'flex' : 'none' ); ?>"> - <?php foreach ( $groups[ $letter ] as $_term ) : ?> - <li class="listItem"> - <a href="<?php echo esc_url( amnesty_term_link( $_term ) ); ?>"><?php echo esc_html( $_term->name ); ?></a> - </li> - <?php endforeach; ?> - </ul> - <?php endforeach; ?> - </div> -</aside> diff --git a/wp-content/themes/humanity-theme/includes/blocks/tweet-action/register.php b/wp-content/themes/humanity-theme/includes/blocks/tweet-action/register.php deleted file mode 100644 index 77562cfd..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/tweet-action/register.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_tweet_action_block' ) ) { - /** - * Register the Tweet Action block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_tweet_action_block(): void { - register_block_type( - 'amnesty-core/tweet-block', - [ - 'render_callback' => 'amnesty_render_tweet_action', - 'editor_script' => 'amnesty-core-blocks-js', - 'attributes' => [ - 'title' => [ - 'type' => 'string', - ], - 'content' => [ - 'type' => 'string', - ], - 'size' => [ - 'type' => 'string', - ], - 'alignment' => [ - 'type' => 'string', - ], - 'embedLink' => [ - 'type' => 'boolean', - 'default' => false, - ], - ], - ] - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/blocks/tweet-action/render.php b/wp-content/themes/humanity-theme/includes/blocks/tweet-action/render.php deleted file mode 100644 index d8c0ff55..00000000 --- a/wp-content/themes/humanity-theme/includes/blocks/tweet-action/render.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_render_tweet_action' ) ) { - /** - * Render a tweet action block - * - * @package Amnesty\Blocks - * - * @param array $attributes the block attributes - * - * @return string - */ - function amnesty_render_tweet_action( array $attributes = [] ): string { - $attributes = wp_parse_args( - $attributes, - [ - 'className' => '', - 'size' => '', - 'alignment' => 'center', - ] - ); - - $tweet_url = get_permalink(); - $share_base = 'https://twitter.com/intent/tweet'; - $full_url = sprintf( '%s?text=%s', $share_base, rawurlencode( $attributes['content'] ?? '' ) ); - $block_classes = $attributes['className'] . ' tweetAction'; - - if ( 'narrow' === $attributes['size'] ) { - $block_classes .= ' tweetAction--narrow'; - } - - spaceless(); - - ?> - - <div class="tweetBlock align-<?php echo esc_attr( $attributes['alignment'] ); ?>"> - <div class="<?php echo esc_attr( $block_classes ); ?>"> - <div class="tweetAction-header"> - <span class="dashicons dashicons-twitter" aria-label="<?php /* translators: [front] ARIA */ esc_attr_e( 'Twitter Logo', 'amnesty' ); ?>"></span> - <?php if ( isset( $attributes['title'] ) ) : ?> - <h3 class="tweetAction-title"><?php echo esc_html( $attributes['title'] ); ?></h3> - <?php endif; ?> - </div> - <div class="tweetAction-content"> - <?php echo esc_html( $attributes['content'] ); ?> - - <?php if ( $attributes['embedLink'] && $tweet_url ) : ?> - <p class="tweetAction-embed"> - <?php echo esc_html( $tweet_url ); ?> - </p> - <?php endif; ?> - </div> - <div class="tweetButton"> - <a class="btn btn--fill btn--large" href="<?php echo esc_url( $full_url ); ?>" target="_blank" rel="noopener noreferrer" aria-label="<?php /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b012-tweet-action/ */ esc_attr_e( 'Send this Tweet', 'amnesty' ); ?>"> - <?php /* translators: [front] https://wordpresstheme.amnesty.org/blocks/b012-tweet-action/ */ esc_html_e( 'Send this Tweet', 'amnesty' ); ?> - </a> - </div> - </div> - </div> - - <?php - - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/features/related-content/class-related-content.php b/wp-content/themes/humanity-theme/includes/features/related-content/class-related-content.php index 0b3e47c8..bcf70c02 100644 --- a/wp-content/themes/humanity-theme/includes/features/related-content/class-related-content.php +++ b/wp-content/themes/humanity-theme/includes/features/related-content/class-related-content.php @@ -122,7 +122,7 @@ public function get_raw(): string { ); $markup .= sprintf( - '<!-- wp:amnesty-core/block-list %s /-->', + '<!-- wp:amnesty-core/post-list %s /-->', wp_json_encode( $block_data, JSON_UNESCAPED_UNICODE ) ); @@ -150,7 +150,7 @@ public function get_rendered(): string { ); $block_comment = sprintf( - '<!-- wp:amnesty-core/block-list %s /-->', + '<!-- wp:amnesty-core/post-list %s /-->', wp_json_encode( $block_data, JSON_UNESCAPED_UNICODE ) ); @@ -214,9 +214,13 @@ protected function get_api_object_terms( array $taxonomy_data ): void { continue; } - $terms = $taxonomy_data[ $taxonomy->name ]; - $terms = array_map( fn ( int $id ) => get_term( $id, $taxonomy->name ), $terms ); - $terms = array_filter( $terms, fn ( $term ): bool => is_a( $term, WP_Term::class ) ); + $terms = array_map( 'absint', $taxonomy_data[ $taxonomy->name ] ); + $terms = get_terms( + [ + 'taxonomy' => $taxonomy->name, + 'terms' => $terms, + ] + ); $this->terms[ $taxonomy->name ] = $terms; } @@ -228,18 +232,21 @@ protected function get_api_object_terms( array $taxonomy_data ): void { return; } - foreach ( $this->terms[ $location_slug ] as $index => $location ) { - $term = get_term( $location, $location_slug ); + $locations = get_terms( + [ + 'taxonomy' => $location_slug, + 'terms' => $this->terms[ $location_slug ], + ], + ); - if ( 'default' !== amnesty_get_location_type( $term ) || ! is_a( $term, WP_Term::class ) ) { - unset( $this->terms[ $location_slug ][ $index ] ); + foreach ( $locations as $index => $location ) { + if ( 'default' !== amnesty_get_location_type( $location ) ) { + unset( $locations[ $index ] ); continue; } - - $this->terms[ $location_slug ][ $index ] = $term; } - $this->terms[ $location_slug ] = array_values( $this->terms[ $location_slug ] ); + $this->terms[ $location_slug ] = array_values( $locations ); } /** diff --git a/wp-content/themes/humanity-theme/includes/features/related-content/class-wp-rest-related-content-controller.php b/wp-content/themes/humanity-theme/includes/features/related-content/class-wp-rest-related-content-controller.php index b8eb19f0..6f2bcbb9 100644 --- a/wp-content/themes/humanity-theme/includes/features/related-content/class-wp-rest-related-content-controller.php +++ b/wp-content/themes/humanity-theme/includes/features/related-content/class-wp-rest-related-content-controller.php @@ -7,12 +7,14 @@ use WP_REST_Controller; use WP_REST_Server; +use function Amnesty\related_content_field_request_args; + add_action( 'rest_api_init', function (): void { $controller = new WP_REST_Related_Content_Controller(); $controller->register_routes(); - } + } ); /** @@ -66,7 +68,7 @@ public function register_routes() { 'permission_callback' => [ $this, 'get_items_permissions_check' ], 'args' => $this->get_args_for_request(), ], - ] + ] ); } @@ -112,9 +114,10 @@ public function get_items_permissions_check( $request ) { * @return \WP_REST_Response|\WP_Error Response object on success, or WP_Error object on failure. */ public function get_items( $request ) { - $post = get_post( absint( $request['id'] ) ); + $pid = absint( $request['id'] ); + $post = get_post( $pid ); - if ( is_wp_error( $post ) ) { + if ( ! $pid || is_wp_error( $post ) ) { return $post; } @@ -219,31 +222,7 @@ protected function check_is_post_type_allowed( $post_type ) { * @return array<string,array<string,mixed>> */ protected function get_args_for_request(): array { - $args = []; - - $taxonomies = get_taxonomies( - [ - 'amnesty' => true, - 'public' => true, - ], - 'objects' - ); - - $taxonomies = apply_filters( 'amnesty_related_content_taxonomies', $taxonomies ); - - foreach ( $taxonomies as $taxonomy ) { - $args[ $taxonomy->name ] = [ - // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - 'description' => sprintf( __( 'The terms assigned to the post in the %s taxonomy.' ), $taxonomy->name ), - 'type' => 'array', - 'items' => [ - 'type' => 'integer', - ], - 'context' => [ 'view', 'edit' ], - ]; - } - - return $args; + return related_content_field_request_args(); } } diff --git a/wp-content/themes/humanity-theme/includes/features/related-content/rest-api-field.php b/wp-content/themes/humanity-theme/includes/features/related-content/rest-api-field.php new file mode 100644 index 00000000..1d29418f --- /dev/null +++ b/wp-content/themes/humanity-theme/includes/features/related-content/rest-api-field.php @@ -0,0 +1,95 @@ +<?php + +declare( strict_types = 1 ); + +namespace Amnesty; + +add_action( 'rest_api_init', '\Amnesty\register_related_content_field' ); + +/** + * Build request args for a post to retrieve related content + * + * @return array<string,array<string,mixed>> + */ +function related_content_field_request_args(): array { + $args = []; + + $taxonomies = get_taxonomies( + [ + 'amnesty' => true, + 'public' => true, + ], + 'objects' + ); + + $taxonomies = apply_filters( 'amnesty_related_content_taxonomies', $taxonomies ); + + foreach ( $taxonomies as $taxonomy ) { + $args[ $taxonomy->name ] = [ + // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment + 'description' => sprintf( __( 'The terms assigned to the post in the %s taxonomy.' ), $taxonomy->name ), + 'type' => 'array', + 'items' => [ + 'type' => 'integer', + ], + 'context' => [ 'view', 'edit' ], + ]; + } + + return $args; +} + +/** + * Retrieve related content for a post + * + * @param array<string,mixed> $post the post data + * + * @return array<int,int> + */ +function related_content_field_get_callback( array $post ): array { + $cache_key = sprintf( '%s-%s', __FUNCTION__, $post['id'] ); + $cached = wp_cache_get( $cache_key, 'related' ); + + if ( is_array( $cached ) ) { + return $cached; + } + + $related = new Related_Content( false, $post['id'] ); + $taxonomies = []; + + foreach ( array_keys( related_content_field_request_args() ) as $taxonomy ) { + if ( ! isset( $post[ $taxonomy ] ) ) { + continue; + } + + $taxonomies[ $taxonomy ] = $post[ $taxonomy ]; + } + + $related = $related->get_api_data( $taxonomies ); + + $expiry = 10 * MINUTE_IN_SECONDS; + if ( count( $taxonomies ) && count( $related ) ) { + $expiry = HOUR_IN_SECONDS; + } + + // phpcs:ignore WordPressVIPMinimum.Performance.LowExpiryCacheTime.CacheTimeUndetermined + wp_cache_set( $cache_key, $related, 'related', $expiry ); + + return $related; +} + +/** + * Adds related content as a property on post objects in the REST API + * + * @return void + */ +function register_related_content_field(): void { + register_rest_field( + 'post', + 'relatedContent', + [ + 'get_callback' => '\Amnesty\related_content_field_get_callback', + 'update_callback' => null, + ], + ); +} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/block.json b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/block.json deleted file mode 100644 index 0566e760..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/block.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", - "apiVersion": 2, - "name": "amnesty-core/archive-filters", - "title": "Archive Filters", - "description": "For presenting filters on archive pages", - "textdomain": "amnesty", - "category": "amnesty-core", - "icon": "editor-table", - "keywords": ["Archives", "Filters"], - "supports": { - "inserter": false - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/register.php deleted file mode 100644 index d694dbf0..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/register.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_archive_filters_block' ) ) { - /** - * Register the archive filters block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_archive_filters_block(): void { - register_block_type_from_metadata( - __DIR__, - [ - 'render_callback' => 'render_archive_filters_block', - ], - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/render.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/render.php deleted file mode 100644 index f50f34ae..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-filters/render.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_archive_filters_block' ) ) { - /** - * Render the archive filters block - * - * @return string - */ - function render_archive_filters_block(): string { - spaceless(); - - echo '<div class="section section--tinted">'; - get_template_part( 'partials/archive/filters' ); - echo '</div>'; - - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/block.json b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/block.json deleted file mode 100644 index f68f9f2a..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/block.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", - "apiVersion": 2, - "name": "amnesty-core/archive-header", - "title": "Archive Header", - "description": "For presenting the archive header", - "textdomain": "amnesty", - "category": "amnesty-core", - "icon": "editor-table", - "keywords": ["Archive Header"], - "supports": { - "align": false, - "inserter": false, - "multiple": false - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/register.php deleted file mode 100644 index a5c8d28c..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/register.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_archive_header_block' ) ) { - /** - * Register the archive header block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_archive_header_block(): void { - register_block_type_from_metadata( - __DIR__, - [ - 'render_callback' => 'render_archive_header_block', - ], - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/render.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/render.php deleted file mode 100644 index 1fd66111..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/archive-header/render.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_archive_header_block' ) ) { - /** - * Render the post search block - * - * @return string - */ - function render_archive_header_block(): string { - spaceless(); - - get_template_part( 'partials/archive/header' ); - - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/block.json b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/block.json deleted file mode 100644 index f9afc9a9..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", - "apiVersion": 2, - "name": "amnesty-core/pop-in", - "title": "Pop-in", - "description": "For presenting dismissible content at the top of the site", - "textdomain": "amnesty", - "category": "amnesty-core", - "icon": "editor-table", - "keywords": ["Pop-in"], - "supports": { - "align": false, - "multiple": false - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/register.php deleted file mode 100644 index 145a8051..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/register.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_pop_in_block' ) ) { - /** - * Register the pop-in block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_pop_in_block(): void { - if ( ! amnesty_feature_is_enabled( 'pop-in' ) ) { - return; - } - - register_block_type_from_metadata( - __DIR__, - [ - 'render_callback' => 'render_pop_in_block', - ], - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/render.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/render.php deleted file mode 100644 index 59cb5d56..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/pop-in/render.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_pop_in_block' ) ) { - /** - * Render the pop-in block - * - * @param array<string,mixed> $attributes block attributes - * @param string $content block content - * - * @return string - */ - function render_pop_in_block( array $attributes = [], string $content = '' ): string { - if ( ! $content ) { - return ''; - } - - $pop_in = '<aside id="pop-in" class="u-textCenter pop-in is-closed">'; - $pop_in .= '<button id="pop-in-close" class="pop-in-close">X</button>'; - $pop_in .= '<div class="section section--small">'; - $pop_in .= '<div class="container container--small">'; - $pop_in .= $content; - $pop_in .= '</div>'; - $pop_in .= '</div>'; - $pop_in .= '</aside>'; - - return $pop_in; - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/block.json b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/block.json deleted file mode 100644 index 80b62c32..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", - "apiVersion": 2, - "name": "amnesty-core/query-count", - "title": "Query Count", - "description": "Display the query results count", - "ancestor": ["core/query"], - "textdomain": "amnesty", - "category": "theme", - "icon": "info", - "usesContext": ["queryId", "query"], - "supports": { - "inserter": false - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/register.php deleted file mode 100644 index 9e548c62..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/register.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_query_count_block' ) ) { - /** - * Register the Query Count block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_query_count_block(): void { - register_block_type_from_metadata( - __DIR__, - [ - 'render_callback' => 'render_query_count_block', - ], - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/render.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/render.php deleted file mode 100644 index 6f27f3eb..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/query-count/render.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_query_count_block' ) ) { - /** - * Render the Query Count block - * - * @return string - */ - function render_query_count_block(): string { - global $wp_query; - - $found_posts = absint( $wp_query->found_posts ); - $formatted = number_format_i18n( $found_posts ); - - /* translators: Singular/Plural number of posts. */ - $results = sprintf( _n( '%s result', '%s results', $found_posts, 'amnesty' ), $formatted ); - - if ( is_search() && get_search_query() ) { - /* translators: 1: number of results for search query, 2: don't translate (dynamic search term) */ - $results = sprintf( _n( "%1\$s result for '%2\$s'", "%1\$s results for '%2\$s'", $found_posts, 'amnesty' ), $formatted, get_search_query() ); - } - - $results = apply_filters( 'amnesty_search_results_title', $results, $found_posts, get_search_query() ); - - return sprintf( '<h2 class="wp-block-amnesty-core-query-count postlist-headerTitle">%s</h2>', esc_html( $results ) ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/register.php deleted file mode 100644 index 5f8c478f..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/register.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -require_once realpath( __DIR__ ) . '/archive-filters/register.php'; -require_once realpath( __DIR__ ) . '/archive-filters/render.php'; -require_once realpath( __DIR__ ) . '/archive-header/register.php'; -require_once realpath( __DIR__ ) . '/archive-header/render.php'; -require_once realpath( __DIR__ ) . '/pop-in/register.php'; -require_once realpath( __DIR__ ) . '/pop-in/render.php'; -require_once realpath( __DIR__ ) . '/query-count/register.php'; -require_once realpath( __DIR__ ) . '/query-count/render.php'; -require_once realpath( __DIR__ ) . '/search-form/register.php'; -require_once realpath( __DIR__ ) . '/search-form/render.php'; -require_once realpath( __DIR__ ) . '/search-header/register.php'; -require_once realpath( __DIR__ ) . '/search-header/render.php'; -require_once realpath( __DIR__ ) . '/sidebar/register.php'; -require_once realpath( __DIR__ ) . '/sidebar/render.php'; - -if ( ! function_exists( 'amnesty_register_full_site_editing_blocks' ) ) { - /** - * Register FSE blocks - * - * @package Amnesty\Blocks - * - * @return void - */ - function amnesty_register_full_site_editing_blocks(): void { - register_archive_filters_block(); - register_archive_header_block(); - register_pop_in_block(); - register_query_count_block(); - register_search_form_block(); - register_search_header_block(); - register_sidebar_block(); - } -} - - -add_action( 'init', 'amnesty_register_full_site_editing_blocks' ); diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/block.json b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/block.json deleted file mode 100644 index e24e6de5..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/block.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", - "apiVersion": 2, - "name": "amnesty-core/search-form", - "title": "Search Form", - "description": "For presenting the search form", - "textdomain": "amnesty", - "category": "amnesty-core", - "icon": "editor-table", - "keywords": ["Search Form"], - "supports": { - "align": false, - "inserter": false, - "multiple": false - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/register.php deleted file mode 100644 index 7ca10883..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/register.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_search_form_block' ) ) { - /** - * Register the site header block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_search_form_block(): void { - register_block_type_from_metadata( - __DIR__, - [ - 'render_callback' => 'render_search_form_block', - ], - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/render.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/render.php deleted file mode 100644 index 73e8541e..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-form/render.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_search_form_block' ) ) { - /** - * Render the site header block - * - * @return string - */ - function render_search_form_block(): string { - spaceless(); - get_template_part( 'partials/search/horizontal-search' ); - - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/block.json b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/block.json deleted file mode 100644 index 979a930a..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/block.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", - "apiVersion": 2, - "name": "amnesty-core/search-header", - "title": "Search Header", - "description": "For presenting the search page header", - "textdomain": "amnesty", - "category": "amnesty-core", - "icon": "editor-table", - "keywords": ["Search Header"], - "usesContext": ["query"], - "supports": { - "align": false, - "inserter": false, - "multiple": false - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/register.php deleted file mode 100644 index 6a9b6042..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/register.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_search_header_block' ) ) { - /** - * Register the search header block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_search_header_block(): void { - register_block_type_from_metadata( - __DIR__, - [ - 'render_callback' => 'render_search_header_block', - ], - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/render.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/render.php deleted file mode 100644 index 7ce7621c..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/render.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'render_search_header_block' ) ) { - /** - * Render the post search header block - * - * @param array<string,mixed> $attributes block attributes - * @param string $content block content - * @param WP_Block $block block object - * - * @return string - */ - function render_search_header_block( array $attributes, string $content, WP_Block $block ): string { - /** - * The core/query block neither instantiates nor executes - * the query declared in it. For some reason, that's done - * in core/post-template. - * - * This means that anything you'd like to output that has - * or requires query context can't actually access it - * before core/post-template has been output. This is - * highly inconvenient for displaying things like this - * block would like to - the number of posts found, total - * pages, etc - as we have to essentially re-run the query. - * - * Thankfully, since we provide the query context to this - * block, re-execution of the query by the core/post-template - * block should theoretically pull it from the object cache. - * - * It's still very much not ideal, but I don't see an alternative. - * - * - @jaymcp - */ - $query = build_query_vars_from_query_block( $block->context['query'], get_query_var( 'paged', 1 ) ); - $query = new WP_Query( $query ); - - spaceless(); - - require __DIR__ . '/views/view.php'; - - return endspaceless( false ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/views/view.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/views/view.php deleted file mode 100644 index 9d63e326..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/search-header/views/view.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php - -$found_posts = absint( $query->found_posts ); -$found_posts_fmt = number_format_i18n( $found_posts ); -$current_sort = get_query_var( 'sort' ) ?: ( $GLOBALS['wp']->query_vars['sort'] ?? '' ); -$available_sorts = amnesty_valid_sort_parameters(); - -/* translators: Singular/Plural number of posts. */ -$results = sprintf( _n( '%s result', '%s results', $found_posts, 'amnesty' ), $found_posts_fmt ); - -if ( is_search() && get_search_query() ) { - /* translators: 1: number of results for search query, 2: don't translate (dynamic search term) */ - $results = sprintf( _n( "%1\$s result for '%2\$s'", "%1\$s results for '%2\$s'", $found_posts, 'amnesty' ), $found_posts_fmt, get_search_query() ); -} - -$results = apply_filters( 'amnesty_search_results_title', $results, $found_posts, get_search_query() ); - -?> - -<!-- wp:group {"tagName":"header","className":"postlist-header"} --> -<header class="wp-block-group postlist-header"> - <!-- wp:heading {"className":"postlist-headerTitle"} --> - <h2 class="wp-block-heading postlist-headerTitle"> - <?php echo esc_html( $results ); ?> - </h2> - <!-- /wp:heading --> - <?php - - if ( ! is_admin() && ! ( defined( 'REST_REQUEST' ) && ! REST_REQUEST ) ) { - $current_sort_option = $available_sorts[ $current_sort ] ?? null; - - // move current sort to the top of the list - if ( $current_sort_option ) { - unset( $available_sorts[ $current_sort ] ); - $available_sorts = [ $current_sort => $current_sort_option ] + $available_sorts; - } - - amnesty_render_custom_select( - [ - 'label' => __( 'Sort by', 'amnesty' ), - 'show_label' => true, - 'name' => 'sort', - 'is_form' => true, - 'multiple' => false, - 'options' => $available_sorts, - ] - ); - } - - ?> -</header> -<!-- /wp:group --> diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/block.json b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/block.json deleted file mode 100644 index 813823cd..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/block.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/WordPress/gutenberg/trunk/schemas/json/block.json", - "apiVersion": 2, - "name": "amnesty-core/sidebar", - "title": "Sidebar", - "description": "For presenting a sidebar on a post type", - "textdomain": "amnesty", - "category": "amnesty-core", - "icon": "editor-table", - "supports": { - "align": false, - "multiple": false - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/register.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/register.php deleted file mode 100644 index 2e5613b3..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/register.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'register_sidebar_block' ) ) { - /** - * Register the sidebar block - * - * @package Amnesty\Blocks - * - * @return void - */ - function register_sidebar_block(): void { - register_block_type_from_metadata( - __DIR__, - [ - 'render_callback' => 'render_sidebar_block', - ], - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/render.php b/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/render.php deleted file mode 100644 index 8d4337ed..00000000 --- a/wp-content/themes/humanity-theme/includes/full-site-editing/blocks/sidebar/render.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_get_sidebar_id' ) ) { - /** - * Get the correct sidbar ID for the current object - * - * @return int - */ - function amnesty_get_sidebar_id(): int { - // post-level override - $sidebar_id = absint( get_post_meta( get_the_ID(), '_sidebar_id', true ) ); - - if ( $sidebar_id ) { - return $sidebar_id; - } - - // global default - return match ( get_post_type() ) { - 'page' => absint( amnesty_get_option( '_default_sidebar_page' )[0] ?? 0 ), - default => absint( amnesty_get_option( '_default_sidebar' )[0] ?? 0 ), - }; - } -} - -if ( ! function_exists( 'amnesty_is_sidebar_available' ) ) { - /** - * Check whether a sidebar is available to render for the current object - * - * @return bool - */ - function amnesty_is_sidebar_available(): bool { - $sidebar = get_post( amnesty_get_sidebar_id() ); - - return is_a( $sidebar, WP_Post::class ) && - 'publish' === $sidebar->post_status && - 'sidebar' === $sidebar->post_type; - } -} - -if ( ! function_exists( 'render_sidebar_block' ) ) { - /** - * Render the sidebar block - * - * @return string - */ - function render_sidebar_block(): string { - $content_maximised = amnesty_validate_boolish( - get_post_meta( get_the_ID(), '_maximize_post_content', true ), - false, - ); - - if ( $content_maximised ) { - return ''; - } - - $sidebar_disabled = amnesty_validate_boolish( - get_post_meta( get_the_ID(), '_disable_sidebar', true ), - false, - ); - - if ( $sidebar_disabled ) { - if ( is_page() ) { - return ''; - } - - // empty element is intentional - return '<aside class="wp-block-group article-sidebar"></aside>'; - } - - if ( ! amnesty_is_sidebar_available() ) { - return ''; - } - - $sidebar = get_post( amnesty_get_sidebar_id() ); - - return sprintf( - '<aside class="wp-block-group article-sidebar">%s</aside>', - apply_filters( 'the_content', $sidebar->post_content ?? '' ), - ); - } -} diff --git a/wp-content/themes/humanity-theme/includes/helpers/frontend.php b/wp-content/themes/humanity-theme/includes/helpers/frontend.php index a09a0ea1..2a3e6a29 100644 --- a/wp-content/themes/humanity-theme/includes/helpers/frontend.php +++ b/wp-content/themes/humanity-theme/includes/helpers/frontend.php @@ -8,7 +8,7 @@ * * @package Amnesty * - * @param array $params { + * @param array $params { * @type string $name the identifier for the select * @type string $label the label shown for the select * @type bool $is_form whether to output a form or a div @@ -16,10 +16,26 @@ * @type string $active the pre-selected option's value * @type array $options the list of options in value=>label pairs * } + * @param string $context the kses context. Default "filter" * * @return void */ - function amnesty_render_custom_select( array $params = [] ): void { + function amnesty_render_custom_select( array $params = [], string $context = 'filter' ): void { + $params_to_attributes = [ + 'active' => 'active', + 'class' => 'className', + 'disabled' => 'isDisabled', + 'is_control' => 'isControl', + 'is_form' => 'isForm', + 'is_nav' => 'isNav', + 'label' => 'label', + 'multiple' => 'multiple', + 'name' => 'name', + 'options' => 'options', + 'show_label' => 'showLabel', + 'type' => 'type', + ]; + $params = wp_parse_args( $params, [ @@ -28,52 +44,30 @@ function amnesty_render_custom_select( array $params = [] ): void { 'show_label' => false, 'name' => amnesty_rand_str( 8 ), 'is_form' => false, - 'is_control' => false, + 'is_control' => true, 'is_nav' => false, 'multiple' => false, 'disabled' => false, 'active' => '', 'class' => '', + 'type' => 'filter', 'options' => [ /* translators: [front] AM not sure yet */ - 'label' => __( 'Choose an option', 'amnesty' ), - 'is_form' => false, - 'active' => '', - 'class' => '', - 'options' => [ - /* translators: [front] AM not sure yet */ - '' => __( 'Choose an option', 'amnesty' ), - ], + '' => __( 'Choose an option', 'amnesty' ), ], ] ); - $is_form = amnesty_validate_boolish( $params['is_form'] ); - - if ( ! $is_form ) { - unset( $params['type'] ); - } - - if ( ! empty( $params['type'] ) && ! in_array( $params['type'], [ 'nav', 'filter' ], true ) ) { - $params['type'] = 'filter'; + $attributes = []; + foreach ( $params as $key => $value ) { + if ( isset( $params_to_attributes[ $key ] ) ) { + $attributes[ $params_to_attributes[ $key ] ] = $value; + } } - if ( true === $params['multiple'] ) { - require locate_template( 'partials/forms/multiselect.php' ); - return; - } - - if ( true === $params['is_form'] ) { - require locate_template( 'partials/forms/select-form.php' ); - return; - } + $block = '<!-- wp:amnesty-core/custom-select ' . wp_json_encode( $attributes ) . ' /-->'; - if ( true === $params['is_nav'] ) { - require locate_template( 'partials/forms/select-nav.php' ); - return; - } - - require locate_template( 'partials/forms/select-control.php' ); + echo wp_kses( do_blocks( $block ), $context ); } } @@ -111,3 +105,40 @@ function amnesty_render_blocks( array $blocks ): string { return implode( '', array_map( 'render_block', $blocks ) ); } } + +if ( ! function_exists( 'amnesty_get_sidebar_id' ) ) { + /** + * Get the correct sidbar ID for the current object + * + * @return int + */ + function amnesty_get_sidebar_id(): int { + // post-level override + $sidebar_id = absint( get_post_meta( get_the_ID(), '_sidebar_id', true ) ); + + if ( $sidebar_id ) { + return $sidebar_id; + } + + // global default + return match ( get_post_type() ) { + 'page' => absint( amnesty_get_option( '_default_sidebar_page' )[0] ?? 0 ), + default => absint( amnesty_get_option( '_default_sidebar' )[0] ?? 0 ), + }; + } +} + +if ( ! function_exists( 'amnesty_is_sidebar_available' ) ) { + /** + * Check whether a sidebar is available to render for the current object + * + * @return bool + */ + function amnesty_is_sidebar_available(): bool { + $sidebar = get_post( amnesty_get_sidebar_id() ); + + return is_a( $sidebar, WP_Post::class ) && + 'publish' === $sidebar->post_status && + 'sidebar' === $sidebar->post_type; + } +} diff --git a/wp-content/themes/humanity-theme/includes/helpers/taxonomies.php b/wp-content/themes/humanity-theme/includes/helpers/taxonomies.php index 9de53ef7..7b328eb1 100644 --- a/wp-content/themes/humanity-theme/includes/helpers/taxonomies.php +++ b/wp-content/themes/humanity-theme/includes/helpers/taxonomies.php @@ -903,3 +903,24 @@ function amnesty_limit_post_terms_results_for_search( array $terms ): array { return $terms; } } + +if ( ! function_exists( 'amnesty_get_taxonomy_slug_from_rest_base' ) ) { + /** + * Retrieve a taxonomy slug from its rest base + * + * @param string $base the taxonomy rest base + * + * @return string + */ + function amnesty_get_taxonomy_slug_from_rest_base( string $base ): string { + $taxonomies = get_taxonomies( output: 'objects' ); + + foreach ( $taxonomies as $taxonomy ) { + if ( $taxonomy->rest_base === $base ) { + return $taxonomy->name; + } + } + + return $base; + } +} diff --git a/wp-content/themes/humanity-theme/includes/theme-setup/scripts-and-styles.php b/wp-content/themes/humanity-theme/includes/theme-setup/scripts-and-styles.php deleted file mode 100644 index f595f970..00000000 --- a/wp-content/themes/humanity-theme/includes/theme-setup/scripts-and-styles.php +++ /dev/null @@ -1,354 +0,0 @@ -<?php - -declare( strict_types = 1 ); - -if ( ! function_exists( 'amnesty_asset_uri' ) ) { - /** - * Get asset/$folder dir URI. - * - * @package Amnesty\ThemeSetup - * @example echo asset_uri('images'); - * - * @param string $folder Folder. - * - * @return string - */ - function amnesty_asset_uri( $folder ) { - return get_template_directory_uri() . '/assets/' . $folder; - } -} - -if ( ! function_exists( 'amnesty_admin_styles' ) ) { - /** - * Enqueue admin styles. - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_admin_styles() { - $theme = wp_get_theme(); - - wp_enqueue_style( 'theme-admin', amnesty_asset_uri( 'styles' ) . '/admin.css', [], $theme->get( 'Version' ), 'all' ); - wp_enqueue_script( 'theme-admin', amnesty_asset_uri( 'scripts' ) . '/admin.js', [ 'jquery-core', 'lodash' ], $theme->get( 'Version' ), true ); - wp_add_inline_style( 'theme-admin', '.nopad th,.nopad td{padding:0}' ); - - $ol_characters = amnesty_get_option( 'ol_locale_option', 'amnesty_localisation_options_page' ); - if ( $ol_characters ) { - $chosen_ol_format = sprintf( 'ol{list-style-type:%s;}', $ol_characters ); - wp_add_inline_style( 'theme-admin', $chosen_ol_format ); - } - } -} - -add_action( 'admin_enqueue_scripts', 'amnesty_admin_styles' ); - - -if ( ! function_exists( 'amnesty_styles' ) ) { - /** - * Enqueue styles. - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_styles() { - if ( is_admin() || 'wp-login.php' === $GLOBALS['pagenow'] ) { - return; - } - - $theme = wp_get_theme(); - - $style_deps = []; - - if ( wp_style_is( 'woocommerce-general' ) ) { - $style_deps[] = 'woocommerce-general'; - } - - wp_enqueue_style( 'amnesty-theme', amnesty_asset_uri( 'styles' ) . '/bundle.css', $style_deps, $theme->get( 'Version' ), 'all' ); - - $ol_characters = amnesty_get_option( 'ol_locale_option', 'amnesty_localisation_options_page' ); - - if ( $ol_characters ) { - $chosen_ol_format = sprintf( 'ol{list-style-type:%s;}', $ol_characters ); - wp_add_inline_style( 'amnesty-theme', $chosen_ol_format ); - } - - $open_double = _x( '“', 'open double quote', 'amnesty' ); - $close_double = _x( '”', 'close double quote', 'amnesty' ); - $open_single = _x( '‘', 'open single quote', 'amnesty' ); - $close_single = _x( '’', 'close single quote', 'amnesty' ); - - $quotes = sprintf( 'blockquote{quotes:\'%s\' \'%s\' "%s" "%s"}', $open_double, $close_double, $open_single, $close_single ); - wp_add_inline_style( 'amnesty-theme', $quotes ); - - if ( is_singular( 'post' ) ) { - wp_enqueue_style( 'print-styles', amnesty_asset_uri( 'styles' ) . '/print.css', [], $theme->get( 'Version' ), 'print' ); - } - } -} - -add_action( 'wp_enqueue_scripts', 'amnesty_styles', 10 ); - -if ( ! function_exists( 'amnesty_scripts' ) ) { - /** - * Enqueue scripts. - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_scripts() { - if ( is_admin() || 'wp-login.php' === $GLOBALS['pagenow'] ) { - return; - } - - $theme = wp_get_theme(); - - wp_register_script( 'flourish-embed', 'https://public.flourish.studio/resources/embed.js', [], $theme->get( 'Version' ), true ); - wp_register_script( 'tickcounter-sdk', 'https://www.tickcounter.com/static/js/loader.js', [], $theme->get( 'Version' ), true ); - wp_enqueue_script( 'infogram-embed', amnesty_asset_uri( 'scripts' ) . '/infogram-loader.js', [], $theme->get( 'Version' ), false ); - - wp_enqueue_script( 'amnesty-theme', amnesty_asset_uri( 'scripts' ) . '/bundle.js', [ 'lodash', 'wp-i18n' ], $theme->get( 'Version' ), true ); - - $localise_with = [ - 'archive_base_url' => get_pagenum_link( 1, false ), - 'domain' => wp_parse_url( home_url( '/', 'https' ), PHP_URL_HOST ), - 'pop_in_timeout' => 30, - 'active_pop_in' => 0, - ]; - - $pop_in = get_option( 'amnesty_pop_in_options_page' ); - - if ( ! empty( $pop_in ) ) { - $localise_with = array_merge( $localise_with, $pop_in ); - } - - wp_localize_script( 'amnesty-theme', 'amnesty_data', $localise_with ); - } -} - -add_action( 'wp_loaded', 'amnesty_scripts' ); - -if ( ! function_exists( 'amnesty_gutenberg_assets' ) ) { - /** - * Load the Gutenberg assets on the WordPress backend. - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_gutenberg_assets() { - $theme = wp_get_theme(); - - wp_enqueue_script( - 'amnesty-core-blocks-js', - amnesty_asset_uri( 'scripts' ) . '/blocks.js', - [ - 'lodash', - 'wp-blocks', - 'wp-data', - 'wp-edit-post', - 'wp-element', - 'wp-i18n', - 'wp-url', - ], - $theme->get( 'Version' ), - false - ); - - wp_add_inline_script( 'amnesty-core-blocks-js', sprintf( 'var WPVersion="%s"', esc_attr( $GLOBALS['wp_version'] ) ), 'before' ); - wp_localize_script( 'amnesty-core-blocks-js', 'userRoles', wp_get_current_user()->roles ); - wp_localize_script( 'amnesty-core-blocks-js', 'postTypes', amnesty_get_post_types() ); - - $settings = [ - 'petitionForm' => amnesty_feature_is_enabled( 'petitions_form' ), - 'defaultSidebars' => [ - 'post' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar' ) ), - 'page' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar_page' ) ), - 'wp_template' => array_map( 'absint', (array) amnesty_get_option( '_default_sidebar' ) ), // for the site editor - ], - ]; - - $taxonomies = get_taxonomies( - [ - 'amnesty' => true, - 'public' => true, - ], - 'objects' - ); - - $taxonomies = apply_filters( 'amnesty_related_content_taxonomies', $taxonomies ); - - $settings += compact( 'taxonomies' ); - - if ( amnesty_taxonomy_is_enabled( 'location' ) ) { - $settings['locationSlug'] = amnesty_get_taxonomy_slug( 'location' ); - } - - wp_localize_script( 'amnesty-core-blocks-js', 'aiSettings', $settings ); - - if ( current_theme_supports( 'woocommerce' ) ) { - $woo = [ - 'nonce' => wp_create_nonce( 'amnesty-wc' ), - ]; - - if ( function_exists( 'amnesty_get_wooccm_fields' ) ) { - $woo['wooccm'] = amnesty_get_wooccm_fields( - function ( $field ) { - return empty( $field['disabled'] ) && 'select' === $field['type']; - } - ); - } - - wp_localize_script( 'amnesty-core-blocks-js', 'amnestyWC', $woo ); - } - - wp_set_script_translations( 'amnesty-core-blocks-js', 'amnesty', get_template_directory() . '/languages' ); - - wp_enqueue_style( 'amnesty-core-gutenberg', amnesty_asset_uri( 'styles' ) . '/blocks.css', [ 'wp-block-library-theme' ], $theme->get( 'Version' ), 'all' ); - } -} - -add_action( 'enqueue_block_editor_assets', 'amnesty_gutenberg_assets' ); - - -if ( ! function_exists( 'amnesty_localise_javascript' ) ) { - /** - * Localise front/backend scripts - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_localise_javascript() { - if ( ! get_translations_for_domain( 'amnesty' ) ) { - return; - } - - $data = [ - /* translators: [front] */ - 'listSeparator' => _x( ',', 'list item separator', 'amnesty' ), - /* translators: [front] */ - 'openDoubleQuote' => _x( '“', 'open double quote', 'amnesty' ), - /* translators: [front] */ - 'closeDoubleQuote' => _x( '”', 'close double quote', 'amnesty' ), - /* translators: [front] */ - 'openSingleQuote' => _x( '‘', 'open single quote', 'amnesty' ), - /* translators: [front] */ - 'closeSingleQuote' => _x( '’', 'close single quote', 'amnesty' ), - 'currentLocale' => get_locale(), - ]; - - $options = get_option( 'amnesty_localisation_options_page' ); - if ( isset( $options['enforce_grouping_separators'] ) ) { - $data['enforceGroupingSeparators'] = 'on' === $options['enforce_grouping_separators']; - } - - wp_localize_script( 'amnesty-theme', 'amnestyCoreI18n', $data ); - wp_localize_script( 'amnesty-core-blocks-js', 'amnestyCoreI18n', $data ); - } -} - -add_action( 'enqueue_block_editor_assets', 'amnesty_localise_javascript' ); -add_action( 'wp_loaded', 'amnesty_localise_javascript' ); - -if ( ! function_exists( 'amnesty_trigger_scripts' ) ) { - /** - * Register app trigger with CSP and output in footer - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_trigger_scripts(): void { - if ( is_admin() || 'wp-login.php' === $GLOBALS['pagenow'] ) { - return; - } - - $script = 'App.default();'; - add_filter( 'amnesty_csp_script', fn ( $csp ) => sprintf( "%s 'sha256-%s'", $csp, base64_encode( hash( 'sha256', $script, true ) ) ) ); - add_action( 'wp_footer', fn () => printf( '<script>%s</script>', $script ), 100 ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } -} - -add_action( 'wp_loaded', 'amnesty_trigger_scripts', 1 ); - -if ( ! function_exists( 'amnesty_localise_timeinfo' ) ) { - /** - * Get server and setting timezones - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_localise_timeinfo() { - $wordpress_tz = wp_timezone(); - $wordpress_time = wp_date( 'Y-m-d H:i:s', null, $wordpress_tz ); - $server_tz = new DateTimeZone( date_default_timezone_get() ); - $server_time = wp_date( 'Y-m-d H:i:s', null, $server_tz ); - - wp_localize_script( - 'amnesty-core-blocks-js', - 'datetimeInfo', - [ - 'wordpress' => [ - 'time' => $wordpress_time, - 'zone' => $wordpress_tz->getName(), - ], - 'server' => [ - 'time' => $server_time, - 'zone' => $server_tz->getName(), - ], - ] - ); - } -} - -add_action( 'enqueue_block_editor_assets', 'amnesty_localise_timeinfo' ); - -if ( ! function_exists( 'amnesty_enqueue_block_assets' ) ) { - /** - * Enqueue block assets for the full site editor - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_enqueue_block_assets(): void { - if ( ! is_admin() ) { - return; - } - - $theme = wp_get_theme(); - - wp_enqueue_style( 'amnesty-core-editor', amnesty_asset_uri( 'styles' ) . '/editor.css', [], $theme->get( 'Version' ), 'all' ); - } -} - -add_action( 'enqueue_block_assets', 'amnesty_enqueue_block_assets' ); - -if ( ! function_exists( 'amnesty_disable_cart_fragments' ) ) { - /** - * Disable WooCommerce cart fragments on pages that don't require it - * - * @package Amnesty\ThemeSetup - * - * @return void - */ - function amnesty_disable_cart_fragments() { - // woocommerce isn't active - if ( ! defined( 'WC_PLUGIN_FILE' ) ) { - return; - } - - // keep it for woocommerce pages - if ( is_woocommerce() || is_cart() || is_checkout() || is_checkout_pay_page() ) { - return; - } - - wp_dequeue_script( 'wc-cart-fragments' ); - } -} - -add_action( 'wp_enqueue_scripts', 'amnesty_disable_cart_fragments', 200 ); diff --git a/wp-content/themes/humanity-theme/partials/forms/taxonomy-filters.php b/wp-content/themes/humanity-theme/partials/forms/taxonomy-filters.php index be70f2f3..14ee245e 100644 --- a/wp-content/themes/humanity-theme/partials/forms/taxonomy-filters.php +++ b/wp-content/themes/humanity-theme/partials/forms/taxonomy-filters.php @@ -17,7 +17,6 @@ foreach ( $taxonomies as $tax_item ) { amnesty_render_custom_select( [ - /* translators: [front] AM not sure yet */ 'label' => $tax_item->label, 'name' => "q{$tax_item->name}", 'active' => query_var_to_array( "q{$tax_item->name}" ), diff --git a/wp-content/themes/humanity-theme/partials/hero.php b/wp-content/themes/humanity-theme/partials/hero.php index 28db945f..943059fb 100644 --- a/wp-content/themes/humanity-theme/partials/hero.php +++ b/wp-content/themes/humanity-theme/partials/hero.php @@ -15,7 +15,14 @@ $hero_data = amnesty_get_hero_data(); -if ( array_filter( $hero_data ) ) { - echo wp_kses_post( render_hero_block( $hero_data['attrs'], $hero_data['content'], $hero_data['name'] ) ); - add_filter( 'the_content', 'amnesty_remove_first_hero_from_content', 0 ); +if ( ! array_filter( $hero_data ) ) { + return; } + +add_filter( 'the_content', 'amnesty_remove_first_hero_from_content', 0 ); + +?> + +<!-- wp:amnesty-core/hero <?php echo wp_kses_data( wp_json_encode( $hero_data['attrs'] ) ); ?> --> +<?php echo wp_kses_post( $hero_data['content'] ); ?> +<!-- /wp:amnesty-core/hero --> diff --git a/wp-content/themes/humanity-theme/patterns/archive-filters-active.php b/wp-content/themes/humanity-theme/patterns/archive-filters-active.php new file mode 100644 index 00000000..8134e81e --- /dev/null +++ b/wp-content/themes/humanity-theme/patterns/archive-filters-active.php @@ -0,0 +1,105 @@ +<?php + +/** + * Title: Active Filters + * Description: Outputs active filters list for post type archive pages and search + * Slug: amnesty/active-filters + * Inserter: no + */ + +$taxonomies = array_filter( get_object_taxonomies( 'post', 'objects' ), 'amnesty_filter_object_taxonomies_callback' ); + +$has_active_taxonomy_filters = false; + +if ( $taxonomies ) { + $has_active_taxonomy_filters = map_array_to_boolean( + $taxonomies, + fn ( WP_Taxonomy $tax ): bool => (bool) amnesty_get_query_var( "q{$tax->name}" ) + ); +} + +$has_other_active_filters = false; +$query_vars_for_filters = apply_filters( 'amnesty_archive_filter_query_vars', [ 'qyear', 'qmonth' ] ); +$active_filter_query_vars = []; + +foreach ( $query_vars_for_filters as $filter_var ) { + $filter_value = amnesty_get_query_var( $filter_var ); + + if ( ! $filter_value ) { + continue; + } + + $active_filter_query_vars[ $filter_var ] = apply_filters( + 'amnesty_archive_filter_query_var_value', + sanitize_key( $filter_value ), + $filter_var, + ); +} + +if ( ! $has_active_taxonomy_filters && ! count( $active_filter_query_vars ) ) { + return; +} + +?> + +<!-- wp:group {"tagName":"section","className":"section section--small filter-wrapper"} --> +<section class="wp-block-group section section--small filter-wrapper"> + <!-- wp:heading {"level":4,"className":"filter-label"} --> + <h4 class="wp-block-heading filter-label"><?php /* translators: [front] https://www.amnesty.org/en/latest/?qlocation=1698,1713 */ esc_html_e( 'Filters applied', 'amnesty' ); ?></h4> + <!-- /wp:heading --> + + <!-- wp:list {"className":"active-filters"} --> + <ul class="wp-block-list active-filters"> + <?php + + foreach ( $taxonomies as $tax_item ) { + $data = query_var_to_array( "q{$tax_item->name}" ); + $terms = get_terms_from_query_var( "q{$tax_item->name}", $tax_item->name ); + + foreach ( $terms as $_term ) { + $_link = remove_query_arg( "q{$tax_item->name}" ); + $carry = array_filter( $data, fn ( $v ) => absint( $v ) !== $_term->term_id ); + + if ( ! empty( $carry ) ) { + $_link = add_query_arg( "q{$tax_item->name}", implode( ',', $carry ) ); + } + + printf( + '<!-- wp:list-item -->' . + '<li class="wp-block-list-item"><a class="clear-filter" href="%s">%s</a></li>' . + '<!-- /wp:list-item -->', + esc_url( $_link ), + esc_html( $_term->name ), + ); + } + } + + foreach ( $active_filter_query_vars as $filter_var => $filter_value ) { + $_link = remove_query_arg( $filter_var ); + + if ( 'qyear' === $filter_var ) { + $_link = remove_query_arg( 'qmonth', $_link ); + } + + printf( + '<!-- wp:list-item -->' . + '<li><a class="clear-filter" href="%s">%s</a></li>' . + '<!-- /wp:list-item -->', + esc_url( $_link ), + esc_html( $filter_value ), + ); + } + + ?> + + <!-- wp:list-item --> + <li> + <a class="clear-filter clear-filter--all" href="<?php echo esc_url( strip_query_string( current_url() ) ); ?>"> + <?php /* translators: [front] https://www.amnesty.org/en/latest/?qlocation=1698,1713 */ esc_html_e( 'Clear all', 'amnesty' ); ?> + </a> + </li> + <!-- /wp:list-item --> + </ul> + <!-- /wp:list --> +</section> +<!-- /wp:group --> diff --git a/wp-content/themes/humanity-theme/patterns/archive-filters.php b/wp-content/themes/humanity-theme/patterns/archive-filters.php new file mode 100644 index 00000000..cb97cc41 --- /dev/null +++ b/wp-content/themes/humanity-theme/patterns/archive-filters.php @@ -0,0 +1,57 @@ +<?php + +/** + * Title: Archive Filters + * Description: Outputs filters for post type archive pages + * Slug: amnesty/archive-filters + * Inserter: no + */ + +$taxonomies = amnesty_get_object_taxonomies( 'post', 'objects' ); + +if ( ! $taxonomies ) { + return; +} + +$form_url = amnesty_search_url(); + +if ( is_category() ) { + unset( $taxonomies['category'] ); + + // pass category archive id to form URI + $form_url = add_query_arg( [ 'qcategory' => get_queried_object_id() ], $form_url ); +} + +?> +<!-- wp:group {"tagName":"div","className":"section section--tinted"} --> +<div class="wp-block-group section section--tinted"> + <!-- wp:group {"tagName":"section","className":"postlist-categoriesContainer"} --> + <section class="wp-block-group postlist-categoriesContainer" style="display: flex;" data-slider> + <!-- wp:group {"tagName":"form","className":"news-filters","htmlId":"filter-form","action":"<?php echo esc_url( $form_url ); ?>"} --> + <form id="filter-form" class="news-filters" action="<?php echo esc_url( $form_url ); ?>"> + <!-- wp:group {"tagName":"div","className":"taxonomyArchive-filters"} --> + <div class="taxonomyArchive-filters"> + <?php + + foreach ( $taxonomies as $tax_item ) { + $block_args = [ + 'label' => $tax_item->label, + 'name' => "q{$tax_item->name}", + 'active' => query_var_to_array( "q{$tax_item->name}" ), + 'options' => amnesty_taxonomy_to_option_list( $tax_item ), + 'multiple' => true, + ]; + + printf( '<!-- wp:amnesty-core/custom-select %s /-->', wp_kses_data( wp_json_encode( $block_args ) ) ); + } + + ?> + </div> + <!-- /wp:group --> + <button id="search-filters-submit" class="btn btn--dark"><?php /* translators: [front] search results left hand side of page button */ esc_html_e( 'Apply', 'amnesty' ); ?></button> + </form> + <!-- /wp:group --> + </section> + <!-- /wp:group --> +</div> +<!-- /wp:group --> diff --git a/wp-content/themes/humanity-theme/patterns/archive-heading.php b/wp-content/themes/humanity-theme/patterns/archive-heading.php index cce084a9..96ab3157 100644 --- a/wp-content/themes/humanity-theme/patterns/archive-heading.php +++ b/wp-content/themes/humanity-theme/patterns/archive-heading.php @@ -1,9 +1,9 @@ <?php /** - * Title: Archive filters - * Description: Outputs filters for post type archive pages - * Slug: amnesty/archive-filters + * Title: Archive heading + * Description: Outputs the title & description for post type archive pages + * Slug: amnesty/archive-heading * Inserter: no */ diff --git a/wp-content/themes/humanity-theme/patterns/archive-loop-results.php b/wp-content/themes/humanity-theme/patterns/archive-loop-results.php deleted file mode 100644 index fb6f0da5..00000000 --- a/wp-content/themes/humanity-theme/patterns/archive-loop-results.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -/** - * Title: Archive loop results - * Description: Template for the loop on archive pages - * Slug: amnesty/archive-loop-results - * Inserter: no - */ - -global $wp_query; - -$current_sort = amnesty_get_query_var( 'sort' ); -$available_sorts = amnesty_valid_sort_parameters(); - -$current_sort_option = $available_sorts[ $current_sort ] ?? null; - -// move current sort to the top of the list -if ( $current_sort_option ) { - unset( $available_sorts[ $current_sort ] ); - $available_sorts = [ $current_sort => $current_sort_option ] + $available_sorts; -} - -?> -<!-- wp:group {"tagName":"header","className":"postlist-header"} --> -<header class="wp-block-group postlist-header"> - <!-- wp:amnesty-core/query-count /--> - <?php - - // site editor expects blocks or nothing - if ( ! is_admin() && ! ( defined( 'REST_REQUEST' ) && ! REST_REQUEST ) ) { - amnesty_render_custom_select( - [ - 'label' => __( 'Sort by', 'amnesty' ), - 'show_label' => true, - 'name' => 'sort', - 'is_form' => true, - 'multiple' => false, - 'options' => $available_sorts, - ] - ); - } - ?> -</header> -<!-- /wp:group --> diff --git a/wp-content/themes/humanity-theme/patterns/archive-loop.php b/wp-content/themes/humanity-theme/patterns/archive-loop.php index 271db5c7..57672f7f 100644 --- a/wp-content/themes/humanity-theme/patterns/archive-loop.php +++ b/wp-content/themes/humanity-theme/patterns/archive-loop.php @@ -9,12 +9,29 @@ add_filter( 'get_the_terms', 'amnesty_limit_post_terms_results_for_archive' ); +$current_sort = amnesty_get_query_var( 'sort' ); +$available_sorts = amnesty_valid_sort_parameters(); + +$current_sort_option = $available_sorts[ $current_sort ] ?? null; + +// move current sort to the top of the list +if ( $current_sort_option ) { + unset( $available_sorts[ $current_sort ] ); + $available_sorts = [ $current_sort => $current_sort_option ] + $available_sorts; +} + ?> <!-- wp:query {"inherit":true} --> <div class="wp-block-query"> <!-- wp:group {"tagName":"div","className":""} --> <div class="wp-block-group news-section section section--small section--tinted has-gutter"> - <!-- wp:pattern {"slug":"amnesty/archive-loop-results"} /--> + <!-- wp:group {"tagName":"header","className":"postlist-header"} --> + <header class="wp-block-group postlist-header"> + <!-- wp:amnesty-core/search-title /--> + <!-- wp:amnesty-core/custom-select {"label":"<?php esc_html_e( 'Sort by', 'amnesty' ); ?>","showLabel":true,"name":"sort","isForm":true,"multiple":false,"options":<?php echo wp_kses_data( wp_json_encode( $available_sorts ) ); ?>} /--> + </header> + <!-- /wp:group --> + <!-- wp:group {"tagName":"div","className":"postlist"} --> <div class="wp-block-group postlist"> <!-- wp:post-template {"layout":{"type":"grid","columnCount":"4"}} --> diff --git a/wp-content/themes/humanity-theme/patterns/attachment-share.php b/wp-content/themes/humanity-theme/patterns/attachment-share.php index 02a1b3e7..3cf57d22 100644 --- a/wp-content/themes/humanity-theme/patterns/attachment-share.php +++ b/wp-content/themes/humanity-theme/patterns/attachment-share.php @@ -23,6 +23,8 @@ return; } +$image_base_uri = get_template_directory_uri() . '/images'; + spaceless(); ?> @@ -31,14 +33,14 @@ <ul class="wp-block-list article-share"><!-- wp:list-item --> <li> <a class="article-shareFacebook" target="_blank" rel="noreferrer noopener" href="https://www.facebook.com/sharer.php?u=<?php the_permalink(); ?>" title="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ text shows on hover */ esc_attr_e( 'Share on Facebook', 'amnesty' ); ?>"> - <img src="<?php echo esc_url( amnesty_asset_uri( 'images' ) ); ?>/icon-facebook.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Facebook Logo', 'amnesty' ); ?>"> + <img src="<?php echo esc_url( $images_base_uri ); ?>/icon-facebook.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Facebook Logo', 'amnesty' ); ?>"> </a> </li> <!-- /wp:list-item --> <!-- wp:list-item --> <li> <a class="article-shareTwitter" target="_blank" rel="noreferrer noopener" href="https://twitter.com/intent/tweet?url=<?php the_permalink(); ?>&text=<?php the_title(); ?>" title="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ text shows on hover */ esc_attr_e( 'Share on Twitter', 'amnesty' ); ?>"> - <img src="<?php echo esc_url( amnesty_asset_uri( 'images' ) ); ?>/icon-twitter.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Twitter Logo', 'amnesty' ); ?>"> + <img src="<?php echo esc_url( $images_base_uri ); ?>/icon-twitter.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Twitter Logo', 'amnesty' ); ?>"> </a> </li> <!-- /wp:list-item --></ul> diff --git a/wp-content/themes/humanity-theme/patterns/background-media-left-grey.php b/wp-content/themes/humanity-theme/patterns/background-media-left-grey.php index 5d35c22e..b7ac6602 100644 --- a/wp-content/themes/humanity-theme/patterns/background-media-left-grey.php +++ b/wp-content/themes/humanity-theme/patterns/background-media-left-grey.php @@ -18,8 +18,8 @@ <!-- /wp:cover --></div> <!-- /wp:column --> -<!-- wp:column --> -<div class="wp-block-column"><!-- wp:paragraph {"style":{"spacing":{"padding":{"left":"0","right":"1rem"}}}} --> +<!-- wp:column {"style":{"spacing":{"padding":{"top":"var:preset|spacing|single","bottom":"var:preset|spacing|single"}}}} --> +<div class="wp-block-column" style="padding-top:var(--wp--preset--spacing--single);padding-bottom:var(--wp--preset--spacing--single)"><!-- wp:paragraph {"style":{"spacing":{"padding":{"left":"0","right":"1rem"}}}} --> <p style="padding-right:1rem;padding-left:0"></p> <!-- /wp:paragraph --></div> <!-- /wp:column --></div> diff --git a/wp-content/themes/humanity-theme/patterns/background-media-left-white.php b/wp-content/themes/humanity-theme/patterns/background-media-left-white.php index 90bbe38e..ad58d383 100644 --- a/wp-content/themes/humanity-theme/patterns/background-media-left-white.php +++ b/wp-content/themes/humanity-theme/patterns/background-media-left-white.php @@ -18,8 +18,8 @@ <!-- /wp:cover --></div> <!-- /wp:column --> -<!-- wp:column --> -<div class="wp-block-column"><!-- wp:paragraph {"style":{"spacing":{"padding":{"right":"1rem"}}}} --> +<!-- wp:column {"style":{"spacing":{"padding":{"top":"var:preset|spacing|single","bottom":"var:preset|spacing|single"}}}} --> +<div class="wp-block-column" style="padding-top:var(--wp--preset--spacing--single);padding-bottom:var(--wp--preset--spacing--single)"><!-- wp:paragraph {"style":{"spacing":{"padding":{"right":"1rem"}}}} --> <p style="padding-right:1rem"></p> <!-- /wp:paragraph --></div> <!-- /wp:column --></div> diff --git a/wp-content/themes/humanity-theme/patterns/background-media-right-grey.php b/wp-content/themes/humanity-theme/patterns/background-media-right-grey.php index c71f69f2..eb6be46a 100644 --- a/wp-content/themes/humanity-theme/patterns/background-media-right-grey.php +++ b/wp-content/themes/humanity-theme/patterns/background-media-right-grey.php @@ -10,8 +10,8 @@ <!-- wp:group {"className":"is-style-light","layout":{"type":"constrained"}} --> <div class="wp-block-group is-style-light"><!-- wp:columns --> -<div class="wp-block-columns"><!-- wp:column --> -<div class="wp-block-column"><!-- wp:paragraph {"style":{"spacing":{"padding":{"left":"1rem"}}}} --> +<div class="wp-block-columns"><!-- wp:column {"style":{"spacing":{"padding":{"top":"var:preset|spacing|single","bottom":"var:preset|spacing|single"}}}} --> +<div class="wp-block-column" style="padding-top:var(--wp--preset--spacing--single);padding-bottom:var(--wp--preset--spacing--single)"><!-- wp:paragraph {"style":{"spacing":{"padding":{"left":"1rem"}}}} --> <p style="padding-left:1rem"></p> <!-- /wp:paragraph --></div> <!-- /wp:column --> diff --git a/wp-content/themes/humanity-theme/patterns/background-media-right-white.php b/wp-content/themes/humanity-theme/patterns/background-media-right-white.php index dbc545dc..dbb69373 100644 --- a/wp-content/themes/humanity-theme/patterns/background-media-right-white.php +++ b/wp-content/themes/humanity-theme/patterns/background-media-right-white.php @@ -10,8 +10,8 @@ <!-- wp:group {"className":"is-style-default","layout":{"type":"constrained"}} --> <div class="wp-block-group is-style-default"><!-- wp:columns --> -<div class="wp-block-columns"><!-- wp:column --> -<div class="wp-block-column"><!-- wp:paragraph {"style":{"spacing":{"padding":{"left":"1rem"}}}} --> +<div class="wp-block-columns"><!-- wp:column {"style":{"spacing":{"padding":{"top":"var:preset|spacing|single","bottom":"var:preset|spacing|single"}}}} --> +<div class="wp-block-column" style="padding-top:var(--wp--preset--spacing--single);padding-bottom:var(--wp--preset--spacing--single)"><!-- wp:paragraph {"style":{"spacing":{"padding":{"left":"1rem"}}}} --> <p style="padding-left:1rem"></p> <!-- /wp:paragraph --></div> <!-- /wp:column --> diff --git a/wp-content/themes/humanity-theme/patterns/post-hero.php b/wp-content/themes/humanity-theme/patterns/post-hero.php index ccebaa06..a0f293e5 100644 --- a/wp-content/themes/humanity-theme/patterns/post-hero.php +++ b/wp-content/themes/humanity-theme/patterns/post-hero.php @@ -22,8 +22,12 @@ return; } -echo wp_kses_post( render_hero_block( $hero_data['attrs'], $hero_data['content'], $hero_data['name'] ) ); - if ( ! is_admin() ) { add_filter( 'the_content', 'amnesty_remove_first_hero_from_content', 0 ); } + +?> + +<!-- wp:amnesty-core/hero <?php echo wp_kses_data( wp_json_encode( $hero_data['attrs'] ) ); ?> --> +<?php echo wp_kses_post( $hero_data['content'] ); ?> +<!-- /wp:amnesty-core/hero --> diff --git a/wp-content/themes/humanity-theme/patterns/post-share.php b/wp-content/themes/humanity-theme/patterns/post-share.php index 475d226d..9407230d 100644 --- a/wp-content/themes/humanity-theme/patterns/post-share.php +++ b/wp-content/themes/humanity-theme/patterns/post-share.php @@ -13,6 +13,8 @@ return; } +$image_base_uri = get_template_directory_uri() . '/images'; + spaceless(); ?> @@ -21,14 +23,14 @@ <ul class="wp-block-list article-share"><!-- wp:list-item --> <li> <a class="article-shareFacebook" target="_blank" rel="noreferrer noopener" href="https://www.facebook.com/sharer.php?u=<?php the_permalink(); ?>" title="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ text shows on hover */ esc_attr_e( 'Share on Facebook', 'amnesty' ); ?>"> - <img src="<?php echo esc_url( amnesty_asset_uri( 'images' ) ); ?>/icon-facebook.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Facebook Logo', 'amnesty' ); ?>"> + <img src="<?php echo esc_url( $image_base_uri ); ?>/icon-facebook.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Facebook Logo', 'amnesty' ); ?>"> </a> </li> <!-- /wp:list-item --> <!-- wp:list-item --> <li> <a class="article-shareTwitter" target="_blank" rel="noreferrer noopener" href="https://twitter.com/intent/tweet?url=<?php the_permalink(); ?>&text=<?php the_title(); ?>" title="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ text shows on hover */ esc_attr_e( 'Share on Twitter', 'amnesty' ); ?>"> - <img src="<?php echo esc_url( amnesty_asset_uri( 'images' ) ); ?>/icon-twitter.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Twitter Logo', 'amnesty' ); ?>"> + <img src="<?php echo esc_url( $image_base_uri ); ?>/icon-twitter.svg" alt="<?php /* translators: [front] https://wordpresstheme.amnesty.org/the-theme/global-elements/m004-social-share/ */ esc_attr_e( 'Twitter Logo', 'amnesty' ); ?>"> </a> </li> <!-- /wp:list-item --></ul> diff --git a/wp-content/themes/humanity-theme/patterns/search-form.php b/wp-content/themes/humanity-theme/patterns/search-form.php new file mode 100644 index 00000000..6f2850cf --- /dev/null +++ b/wp-content/themes/humanity-theme/patterns/search-form.php @@ -0,0 +1,110 @@ +<?php + +/** + * Title: Search Form + * Description: Search form output + * Slug: amnesty/search-form + * Inserter: yes + */ +$years = range( gmdate( 'Y' ), 1961 ); +$months = amnesty_get_months(); + +$year_options = [ 0 => __( 'Year', 'amnesty' ) ] + array_combine( $years, $years ); +$month_options = [ 0 => __( 'Month', 'amnesty' ) ] + $months; + +$year_param = ''; +if ( get_query_var( 'qyear' ) ) { + $year_param = absint( get_query_var( 'qyear' ) ); +} + +$month_param = ''; +if ( get_query_var( 'qmonth' ) ) { + $month_param = absint( get_query_var( 'qmonth' ) ); +} + +$search_url = current_url(); +if ( get_query_var( 'paged' ) ) { + $search_url = html_entity_decode( get_pagenum_link() ); +} + +$year_attributes = [ + 'className' => 'autosubmit for-year', + 'label' => __( 'Year', 'amnesty' ), + 'showLabel' => false, + 'name' => 'qyear', + 'isNav' => true, + 'multiple' => false, + 'options' => $year_options, + 'active' => $year_param, +]; + +$month_attributes = [ + 'className' => 'autosubmit for-month' . ( $year_param ? ' is-active' : '' ), + 'label' => __( 'Month', 'amnesty' ), + 'showLabel' => false, + 'name' => 'qmonth', + 'isNav' => true, + 'multiple' => false, + 'options' => (object) $month_options, + 'active' => $month_param, + 'isDisabled' => ! $year_param, +]; + +?> +<!-- wp:group {"tagName":"form","className":"horizontal-search","action":"<?php echo esc_url( $search_url ); ?>"} --> +<form class="wp-block-group horizontal-search" action="<?php echo esc_url( $search_url ); ?>"> + <!-- wp:group {"tagName":"section","className":"section section--small section--dark postlist-categoriesContainer"} --> + <section class="wp-block-group section section--small section--dark postlist-categoriesContainer"> + <!-- wp:group {"tagName":"div","className":"container initial-filters"} --> + <div class="wp-block-group container initial-filters"> + <!-- wp:group {"tagName":"div","className":"default-search-filters taxonomyArchive-filters"} --> + <div class="wp-block-group default-search-filters taxonomyArchive-filters"> + <!-- wp:group {"tagName":"div","className":"search-input"} --> + <div class="wp-block-group search-input"> + <!-- wp:amnesty-core/search-input /--> + + <!-- wp:buttons --> + <div class="wp-block-buttons"><!-- wp:button {"tagName":"button","className":"is-style-search","type":"submit"} --> + <div class="wp-block-button is-style-search"><button type="submit" class="wp-block-button__link wp-element-button"> + <span class="search-button-text"><?php /* translators: [front] */ esc_html_e( 'Search', 'amnesty' ); ?></span> + <i class="icon icon-search"></i> + </button></div> + <!-- /wp:button --> + </div> + <!-- /wp:buttons --> + </div> + <!-- /wp:group --> + + <!-- wp:group {"tagName":"div","className":"basic-filters"} --> + <div class="wp-block-group basic-filters"> + <?php do_action( 'amnesty_search_before_basic_filters' ); ?> + + <!-- wp:amnesty-core/custom-select <?php echo wp_kses_data( wp_json_encode( $year_attributes ) ); ?> /--> + <!-- wp:amnesty-core/custom-select <?php echo wp_kses_data( wp_json_encode( $month_attributes ) ); ?> /--> + + <?php do_action( 'amnesty_search_after_basic_filters' ); ?> + </div> + <!-- /wp:group --> + + <span class="btn toggle-search-filters"> + <span class="toggle-search-filters-text"> + <?php /* translators: [front] */ esc_html_e( 'Filters', 'amnesty' ); ?> + </span> + <i class="icon icon-arrow-down"></i> + </span> + </div> + <!-- /wp:group --> + </div> + <!-- /wp:group --> + + <!-- wp:group {"tagName":"div","className":"container additional-filters"} --> + <div class="container additional-filters"> + <!-- wp:pattern {"slug":"amnesty/archive-filters"} /--> + </div> + <!-- /wp:group --> + </section> + <!-- /wp:group --> +</form> +<!-- /wp:group --> + +<!-- wp:pattern {"slug":"amnesty/active-filters"} /--> diff --git a/wp-content/themes/humanity-theme/patterns/search-results.php b/wp-content/themes/humanity-theme/patterns/search-results.php index c467dc46..ad110431 100644 --- a/wp-content/themes/humanity-theme/patterns/search-results.php +++ b/wp-content/themes/humanity-theme/patterns/search-results.php @@ -12,12 +12,30 @@ // add filter to limit the post terms results for search add_filter( 'get_the_terms', 'amnesty_limit_post_terms_results_for_search' ); +$current_sort = amnesty_get_query_var( 'sort' ); +$available_sorts = amnesty_valid_sort_parameters(); +$sort_select_args = [ + 'label' => __( 'Sort by', 'amnesty' ), + 'showLabel' => true, + 'name' => 'sort', + 'isForm' => true, + 'multiple' => false, + 'options' => $available_sorts, + 'active' => $current_sort, +]; + ?> <!-- wp:query {"inherit":true} --> <div class="wp-block-query"> <!-- wp:group {"tagName":"div","className":"section section--tinted search-results"} --> <div class="wp-block-group section section--tinted search-results"> - <!-- wp:amnesty-core/archive-header /--> + <!-- wp:group {"tagName":"header","className":"postlist-header"} --> + <header class="wp-block-group postlist-header"> + <!-- wp:amnesty-core/search-title /--> + <!-- wp:amnesty-core/custom-select <?php echo wp_kses_data( wp_json_encode( $sort_select_args ) ); ?> /--> + </header> + <!-- /wp:group --> + <!-- wp:post-template {"layout":{"type":"constrained","justifyContent":"left"}} --> <!-- wp:group {"tagName":"article","className":"post post--result"} --> diff --git a/wp-content/themes/humanity-theme/patterns/search.php b/wp-content/themes/humanity-theme/patterns/search.php index 8cefb5cd..1e6ad336 100644 --- a/wp-content/themes/humanity-theme/patterns/search.php +++ b/wp-content/themes/humanity-theme/patterns/search.php @@ -33,13 +33,31 @@ // add filter to limit the post terms results for search add_filter( 'get_the_terms', 'amnesty_limit_post_terms_results_for_search' ); +$current_sort = amnesty_get_query_var( 'sort' ); +$available_sorts = amnesty_valid_sort_parameters(); +$sort_select_args = [ + 'label' => __( 'Sort by', 'amnesty' ), + 'showLabel' => true, + 'name' => 'sort', + 'isForm' => true, + 'multiple' => false, + 'options' => $available_sorts, + 'active' => $current_sort, +]; + ?> <!-- wp:query <?php echo wp_kses_data( wp_json_encode( $block_args ) ); ?> --> <div class="wp-block-query"> <!-- wp:group {"tagName":"div","className":"section section--tinted search-results"} --> <div class="wp-block-group section section--tinted search-results"> - <!-- wp:amnesty-core/search-header /--> + <!-- wp:group {"tagName":"header","className":"postlist-header"} --> + <header class="wp-block-group postlist-header"> + <!-- wp:amnesty-core/search-title /--> + <!-- wp:amnesty-core/custom-select <?php echo wp_kses_data( wp_json_encode( $sort_select_args ) ); ?> /--> + </header> + <!-- /wp:group --> + <!-- wp:post-template {"layout":{"type":"constrained","justifyContent":"left"}} --> <!-- wp:group {"tagName":"article","className":"post post--result"} --> diff --git a/wp-content/themes/humanity-theme/style.css b/wp-content/themes/humanity-theme/style.css index 57969c28..0850ad60 100644 --- a/wp-content/themes/humanity-theme/style.css +++ b/wp-content/themes/humanity-theme/style.css @@ -2,7 +2,7 @@ * Theme Name: Humanity Theme * Theme URI: https://github.com/amnestywebsite/humanity-theme * Description: The Amnesty International WordPress Humanity Theme - * Version: 2.0.11 + * Version: 2.0.12 * Author: Amnesty International * Author URI: https://www.amnesty.org * License: GPLv2 diff --git a/wp-content/themes/humanity-theme/styles/01-amnesty-trade-gothic.json b/wp-content/themes/humanity-theme/styles/01-amnesty-trade-gothic.json index af7a79ff..2520238e 100644 --- a/wp-content/themes/humanity-theme/styles/01-amnesty-trade-gothic.json +++ b/wp-content/themes/humanity-theme/styles/01-amnesty-trade-gothic.json @@ -16,10 +16,10 @@ "fontWeight": 300, "fontDisplay": "swap", "src": [ - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Light.eot", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Light.woff2", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Light.woff", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Light.ttf" + "file:./fonts/trade-gothic/TradeGothicLTW05-Light.eot", + "file:./fonts/trade-gothic/TradeGothicLTW05-Light.woff2", + "file:./fonts/trade-gothic/TradeGothicLTW05-Light.woff", + "file:./fonts/trade-gothic/TradeGothicLTW05-Light.ttf" ] }, { @@ -28,10 +28,10 @@ "fontWeight": 300, "fontDisplay": "swap", "src": [ - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-LightObl.eot", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff2", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-LightObl.woff", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-LightObl.ttf" + "file:./fonts/trade-gothic/TradeGothicLTW05-LightObl.eot", + "file:./fonts/trade-gothic/TradeGothicLTW05-LightObl.woff2", + "file:./fonts/trade-gothic/TradeGothicLTW05-LightObl.woff", + "file:./fonts/trade-gothic/TradeGothicLTW05-LightObl.ttf" ] }, { @@ -40,10 +40,10 @@ "fontWeight": "normal", "fontDisplay": "swap", "src": [ - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Roman.eot", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Roman.woff2", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Roman.woff", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Roman.ttf" + "file:./fonts/trade-gothic/TradeGothicLTW05-Roman.eot", + "file:./fonts/trade-gothic/TradeGothicLTW05-Roman.woff2", + "file:./fonts/trade-gothic/TradeGothicLTW05-Roman.woff", + "file:./fonts/trade-gothic/TradeGothicLTW05-Roman.ttf" ] }, { @@ -52,10 +52,10 @@ "fontWeight": "normal", "fontDisplay": "swap", "src": [ - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Oblique.eot", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff2", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Oblique.woff", - "file:./assets/fonts/trade-gothic/TradeGothicLTW05-Oblique.ttf" + "file:./fonts/trade-gothic/TradeGothicLTW05-Oblique.eot", + "file:./fonts/trade-gothic/TradeGothicLTW05-Oblique.woff2", + "file:./fonts/trade-gothic/TradeGothicLTW05-Oblique.woff", + "file:./fonts/trade-gothic/TradeGothicLTW05-Oblique.ttf" ] } ] @@ -71,10 +71,10 @@ "fontWeight": "normal", "fontDisplay": "swap", "src": [ - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.eot", - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff2", - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff", - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.ttf" + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.eot", + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff2", + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.woff", + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-CnNo.18Obl.ttf" ] }, { @@ -83,10 +83,10 @@ "fontWeight": "bold", "fontDisplay": "swap", "src": [ - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.eot", - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff2", - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff", - "file:./assets/fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.ttf" + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.eot", + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff2", + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.woff", + "file:./fonts/trade-gothic-condensed/TradeGothicLTW05-BdCnNo.20.ttf" ] } ] @@ -95,4 +95,3 @@ } } } - \ No newline at end of file diff --git a/wp-content/themes/humanity-theme/styles/02-roboto.json b/wp-content/themes/humanity-theme/styles/02-roboto.json index 42dd7a0f..5344c9ea 100644 --- a/wp-content/themes/humanity-theme/styles/02-roboto.json +++ b/wp-content/themes/humanity-theme/styles/02-roboto.json @@ -11,37 +11,37 @@ "fontFamily": "Roboto", "fontStyle": "normal", "fontWeight": "400", - "src": "file:./assets/fonts/roboto/roboto-400.woff2" + "src": "file:./fonts/roboto/roboto-400.woff2" }, { "fontFamily": "Roboto", "fontStyle": "normal", "fontWeight": "700", - "src": "file:./assets/fonts/roboto/roboto-700.woff2" + "src": "file:./fonts/roboto/roboto-700.woff2" }, { "fontFamily": "Roboto", "fontStyle": "italic", "fontWeight": "400", - "src": "file:./assets/fonts/roboto/roboto-400-italic.woff2" + "src": "file:./fonts/roboto/roboto-400-italic.woff2" }, { "fontFamily": "Roboto", "fontStyle": "italic", "fontWeight": "700", - "src": "file:./assets/fonts/roboto/roboto-700-italic.woff2" + "src": "file:./fonts/roboto/roboto-700-italic.woff2" }, { "fontFamily": "Roboto", "fontStyle": "normal", "fontWeight": "100", - "src": "file:./assets/fonts/roboto/roboto-100.woff2" + "src": "file:./fonts/roboto/roboto-100.woff2" }, { "fontFamily": "Roboto", "fontStyle": "italic", "fontWeight": "100", - "src": "file:./assets/fonts/roboto/roboto-100-italic.woff2" + "src": "file:./fonts/roboto/roboto-100-italic.woff2" } ], "fontFamily": "Roboto, sans-serif", @@ -54,37 +54,37 @@ "fontFamily": "\"Roboto Condensed\"", "fontStyle": "normal", "fontWeight": "400", - "src": "file:./assets/fonts/roboto-condensed/roboto-condensed-400.woff2" + "src": "file:./fonts/roboto-condensed/roboto-condensed-400.woff2" }, { "fontFamily": "\"Roboto Condensed\"", "fontStyle": "normal", "fontWeight": "700", - "src": "file:./assets/fonts/roboto-condensed/roboto-condensed-700.woff2" + "src": "file:./fonts/roboto-condensed/roboto-condensed-700.woff2" }, { "fontFamily": "\"Roboto Condensed\"", "fontStyle": "italic", "fontWeight": "400", - "src": "file:./assets/fonts/roboto-condensed/roboto-condensed-400-italic.woff2" + "src": "file:./fonts/roboto-condensed/roboto-condensed-400-italic.woff2" }, { "fontFamily": "\"Roboto Condensed\"", "fontStyle": "italic", "fontWeight": "700", - "src": "file:./assets/fonts/roboto-condensed/roboto-condensed-700-italic.woff2" + "src": "file:./fonts/roboto-condensed/roboto-condensed-700-italic.woff2" }, { "fontFamily": "\"Roboto Condensed\"", "fontStyle": "normal", "fontWeight": "200", - "src": "file:./assets/fonts/roboto-condensed/roboto-condensed-200.woff2" + "src": "file:./fonts/roboto-condensed/roboto-condensed-200.woff2" }, { "fontFamily": "\"Roboto Condensed\"", "fontStyle": "italic", "fontWeight": "200", - "src": "file:./assets/fonts/roboto-condensed/roboto-condensed-200-italic.woff2" + "src": "file:./fonts/roboto-condensed/roboto-condensed-200-italic.woff2" } ], "fontFamily": "\"Roboto Condensed\", sans-serif", @@ -94,4 +94,4 @@ ] } } -} \ No newline at end of file +} diff --git a/wp-content/themes/humanity-theme/styles/03-rubik.json b/wp-content/themes/humanity-theme/styles/03-rubik.json index d06c6f2c..3c6bb43e 100644 --- a/wp-content/themes/humanity-theme/styles/03-rubik.json +++ b/wp-content/themes/humanity-theme/styles/03-rubik.json @@ -11,37 +11,37 @@ "fontFamily": "Rubik", "fontStyle": "normal", "fontWeight": "400", - "src": "file:./assets/fonts/rubik/rubik-400.woff2" + "src": "file:./fonts/rubik/rubik-400.woff2" }, { "fontFamily": "Rubik", "fontStyle": "normal", "fontWeight": "300", - "src": "file:./assets/fonts/rubik/rubik-300.woff2" + "src": "file:./fonts/rubik/rubik-300.woff2" }, { "fontFamily": "Rubik", "fontStyle": "normal", "fontWeight": "700", - "src": "file:./assets/fonts/rubik/rubik-700.woff2" + "src": "file:./fonts/rubik/rubik-700.woff2" }, { "fontFamily": "Rubik", "fontStyle": "italic", "fontWeight": "300", - "src": "file:./assets/fonts/rubik/rubik-300-italic.woff2" + "src": "file:./fonts/rubik/rubik-300-italic.woff2" }, { "fontFamily": "Rubik", "fontStyle": "italic", "fontWeight": "400", - "src": "file:./assets/fonts/rubik/rubik-400-italic.woff2" + "src": "file:./fonts/rubik/rubik-400-italic.woff2" }, { "fontFamily": "Rubik", "fontStyle": "italic", "fontWeight": "700", - "src": "file:./assets/fonts/rubik/rubik-700-italic.woff2" + "src": "file:./fonts/rubik/rubik-700-italic.woff2" } ], "fontFamily": "Rubik, sans-serif", @@ -56,4 +56,4 @@ ] } } -} \ No newline at end of file +} diff --git a/wp-content/themes/humanity-theme/templates/archive.html b/wp-content/themes/humanity-theme/templates/archive.html index 5892541c..3897f9fe 100644 --- a/wp-content/themes/humanity-theme/templates/archive.html +++ b/wp-content/themes/humanity-theme/templates/archive.html @@ -13,7 +13,7 @@ <!-- wp:pattern {"slug":"amnesty/archive-heading"} /--> <!-- wp:group {"tagName":"div"} --> <div class="wp-block-group"> - <!-- wp:amnesty-core/archive-filters /--> + <!-- wp:pattern {"slug":"amnesty/archive-filters"} /--> </div> <!-- /wp:group --> </div> diff --git a/wp-content/themes/humanity-theme/templates/search.html b/wp-content/themes/humanity-theme/templates/search.html index 546c3a02..cfeae312 100644 --- a/wp-content/themes/humanity-theme/templates/search.html +++ b/wp-content/themes/humanity-theme/templates/search.html @@ -2,7 +2,7 @@ <main class="wp-block-group"> <!-- wp:group {"tagName":"div","className":"container has-gutter"} --> <div class="wp-block-group container has-gutter"> - <!-- wp:amnesty-core/search-form /--> + <!-- wp:pattern {"slug":"amnesty/search-form"} /--> <!-- wp:group {"tagName":"div"} --> <div class="wp-block-group"> diff --git a/wp-content/themes/humanity-theme/templates/searchpage.html b/wp-content/themes/humanity-theme/templates/searchpage.html index a04b3ca4..c2cd2279 100644 --- a/wp-content/themes/humanity-theme/templates/searchpage.html +++ b/wp-content/themes/humanity-theme/templates/searchpage.html @@ -2,7 +2,7 @@ <main class="wp-block-group"> <!-- wp:group {"tagName":"div","className":"container has-gutter"} --> <div class="wp-block-group container has-gutter"> - <!-- wp:amnesty-core/search-form /--> + <!-- wp:pattern {"slug":"amnesty/search-form"} /--> <!-- wp:group {"tagName":"div"} --> <div class="wp-block-group"> diff --git a/wp-content/themes/humanity-theme/theme.json b/wp-content/themes/humanity-theme/theme.json index d489d127..34fe06f0 100644 --- a/wp-content/themes/humanity-theme/theme.json +++ b/wp-content/themes/humanity-theme/theme.json @@ -187,9 +187,9 @@ "fontWeight": 300, "fontDisplay": "swap", "src": [ - "file:./assets/fonts/lato/Lato-Light.woff2", - "file:./assets/fonts/lato/Lato-Light.woff", - "file:./assets/fonts/lato/Lato-Light.ttf" + "file:./fonts/lato/Lato-Light.woff2", + "file:./fonts/lato/Lato-Light.woff", + "file:./fonts/lato/Lato-Light.ttf" ] }, { @@ -198,9 +198,9 @@ "fontWeight": 300, "fontDisplay": "swap", "src": [ - "file:./assets/fonts/lato/Lato-LightItalic.woff2", - "file:./assets/fonts/lato/Lato-LightItalic.woff", - "file:./assets/fonts/lato/Lato-LightItalic.ttf" + "file:./fonts/lato/Lato-LightItalic.woff2", + "file:./fonts/lato/Lato-LightItalic.woff", + "file:./fonts/lato/Lato-LightItalic.ttf" ] }, { @@ -209,9 +209,9 @@ "fontWeight": 400, "fontDisplay": "swap", "src": [ - "file:./assets/fonts/lato/Lato-Regular.woff2", - "file:./assets/fonts/lato/Lato-Regular.woff", - "file:./assets/fonts/lato/Lato-Regular.ttf" + "file:./fonts/lato/Lato-Regular.woff2", + "file:./fonts/lato/Lato-Regular.woff", + "file:./fonts/lato/Lato-Regular.ttf" ] }, { @@ -220,9 +220,9 @@ "fontWeight": 400, "fontDisplay": "swap", "src": [ - "file:./assets/fonts/lato/Lato-Italic.woff2", - "file:./assets/fonts/lato/Lato-Italic.woff", - "file:./assets/fonts/lato/Lato-Italic.ttf" + "file:./fonts/lato/Lato-Italic.woff2", + "file:./fonts/lato/Lato-Italic.woff", + "file:./fonts/lato/Lato-Italic.ttf" ] } ] @@ -238,9 +238,9 @@ "fontWeight": "normal", "fontDisplay": "swap", "src": [ - "file:./assets/fonts/playfair/PlayfairDisplay-Italic.woff2", - "file:./assets/fonts/playfair/PlayfairDisplay-Italic.woff", - "file:./assets/fonts/playfair/PlayfairDisplay-Italic.ttf" + "file:./fonts/playfair/PlayfairDisplay-Italic.woff2", + "file:./fonts/playfair/PlayfairDisplay-Italic.woff", + "file:./fonts/playfair/PlayfairDisplay-Italic.ttf" ] }, { @@ -249,9 +249,9 @@ "fontWeight": "bold", "fontDisplay": "swap", "src": [ - "file:./assets/fonts/playfair/PlayfairDisplay-Bold.woff2", - "file:./assets/fonts/playfair/PlayfairDisplay-Bold.woff", - "file:./assets/fonts/playfair/PlayfairDisplay-Bold.ttf" + "file:./fonts/playfair/PlayfairDisplay-Bold.woff2", + "file:./fonts/playfair/PlayfairDisplay-Bold.woff", + "file:./fonts/playfair/PlayfairDisplay-Bold.ttf" ] } ] diff --git a/wp-content/themes/humanity-theme/woocommerce/archive-product.php b/wp-content/themes/humanity-theme/woocommerce/archive-product.php index 1283bf77..1d56b249 100644 --- a/wp-content/themes/humanity-theme/woocommerce/archive-product.php +++ b/wp-content/themes/humanity-theme/woocommerce/archive-product.php @@ -25,7 +25,9 @@ $header_data = amnesty_get_header_data( $archive_page ); if ( 'amnesty-core/hero' === $header_data['name'] ) { - echo wp_kses_post( render_hero_block( $header_data['attrs'] ) ); + printf( '<!-- wp:amnesty-core/hero %s -->', wp_kses_data( wp_json_encode( $header_data['attrs'] ) ) ); + echo wp_kses_post( $header_data['content'] ); + echo '<!-- /wp:amnesty-core/hero -->'; } else { // phpcs:ignore echo \Amnesty\Blocks\amnesty_render_header_block( $header_data['attrs'] ); diff --git a/wp-content/themes/humanity-theme/woocommerce/archive-product_cat.php b/wp-content/themes/humanity-theme/woocommerce/archive-product_cat.php index 0bf0db3f..d5b18b4b 100644 --- a/wp-content/themes/humanity-theme/woocommerce/archive-product_cat.php +++ b/wp-content/themes/humanity-theme/woocommerce/archive-product_cat.php @@ -25,7 +25,9 @@ $header_data = amnesty_get_header_data( $archive_page ); if ( 'amnesty-core/hero' === $header_data['name'] ) { - echo wp_kses_post( render_hero_block( $header_data['attrs'] ) ); + printf( '<!-- wp:amnesty-core/hero %s -->', wp_kses_data( wp_json_encode( $header_data['attrs'] ) ) ); + echo wp_kses_post( $header_data['content'] ); + echo '<!-- /wp:amnesty-core/hero -->'; } else { // phpcs:ignore echo \Amnesty\Blocks\amnesty_render_header_block( $header_data['attrs'] );