├── .distignore ├── .eslintrc ├── .github ├── ISSUE_TEMPLATE │ ├── Bug_report.yml │ └── Feature_request.yml ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml ├── labeler.yml └── workflows │ ├── create-build-zip.yml │ ├── create-tag.yml │ ├── deploy-s3-store.yml │ ├── diff-translations.yml │ ├── issue-labeler.yml │ ├── new-issues.yml │ ├── sync-branches.yml │ ├── test-js.yml │ └── test-php.yml ├── .gitignore ├── .releaserc.yml ├── .stylelintrc.json ├── CHANGELOG.md ├── Gruntfile.js ├── assets ├── css │ └── src │ │ ├── blocks │ │ ├── _calendar.scss │ │ ├── _image.scss │ │ ├── _latest-posts.scss │ │ ├── _main.scss │ │ ├── _navigation.scss │ │ ├── _post-terms.scss │ │ ├── _query-pagination.scss │ │ ├── _quote.scss │ │ ├── _search.scss │ │ ├── _separator.scss │ │ └── _table.scss │ │ ├── common │ │ ├── _generic.scss │ │ └── _vars.scss │ │ ├── design-pack-notice.scss │ │ ├── editor.scss │ │ ├── editor │ │ └── blocks │ │ │ ├── _button.scss │ │ │ ├── _latest-posts.scss │ │ │ └── _main.scss │ │ ├── elements │ │ ├── _comments.scss │ │ ├── _extends.scss │ │ ├── _inputs.scss │ │ └── _main.scss │ │ ├── style.scss │ │ └── welcome-notice.scss ├── fonts │ ├── albert-sans │ │ ├── AlbertSans-Italic-VariableFont_wght.ttf │ │ ├── AlbertSans-VariableFont_wght.ttf │ │ └── License.txt │ ├── figtree │ │ ├── Figtree-Italic-VariableFont_wght.ttf │ │ ├── Figtree-VariableFont_wght.ttf │ │ └── License.txt │ ├── fraunces │ │ ├── Fraunces-Italic-VariableFont_wght.ttf │ │ ├── Fraunces-VariableFont_wght.ttf │ │ └── License.txt │ ├── hanken-grotesk │ │ ├── HankenGrotesk-Italic-VariableFont_wght.ttf │ │ ├── HankenGrotesk-VariableFont_wght.ttf │ │ └── License.txt │ ├── inter │ │ ├── Inter-VariableFont_wght.ttf │ │ └── License.txt │ ├── montserrat │ │ ├── License.txt │ │ ├── Montserrat-Italic-VariableFont_wght.ttf │ │ └── Montserrat-VariableFont_wght.ttf │ ├── open-sans │ │ ├── License.txt │ │ ├── OpenSans-Italic-VariableFont_wdth,wght.ttf │ │ └── OpenSans-VariableFont_wdth,wght.ttf │ ├── outfit │ │ ├── License.txt │ │ └── Outfit-VariableFont_wght.ttf │ ├── playfair-display │ │ ├── License.txt │ │ ├── PlayfairDisplay-Italic-VariableFont_wght.ttf │ │ └── PlayfairDisplay-VariableFont_wght.ttf │ ├── source-sans-pro │ │ ├── License.txt │ │ ├── SourceSansPro-Bold.ttf │ │ ├── SourceSansPro-BoldItalic.ttf │ │ ├── SourceSansPro-Italic.ttf │ │ └── SourceSansPro-Regular.ttf │ └── spline-sans │ │ ├── License.txt │ │ └── SplineSans-VariableFont_wght.ttf ├── img │ ├── neve-fse-img01.svg │ ├── neve-fse-img02.svg │ ├── neve-fse-img03.svg │ ├── neve-fse-img04.jpg │ ├── neve-fse-img05.jpg │ ├── neve-fse-img06.jpg │ ├── neve-fse-img07.jpg │ ├── neve-fse-img08.jpg │ ├── neve-fse-img09.jpg │ ├── neve-fse-img10.jpg │ ├── neve-fse-img11.jpg │ ├── neve-fse-img12.jpg │ ├── neve-fse-img13.webp │ ├── neve-fse-img14.webp │ ├── neve-fse-logo.svg │ └── welcome-notice.png └── js │ └── src │ ├── common │ └── plugin-install.js │ ├── components │ └── DesignPackNotice.js │ ├── design-pack-notice.js │ ├── general-notice.js │ └── welcome-notice.js ├── bin ├── dist.sh ├── install-wp-tests.sh ├── makepot.sh └── pot-diff.sh ├── composer.json ├── composer.lock ├── functions.php ├── grunt ├── addtextdomain.js ├── aliases.yaml ├── postcss.js ├── rtlcss.js ├── sass.js ├── version.js ├── watch.js └── wp_readme_to_markdown.js ├── inc ├── Admin.php ├── Assets_Manager.php ├── Block_Patterns.php ├── Block_Styles.php ├── Constants.php ├── Core.php ├── Neve_Mods.php ├── Starter_Content.php └── patterns │ ├── layout │ ├── boxed-features-1.php │ ├── boxed-features-2.php │ ├── columns-content-images.php │ ├── columns-image-and-text-inv.php │ ├── columns-image-and-text.php │ ├── columns-testimonials-inv.php │ ├── columns-testimonials.php │ ├── columns-text-image.php │ ├── columns-with-cards.php │ ├── columns-with-icons.php │ ├── columns-with-services-text.php │ ├── columns-with-services.php │ ├── contact-section.php │ ├── content-with-images.php │ ├── cta-dark.php │ ├── faq-section.php │ ├── full-width-columns-content-image.php │ ├── full-width-quote.php │ ├── hero-with-feature-columns.php │ ├── hero-with-text.php │ ├── map-section.php │ ├── page-cover-bg-image.php │ ├── page-cover-with-buttons.php │ ├── portfolio-columns.php │ ├── pricing-columns.php │ └── team-members-columns.php │ ├── loops │ ├── post-loop-1.php │ ├── post-loop-2.php │ ├── post-loop-3.php │ ├── post-loop-4.php │ ├── post-loop-5.php │ ├── post-loop-6.php │ ├── post-loop-7.php │ ├── post-loop-8.php │ └── post-loop-9.php │ ├── page_titles │ ├── page-title-1.php │ ├── page-title-2.php │ ├── page-title-3.php │ ├── page-title-4.php │ └── page-title-5.php │ └── templates │ ├── archive-cover.php │ ├── archive-list.php │ ├── single-post-cover-boxed.php │ └── single-post-cover.php ├── index.php ├── languages └── .gitkeep ├── library ├── archive │ ├── archive-cover.php │ └── archive-list.php ├── front-page │ ├── front-page-2.php │ └── front-page-3.php ├── single │ ├── single-post-cover-boxed.php │ └── single-post-cover.php └── templates │ ├── about-page.php │ ├── contact-page.php │ ├── portfolio-page.php │ └── services-page.php ├── lint-staged.config.js ├── package.json ├── parts ├── footer.html ├── footer_s1.html ├── footer_s2.html ├── footer_s3.html ├── footer_s4.html ├── header.html ├── header_s1.html ├── header_s2.html └── header_s3.html ├── phpcs.xml ├── phpunit.xml ├── readme.md ├── readme.txt ├── screenshot.png ├── style.css ├── styles ├── s1-crayola.json ├── s2-majorelle-blue.json ├── s3-zomp.json ├── s4-dark-pastel-red.json ├── s5-aztec-gold.json ├── s6-vivid-red-tangelo.json └── s7-greenlight.json ├── templates ├── 404.html ├── archive.html ├── front-page.html ├── index.html ├── page.html ├── search.html ├── single.html ├── template-blank.html └── template-plain.html ├── tests ├── bootstrap.php └── test-load.php ├── theme.json └── yarn.lock /.distignore: -------------------------------------------------------------------------------- 1 | .git 2 | CONTRIBUTING.md 3 | .distignore 4 | .gitignore 5 | .travis.yml 6 | .jshintrc 7 | .commitlintrc.js 8 | docker-compose.yml 9 | Gruntfile.js 10 | grunt 11 | phpcs.xml 12 | node_modules 13 | logs 14 | e2e-tests 15 | cypress.json 16 | .eslintignore 17 | .eslintrc.js 18 | .releaserc.yml 19 | .gitattributes 20 | .babelrc 21 | .eslintrc 22 | .github 23 | package.json 24 | bin 25 | tests 26 | phpunit.xml 27 | npm-debug.log 28 | package-lock.json 29 | webpack.config.js 30 | dist 31 | .nvmrc 32 | .editorconfig 33 | artifact 34 | composer.json 35 | composer.lock 36 | themeisle.enc 37 | 38 | .idea 39 | vendor/codeinwp/themeisle-sdk/src/Modules/Dashboard_widget.php 40 | **/*.css.map 41 | .DS_Store 42 | blackfire 43 | rollup.config.js 44 | docker-compose.ci.yml 45 | visual-regressions 46 | yarn.lock 47 | .ds_store 48 | .storybook 49 | stories 50 | cypress.storybook.json 51 | tsconfig.json 52 | lint-staged.config.js 53 | .stylelintrc.json 54 | phpstan.neon 55 | .gitkeep 56 | assets/js/src 57 | assets/css/src 58 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ "plugin:@wordpress/eslint-plugin/recommended" ] 3 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 2 | description: Report a bug so we can get to squashing it. 3 | labels: bug 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Thanks for taking the time to fill out this bug report! 9 | - type: textarea 10 | attributes: 11 | label: Description 12 | description: Please write a brief description of the bug, including what you expect to happen and what is currently happening. 13 | placeholder: | 14 | Feature '...' is not working properly. I expect '...' to happen, but '...' happens instead 15 | validations: 16 | required: true 17 | 18 | - type: textarea 19 | attributes: 20 | label: Step-by-step reproduction instructions 21 | description: Please write the steps needed to reproduce the bug. 22 | placeholder: | 23 | 1. Go to '...' 24 | 2. Click on '...' 25 | 3. Scroll down to '...' 26 | validations: 27 | required: true 28 | 29 | - type: textarea 30 | attributes: 31 | label: Screenshots, screen recording, code snippet or Help Scout ticket 32 | description: | 33 | If possible, please upload a screenshot or screen recording which demonstrates the bug. 34 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 35 | Tip: You can include links to customer Help Scout support thread. 36 | validations: 37 | required: false 38 | 39 | - type: input 40 | attributes: 41 | label: Environment info 42 | description: | 43 | Please share a https://pastebin.com/ link of your system details by going to site Admin -> Tools -> Site Health -> Info and Copy to Clipboard 44 | placeholder: pastebin.com/ ... 45 | validations: 46 | required: false 47 | 48 | - type: dropdown 49 | id: regression 50 | attributes: 51 | label: Is the issue you are reporting a regression 52 | description: | 53 | i.e, a previously working feature/functionality is now broken? 54 | By specifying whether or not your issue is a regression, it will help the development team to more effectively diagnose and resolve the problem. 55 | 56 | multiple: false 57 | options: 58 | - 'No' 59 | - 'Yes, this is a regression.' 60 | validations: 61 | required: true 62 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 2 | description: Suggest a feature that we can implement. 3 | labels: new feature 4 | body: 5 | - type: textarea 6 | attributes: 7 | label: What problem does this address? 8 | description: | 9 | Can you give us a little more insight into this feature request? We'd love to know if it's related to any problems or pain points you've been facing. 10 | If so, can you please let us know what the issue is in a clear and simple way? 11 | Tip: If this is related to a customer request, please add the Help Scout thread URL. 12 | placeholder: | 13 | For example, something like "I find it tough when..." or "I get frustrated because..." would be great. 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: What is your proposed solution? 19 | description: Can you please specify the desired feature or improvement and how it resolves the problem mentioned? 20 | validations: 21 | required: false 22 | - type: dropdown 23 | id: doc-needed 24 | attributes: 25 | label: Will this feature require documentation? (Optional) 26 | description: | 27 | Does this feature require the creation or update of documentation? If you're unsure, feel free to skip this. 28 | multiple: false 29 | options: 30 | - 'I dont know.' 31 | - 'No.' 32 | - 'Yes, it requires documentation.' 33 | validations: 34 | required: false -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Summary 2 | 3 | 4 | ### Will affect visual aspect of the product 5 | 6 | YES/NO 7 | 8 | ### Screenshots 9 | 10 | 11 | ### Test instructions 12 | 13 | 14 | - 15 | - 16 | 17 | 18 | Closes #. 19 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | 2 | version: 2 3 | updates: 4 | 5 | # Maintain dependencies for Composer 6 | - package-ecosystem: "composer" 7 | directory: "/" 8 | target-branch: "development" 9 | schedule: 10 | interval: "weekly" -------------------------------------------------------------------------------- /.github/labeler.yml: -------------------------------------------------------------------------------- 1 | regression: 2 | - '(Yes, this is a regression)' 3 | 4 | customer report: 5 | - '(helpscout|wordpress.org/support)' 6 | 7 | doc-needed: 8 | - '(Yes, it requires documentation.)' -------------------------------------------------------------------------------- /.github/workflows/create-tag.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | jobs: 8 | create_tag: 9 | runs-on: ubuntu-latest 10 | if: "! contains(github.event.head_commit.message, '[skip ci]')" 11 | strategy: 12 | matrix: 13 | node-version: [14.x] 14 | steps: 15 | - uses: actions/checkout@master 16 | with: 17 | persist-credentials: false 18 | - name: Build files using ${{ matrix.node-version }} 19 | uses: actions/setup-node@v1 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | - name: Release new version 23 | id: release 24 | run: | 25 | yarn install --frozen-lockfile 26 | composer install --prefer-dist --no-progress --no-suggest --ignore-platform-reqs 27 | yarn run build 28 | yarn run release 29 | env: 30 | CI: true 31 | GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} 32 | GIT_AUTHOR_NAME: themeisle[bot] 33 | GIT_AUTHOR_EMAIL: ${{ secrets.PIRATE_BOT_EMAIL }} 34 | GIT_COMMITTER_NAME: themeisle[bot] 35 | GIT_COMMITTER_EMAIL: ${{ secrets.PIRATE_BOT_EMAIL }} 36 | SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_ANNOUNCEMENTS }} 37 | SEMANTIC_RELEASE_PACKAGE: NeveFSE 38 | empty-job: 39 | # if no jobs run, github action considers it a test failure -- which seems like a bug 40 | # this makes it so the top-level if statement for the job does not give status failure. 41 | runs-on: ubuntu-latest 42 | if: success() 43 | steps: 44 | - name: Meep 45 | run: | 46 | echo "Nothing to do" 47 | -------------------------------------------------------------------------------- /.github/workflows/deploy-s3-store.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | 4 | on: 5 | push: 6 | tags: 7 | - "*" 8 | jobs: 9 | deploy: 10 | name: Deploy to server 11 | runs-on: ubuntu-22.04 12 | steps: 13 | - uses: actions/checkout@master 14 | - name: Setup node 14 15 | uses: actions/setup-node@v1 16 | with: 17 | node-version: 14.x 18 | - name: Build & create dist/artifact 19 | run: | 20 | yarn install --frozen-lockfile 21 | composer install --no-dev --prefer-dist --no-progress --no-suggest 22 | yarn run build 23 | yarn run dist 24 | - name: Upload Latest Version to S3 25 | uses: jakejarvis/s3-sync-action@master 26 | with: 27 | args: --acl public-read --follow-symlinks --delete 28 | env: 29 | AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET_DOWNLOADS }} 30 | AWS_ACCESS_KEY_ID: ${{ secrets.S3_DOWNLOADS_AWS_ACCESS_KEY_ID }} 31 | AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DOWNLOADS_AWS_SECRET_ACCESS_KEY }} 32 | AWS_REGION: 'us-west-1' # optional: defaults to us-east-1 33 | SOURCE_DIR: 'artifact' # optional: defaults to entire repository 34 | DEST_DIR: ${{ secrets.S3_AWS_PRODUCTS_FOLDER }}/$BUILD_NAME/latest 35 | - name: Upload Tagged Version to S3 36 | uses: jakejarvis/s3-sync-action@master 37 | with: 38 | args: --acl public-read --follow-symlinks --delete 39 | env: 40 | AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET_DOWNLOADS }} 41 | AWS_ACCESS_KEY_ID: ${{ secrets.S3_DOWNLOADS_AWS_ACCESS_KEY_ID }} 42 | AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DOWNLOADS_AWS_SECRET_ACCESS_KEY }} 43 | AWS_REGION: 'us-west-1' # optional: defaults to us-east-1 44 | SOURCE_DIR: 'artifact' # optional: defaults to entire repository 45 | DEST_DIR: ${{ secrets.S3_AWS_PRODUCTS_FOLDER }}/$BUILD_NAME/$BUILD_VERSION 46 | - name: Send update to the store 47 | env: 48 | PRODUCT_ID: ${{ secrets.THEMEISLE_ID }} 49 | AUTH_TOKEN: ${{ secrets.THEMEISLE_STORE_AUTH }} 50 | STORE_URL: ${{ secrets.THEMEISLE_STORE_URL }} 51 | GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} 52 | BUILD_VERSION: ${{ env.BUILD_VERSION }} 53 | uses: Codeinwp/action-store-release@main 54 | - name: WordPress Theme Deploy 55 | uses: Codeinwp/action-wordpress-theme-deploy@primary 56 | env: 57 | SVN_PASSWORD: ${{ secrets.SVN_THEMEISLE_PASSWORD }} 58 | SVN_USERNAME: ${{ secrets.SVN_THEMEISLE_USERNAME }} 59 | -------------------------------------------------------------------------------- /.github/workflows/diff-translations.yml: -------------------------------------------------------------------------------- 1 | name: Translations Diff 2 | 3 | on: 4 | pull_request_review: 5 | pull_request: 6 | types: [opened, edited, synchronize, ready_for_review] 7 | branches: 8 | - 'development' 9 | 10 | jobs: 11 | translation: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout Ref Base 15 | uses: actions/checkout@v2 16 | with: 17 | path: neve-fse-head 18 | - name: Setup node 14 19 | uses: actions/setup-node@v1 20 | with: 21 | node-version: 14.x 22 | - name: FRESH Makepot BASE 23 | run: | 24 | cd neve-fse-head 25 | ls languages/ 26 | composer install --no-dev --prefer-dist --no-progress --no-suggest 27 | yarn install --frozen-lockfile 28 | yarn run build 29 | ls languages/ 30 | - name: Checkout Ref Head 31 | uses: actions/checkout@v2 32 | with: 33 | ref: development 34 | path: neve-fse-base 35 | - name: FRESH Makepot HEAD 36 | run: | 37 | cd neve-fse-base 38 | ls languages/ 39 | composer install --no-dev --prefer-dist --no-progress --no-suggest 40 | yarn install --frozen-lockfile 41 | yarn run build 42 | ls languages/ 43 | - name: Find Comment 44 | uses: peter-evans/find-comment@v2 45 | id: find_coomment 46 | with: 47 | issue-number: ${{ github.event.pull_request.number }} 48 | comment-author: 'pirate-bot' 49 | body-includes: PR has POT difference 50 | - name: Install PODiff 51 | run: | 52 | curl -o podiff.gz ftp://download.gnu.org.ua/pub/releases/podiff/podiff-1.3.tar.gz 53 | tar -xf podiff.gz 54 | cd podiff-1.3 55 | make 56 | mkdir -p $GITHUB_WORKSPACE/bin 57 | mv ./podiff $GITHUB_WORKSPACE/bin 58 | echo "$GITHUB_WORKSPACE/bin" >> $GITHUB_PATH 59 | cd .. 60 | - name: Run Podiff 61 | id: translation_status 62 | run: | 63 | ${GITHUB_WORKSPACE}/neve-fse-head/bin/pot-diff.sh ./neve-fse-base/languages/neve-fse.pot ./neve-fse-head/languages/neve-fse.pot $PERCENT_TRESHOLD 64 | - name: Step require review 65 | if: steps.translation_status.outputs.has_pot_diff != 'success' 66 | uses: Automattic/action-required-review@v3 67 | with: 68 | requirements: | 69 | - name: Everything else 70 | paths: unmatched 71 | teams: 72 | - "sbs" 73 | status: Has translation changes, a review from SBS team is required 74 | token: ${{ secrets.BOT_TOKEN }} 75 | -------------------------------------------------------------------------------- /.github/workflows/issue-labeler.yml: -------------------------------------------------------------------------------- 1 | name: "Issue Labeler" 2 | on: 3 | issues: 4 | types: [opened] 5 | 6 | jobs: 7 | triage: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: github/issue-labeler@master 11 | with: 12 | repo-token: "${{ secrets.BOT_TOKEN }}" 13 | enable-versioned-regex: 0 14 | configuration-path: .github/labeler.yml -------------------------------------------------------------------------------- /.github/workflows/new-issues.yml: -------------------------------------------------------------------------------- 1 | name: Add to project 2 | 3 | on: 4 | issues: 5 | types: [opened,transferred] 6 | 7 | jobs: 8 | add-to-project: 9 | name: Add issue to project 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/add-to-project@main 13 | id: add_project 14 | with: 15 | project-url: ${{ secrets.PROJECT_PLANNING }} 16 | github-token: ${{ secrets.BOT_TOKEN_PROJECT }} 17 | - name: Set Team 18 | env: 19 | GITHUB_TOKEN: ${{ secrets.BOT_TOKEN_PROJECT }} 20 | run: | 21 | gh api graphql -f query=' 22 | mutation( 23 | $project: ID! 24 | $item: ID! 25 | $status_field: ID! 26 | $status_value: String! 27 | ) { 28 | updateProjectV2ItemFieldValue( 29 | input: { 30 | projectId: $project 31 | itemId: $item 32 | fieldId: $status_field 33 | value: { 34 | singleSelectOptionId: $status_value 35 | } 36 | } 37 | ) { 38 | projectV2Item { 39 | id 40 | } 41 | } 42 | }' -f project=${{ secrets.PROJECT_PLANNING_ID }} -f item=${{ steps.add_project.outputs.itemId }} -f status_field=${{ secrets.PLANNING_TEAM_FIELD_ID }} -f status_value=f0658f06 --silent 43 | -------------------------------------------------------------------------------- /.github/workflows/sync-branches.yml: -------------------------------------------------------------------------------- 1 | name: Sync branches 2 | on: 3 | push: 4 | branches: 5 | - 'main' 6 | jobs: 7 | sync-branch: 8 | runs-on: ubuntu-latest 9 | if: ${{ github.repository_owner == 'Codeinwp' }} # Disable on forks 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: Retrieve branch name 13 | id: retrieve-branch-name 14 | run: echo "::set-output name=branch_name::$(REF=${GITHUB_HEAD_REF:-$GITHUB_REF} && echo ${REF#refs/heads/} | sed 's/\//-/g')" 15 | - name: Merge master -> development 16 | if: ${{ steps.retrieve-branch-name.outputs.branch_name == 'main' }} 17 | uses: Codeinwp/merge-branch@master 18 | with: 19 | type: now 20 | from_branch: main 21 | target_branch: development 22 | github_token: ${{ secrets.BOT_TOKEN }} 23 | -------------------------------------------------------------------------------- /.github/workflows/test-js.yml: -------------------------------------------------------------------------------- 1 | name: Test JS 2 | 3 | on: 4 | push: 5 | branches-ignore: 6 | - 'main' 7 | 8 | jobs: 9 | jslint: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | matrix: 13 | node-version: [14.x] 14 | name: JS Test 15 | steps: 16 | - name: Checkout source code 17 | uses: actions/checkout@master 18 | - name: Setup node 19 | uses: actions/setup-node@v1 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | - name: Get yarn cache directory path 23 | id: yarn-cache-dir-path 24 | run: echo "::set-output name=dir::$(yarn cache dir)" 25 | - uses: actions/cache@v4 26 | id: yarn-cache 27 | with: 28 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 29 | key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} 30 | restore-keys: | 31 | ${{ runner.os }}-yarn- 32 | - name: Install Dependencies 33 | run: yarn install --frozen-lockfile 34 | - name: Build source 35 | run: yarn run build 36 | - name: Run lint checks 37 | run: yarn run lint 38 | -------------------------------------------------------------------------------- /.github/workflows/test-php.yml: -------------------------------------------------------------------------------- 1 | name: Test PHP 2 | 3 | on: 4 | push: 5 | branches-ignore: 6 | - "main" 7 | 8 | jobs: 9 | phplint: 10 | name: Phplint 11 | runs-on: ubuntu-22.04 12 | steps: 13 | - name: Setup PHP version 14 | uses: shivammathur/setup-php@v2 15 | with: 16 | php-version: "7.2" 17 | extensions: simplexml 18 | - name: Checkout source code 19 | uses: actions/checkout@v2 20 | - name: Get Composer Cache Directory 21 | id: composer-cache 22 | run: | 23 | echo "::set-output name=dir::$(composer config cache-files-dir)" 24 | - name: Setup Composer cache 25 | uses: actions/cache@v4 26 | with: 27 | path: ${{ steps.composer-cache.outputs.dir }} 28 | key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} 29 | restore-keys: | 30 | ${{ runner.os }}-composer- 31 | - name: Install composer 32 | run: composer install --prefer-dist --no-progress --no-suggest 33 | - name: Run PHPCS 34 | run: composer run lint 35 | phpunit: 36 | name: Phpunit 37 | runs-on: ubuntu-22.04 38 | services: 39 | mysql: 40 | image: mysql:5.7 41 | env: 42 | MYSQL_ROOT_PASSWORD: root 43 | ports: 44 | - 3306/tcp 45 | options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 46 | steps: 47 | - name: Setup PHP version 48 | uses: shivammathur/setup-php@v2 49 | with: 50 | php-version: "7.2" 51 | extensions: simplexml, mysql 52 | tools: phpunit-polyfills 53 | - name: Checkout source code 54 | uses: actions/checkout@v2 55 | - name: Install WordPress Test Suite 56 | run: | 57 | bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1:${{ job.services.mysql.ports['3306'] }} 58 | - name: Get Composer Cache Directory 59 | id: composer-cache 60 | run: | 61 | echo "::set-output name=dir::$(composer config cache-files-dir)" 62 | - name: Setup Composer cache 63 | uses: actions/cache@v4 64 | with: 65 | path: ${{ steps.composer-cache.outputs.dir }} 66 | key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} 67 | restore-keys: | 68 | ${{ runner.os }}-composer- 69 | - name: Install composer 70 | run: composer install --prefer-dist --no-progress --no-suggest 71 | - name: Run phpunit 72 | run: composer run-script phpunit 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | dist 4 | artifact 5 | 6 | assets/css/build 7 | assets/js/build 8 | 9 | *.log 10 | *.map 11 | /vendor/ 12 | 13 | languages/neve-fse.pot 14 | 15 | .DS_Store 16 | .phpunit.result.cache 17 | -------------------------------------------------------------------------------- /.releaserc.yml: -------------------------------------------------------------------------------- 1 | --- 2 | branches: 3 | - 'main' 4 | plugins: 5 | - - "@semantic-release/commit-analyzer" 6 | - preset: simple-preset 7 | releaseRules: conventional-changelog-simple-preset/release-rules 8 | - - "@semantic-release/changelog" 9 | - changelogFile: CHANGELOG.md 10 | - - "@semantic-release/release-notes-generator" 11 | - preset: simple-preset 12 | - - "@semantic-release/exec" 13 | - prepareCmd: "replace-in-file \"== Changelog ==\" \"== Changelog ==\n\n${nextRelease.notes}\" readme.txt" 14 | - - "@semantic-release/exec" 15 | - prepareCmd: grunt version::${nextRelease.version} && grunt wp_readme_to_markdown 16 | - - "semantic-release-slack-bot" 17 | - notifyOnSuccess: false 18 | notifyOnFail: false 19 | markdownReleaseNotes: true 20 | branchesConfig: 21 | - pattern: main 22 | notifyOnSuccess: true 23 | notifyOnFail: false 24 | - - "@semantic-release/git" 25 | - assets: 26 | - CHANGELOG.md 27 | - readme.md 28 | - readme.txt 29 | - style.css 30 | - functions.php 31 | - package-lock.json 32 | - package.json 33 | message: "chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" 34 | - - "@semantic-release/github" 35 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "@wordpress/stylelint-config/scss" 4 | ], 5 | "rules": { 6 | "no-invalid-position-at-import-rule": null, 7 | "no-descending-specificity": null, 8 | "selector-class-pattern": null 9 | } 10 | } -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | const path = require( 'path' ); 2 | 3 | const paths = { 4 | global: { 5 | config: path.join( __dirname, 'grunt/' ), 6 | grunt: path.join( __dirname, 'grunt/' ), 7 | }, 8 | config: 'grunt/', 9 | grunt: 'grunt/', 10 | languages: 'languages/', 11 | logs: 'logs/', 12 | images: 'images/', 13 | vendor: 'packages/', 14 | css: 'assets/css/', 15 | }; 16 | 17 | const taskMap = { 18 | rtlcss: 'grunt-rtlcss', 19 | sass: 'grunt-contrib-sass', 20 | watch: 'grunt-contrib-watch', 21 | addtextdomain: 'grunt-wp-i18n', 22 | postcss: '@lodder/grunt-postcss', 23 | wp_readme_to_markdown: 'grunt-wp-readme-to-markdown', 24 | }; 25 | 26 | const files = { 27 | php: [ 28 | '*.php', 29 | '**/*.php', 30 | '!.git/**', 31 | '!vendor/**', 32 | '!node_modules/**', 33 | '!logs/**', 34 | ], 35 | css: [ 36 | '*.css', 37 | '**/*.css', 38 | '!*.min.css', 39 | '!**/*.min.css', 40 | '!vendor/**', 41 | '!node_modules/**', 42 | '!logs/**', 43 | ], 44 | js: [ 45 | '*.js', 46 | '**/*.js', 47 | '!*.min.js', 48 | '!**/*.min.js', 49 | '!.git/**', 50 | '!vendor/**', 51 | '!node_modules/**', 52 | '!logs/**', 53 | ], 54 | }; 55 | 56 | const gruntConfig = ( grunt ) => { 57 | 'use strict'; 58 | 59 | const config = {}; 60 | const loader = require( 'load-project-config' ); 61 | 62 | config.paths = paths; 63 | config.taskMap = taskMap; 64 | config.files = files; 65 | loader( grunt, config ).init(); 66 | }; 67 | 68 | module.exports = gruntConfig; 69 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_calendar.scss: -------------------------------------------------------------------------------- 1 | /* Border color of calendar should inherit ti-bg-alt color */ 2 | .wp-block-calendar table:where(:not(.has-text-color)) td, 3 | .wp-block-calendar table:where(:not(.has-text-color)) th { 4 | border: 1px solid var(--wp--preset--color--ti-bg-alt); 5 | padding: 8px; 6 | } 7 | 8 | /*Set bg color of calendar header to bg-inv, and the border color to bg-alt */ 9 | :where(.wp-block-calendar table:not(.has-background) th) { 10 | border-color: 1 px solid var(--wp--preset--color--ti-bg-alt); 11 | background-color: var(--wp--preset--color--ti-bg-inv); 12 | color: var(--wp--preset--color--ti-fg-alt); 13 | } 14 | 15 | /* Text of calendar should inherit ti-fg color */ 16 | .wp-block-calendar table:where(:not(.has-text-color)) { 17 | color: var(--wp--preset--color--ti-fg); 18 | } 19 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_image.scss: -------------------------------------------------------------------------------- 1 | %figcaption { 2 | text-align: left; 3 | font-size: var(--wp--preset--font-size--small); 4 | } 5 | 6 | .wp-block-image { 7 | 8 | &.aligncenter { 9 | margin-left: auto; 10 | margin-right: auto; 11 | } 12 | 13 | &.alignleft { 14 | float: left; 15 | margin-right: 2em; 16 | } 17 | 18 | &.alignright { 19 | float: right; 20 | margin-left: 2em; 21 | } 22 | } 23 | 24 | // Gallery & Image captions. 25 | .wp-block-gallery.has-nested-images, 26 | figure.wp-block-image { 27 | 28 | figcaption { 29 | 30 | @extend %figcaption; 31 | color: var(--wp--preset--color--ti-fg); 32 | opacity: 0.6; 33 | } 34 | } 35 | 36 | // Gallery image captions 37 | .wp-block-gallery.has-nested-images { 38 | 39 | figure.wp-block-image { 40 | 41 | figcaption { 42 | 43 | @extend %figcaption; 44 | background: rgba(0, 0, 0, 0.3); 45 | margin: 0; 46 | padding: 8px; 47 | opacity: 1; 48 | } 49 | 50 | &.is-style-rounded { 51 | 52 | figcaption { 53 | opacity: 0.6; 54 | background: 0; 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_latest-posts.scss: -------------------------------------------------------------------------------- 1 | .wp-block-latest-posts { 2 | 3 | img { 4 | display: block; 5 | } 6 | 7 | &.wp-block-latest-posts__list li { 8 | margin-bottom: 16px; 9 | } 10 | 11 | .wp-block-latest-posts__post-title { 12 | display: block; 13 | margin-bottom: 8px; 14 | text-decoration: none; 15 | } 16 | 17 | .wp-block-latest-posts__post-author, 18 | time { 19 | font-size: var(--wp--preset--font-size--small); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_main.scss: -------------------------------------------------------------------------------- 1 | @import "image"; 2 | @import "separator"; 3 | @import "post-terms"; 4 | @import "query-pagination"; 5 | @import "search"; 6 | @import "navigation"; 7 | @import "latest-posts"; 8 | @import "table"; 9 | @import "calendar"; 10 | @import "quote"; 11 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_navigation.scss: -------------------------------------------------------------------------------- 1 | // Overwrite the selector... 2 | .wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open { 3 | background: var(--wp--preset--color--ti-bg); 4 | color: var(--wp--preset--color--ti-fg); 5 | } 6 | 7 | .wp-block-navigation__responsive-container.is-menu-open { 8 | --navigation-layout-justification-setting: center; 9 | 10 | > .wp-block-navigation__container { 11 | gap: 0; 12 | } 13 | 14 | // Root menu. 15 | .wp-block-navigation__container { 16 | gap: 24px !important; 17 | 18 | > li > a { 19 | font-size: var(--wp--preset--font-size--large) !important; 20 | } 21 | } 22 | 23 | // Submenu. 24 | .wp-block-navigation__submenu-container { 25 | gap: 24px !important; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_post-terms.scss: -------------------------------------------------------------------------------- 1 | .wp-block-post-terms { 2 | display: flex; 3 | flex-wrap: wrap; 4 | align-items: center; 5 | 6 | &.taxonomy-category, 7 | &.taxonomy-post_tag { 8 | 9 | a { 10 | padding: 4px 16px; 11 | margin: 5px; 12 | background-color: var(--wp--preset--color--ti-bg-alt); 13 | border-radius: 999px; 14 | } 15 | 16 | .wp-block-post-terms__separator { 17 | display: none; 18 | } 19 | } 20 | 21 | 22 | &.has-text-align-center { 23 | justify-content: center; 24 | } 25 | 26 | &.has-text-align-right { 27 | justify-content: flex-end; 28 | } 29 | } 30 | 31 | .wp-block-tag-cloud { 32 | display: flex; 33 | flex-wrap: wrap; 34 | align-items: center; 35 | 36 | a { 37 | padding: 4px 16px; 38 | margin: 5px; 39 | background-color: var(--wp--preset--color--ti-bg-alt); 40 | border-radius: 999px; 41 | text-decoration: none; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_query-pagination.scss: -------------------------------------------------------------------------------- 1 | .wp-block-query-pagination-numbers { 2 | 3 | .page-numbers:not(:last-child) { 4 | margin-right: 16px; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_quote.scss: -------------------------------------------------------------------------------- 1 | .wp-block-quote cite, 2 | .wp-block-quote footer { 3 | font-size: var(--wp--preset--font-size--normal); 4 | } 5 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_search.scss: -------------------------------------------------------------------------------- 1 | .wp-block-search { 2 | 3 | &.wp-block-search__button-inside .wp-block-search__inside-wrapper { 4 | 5 | @extend %input-base; 6 | } 7 | 8 | .wp-block-search__button { 9 | background: var(--wp--preset--color--ti-accent); 10 | color: var(--wp--preset--color--ti-fg-alt); 11 | border-color: var(--wp--preset--color--ti-accent); 12 | border-radius: 5px; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_separator.scss: -------------------------------------------------------------------------------- 1 | .wp-block-separator { 2 | 3 | &.is-style-wide { 4 | width: 100%; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /assets/css/src/blocks/_table.scss: -------------------------------------------------------------------------------- 1 | .wp-block-table { 2 | 3 | &.is-style-stripes tbody tr:nth-child(odd) { 4 | background-color: var(--wp--preset--color--ti-bg-alt); 5 | } 6 | 7 | thead { 8 | border-bottom: 1px solid; 9 | } 10 | 11 | tfoot { 12 | border-top: 1px solid; 13 | } 14 | 15 | figcaption { 16 | font-size: var(--wp--preset--font-size--small); 17 | color: var(--wp--preset--color--ti-fg); 18 | opacity: 0.6; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /assets/css/src/common/_generic.scss: -------------------------------------------------------------------------------- 1 | @custom-media --mobile (max-width: 481px); 2 | 3 | * { 4 | box-sizing: border-box; 5 | } 6 | 7 | body { 8 | -moz-osx-font-smoothing: grayscale; 9 | -webkit-font-smoothing: antialiased; 10 | } 11 | 12 | html, 13 | body { 14 | height: 100%; 15 | } 16 | 17 | .wp-site-blocks { 18 | height: 100%; 19 | display: flex; 20 | flex-direction: column; 21 | } 22 | 23 | header .is-position-sticky { 24 | position: fixed; 25 | width: 100% !important; 26 | } 27 | 28 | // Push footer to bottom. 29 | footer { 30 | margin-block-start: auto !important; 31 | } 32 | 33 | .wp-block-spacer { 34 | margin-block-start: 0 !important; 35 | } 36 | 37 | /* 38 | * Alignment styles. 39 | * 40 | * Relevant issues: 41 | * https://github.com/WordPress/gutenberg/issues/35607 42 | * https://github.com/WordPress/gutenberg/issues/35884 43 | */ 44 | 45 | 46 | .wp-site-blocks, 47 | body > .is-root-container, 48 | .edit-post-visual-editor__post-title-wrapper, 49 | .wp-block-group.alignfull, 50 | .wp-block-group.has-background, 51 | .wp-block-cover.alignfull, 52 | .is-root-container .wp-block[data-align="full"] > .wp-block-group, 53 | .is-root-container .wp-block[data-align="full"] > .wp-block-cover { 54 | padding-left: var(--wp--custom--spacing--outer); 55 | padding-right: var(--wp--custom--spacing--outer); 56 | } 57 | 58 | .wp-site-blocks .alignfull, 59 | .wp-site-blocks > .wp-block-group.has-background, 60 | .wp-site-blocks > .wp-block-cover, 61 | .wp-site-blocks > .wp-block-template-part > .wp-block-group.has-background, 62 | .wp-site-blocks > .wp-block-template-part > .wp-block-cover, 63 | body > .is-root-container > .wp-block-cover, 64 | body > .is-root-container > .wp-block-template-part > .wp-block-group.has-background, 65 | body > .is-root-container > .wp-block-template-part > .wp-block-cover, 66 | .is-root-container .wp-block[data-align="full"] { 67 | margin-left: calc(-1 * var(--wp--custom--spacing--outer)) !important; 68 | margin-right: calc(-1 * var(--wp--custom--spacing--outer)) !important; 69 | width: unset; 70 | } 71 | 72 | /** 73 | * Override button outline paddings because they 74 | * can NOT be changed from the theme.json. 75 | * Relevant issue: 76 | * https://github.com/WordPress/gutenberg/issues/34853 77 | */ 78 | body .wp-block-button.is-style-outline > .wp-block-button__link, 79 | body .wp-block-button .wp-block-button__link.is-style-outline { 80 | border: 2px solid; 81 | padding: 16px 40px; 82 | 83 | @media (--mobile) { 84 | padding: 16px 20px; 85 | } 86 | } 87 | 88 | body .wp-block-button .wp-block-button__link { 89 | 90 | @media (--mobile) { 91 | padding: 16px 20px; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /assets/css/src/common/_vars.scss: -------------------------------------------------------------------------------- 1 | $line-height-fs-huge: 1.25; 2 | $line-height-fs-x-large: 1.3; 3 | $line-height-fs-large: 1.4; 4 | $line-height-fs-medium: 1.5; 5 | $line-height-fs-normal: 1.7; 6 | $line-height-fs-small: 1.6; 7 | 8 | -------------------------------------------------------------------------------- /assets/css/src/design-pack-notice.scss: -------------------------------------------------------------------------------- 1 | @custom-media --max-tablet (max-width: 769px); 2 | @custom-media --max-desktop (max-width: 1200px); 3 | 4 | #neve-fse-design-pack-notice { 5 | 6 | .notice-wrap { 7 | display: flex; 8 | align-items: center; 9 | gap: 15px; 10 | border: 0; 11 | border-radius: 8px; 12 | padding: 20px 25px; 13 | opacity: 0; 14 | animation: fade-down-in 0.3s ease forwards 0.3s; 15 | z-index: 10000; 16 | position: fixed; 17 | background: #fff; 18 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); 19 | right: 10px; 20 | bottom: 35px; 21 | 22 | @media (--max-desktop) { 23 | bottom: 10px; 24 | right: 10px; 25 | padding: 10px 15px; 26 | margin-left: 10px; 27 | } 28 | 29 | &.dismissed { 30 | animation: fade-up-out 0.3s ease forwards 0s; 31 | } 32 | } 33 | 34 | svg { 35 | flex-shrink: 0; 36 | } 37 | 38 | button { 39 | border: 0; 40 | background: 0; 41 | cursor: pointer; 42 | padding: 0; 43 | border-radius: 5px; 44 | 45 | &:hover { 46 | background: #e7e7e7; 47 | } 48 | } 49 | 50 | .content-wrap { 51 | display: grid; 52 | } 53 | 54 | span { 55 | font-weight: 600; 56 | color: #6a6a6a; 57 | font-size: 12px; 58 | 59 | @media (--max-desktop) { 60 | font-size: 10px; 61 | } 62 | } 63 | 64 | p { 65 | 66 | @media (--max-desktop) { 67 | font-size: 12px; 68 | } 69 | font-size: 16px; 70 | margin: 0; 71 | padding: 0; 72 | } 73 | 74 | a { 75 | margin-left: 35px; 76 | font-weight: 700; 77 | font-size: 16px; 78 | text-decoration: 0; 79 | color: #fff; 80 | background: #383fef; 81 | border-radius: 5px; 82 | padding: 12px 16px; 83 | text-align: center; 84 | 85 | @media (--max-desktop) { 86 | font-size: 14px; 87 | padding: 7px 10px; 88 | margin-left: 0; 89 | flex-shrink: 0; 90 | } 91 | } 92 | } 93 | 94 | @keyframes fade-down-in { 95 | 96 | 0% { 97 | opacity: 0; 98 | transform: translateY(-20px); 99 | } 100 | 101 | 100% { 102 | opacity: 1; 103 | transform: translateY(0); 104 | } 105 | } 106 | 107 | @keyframes fade-up-out { 108 | 109 | 0% { 110 | opacity: 1; 111 | transform: translateY(0); 112 | } 113 | 114 | 100% { 115 | opacity: 0; 116 | transform: translateY(-20px); 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /assets/css/src/editor.scss: -------------------------------------------------------------------------------- 1 | @import "common/vars"; 2 | 3 | .editor-styles-wrapper { 4 | 5 | @import "common/generic"; 6 | @import "blocks/main"; 7 | @import "elements/main"; 8 | @import "editor/blocks/main"; 9 | } 10 | -------------------------------------------------------------------------------- /assets/css/src/editor/blocks/_button.scss: -------------------------------------------------------------------------------- 1 | .wp-block-button.is-style-outline > .wp-block-button__link, 2 | .wp-block-button .wp-block-button__link.is-style-outline { 3 | border-color: inherit; 4 | } 5 | -------------------------------------------------------------------------------- /assets/css/src/editor/blocks/_latest-posts.scss: -------------------------------------------------------------------------------- 1 | .wp-block-latest-posts { 2 | 3 | li > a { 4 | display: block; 5 | margin-bottom: 10px; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /assets/css/src/editor/blocks/_main.scss: -------------------------------------------------------------------------------- 1 | @import "latest-posts"; 2 | @import "button"; 3 | -------------------------------------------------------------------------------- /assets/css/src/elements/_comments.scss: -------------------------------------------------------------------------------- 1 | .comment-form { 2 | display: grid; 3 | grid-template-columns: repeat(3, 1fr); 4 | grid-column-gap: 15px; 5 | 6 | > * { 7 | grid-column: 1 / span 3; 8 | } 9 | 10 | > { 11 | 12 | .comment-form-author, 13 | .comment-form-email, 14 | .comment-form-url { 15 | grid-column: span 1; 16 | } 17 | } 18 | 19 | textarea, 20 | input:not([type="submit"]) { 21 | 22 | @extend %input-base; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /assets/css/src/elements/_extends.scss: -------------------------------------------------------------------------------- 1 | %input-base { 2 | border-radius: 5px; 3 | color: var(--wp--preset--color--ti-fg); 4 | background: var(--wp--preset--color--ti-bg); 5 | border: 2px solid var(--wp--preset--color--ti-fg); 6 | font-size: var(--wp--preset--font-size--normal); 7 | } 8 | 9 | @mixin button-base { 10 | border: 0; 11 | box-shadow: none; 12 | font-weight: 600; 13 | padding: 16px 32px; 14 | border-radius: 3px; 15 | font-size: var(--wp--preset--font-size--normal); 16 | } 17 | 18 | %button { 19 | 20 | @include button-base; 21 | color: var(--wp--preset--color--ti-fg-alt); 22 | background: var(--wp--preset--color--ti-accent); 23 | border-color: var(--wp--preset--color--ti-accent); 24 | } 25 | -------------------------------------------------------------------------------- /assets/css/src/elements/_inputs.scss: -------------------------------------------------------------------------------- 1 | input:read-write, 2 | textarea, 3 | select { 4 | 5 | @extend %input-base; 6 | } 7 | 8 | input:read-write:not([type="search"]), 9 | textarea, 10 | select { 11 | width: 100%; 12 | padding: 11px; 13 | font-size: var(--wp--preset--font-size--normal); 14 | } 15 | 16 | input { 17 | font-family: inherit; 18 | } 19 | 20 | textarea { 21 | resize: vertical; 22 | font-family: inherit; 23 | } 24 | 25 | input[type="submit"], 26 | button[type="submit"] { 27 | 28 | @extend %button; 29 | } 30 | -------------------------------------------------------------------------------- /assets/css/src/elements/_main.scss: -------------------------------------------------------------------------------- 1 | @import "extends"; 2 | @import "comments"; 3 | @import "inputs"; 4 | -------------------------------------------------------------------------------- /assets/css/src/style.scss: -------------------------------------------------------------------------------- 1 | @import "common/generic"; 2 | @import "common/vars"; 3 | @import "elements/main"; 4 | @import "blocks/main"; 5 | @custom-media --tablet (max-width: 769px); 6 | -------------------------------------------------------------------------------- /assets/css/src/welcome-notice.scss: -------------------------------------------------------------------------------- 1 | @custom-media --tablet (max-width: 769px); 2 | @custom-media --desktop (max-width: 1200px); 3 | 4 | .neve-fse-welcome-notice { 5 | position: relative; 6 | padding-bottom: 0; 7 | 8 | .notice-content { 9 | display: flex; 10 | width: 100%; 11 | gap: 20px; 12 | 13 | @media (--desktop) { 14 | flex-direction: column-reverse; 15 | text-align: center; 16 | gap: 0; 17 | } 18 | } 19 | 20 | .notice-copy { 21 | padding: 30px 0; 22 | display: flex; 23 | flex-direction: column; 24 | justify-content: center; 25 | 26 | @media (--desktop) { 27 | padding: 20px 0; 28 | align-items: center; 29 | } 30 | } 31 | 32 | .notice-title { 33 | line-height: 1.5; 34 | 35 | span { 36 | font-weight: 600; 37 | color: #e57451; 38 | } 39 | } 40 | 41 | .actions { 42 | display: flex; 43 | margin-top: 40px; 44 | gap: 20px; 45 | align-items: center; 46 | flex-wrap: wrap; 47 | 48 | 49 | @media (--desktop) { 50 | margin-top: 20px; 51 | gap: 10px; 52 | justify-content: center; 53 | } 54 | } 55 | 56 | .button { 57 | display: flex; 58 | align-items: center; 59 | justify-content: center; 60 | justify-items: center; 61 | 62 | } 63 | 64 | .dashicons-update { 65 | margin-right: 5px; 66 | animation: rotation 2s infinite linear; 67 | } 68 | 69 | .dashicons-external { 70 | margin-left: 5px; 71 | } 72 | 73 | p { 74 | max-width: 700px; 75 | font-size: 15px; 76 | line-height: 1.6; 77 | } 78 | 79 | 80 | .otter-preview { 81 | flex-shrink: 1; 82 | width: auto; 83 | align-self: flex-end; 84 | display: block; 85 | max-height: 300px; 86 | max-width: 60%; 87 | 88 | @media (--desktop) { 89 | max-width: 80%; 90 | margin: 0 auto; 91 | } 92 | } 93 | 94 | .otter-logo { 95 | bottom: 30px; 96 | right: 30px; 97 | opacity: 0.75; 98 | max-width: 75px; 99 | //position: absolute; 100 | } 101 | } 102 | 103 | .neve-fse-survey-notice { 104 | 105 | .notice-content { 106 | display: flex; 107 | gap: 12px; 108 | align-items: flex-start; 109 | 110 | .neve-fse-logo { 111 | width: 64px; 112 | min-width: 64px; 113 | margin-top: 12px; 114 | } 115 | 116 | .description { 117 | font-size: 15px; 118 | line-height: 1.6; 119 | margin-bottom: 12px; 120 | } 121 | 122 | .notice-copy .actions { 123 | display: flex; 124 | gap: 12px; 125 | margin-bottom: 12px; 126 | 127 | .button-hero { 128 | 129 | .dashicons-external { 130 | line-height: 42px; 131 | } 132 | } 133 | } 134 | } 135 | } 136 | 137 | -------------------------------------------------------------------------------- /assets/fonts/albert-sans/AlbertSans-Italic-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/albert-sans/AlbertSans-Italic-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/albert-sans/AlbertSans-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/albert-sans/AlbertSans-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/figtree/Figtree-Italic-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/figtree/Figtree-Italic-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/figtree/Figtree-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/figtree/Figtree-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/fraunces/Fraunces-Italic-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/fraunces/Fraunces-Italic-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/fraunces/Fraunces-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/fraunces/Fraunces-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/hanken-grotesk/HankenGrotesk-Italic-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/hanken-grotesk/HankenGrotesk-Italic-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/hanken-grotesk/HankenGrotesk-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/hanken-grotesk/HankenGrotesk-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/inter/Inter-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/inter/Inter-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/montserrat/Montserrat-Italic-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/montserrat/Montserrat-Italic-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/montserrat/Montserrat-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/montserrat/Montserrat-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/open-sans/OpenSans-Italic-VariableFont_wdth,wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/open-sans/OpenSans-Italic-VariableFont_wdth,wght.ttf -------------------------------------------------------------------------------- /assets/fonts/open-sans/OpenSans-VariableFont_wdth,wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/open-sans/OpenSans-VariableFont_wdth,wght.ttf -------------------------------------------------------------------------------- /assets/fonts/outfit/Outfit-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/outfit/Outfit-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/playfair-display/PlayfairDisplay-Italic-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/playfair-display/PlayfairDisplay-Italic-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/playfair-display/PlayfairDisplay-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/playfair-display/PlayfairDisplay-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/fonts/source-sans-pro/SourceSansPro-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/source-sans-pro/SourceSansPro-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/source-sans-pro/SourceSansPro-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/source-sans-pro/SourceSansPro-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/source-sans-pro/SourceSansPro-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/source-sans-pro/SourceSansPro-Italic.ttf -------------------------------------------------------------------------------- /assets/fonts/source-sans-pro/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/source-sans-pro/SourceSansPro-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/spline-sans/SplineSans-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/fonts/spline-sans/SplineSans-VariableFont_wght.ttf -------------------------------------------------------------------------------- /assets/img/neve-fse-img01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/img/neve-fse-img02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/img/neve-fse-img03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/img/neve-fse-img04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img04.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img05.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img06.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img07.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img08.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img09.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img10.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img11.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img12.jpg -------------------------------------------------------------------------------- /assets/img/neve-fse-img13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img13.webp -------------------------------------------------------------------------------- /assets/img/neve-fse-img14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/neve-fse-img14.webp -------------------------------------------------------------------------------- /assets/img/neve-fse-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/img/welcome-notice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/assets/img/welcome-notice.png -------------------------------------------------------------------------------- /assets/js/src/common/plugin-install.js: -------------------------------------------------------------------------------- 1 | /* global jQuery */ 2 | 3 | const installPlugin = ( slug ) => { 4 | return new Promise( ( resolve ) => { 5 | wp.updates.ajax( 'install-plugin', { 6 | slug, 7 | success: () => { 8 | resolve( { success: true } ); 9 | }, 10 | error: ( err ) => { 11 | resolve( { success: false, code: err.errorCode } ); 12 | }, 13 | } ); 14 | } ); 15 | }; 16 | 17 | const activatePlugin = ( url ) => { 18 | return new Promise( ( resolve ) => { 19 | jQuery 20 | .get( url ) 21 | .done( () => { 22 | resolve( { success: true } ); 23 | } ) 24 | .fail( () => { 25 | resolve( { success: false } ); 26 | } ); 27 | } ); 28 | }; 29 | 30 | export { installPlugin, activatePlugin }; 31 | -------------------------------------------------------------------------------- /assets/js/src/components/DesignPackNotice.js: -------------------------------------------------------------------------------- 1 | /* global designPackNoticeData */ 2 | import { useSelect } from '@wordpress/data'; 3 | import { Icon, closeSmall } from '@wordpress/icons'; 4 | import { useEffect, useState } from '@wordpress/element'; 5 | 6 | const logo = ( 7 | 14 | 20 | 21 | ); 22 | 23 | const BLOCK_PATTERN_INSERTED_NOTICE = 'block-pattern-inserted-notice'; 24 | export default () => { 25 | const [ dismissed, setDismissed ] = useState( false ); 26 | const [ noticeTriggered, setNoticeTriggered ] = useState( false ); 27 | 28 | const patternInserted = useSelect( 29 | ( select ) => 30 | select( 'core/notices' ) 31 | .getNotices() 32 | .filter( ( n ) => n.id === BLOCK_PATTERN_INSERTED_NOTICE ) 33 | .length > 0 34 | ); 35 | 36 | useEffect( () => { 37 | if ( noticeTriggered ) { 38 | return; 39 | } 40 | if ( patternInserted ) { 41 | setNoticeTriggered( true ); 42 | } 43 | }, [ patternInserted ] ); 44 | 45 | const { ajaxUrl, ajaxAction, nonce, strings, buttonLink } = 46 | designPackNoticeData; 47 | const { dismiss, recommends, learnMore, noticeHtml } = strings; 48 | 49 | const dismissNotice = () => { 50 | const data = new window.FormData(); 51 | 52 | data.append( 'action', ajaxAction ); 53 | data.append( 'nonce', nonce ); 54 | 55 | fetch( ajaxUrl, { 56 | method: 'POST', 57 | body: data, 58 | } ).then( () => { 59 | setDismissed( true ); 60 | } ); 61 | }; 62 | 63 | const classes = [ 'notice-wrap' ]; 64 | 65 | if ( dismissed ) { 66 | classes.push( 'dismissed' ); 67 | } 68 | 69 | if ( ! noticeTriggered ) { 70 | return null; 71 | } 72 | 73 | return ( 74 |
75 | { logo } 76 | 77 |
78 | { recommends } 79 | 80 |

81 |
82 | 83 | 89 | { learnMore } 90 | 91 | 92 | 96 |
97 | ); 98 | }; 99 | -------------------------------------------------------------------------------- /assets/js/src/design-pack-notice.js: -------------------------------------------------------------------------------- 1 | import { createRoot } from '@wordpress/element'; 2 | 3 | import DesignPackNotice from './components/DesignPackNotice'; 4 | 5 | const container = document.createElement( 'div' ); 6 | container.id = 'neve-fse-design-pack-notice'; 7 | document.body.appendChild( container ); 8 | 9 | if ( container ) { 10 | createRoot( container ).render( ); 11 | } 12 | -------------------------------------------------------------------------------- /assets/js/src/general-notice.js: -------------------------------------------------------------------------------- 1 | /* global surveyFSENoticeData, jQuery */ 2 | 3 | /** 4 | * Handle the general notice. 5 | * 6 | * @param {jQuery} $ 7 | */ 8 | function handleGeneralNotice( $ ) { 9 | const { ajaxUrl, nonce, surveyClass, surveyAction } = surveyFSENoticeData; 10 | if ( ! $( `.${ surveyClass }` ).length ) { 11 | return; 12 | } 13 | const dismissSurveyBtn = $( `.${ surveyClass } .notice-dismiss` ); 14 | 15 | if ( ! dismissSurveyBtn.length ) { 16 | return; 17 | } 18 | 19 | $( dismissSurveyBtn ).on( 'click', () => { 20 | $.post( ajaxUrl, { 21 | nonce, 22 | action: surveyAction, 23 | success: hideAndRemoveGeneralNotice( $( '.' + surveyClass ) ), 24 | } ); 25 | } ); 26 | 27 | const laterDismiss = $( `.${ surveyClass } .later-dismiss` ); 28 | 29 | if ( ! laterDismiss.length ) { 30 | return; 31 | } 32 | 33 | $( laterDismiss ).on( 'click', () => { 34 | hideAndRemoveGeneralNotice( $( '.' + surveyClass ) ); 35 | } ); 36 | 37 | /** 38 | * Hide and remove the notice. 39 | * 40 | * @param {Element} notice 41 | */ 42 | const hideAndRemoveGeneralNotice = ( notice ) => { 43 | if ( ! notice ) { 44 | return; 45 | } 46 | notice.fadeTo( 100, 0, () => { 47 | notice.slideUp( 100, () => { 48 | notice.remove(); 49 | } ); 50 | } ); 51 | }; 52 | } 53 | 54 | /** 55 | * Initiate the notice. 56 | */ 57 | document.addEventListener( 'DOMContentLoaded', () => { 58 | jQuery( document ).ready( function () { 59 | handleGeneralNotice( jQuery ); 60 | } ); 61 | } ); 62 | -------------------------------------------------------------------------------- /assets/js/src/welcome-notice.js: -------------------------------------------------------------------------------- 1 | /* global neveFSEData, jQuery */ 2 | 3 | import { installPlugin, activatePlugin } from './common/plugin-install'; 4 | 5 | function handleWelcomeNotice( $ ) { 6 | const { 7 | activating, 8 | installing, 9 | done, 10 | activationUrl, 11 | onboardingUrl, 12 | ajaxUrl, 13 | nonce, 14 | otterRefNonce, 15 | otterStatus, 16 | } = neveFSEData; 17 | 18 | const installBtn = $( '.neve-fse-welcome-notice #neve-fse-install-otter' ); 19 | const dismissBtn = $( '.neve-fse-welcome-notice .notice-dismiss' ); 20 | const notice = $( '.neve-fse-welcome-notice' ); 21 | const installText = installBtn.find( '.text' ); 22 | const installSpinner = installBtn.find( '.dashicons' ); 23 | 24 | const hideAndRemoveNotice = () => { 25 | notice.fadeTo( 100, 0, () => { 26 | notice.slideUp( 100, () => { 27 | notice.remove(); 28 | } ); 29 | } ); 30 | }; 31 | 32 | const activateOtter = async () => { 33 | installText.text( activating ); 34 | await activatePlugin( activationUrl ); 35 | 36 | await $.post( ajaxUrl, { 37 | nonce: otterRefNonce, 38 | action: 'neve_fse_set_otter_ref', 39 | } ); 40 | 41 | installSpinner.removeClass( 'dashicons-update' ); 42 | installSpinner.addClass( 'dashicons-yes' ); 43 | installText.text( done ); 44 | setTimeout( hideAndRemoveNotice, 1500 ); 45 | window.location.href = onboardingUrl; 46 | }; 47 | 48 | $( installBtn ).on( 'click', async () => { 49 | installSpinner.removeClass( 'hidden' ); 50 | installBtn.attr( 'disabled', true ); 51 | 52 | if ( otterStatus === 'active' ) { 53 | window.location.href = onboardingUrl; 54 | return; 55 | } 56 | 57 | if ( otterStatus === 'installed' ) { 58 | await activateOtter(); 59 | return; 60 | } 61 | 62 | installText.text( installing ); 63 | await installPlugin( 'otter-blocks' ); 64 | await activateOtter(); 65 | } ); 66 | 67 | $( dismissBtn ).on( 'click', () => { 68 | $.post( ajaxUrl, { 69 | nonce, 70 | action: 'neve_fse_dismiss_welcome_notice', 71 | success: hideAndRemoveNotice, 72 | } ); 73 | } ); 74 | } 75 | 76 | document.addEventListener( 'DOMContentLoaded', () => { 77 | handleWelcomeNotice( jQuery ); 78 | } ); 79 | -------------------------------------------------------------------------------- /bin/dist.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | BUILD_VERSION=$(node -pe "require('./package.json').version") 4 | export BUILD_VERSION 5 | BUILD_NAME=$(node -pe "require('./package.json').name") 6 | export BUILD_NAME 7 | 8 | 9 | echo "BUILD_NAME=$BUILD_NAME" >> $GITHUB_ENV 10 | echo "BUILD_VERSION=$BUILD_VERSION" >> $GITHUB_ENV 11 | 12 | if [ ! -d "dist" ]; then 13 | mkdir "dist" 14 | fi 15 | 16 | if [ ! -d "artifact" ]; then 17 | mkdir "artifact" 18 | fi 19 | 20 | rsync -rc --exclude-from ".distignore" "./" "dist/$BUILD_NAME" 21 | 22 | cd dist 23 | zip -r "../artifact/$BUILD_NAME" "./$BUILD_NAME/" 24 | cd - 25 | -------------------------------------------------------------------------------- /bin/makepot.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | docker run \ 4 | --user root \ 5 | --rm \ 6 | --volume "$(pwd):/var/www/html/neve-fse" \ 7 | wordpress:cli bash -c 'php -d memory_limit=1024M "$(which wp)" i18n make-pot ./neve-fse/ ./neve-fse/languages/neve-fse.pot --headers={\"Last-Translator\":\"friends@themeisle.com\"\,\"Project-Id-Version\":\"NeveFSE\"\,\"Report-Msgid-Bugs-To\":\"https://github.com/Codeinwp/neve-fse/issues\"\} --allow-root --exclude=dist,build,bundle,e2e-tests ' -------------------------------------------------------------------------------- /bin/pot-diff.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Set Arguments 3 | file1="$1" 4 | file2="$2" 5 | 6 | ## Striping headers for file1 and file2. 7 | 8 | sed '/^"/d' $file1 > $file1.edited 9 | mv $file1.edited $file1 10 | sed '/^"/d' ${file2} > ${file2}.edited 11 | mv ${file2}.edited ${file2} 12 | 13 | if [[ $(podiff $file1 $file2) ]]; then 14 | podiff $file1 $file2 15 | echo "has_pot_diff=failure" >> $GITHUB_OUTPUT 16 | else 17 | echo "has_pot_diff=success" >> $GITHUB_OUTPUT 18 | echo "No differences found" 19 | fi 20 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codeinwp/neve-fse", 3 | "description": "NeveFSE theme by Themeisle", 4 | "type": "project", 5 | "license": "GPL-2.0+", 6 | "authors": [ 7 | { 8 | "name": "Themeisle", 9 | "email": "friends@themeisle.com", 10 | "homepage": "https://themeisle.com" 11 | } 12 | ], 13 | "autoload": { 14 | "psr-4": { 15 | "NeveFSE\\": "inc/" 16 | }, 17 | "files": [ 18 | "vendor/codeinwp/themeisle-sdk/load.php" 19 | ] 20 | }, 21 | "minimum-stability": "dev", 22 | "prefer-stable": true, 23 | "config": { 24 | "optimize-autoloader": true, 25 | "platform-check": false, 26 | "platform": { 27 | "php": "7.0" 28 | }, 29 | "allow-plugins": { 30 | "dealerdirect/phpcodesniffer-composer-installer": true 31 | } 32 | }, 33 | "extra": { 34 | "installer-disable": "true" 35 | }, 36 | "require": { 37 | "codeinwp/themeisle-sdk": "^3.3" 38 | }, 39 | "require-dev": { 40 | "codeinwp/phpcs-ruleset": "dev-main", 41 | "phpunit/phpunit": "^6.5", 42 | "automattic/vipwpcs": "^2.3", 43 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7.2", 44 | "wp-coding-standards/wpcs": "^2.3", 45 | "squizlabs/php_codesniffer": "^3.7", 46 | "phpcompatibility/php-compatibility": "^9.3", 47 | "yoast/phpunit-polyfills": "^2.0" 48 | }, 49 | "scripts": { 50 | "format-fix-exit": "\"vendor/bin/phpcbf-fix-exit-0\" --standard=phpcs.xml --report-summary --report-source -s --runtime-set testVersion 7.0- ", 51 | "format": "phpcbf --standard=phpcs.xml --report-summary --report-source -s --runtime-set testVersion 7.0- ", 52 | "phpcs": "phpcs --standard=phpcs.xml -s --runtime-set testVersion 7.0-", 53 | "lint": "composer run-script phpcs", 54 | "phpcs-i": "phpcs -i", 55 | "phpunit": "phpunit" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /grunt/addtextdomain.js: -------------------------------------------------------------------------------- 1 | /* jshint node:true */ 2 | // https://github.com/blazersix/grunt-wp-i18n 3 | module.exports = { 4 | theme: { 5 | options: { 6 | updateDomains: true, 7 | textdomain: '<%= package.theme.textdomain %>', 8 | }, 9 | files: { 10 | src: [ '<%= files.php %>' ], 11 | }, 12 | }, 13 | composer: { 14 | options: { 15 | textdomain: '<%= package.theme.textdomain %>', 16 | updateDomains: true, 17 | }, 18 | files: { 19 | src: [ 'vendor/codeinwp/**/*.php' ], 20 | }, 21 | }, 22 | }; 23 | -------------------------------------------------------------------------------- /grunt/aliases.yaml: -------------------------------------------------------------------------------- 1 | build: 2 | # Transpile SCSS 3 | - 'sass' 4 | # PostCSS 5 | - 'postcss' 6 | # RTL CSS 7 | - 'rtlcss' 8 | # Add TextDomain. 9 | - 'addtextdomain' 10 | 11 | # Version: 12 | # 1. grunt version::patch 13 | # 2. grunt generate 14 | # 3. commit & push for version update 15 | # 4. zip & upload to wordpress.org 16 | -------------------------------------------------------------------------------- /grunt/postcss.js: -------------------------------------------------------------------------------- 1 | // https://www.npmjs.com/package/@lodder/grunt-postcss 2 | 3 | const path = require('path'); 4 | 5 | module.exports = { 6 | options: { 7 | processors: [ 8 | require('postcss-custom-media')(), // Custom media queries: https://www.npmjs.com/package/postcss-custom-media 9 | require('postcss-combine-media-query')(), // Combine media queries: https://www.npmjs.com/package/postcss-combine-media-query 10 | require('cssnano')() // Minify the css: https://www.npmjs.com/package/cssnano 11 | ] 12 | }, 13 | dist: { 14 | src: 'assets/css/build/*.css' 15 | } 16 | } -------------------------------------------------------------------------------- /grunt/rtlcss.js: -------------------------------------------------------------------------------- 1 | // https://github.com/MohammadYounes/grunt-rtlcss 2 | const ext = '-rtl.css'; 3 | 4 | const options = { 5 | autoRename: false, 6 | autoRenameStrict: false, 7 | blacklist: {}, 8 | clean: true, 9 | greedy: false, 10 | processUrls: false, 11 | stringMap: [ 12 | { 13 | name: 'left-right', 14 | priority: 100, 15 | search: ['left', 'Left', 'LEFT'], 16 | replace: ['right', 'Right', 'RIGHT'], 17 | options: { 18 | scope: '*', 19 | ignoreCase: false, 20 | }, 21 | }, 22 | { 23 | name: 'ltr-rtl', 24 | priority: 100, 25 | search: ['ltr', 'Ltr', 'LTR'], 26 | replace: ['rtl', 'Rtl', 'RTL'], 27 | options: { 28 | scope: '*', 29 | ignoreCase: false, 30 | }, 31 | }, 32 | ], 33 | }; 34 | 35 | module.exports = { 36 | css: { 37 | options, 38 | expand: true, 39 | cwd: '<%= paths.css %>/build', 40 | dest: '<%= paths.css %>/build', 41 | ext, 42 | src: ['*.css', '!*-rtl.css'], 43 | }, 44 | }; 45 | -------------------------------------------------------------------------------- /grunt/sass.js: -------------------------------------------------------------------------------- 1 | // https://github.com/gruntjs/grunt-contrib-sass 2 | 3 | const sass = require('node-sass'); 4 | 5 | const options = { 6 | implementation: sass, 7 | noCache: true, 8 | outputStyle: 'expanded', 9 | sourceMap: true, 10 | }; 11 | 12 | const files = [{ 13 | expand: true, 14 | cwd: '<%= paths.css %>/src', 15 | src: ['*.scss'], 16 | dest: '<%= paths.css %>/build', 17 | ext: '.css' 18 | }]; 19 | 20 | module.exports = { 21 | scss: { 22 | options, 23 | files 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /grunt/version.js: -------------------------------------------------------------------------------- 1 | /* jshint node:true */ 2 | // https://github.com/kswedberg/grunt-version 3 | module.exports = { 4 | package: { 5 | options: { 6 | prefix: '"version"\\:\\s+"', 7 | }, 8 | src: 'package.json', 9 | }, 10 | stylesheet: { 11 | options: { 12 | prefix: 'Version\\:\\s+', 13 | }, 14 | src: 'style.css', 15 | }, 16 | functions: { 17 | options: { 18 | prefix: "NEVE_FSE_VERSION', '", 19 | }, 20 | src: 'functions.php', 21 | }, 22 | }; 23 | -------------------------------------------------------------------------------- /grunt/watch.js: -------------------------------------------------------------------------------- 1 | // https://github.com/gruntjs/grunt-contrib-watch 2 | module.exports = { 3 | sass: { 4 | files: ['assets/css/src/**/*.scss'], 5 | tasks: ['build'] 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /grunt/wp_readme_to_markdown.js: -------------------------------------------------------------------------------- 1 | /* jshint node:true */ 2 | // https://github.com/stephenharris/wp-readme-to-markdown 3 | module.exports = { 4 | theme: { 5 | files: { 6 | 'readme.md': 'readme.txt' 7 | } 8 | } 9 | }; -------------------------------------------------------------------------------- /inc/Block_Styles.php: -------------------------------------------------------------------------------- 1 | styles = array(); 30 | 31 | add_action( 'init', array( $this, 'add_block_styles' ) ); 32 | } 33 | 34 | /** 35 | * Add the block styles. 36 | * 37 | * @return void 38 | */ 39 | public function add_block_styles() { 40 | foreach ( $this->styles as $block => $styles ) { 41 | foreach ( $styles as $block_style ) { 42 | register_block_style( $block, $block_style ); 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /inc/Constants.php: -------------------------------------------------------------------------------- 1 | 'neve-fse-welcome-notice-dismissed', 20 | 'dismissed-survey-notice' => 'neve-fse-survey-notice-dismissed', 21 | 'dismissed-fse-design-pack-notice' => 'neve-fse-design-pack-dismissed', 22 | ); 23 | 24 | const PRODUCT_KEY = 'neve_fse'; 25 | } 26 | -------------------------------------------------------------------------------- /inc/Starter_Content.php: -------------------------------------------------------------------------------- 1 | array( 29 | 'primary' => array( 30 | 'items' => array( 31 | 'home' => array( 32 | 'type' => 'post_type', 33 | 'object' => 'page', 34 | 'object_id' => '{{' . self::HOME_SLUG . '}}', 35 | ), 36 | 'page_blog' => array( 37 | 'type' => 'post_type', 38 | 'object' => 'page', 39 | 'object_id' => '{{' . self::BLOG_SLUG . '}}', 40 | ), 41 | ), 42 | ), 43 | ), 44 | 'options' => array( 45 | 'page_on_front' => '{{' . self::HOME_SLUG . '}}', 46 | 'page_for_posts' => '{{' . self::BLOG_SLUG . '}}', 47 | 'show_on_front' => 'page', 48 | ), 49 | 'posts' => array( 50 | self::BLOG_SLUG => array( 51 | 'post_name' => self::BLOG_SLUG, 52 | 'post_type' => 'page', 53 | 'post_title' => self::BLOG_SLUG, 54 | ), 55 | self::HOME_SLUG => array( 56 | 'post_type' => 'page', 57 | 'post_title' => self::HOME_SLUG, 58 | 'post_content' => ' 59 | 60 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore.

61 | 62 | ', 63 | ), 64 | ), 65 | ); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /inc/patterns/layout/columns-content-images.php: -------------------------------------------------------------------------------- 1 | __( 'Columns with content and images', 'neve-fse' ), 22 | 'categories' => array( 'neve-fse' ), 23 | 'keywords' => array( 'Content', 'images', 'text', 'columns' ), 24 | 'content' => ' 25 | 26 |
27 |
28 |
29 |
30 |

Subheader

31 |
32 | 33 | 34 | 35 |

Add your title

36 | 37 | 38 | 39 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

40 | 41 | 42 | 43 |
44 | 45 |
46 |
47 | 48 | 49 | 50 |
51 | 52 |
53 | 54 |
55 | 56 |
57 | 58 | 59 | 60 |
61 | 62 |
63 | 64 |
65 | 66 |
67 |
68 |
69 | 70 | ', 71 | ); 72 | -------------------------------------------------------------------------------- /inc/patterns/layout/columns-image-and-text-inv.php: -------------------------------------------------------------------------------- 1 | __( 'Columns with image and text inverted', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse' ), 22 | 'keywords' => array( 'Columns', 'content', 'text', 'dark', 'inverted' ), 23 | 'content' => ' 24 | 25 | 64 | 65 | ', 66 | ); 67 | -------------------------------------------------------------------------------- /inc/patterns/layout/columns-image-and-text.php: -------------------------------------------------------------------------------- 1 | __( 'Columns with image and text', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse' ), 22 | 'keywords' => array( 'Columns', 'content', 'image', 'text' ), 23 | 'content' => ' 24 | 25 |
26 | 27 |
28 | 29 |
30 | 31 |
32 | 33 |
34 | 35 |
36 | 37 | 38 | 39 |
40 | 41 |

Lean and simple design

42 | 43 | 44 | 45 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 |
54 | 55 |
56 | 57 |
58 | 59 |
60 | 61 | ', 62 | ); 63 | -------------------------------------------------------------------------------- /inc/patterns/layout/columns-text-image.php: -------------------------------------------------------------------------------- 1 | __( 'Columns with text and image', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse' ), 22 | 'keywords' => array( 'Columns', 'content', 'text', 'image' ), 23 | 'content' => ' 24 | 25 |
26 | 27 |
28 | 29 |
30 | 31 |

Style Variations

32 | 33 | 34 | 35 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 |
44 | 45 |
46 | 47 | 48 | 49 |
50 | 51 |
52 | 53 |
54 | 55 |
56 | 57 |
58 | 59 |
60 | 61 | ', 62 | ); 63 | -------------------------------------------------------------------------------- /inc/patterns/layout/columns-with-services-text.php: -------------------------------------------------------------------------------- 1 | __( 'Columns with Services Text', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse' ), 20 | 'keywords' => array( 'columns', 'services', 'features', '3col' ), 21 | 'content' => ' 22 | 23 |
24 |
25 |
26 |

Service Title

27 | 28 | 29 | 30 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.

31 | 32 | 33 | 34 |
35 | 36 |
37 |
38 | 39 | 40 | 41 |
42 |

Service Title

43 | 44 | 45 | 46 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.

47 | 48 | 49 | 50 |
51 | 52 |
53 |
54 | 55 | 56 | 57 |
58 |

Service Title

59 | 60 | 61 | 62 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.

63 | 64 | 65 | 66 |
67 | 68 |
69 |
70 |
71 |
72 | ', 73 | ); 74 | -------------------------------------------------------------------------------- /inc/patterns/layout/contact-section.php: -------------------------------------------------------------------------------- 1 | __( 'Columns Section', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse' ), 20 | 'keywords' => array( 'contact' ), 21 | 'content' => ' 22 | 23 |
24 | 41 |
42 | ', 43 | ); 44 | -------------------------------------------------------------------------------- /inc/patterns/layout/content-with-images.php: -------------------------------------------------------------------------------- 1 | __( 'Content with images', 'neve-fse' ), 23 | 'categories' => array( 'neve-fse' ), 24 | 'keywords' => array( 'Content', 'images', 'text' ), 25 | 'content' => ' 26 | 27 |
28 |
29 |
30 |

Add your title

31 | 32 | 33 | 34 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

35 |
36 | 37 | 38 | 39 |
40 |
41 |
42 | 43 | 44 | 45 |
46 |
47 |
48 |
49 | 50 | 51 | 52 |
53 |
54 |
55 |
56 | 57 | 58 | 59 |
60 |

"...Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor ut labore et dolore magna aliqua..."

61 | 62 | 63 | 64 |
65 | 66 |
67 |
68 |
69 |
70 | 71 | ', 72 | ); 73 | -------------------------------------------------------------------------------- /inc/patterns/layout/cta-dark.php: -------------------------------------------------------------------------------- 1 | __( 'Call to Action with Background Color', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse' ), 20 | 'keywords' => array( 'call to action', 'CTA', 'inverted', 'dark', 'centered', 'cover' ), 21 | 'content' => ' 22 | 23 |
24 |
25 |

Let’s work together on your
next project

26 | 27 | 28 | 29 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

30 | 31 | 32 | 33 |
34 | 35 |
36 |
37 |
38 | 39 | ', 40 | ); 41 | -------------------------------------------------------------------------------- /inc/patterns/layout/full-width-quote.php: -------------------------------------------------------------------------------- 1 | __( 'Full-width columns with image and content', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse' ), 20 | 'keywords' => array( 'Full-width', 'quote', 'text', 'inverted', 'dark' ), 21 | 'content' => ' 22 | 23 |
24 |
25 |

"...Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua..."

26 | 27 | 28 | 29 |

SEAN FISHER

30 |
31 |
32 | 33 | ', 34 | ); 35 | -------------------------------------------------------------------------------- /inc/patterns/layout/hero-with-feature-columns.php: -------------------------------------------------------------------------------- 1 | __( 'Hero section with feature columns', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse' ), 20 | 'keywords' => array( 'columns', 'hero' ), 21 | 'content' => ' 22 | 23 |
24 | 25 |
26 | 27 |
28 | 29 |

Create and grow your
unique website today

30 | 31 | 32 | 33 |

Build a website for your business or brand, with Neve FSE

34 | 35 | 36 | 37 |
38 | 39 | 40 | 41 |
42 | 43 |
44 | 45 | 46 | 47 |
48 | 49 |
50 | 51 |
52 | 53 |
54 | 55 |
56 | 57 |
58 | ', 59 | ); 60 | -------------------------------------------------------------------------------- /inc/patterns/layout/hero-with-text.php: -------------------------------------------------------------------------------- 1 | __( 'Hero section with text', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse' ), 20 | 'keywords' => array( 'hero' ), 21 | 'content' => ' 22 | 23 |
24 |
25 |
26 |
27 |

Create and grow your
unique website today

28 | 29 | 30 | 31 |

Build a website for your business or brand, with Neve FSE

32 | 33 | 34 | 35 |
36 | 37 |
38 |
39 |
40 |
41 |
42 | ', 43 | ); 44 | -------------------------------------------------------------------------------- /inc/patterns/layout/map-section.php: -------------------------------------------------------------------------------- 1 | __( 'Map Section', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse' ), 22 | 'keywords' => array( 'contact' ), 23 | 'content' => ' 24 | 25 |
26 |
27 |
28 | ', 29 | ); 30 | -------------------------------------------------------------------------------- /inc/patterns/layout/page-cover-bg-image.php: -------------------------------------------------------------------------------- 1 | __( 'Page Cover with background image', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse' ), 22 | 'keywords' => array( 'call to action', 'page cover', 'inverted', 'dark' ), 23 | 'content' => ' 24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | 32 |

Let’s work together on your next project

33 | 34 | 35 | 36 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 |
45 | 46 |
47 | 48 |
49 |
50 | 51 | ', 52 | ); 53 | -------------------------------------------------------------------------------- /inc/patterns/layout/page-cover-with-buttons.php: -------------------------------------------------------------------------------- 1 | __( 'Page Cover with Buttons', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse' ), 22 | 'keywords' => array( 'Hero', 'Page Hero', 'Cover' ), 23 | 'content' => ' 24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | 32 |

Create and grow your
unique website today

33 | 34 | 35 | 36 |

Build a website for your business or brand, with Neve FSE

37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
49 | 50 |
51 | 52 |
53 |
54 | 55 | ', 56 | ); 57 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-1.php: -------------------------------------------------------------------------------- 1 | __( 'Posts loop grid simple', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed' ), 19 | 'content' => ' 20 | 21 |
22 |

From the blog

23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |

No Posts were found

37 | 38 |
39 |
40 | 41 | ', 42 | ); 43 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-2.php: -------------------------------------------------------------------------------- 1 | __( 'Posts loop grid inverted', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', 'dark', 'inverted' ), 19 | 'content' => ' 20 | 21 | 40 | 41 | ', 42 | ); 43 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-3.php: -------------------------------------------------------------------------------- 1 | __( 'Post cards', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', 'cards' ), 19 | 'content' => ' 20 | 21 |
22 |

From the blog

23 | 24 | 25 | 26 |
27 | 28 |
29 | 30 | 31 |
32 | 33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 |

No Posts were found

41 | 42 |
43 |
44 | 45 | ', 46 | ); 47 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-4.php: -------------------------------------------------------------------------------- 1 | __( 'Post rows', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', 'rows' ), 19 | 'content' => ' 20 | 21 |
22 |
23 | 24 |
25 |
26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 |

No Posts were found

41 | 42 |
43 |
44 | 45 | ', 46 | ); 47 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-5.php: -------------------------------------------------------------------------------- 1 | __( 'Post rows', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', 'rows', 'cards' ), 19 | 'content' => ' 20 | 21 |
22 |
23 | 24 |
25 |
26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 |

No Posts were found

41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
49 |
50 | 51 | ', 52 | ); 53 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-6.php: -------------------------------------------------------------------------------- 1 | __( 'Posts loop grid simple', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', 'rows', 'list' ), 19 | 'content' => ' 20 | 21 |
22 |
23 | 24 |
25 |
26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 |

No Posts were found

41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
49 |
50 | 51 | ', 52 | ); 53 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-7.php: -------------------------------------------------------------------------------- 1 | __( 'Post cards 2', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', 'grid', 'cards', 'excerpt' ), 19 | 'content' => ' 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 |
28 | 29 | 30 | 31 |
32 |
33 | 34 | 35 | 36 | 37 | 38 |

No Posts were found

39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
47 |
48 | 49 | ', 50 | ); 51 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-8.php: -------------------------------------------------------------------------------- 1 | __( 'Posts', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', '1 col' ), 19 | 'content' => ' 20 | 21 |
22 |
23 | 24 |
25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 |

No Posts were found

41 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 |
50 |
51 |
52 | 53 | ', 54 | ); 55 | -------------------------------------------------------------------------------- /inc/patterns/loops/post-loop-9.php: -------------------------------------------------------------------------------- 1 | __( 'Post Covers', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'posts', 'loop', 'blog', 'feed', '1 col', 'covers', 'tile' ), 19 | 'content' => ' 20 | 21 |
22 |
23 | 24 |
25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 |

No Posts were found

33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 |
42 | 43 | ', 44 | ); 45 | -------------------------------------------------------------------------------- /inc/patterns/page_titles/page-title-1.php: -------------------------------------------------------------------------------- 1 | __( 'Page Title - Simple', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'Page Title', 'Post title' ), 19 | 'content' => ' 20 | 21 |
22 | 23 | ', 24 | ); 25 | -------------------------------------------------------------------------------- /inc/patterns/page_titles/page-title-2.php: -------------------------------------------------------------------------------- 1 | __( 'Page Title - Dark', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'Page Title', 'Post title', 'background', 'inverted', 'dark' ), 19 | 'content' => ' 20 | 21 |
22 |
23 |
24 |
25 |
26 | 27 | ', 28 | ); 29 | -------------------------------------------------------------------------------- /inc/patterns/page_titles/page-title-3.php: -------------------------------------------------------------------------------- 1 | __( 'Page Title - Light', 'neve-fse' ), 17 | 'categories' => array( 'neve-fse', 'posts' ), 18 | 'keywords' => array( 'Page Title', 'Post title', 'background', 'light' ), 19 | 'content' => ' 20 | 21 |
22 |
23 |
24 |
25 |
26 | 27 | ', 28 | ); 29 | -------------------------------------------------------------------------------- /inc/patterns/page_titles/page-title-4.php: -------------------------------------------------------------------------------- 1 | __( 'Page Title - Cover', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse', 'posts' ), 22 | 'keywords' => array( 'Page Title', 'Post title', 'background', 'cover' ), 23 | 'content' => ' 24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 |
40 | 41 | ', 42 | ); 43 | -------------------------------------------------------------------------------- /inc/patterns/page_titles/page-title-5.php: -------------------------------------------------------------------------------- 1 | __( 'Page Title - Cover Boxed', 'neve-fse' ), 21 | 'categories' => array( 'neve-fse', 'posts' ), 22 | 'keywords' => array( 'Page Title', 'Post title', 'background', 'cover', 'boxed' ), 23 | 'content' => ' 24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 |
40 | 41 | ', 42 | ); 43 | -------------------------------------------------------------------------------- /inc/patterns/templates/archive-cover.php: -------------------------------------------------------------------------------- 1 | __( 'Archive (Cover)', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse-layouts' ), 20 | 'keywords' => array( 'archive', 'posts', 'cover' ), 21 | 'content' => ' 22 | 23 |
24 | 25 |
26 | 27 |
28 | 29 | 30 | 31 |
32 | 33 |
34 | 35 | 36 |
37 | 38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 | 46 | 47 | 48 |

No Posts were found

49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |
57 | 58 |
59 | 60 | 61 | 62 |
63 | 64 |

Search for an article

65 | 66 | 67 | 68 |
69 | 70 |
71 | 72 | ', 73 | ); 74 | -------------------------------------------------------------------------------- /inc/patterns/templates/archive-list.php: -------------------------------------------------------------------------------- 1 | __( 'Archive List', 'neve-fse' ), 19 | 'categories' => array( 'neve-fse-layouts' ), 20 | 'keywords' => array( 'archive', 'posts', 'list' ), 21 | 'content' => ' 22 | 23 |
24 | 25 |
26 | 27 |
28 | 29 | 30 | 31 |
32 | 33 |
34 | 35 | 36 |
37 | 38 |
39 | 40 |
41 | 42 | 43 | 44 |
45 | 46 | 47 | 48 |
49 | 50 |
51 | 52 | 53 | 54 | 55 | 56 |

No Posts were found

57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
65 | 66 |
67 | 68 | 69 | 70 |
71 | 72 |

Search for an article

73 | 74 | 75 | 76 |
77 | 78 |
79 | 80 | ', 81 | ); 82 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | '; 15 | -------------------------------------------------------------------------------- /library/archive/archive-list.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | '; 15 | -------------------------------------------------------------------------------- /library/front-page/front-page-2.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | '; 31 | -------------------------------------------------------------------------------- /library/front-page/front-page-3.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | '; 31 | -------------------------------------------------------------------------------- /library/single/single-post-cover-boxed.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | '; 15 | -------------------------------------------------------------------------------- /library/single/single-post-cover.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | '; 15 | -------------------------------------------------------------------------------- /library/templates/about-page.php: -------------------------------------------------------------------------------- 1 | 11 |
12 | 13 | 14 |
15 |

About

16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | '; 29 | -------------------------------------------------------------------------------- /library/templates/contact-page.php: -------------------------------------------------------------------------------- 1 | 11 |
12 | 13 | 14 |
15 |

Contact

16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | '; 27 | -------------------------------------------------------------------------------- /library/templates/portfolio-page.php: -------------------------------------------------------------------------------- 1 | 11 |
12 | 13 | 14 |
15 |

Portfolio

16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | '; 27 | -------------------------------------------------------------------------------- /library/templates/services-page.php: -------------------------------------------------------------------------------- 1 | 11 |
12 | 13 | 14 |
15 |

Services

16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | '; 29 | -------------------------------------------------------------------------------- /lint-staged.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '**/*.php': [ 'composer format-fix-exit ', 'composer lint' ], 3 | 'package.json': [ 'yarn run lint:package-json' ], 4 | 'assets/js/src/**/*.js': () => [ 'yarn run format:js', 'yarn run lint:js' ], 5 | 'assets/css/src/**/*.scss': () => [ 6 | 'yarn run format:scss', 7 | 'yarn run lint:scss', 8 | ], 9 | }; 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "neve-fse", 3 | "version": "1.1.5", 4 | "description": "A lightweight theme for the full site editing WordPress experience.", 5 | "author": "Themeisle ", 6 | "license": "GPL-2.0-or-later", 7 | "keywords": [ 8 | "wordpress-theme" 9 | ], 10 | "homepage": "https://github.com/Codeinwp/neve-fse", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/Codeinwp/neve-fse" 14 | }, 15 | "theme": { 16 | "textdomain": "neve-fse" 17 | }, 18 | "bugs": { 19 | "url": "https://github.com/Codeinwp/neve-fse/issues" 20 | }, 21 | "pot": { 22 | "reportmsgidbugsto": "https://github.com/Codeinwp/neve-fse/issues", 23 | "languageteam": "Themeisle Translate ", 24 | "lasttranslator": "Themeisle Translate Team " 25 | }, 26 | "devDependencies": { 27 | "@lodder/grunt-postcss": "^3.1.1", 28 | "@semantic-release/changelog": "^6.0.1", 29 | "@semantic-release/exec": "^6.0.3", 30 | "@semantic-release/git": "^10.0.1", 31 | "@wordpress/eslint-plugin": "^12.8.0", 32 | "@wordpress/icons": "^9.47.0", 33 | "@wordpress/scripts": "^23.6.0", 34 | "@wordpress/stylelint-config": "^20.0.2", 35 | "conventional-changelog-simple-preset": "^1.0.20", 36 | "cssnano": "^5.1.12", 37 | "eslint": "^8.21.0", 38 | "grunt": "^1.5.3", 39 | "grunt-contrib-watch": "^1.1.0", 40 | "grunt-rtlcss": "^2.0.2", 41 | "grunt-sass": "^3.1.0", 42 | "grunt-version": "^3.0.0", 43 | "grunt-wp-i18n": "^1.0.3", 44 | "grunt-wp-readme-to-markdown": "^2.1.0", 45 | "lint-staged": "^13.0.3", 46 | "load-project-config": "^0.2.1", 47 | "node-sass": "^7.0.1", 48 | "npm-run-all": "^4.1.5", 49 | "postcss": "^8.4.14", 50 | "postcss-combine-media-query": "^1.0.1", 51 | "postcss-custom-media": "^8.0.2", 52 | "replace-in-file": "^6.3.5", 53 | "semantic-release": "^19.0.3", 54 | "semantic-release-slack-bot": "^3.5.3", 55 | "simple-git-hooks": "^2.8.0" 56 | }, 57 | "scripts": { 58 | "build": "npm-run-all build:*", 59 | "dev": "npm-run-all --parallel dev:* format:*", 60 | "format": "npm-run-all format:*", 61 | "lint": "npm-run-all lint:*", 62 | "dist": "yarn run build && bash ./bin/dist.sh", 63 | "release": "npx semantic-release", 64 | "build:grunt": "grunt build", 65 | "build:js": "wp-scripts build assets/js/src/*.js --output-path=assets/js/build", 66 | "build:makepot": "bash ./bin/makepot.sh", 67 | "dev:grunt": "grunt watch", 68 | "dev:js": "wp-scripts build assets/js/src/*.js --output-path=assets/js/build --watch", 69 | "lint:package-json": "wp-scripts lint-pkg-json ./", 70 | "lint:js": "wp-scripts lint-js './assets/js/src/**/*.js'", 71 | "format:js": "wp-scripts format assets/js/src/**/*.js", 72 | "lint:scss": "wp-scripts lint-style './assets/css/src/**/*.scss'", 73 | "format:scss": "wp-scripts lint-style './assets/css/src/**/*.scss' --fix" 74 | }, 75 | "simple-git-hooks": { 76 | "pre-commit": "npx lint-staged" 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /parts/footer.html: -------------------------------------------------------------------------------- 1 | 2 |
4 | 5 | 6 | 11 | 12 | 13 | 14 |

Copyright 2023 - Neve FSE theme

15 | 16 |
17 | -------------------------------------------------------------------------------- /parts/footer_s1.html: -------------------------------------------------------------------------------- 1 | 2 |
4 | 5 |
6 | 7 |
8 | 9 |

10 | Copyright 2023 - Neve FSE theme

11 | 12 |
13 | 14 | 15 | 16 |
17 | 18 |
19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 |
28 | 29 |
30 | 31 |
32 | -------------------------------------------------------------------------------- /parts/header.html: -------------------------------------------------------------------------------- 1 | 2 |
4 | 5 |
7 | 8 |
9 | 10 |
11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 36 | 37 | 38 |
39 | 40 |
41 | 42 |
43 | 44 |
45 | -------------------------------------------------------------------------------- /parts/header_s1.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /parts/header_s2.html: -------------------------------------------------------------------------------- 1 | 2 |
4 | 5 | 6 |
7 | 8 | 9 |
10 | 11 |
12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 |
29 | 30 | 31 |
32 | 33 | 34 |
35 | 36 | 37 |
38 | -------------------------------------------------------------------------------- /parts/header_s3.html: -------------------------------------------------------------------------------- 1 | 2 |
4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 | 19 |
20 | 21 |
22 | 23 |
24 | 25 |
26 | -------------------------------------------------------------------------------- /phpcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ThemeIsle ruleset 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | . 33 | node_modules/* 34 | vendor/* 35 | build/* 36 | tests/* 37 | Gruntfile.js 38 | dist 39 | dist/* 40 | artifact/* 41 | assets/* 42 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | ./tests/ 12 | 13 | 14 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Codeinwp/neve-fse/203b78b520bc992dcb83ac38e93d4a2442d32dc7/screenshot.png -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: Neve FSE 3 | Theme URI: https://themeisle.com/themes/neve-fse/ 4 | Author: ThemeIsle 5 | Author URI: https://themeisle.com 6 | Tested up to: 6.1 7 | Requires PHP: 7.0 8 | Requires at least: 5.5 9 | Description: Neve FSE is an experimental sister theme of Neve, for the ones that are ready to go full speed on full site editing, without backwards compatibility code.Neve FSE is a modern, minimalistic theme that is fully compatible with full-site-editing, it offers a range of patterns that make it perfect for simple design is suitable for a wide range of purposes, including blogs, small businesses, startups, agencies, firms, e-commerce shops, personal portfolio sites, and more. It also comes with several style variations to suit your unique aesthetic. 10 | Version: 1.1.5 11 | License: GNU General Public License v2 or later 12 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 13 | Text Domain: neve-fse 14 | WordPress Available: yes 15 | Requires License: no 16 | Tags: one-column, custom-colors, custom-menu, custom-logo, e-commerce, editor-style, featured-images, full-site-editing, block-patterns, rtl-language-support, sticky-post, threaded-comments 17 | */ 18 | -------------------------------------------------------------------------------- /styles/s1-crayola.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/theme.json", 3 | "title": "Crayola", 4 | "version": 2, 5 | "settings": { 6 | "color": { 7 | "palette": [ 8 | { 9 | "slug": "ti-bg", 10 | "color": "#FFFFFF", 11 | "name": "Background" 12 | }, 13 | { 14 | "slug": "ti-fg", 15 | "color": "#1F2023", 16 | "name": "Foreground" 17 | }, 18 | { 19 | "slug": "ti-accent", 20 | "color": "#F5AB1A", 21 | "name": "Accent" 22 | }, 23 | { 24 | "slug": "ti-accent-secondary", 25 | "color": "#E1980A", 26 | "name": "Accent Secondary" 27 | }, 28 | { 29 | "slug": "ti-bg-inv", 30 | "color": "#14171C", 31 | "name": "Background Dark" 32 | }, 33 | { 34 | "slug": "ti-bg-alt", 35 | "color": "#F6F6F6", 36 | "name": "Background Alt" 37 | }, 38 | { 39 | "slug": "ti-fg-alt", 40 | "color": "#FFFFFA", 41 | "name": "Foreground Alt" 42 | } 43 | ] 44 | } 45 | }, 46 | "styles": { 47 | "elements": { 48 | "h1": { 49 | "typography": { 50 | "fontWeight": "600" 51 | } 52 | }, 53 | "h2": { 54 | "typography": { 55 | "fontWeight": "600" 56 | } 57 | }, 58 | "h3": { 59 | "typography": { 60 | "fontWeight": "600" 61 | } 62 | }, 63 | "h4": { 64 | "typography": { 65 | "fontWeight": "600" 66 | } 67 | }, 68 | "h5": { 69 | "typography": { 70 | "fontWeight": "600" 71 | } 72 | }, 73 | "h6": { 74 | "typography": { 75 | "fontWeight": "600" 76 | } 77 | } 78 | }, 79 | "heading": { 80 | "typography": { 81 | "fontFamily": "var(--wp--preset--font-family--inter)" 82 | } 83 | }, 84 | "typography": { 85 | "fontFamily": "var(--wp--preset--font-family--inter)" 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /styles/s2-majorelle-blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/theme.json", 3 | "title": "Majorelle Blue", 4 | "version": 2, 5 | "settings": { 6 | "color": { 7 | "palette": [ 8 | { 9 | "slug": "ti-bg", 10 | "color": "#FFFFFF", 11 | "name": "Background" 12 | }, 13 | { 14 | "slug": "ti-fg", 15 | "color": "#1F2023", 16 | "name": "Foreground" 17 | }, 18 | { 19 | "slug": "ti-accent", 20 | "color": "#5E33D9", 21 | "name": "Accent" 22 | }, 23 | { 24 | "slug": "ti-accent-secondary", 25 | "color": "#4F25C6", 26 | "name": "Accent Secondary" 27 | }, 28 | { 29 | "slug": "ti-bg-inv", 30 | "color": "#261E3C", 31 | "name": "Background Dark" 32 | }, 33 | { 34 | "slug": "ti-bg-alt", 35 | "color": "#EEEBF5", 36 | "name": "Background Alt" 37 | }, 38 | { 39 | "slug": "ti-fg-alt", 40 | "color": "#FFFFFA", 41 | "name": "Foreground Alt" 42 | } 43 | ] 44 | } 45 | }, 46 | "styles": { 47 | "elements": { 48 | "heading": { 49 | "typography": { 50 | "fontFamily": "var(--wp--preset--font-family--albert-sans)" 51 | } 52 | }, 53 | "h1": { 54 | "typography": { 55 | "fontWeight": "600" 56 | } 57 | }, 58 | "h2": { 59 | "typography": { 60 | "fontWeight": "600" 61 | } 62 | }, 63 | "h3": { 64 | "typography": { 65 | "fontWeight": "600" 66 | } 67 | }, 68 | "h4": { 69 | "typography": { 70 | "fontWeight": "600" 71 | } 72 | }, 73 | "h5": { 74 | "typography": { 75 | "fontWeight": "600" 76 | } 77 | }, 78 | "h6": { 79 | "typography": { 80 | "fontWeight": "600" 81 | } 82 | } 83 | }, 84 | "typography": { 85 | "fontFamily": "var(--wp--preset--font-family--albert-sans)" 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /styles/s3-zomp.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/theme.json", 3 | "title": "Zomp", 4 | "version": 2, 5 | "settings": { 6 | "color": { 7 | "palette": [ 8 | { 9 | "slug": "ti-bg", 10 | "color": "#F2EBE3", 11 | "name": "Background" 12 | }, 13 | { 14 | "slug": "ti-fg", 15 | "color": "#1F2023", 16 | "name": "Foreground" 17 | }, 18 | { 19 | "slug": "ti-accent", 20 | "color": "#429C91", 21 | "name": "Accent" 22 | }, 23 | { 24 | "slug": "ti-accent-secondary", 25 | "color": "#3A8A80", 26 | "name": "Accent Secondary" 27 | }, 28 | { 29 | "slug": "ti-bg-inv", 30 | "color": "#1E2827", 31 | "name": "Background Dark" 32 | }, 33 | { 34 | "slug": "ti-bg-alt", 35 | "color": "#FFFFFF", 36 | "name": "Background Alt" 37 | }, 38 | { 39 | "slug": "ti-fg-alt", 40 | "color": "#FFFFFA", 41 | "name": "Foreground Alt" 42 | } 43 | ] 44 | } 45 | }, 46 | "styles": { 47 | "elements": { 48 | "heading": { 49 | "typography": { 50 | "fontFamily": "var(--wp--preset--font-family--fraunces)" 51 | } 52 | } 53 | }, 54 | "typography": { 55 | "fontFamily": "var(--wp--preset--font-family--hanken-grotesk)" 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /styles/s4-dark-pastel-red.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/theme.json", 3 | "title": "Dark Pastel Red", 4 | "version": 2, 5 | "settings": { 6 | "color": { 7 | "palette": [ 8 | { 9 | "slug": "ti-bg", 10 | "color": "#F8F4F4", 11 | "name": "Background" 12 | }, 13 | { 14 | "slug": "ti-fg", 15 | "color": "#313132", 16 | "name": "Foreground" 17 | }, 18 | { 19 | "slug": "ti-accent", 20 | "color": "#C6461E", 21 | "name": "Accent" 22 | }, 23 | { 24 | "slug": "ti-accent-secondary", 25 | "color": "#A93C19", 26 | "name": "Accent Secondary" 27 | }, 28 | { 29 | "slug": "ti-bg-inv", 30 | "color": "#1D1A1A", 31 | "name": "Background Dark" 32 | }, 33 | { 34 | "slug": "ti-bg-alt", 35 | "color": "#FFFFFF", 36 | "name": "Background Alt" 37 | }, 38 | { 39 | "slug": "ti-fg-alt", 40 | "color": "#FFFFFA", 41 | "name": "Foreground Alt" 42 | } 43 | ] 44 | } 45 | }, 46 | "styles": { 47 | "elements": { 48 | "h1": { 49 | "typography": { 50 | "fontWeight": "500" 51 | } 52 | }, 53 | "h2": { 54 | "typography": { 55 | "fontWeight": "500" 56 | } 57 | }, 58 | "h3": { 59 | "typography": { 60 | "fontWeight": "500" 61 | } 62 | }, 63 | "h4": { 64 | "typography": { 65 | "fontWeight": "500" 66 | } 67 | }, 68 | "h5": { 69 | "typography": { 70 | "fontWeight": "500" 71 | } 72 | }, 73 | "h6": { 74 | "typography": { 75 | "fontWeight": "500" 76 | } 77 | }, 78 | "heading": { 79 | "typography": { 80 | "fontFamily": "var(--wp--preset--font-family--outfit)" 81 | } 82 | } 83 | }, 84 | "typography": { 85 | "fontFamily": "var(--wp--preset--font-family--spline-sans)" 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /styles/s5-aztec-gold.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/theme.json", 3 | "title": "Aztec Gold", 4 | "version": 2, 5 | "settings": { 6 | "color": { 7 | "palette": [ 8 | { 9 | "slug": "ti-bg", 10 | "color": "#181818", 11 | "name": "Background" 12 | }, 13 | { 14 | "slug": "ti-fg", 15 | "color": "#FFFFFF", 16 | "name": "Foreground" 17 | }, 18 | { 19 | "slug": "ti-accent", 20 | "color": "#BF985C", 21 | "name": "Accent" 22 | }, 23 | { 24 | "slug": "ti-accent-secondary", 25 | "color": "#AD8A54", 26 | "name": "Accent Secondary" 27 | }, 28 | { 29 | "slug": "ti-bg-alt", 30 | "color": "#1F1F1F", 31 | "name": "Background Alt" 32 | }, 33 | { 34 | "slug": "ti-bg-inv", 35 | "color": "#000000", 36 | "name": "Background Dark" 37 | }, 38 | { 39 | "slug": "ti-fg-alt", 40 | "color": "#FFFFFA", 41 | "name": "Foreground Alt" 42 | } 43 | ] 44 | } 45 | }, 46 | "styles": { 47 | "elements": { 48 | "heading": { 49 | "typography": { 50 | "fontFamily": "var(--wp--preset--font-family--playfair-display)" 51 | } 52 | }, 53 | "h1": { 54 | "typography": { 55 | "fontWeight": "800" 56 | } 57 | }, 58 | "h2": { 59 | "typography": { 60 | "fontWeight": "800" 61 | } 62 | }, 63 | "h3": { 64 | "typography": { 65 | "fontWeight": "800" 66 | } 67 | }, 68 | "h4": { 69 | "typography": { 70 | "fontWeight": "600" 71 | } 72 | }, 73 | "h5": { 74 | "typography": { 75 | "fontWeight": "600" 76 | } 77 | }, 78 | "h6": { 79 | "typography": { 80 | "fontWeight": "600" 81 | } 82 | } 83 | }, 84 | "typography": { 85 | "fontFamily": "var(--wp--preset--font-family--source-sans-pro)" 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /styles/s6-vivid-red-tangelo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/theme.json", 3 | "title": "Vivid Red-Tangelo", 4 | "version": 2, 5 | "settings": { 6 | "color": { 7 | "palette": [ 8 | { 9 | "slug": "ti-bg", 10 | "color": "#11252E", 11 | "name": "Background" 12 | }, 13 | { 14 | "slug": "ti-fg", 15 | "color": "#FFFFFF", 16 | "name": "Foreground" 17 | }, 18 | { 19 | "slug": "ti-accent", 20 | "color": "#DF6018", 21 | "name": "Accent" 22 | }, 23 | { 24 | "slug": "ti-accent-secondary", 25 | "color": "#CC5816", 26 | "name": "Accent Secondary" 27 | }, 28 | { 29 | "slug": "ti-bg-alt", 30 | "color": "#0E313E", 31 | "name": "Background Alt" 32 | }, 33 | { 34 | "slug": "ti-bg-inv", 35 | "color": "#121F25", 36 | "name": "Background Dark" 37 | }, 38 | { 39 | "slug": "ti-fg-alt", 40 | "color": "#FFFFFA", 41 | "name": "Foreground Alt" 42 | } 43 | ] 44 | } 45 | }, 46 | "styles": { 47 | "elements": { 48 | "h1": { 49 | "typography": { 50 | "fontWeight": "700" 51 | } 52 | }, 53 | "h2": { 54 | "typography": { 55 | "fontWeight": "700" 56 | } 57 | }, 58 | "h3": { 59 | "typography": { 60 | "fontWeight": "700" 61 | } 62 | }, 63 | "h4": { 64 | "typography": { 65 | "fontWeight": "700" 66 | } 67 | }, 68 | "h5": { 69 | "typography": { 70 | "fontWeight": "700" 71 | } 72 | }, 73 | "h6": { 74 | "typography": { 75 | "fontWeight": "700" 76 | } 77 | }, 78 | "heading": { 79 | "typography": { 80 | "fontFamily": "var(--wp--preset--font-family--montserrat)" 81 | } 82 | } 83 | }, 84 | "typography": { 85 | "fontFamily": "var(--wp--preset--font-family--open-sans)" 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /styles/s7-greenlight.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/theme.json", 3 | "title": "Greenlight", 4 | "version": 2, 5 | "settings": { 6 | "color": { 7 | "palette": [ 8 | { 9 | "slug": "ti-bg", 10 | "color": "#FFFFFF", 11 | "name": "Background" 12 | }, 13 | { 14 | "slug": "ti-fg", 15 | "color": "#1F2023", 16 | "name": "Foreground" 17 | }, 18 | { 19 | "slug": "ti-accent", 20 | "color": "#518459", 21 | "name": "Accent" 22 | }, 23 | { 24 | "slug": "ti-accent-secondary", 25 | "color": "#46734D", 26 | "name": "Accent Secondary" 27 | }, 28 | { 29 | "slug": "ti-bg-inv", 30 | "color": "#14171C", 31 | "name": "Background Dark" 32 | }, 33 | { 34 | "slug": "ti-bg-alt", 35 | "color": "#F6F3EE", 36 | "name": "Background Alt" 37 | }, 38 | { 39 | "slug": "ti-fg-alt", 40 | "color": "#FFFFFA", 41 | "name": "Foreground Alt" 42 | } 43 | ] 44 | } 45 | }, 46 | "styles": { 47 | "elements": { 48 | "heading": { 49 | "typography": { 50 | "fontFamily": "var(--wp--preset--font-family--figtree)" 51 | } 52 | }, 53 | "h1": { 54 | "typography": { 55 | "fontWeight": "700" 56 | } 57 | }, 58 | "h2": { 59 | "typography": { 60 | "fontWeight": "700" 61 | } 62 | }, 63 | "h3": { 64 | "typography": { 65 | "fontWeight": "700" 66 | } 67 | }, 68 | "h4": { 69 | "typography": { 70 | "fontWeight": "600" 71 | } 72 | }, 73 | "h5": { 74 | "typography": { 75 | "fontWeight": "600" 76 | } 77 | }, 78 | "h6": { 79 | "typography": { 80 | "fontWeight": "600" 81 | } 82 | } 83 | }, 84 | "typography": { 85 | "fontFamily": "var(--wp--preset--font-family--figtree)" 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /templates/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 |
7 |

404 - Page not Found

8 | 9 | 10 | 11 |

Unfortunately the page was not found. Click the 12 | button below to return to the homepage

13 | 14 | 15 | 16 |
17 | 18 |
19 |
20 |
21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /templates/archive.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
7 | 8 |
9 | 10 | 11 | 12 |
13 |
14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 |

No Posts were found

37 | 38 |
39 |
40 | 41 | 42 | 43 |
44 |

Search for an article

45 | 46 | 47 |
48 |
49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /templates/front-page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /templates/page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /templates/search.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 |

Search results

7 |
8 | 9 | 10 | 11 |
12 |
13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 |

No Posts were found

35 | 36 |
37 |
38 |
39 | 40 | 41 | 42 |
43 |

Try another search

44 | 45 | 46 |
47 |
48 | 49 | 50 | -------------------------------------------------------------------------------- /templates/single.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 |
7 | 8 | 9 |
10 | 11 |
12 |
13 |
14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 | 22 | 23 |
24 |
25 | 26 | 27 | 28 |
29 |
30 | 31 | 32 | 33 |
34 | 35 | 36 |
37 | 38 |
39 | 40 | 41 | 42 | 43 |
44 |
45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 |
56 | 57 | 58 |
59 |
60 |
61 | 62 | 63 | -------------------------------------------------------------------------------- /templates/template-blank.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /templates/template-plain.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | set_role( 'administrator' ); 43 | wp_update_user( 44 | array( 45 | 'ID' => 1, 46 | 'first_name' => 'Admin', 47 | 'last_name' => 'User', 48 | ) 49 | ); -------------------------------------------------------------------------------- /tests/test-load.php: -------------------------------------------------------------------------------- 1 | assertTrue( defined( 'NEVE_FSE_VERSION' ) ); 14 | $this->assertTrue( defined( 'NEVE_FSE_DEBUG' ) ); 15 | $this->assertTrue( defined( 'NEVE_FSE_DIR' ) ); 16 | $this->assertTrue( defined( 'NEVE_FSE_URL' ) ); 17 | } 18 | 19 | /** 20 | * Make sure debug is false. 21 | */ 22 | public function testDebugOff() { 23 | $this->assertEquals( NEVE_FSE_DEBUG, WP_DEBUG ); 24 | } 25 | 26 | /** 27 | * Make sure Core is loaded. 28 | * 29 | * @return void 30 | */ 31 | public function testCoreLoaded() { 32 | $this->assertTrue( class_exists( 'NeveFSE\Core', false ) ); 33 | } 34 | } --------------------------------------------------------------------------------