diff --git a/.github/workflows/deploy-free.yaml b/.github/workflows/deploy-free.yaml new file mode 100644 index 0000000..d4a554f --- /dev/null +++ b/.github/workflows/deploy-free.yaml @@ -0,0 +1,189 @@ +# builds the content of http://github.com/orgrosua/windpress +# inspiration from https://github.com/rectorphp/rector-src/blob/main/.github/workflows/build_scoped_rector.yaml + +name: Build FREE + +on: + push: + # branches: + # - main + tags: + - '*' + +env: + # see https://github.com/composer/composer/issues/9368#issuecomment-718112361 + COMPOSER_ROOT_VERSION: "dev-main" + +jobs: + build_scoped_orgrosua: + # Don't run on forks. + if: github.repository == 'orgrosua/windpress' + + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + # sometime, when 2 or more consecutive PRs merged, the checkout orgrosua/windpress is overlapped + # and reverting other commit change + # this should not happen on create a tag, so wait first + # - name: "Wait before checkout orgrosua/windpress on create a tag" + # if: "startsWith(github.ref, 'refs/tags/')" + # run: sleep 120 + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Get the current tag from github.ref, where the tag name is the version number. + # tag name pattern: X.Y.Z, where X, Y, Z are integers + # reduce the X by 1, then build the tag name + # save the tag name as `TAG_NAME` variable to file $GITHUB_ENV + # Note, set-output is deprecated, so use alternative instead of ::set-output + - name: "Get the current tag" + id: get_tag + run: | + echo "TAG_NAME=$(echo ${GITHUB_REF#refs/tags/} | awk -F. '{print $1-1"."$2"."$3}')" >> $GITHUB_ENV + + # clean up the dev files + - run: rm -rf ecs.php rector.php + + # Use pnpm to install dependencies and build the assets. + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - uses: actions/cache@v4 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + # Font Awesome Pro. https://fontawesome.com/docs/web/setup/packages + - run: npm config set "@fortawesome:registry" https://npm.fontawesome.com/ + - run: npm config set "//npm.fontawesome.com/:_authToken" ${{ secrets.FONTAWESOME_NPM_AUTH_TOKEN }} + + - run: pnpm install + - run: pnpm build + + # clean up the assets dev files + - run: rm -rf assets node_modules package.json pnpm-lock.yaml vite.config.js + + # scoped using php-scoper.phar which require #[\ReturnTypeWillChange] inside so use php 8.0 for scoping + - uses: shivammathur/setup-php@v2 + with: + php-version: 7.4 + coverage: none + # fixes https://github.com/rectorphp/rector/pull/4559/checks?check_run_id=1359814403, see https://github.com/shivammathur/setup-php#composer-github-oauth + env: + COMPOSER_TOKEN: ${{ secrets.ORGROSUA_DEV_PAT }} + + # remove this folders, as it exclusive for the premium version + - run: rm -rf src/Integration/{Blockstudio,Breakdance,Beaver,Blocksy,Breakdance,Bricks,Cwicly,Divi,FunnelKit,Greenshift,Kadence,Oxygen} + + # remove custom update library + - run: composer remove rosua/edd-sl-plugin-updater --ansi + + # decrease the version + # - run: php ./deploy/decrease-version.php + + # cleanup the decrease-version.php to avoid scanned by humbug/php-scoper + # - run: rm deploy/decrease-version.php + + # install only prod dependencies + - run: composer install --no-dev --classmap-authoritative --ansi + + # copy files to $NESTED_DIRECTORY directory Exclude the scoped/nested directories to prevent rsync from copying in a loop + - run: rsync --exclude orgrosua-deploy -av * orgrosua-deploy --quiet + + # humbug/php-scoper requires php ^8.2 + - uses: shivammathur/setup-php@v2 + with: + php-version: 8.2 + coverage: none + + # prefix the namespaces + - run: sh deploy/deploy-scoped.sh orgrosua-deploy orgrosua-prefixed + + # copy repository meta files + # - run: | + # cp CHANGELOG.md orgrosua-prefixed/ + + # deploy to WordPress.org SVN repository + # - name: WordPress Plugin Deploy + # uses: 10up/action-wordpress-plugin-deploy@stable + # env: + # SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + # SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + # SLUG: windpress + # BUILD_DIR: orgrosua-prefixed + # VERSION: ${{ env.TAG_NAME }} + + # clone remote repository, so we can push it + - uses: "actions/checkout@v4" + with: + repository: orgrosua/windpress-free + ref: main + path: remote-repository + token: ${{ secrets.ORGROSUA_DEV_PAT }} + + # remove remote files, to avoid piling up dead code in remote repository + - working-directory: remote-repository + run: | + git rm -rf . + git clean -fxd + + # copy files to remote repository + - run: cp -a orgrosua-prefixed/. remote-repository + + # setup git + - working-directory: remote-repository + run: | + git config user.name "Joshua Gugun Siagian" + git config user.email suabahasa@gmail.com + + # commit metadata + - name: "Get Git log" + id: git-log + run: | + echo "log<> $GITHUB_OUTPUT + echo "$(git log ${{ github.event.before }}..${{ github.event.after }} --reverse --pretty='https://github.com/orgrosua/windpress/commit/%H %s')" >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + + # publish it to remote repository without tag + # - name: "Commit Prefixed - main" + # working-directory: remote-repository + # if: "!startsWith(github.ref, 'refs/tags/')" + # run: | + # git add --all + # git commit -m "Updated WindPress to commit ${{ github.event.after }}" -m "${{ steps.git-log.outputs.log }}" + # git push --quiet origin main + + # publish it to remote repository with tag, where the tag is from the previous step, env.TAG_NAME + - name: "Commit Prefixed - tag" + working-directory: remote-repository + if: "startsWith(github.ref, 'refs/tags/')" + env: + INPUT_LOG: ${{ steps.git-log.outputs.log }} + # run: | + # git add --all + # git commit -m "WindPress ${GITHUB_REF#refs/tags/}" -m "$INPUT_LOG" + # git push --quiet origin main + # git tag ${GITHUB_REF#refs/tags/} -m "${GITHUB_REF#refs/tags/}" + # git push --quiet origin ${GITHUB_REF#refs/tags/} + run: | + git add --all + git commit -m "WindPress ${{env.TAG_NAME}}" -m "$INPUT_LOG" + git push --quiet origin main + git tag ${{env.TAG_NAME}} -m "${{env.TAG_NAME}}" + git push --quiet origin ${{env.TAG_NAME}} \ No newline at end of file diff --git a/.github/workflows/deploy-pro.yaml b/.github/workflows/deploy-pro.yaml new file mode 100644 index 0000000..f335dab --- /dev/null +++ b/.github/workflows/deploy-pro.yaml @@ -0,0 +1,156 @@ +# builds the content of http://github.com/orgrosua/windpress +# inspiration from https://github.com/rectorphp/rector-src/blob/main/.github/workflows/build_scoped_rector.yaml +# TODO: trigger the FREE build only when the PRO build is successful. reference: https://github.blog/changelog/2022-09-08-github-actions-use-github_token-with-workflow_dispatch-and-repository_dispatch/ +name: Build PRO + +on: + push: + # branches: + # - main + tags: + - '*' + +env: + # see https://github.com/composer/composer/issues/9368#issuecomment-718112361 + COMPOSER_ROOT_VERSION: "dev-main" + +jobs: + build_scoped_orgrosua: + # Don't run on forks. + if: github.repository == 'orgrosua/windpress' + + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + # sometime, when 2 or more consecutive PRs merged, the checkout orgrosua/windpress is overlapped + # and reverting other commit change + # this should not happen on create a tag, so wait first + # - name: "Wait before checkout orgrosua/windpress on create a tag" + # if: "startsWith(github.ref, 'refs/tags/')" + # run: sleep 120 + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # clean up the dev files + - run: rm -rf ecs.php rector.php + + # clean up the .wordpress-org directory as it is not needed in the PRO build + - run: rm -rf .wordpress-org + + # Use pnpm to install dependencies and build the assets. + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - uses: actions/cache@v4 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + # Font Awesome Pro. https://fontawesome.com/docs/web/setup/packages + - run: npm config set "@fortawesome:registry" https://npm.fontawesome.com/ + - run: npm config set "//npm.fontawesome.com/:_authToken" ${{ secrets.FONTAWESOME_NPM_AUTH_TOKEN }} + + - run: pnpm install + - run: pnpm build + + # clean up the assets dev files + - run: rm -rf assets node_modules package.json pnpm-lock.yaml vite.config.js + + # scoped using php-scoper.phar which require #[\ReturnTypeWillChange] inside so use php 8.0 for scoping + - uses: shivammathur/setup-php@v2 + with: + php-version: 7.4 + coverage: none + # fixes https://github.com/rectorphp/rector/pull/4559/checks?check_run_id=1359814403, see https://github.com/shivammathur/setup-php#composer-github-oauth + env: + COMPOSER_TOKEN: ${{ secrets.ORGROSUA_DEV_PAT }} + + # install only prod dependencies + - run: composer install --no-dev --classmap-authoritative --ansi + + # copy files to $NESTED_DIRECTORY directory Exclude the scoped/nested directories to prevent rsync from copying in a loop + - run: rsync --exclude orgrosua-deploy -av * orgrosua-deploy --quiet + + # humbug/php-scoper requires php ^8.2 + - uses: shivammathur/setup-php@v2 + with: + php-version: 8.2 + coverage: none + + # prefix the namespaces + - run: sh deploy/deploy-scoped.sh orgrosua-deploy orgrosua-prefixed + + # copy repository meta files + # - run: | + # cp CHANGELOG.md orgrosua-prefixed/ + + # clone remote repository, so we can push it + - uses: "actions/checkout@v4" + with: + repository: orgrosua/windpress-pro + ref: main + path: remote-repository + token: ${{ secrets.ORGROSUA_DEV_PAT }} + + # remove remote files, to avoid piling up dead code in remote repository + - working-directory: remote-repository + run: | + git rm -rf . + git clean -fxd + + # copy files to remote repository + - run: cp -a orgrosua-prefixed/. remote-repository + + # setup git + - working-directory: remote-repository + run: | + git config user.name "Joshua Gugun Siagian" + git config user.email suabahasa@gmail.com + + # commit metadata + - name: "Get Git log" + id: git-log + run: | + echo "log<> $GITHUB_OUTPUT + echo "$(git log ${{ github.event.before }}..${{ github.event.after }} --reverse --pretty='https://github.com/orgrosua/windpress/commit/%H %s')" >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + + # publish it to remote repository without tag + # - name: "Commit Prefixed - main" + # working-directory: remote-repository + # if: "!startsWith(github.ref, 'refs/tags/')" + # env: + # INPUT_LOG: ${{ steps.git-log.outputs.log }} + # run: | + # git add --all + # git commit -m "Updated Yabe Siul to commit ${{ github.event.after }}" -m "$INPUT_LOG" + # git push --quiet origin main + + # publish it to remote repository with tag + - name: "Commit Prefixed - tag" + working-directory: remote-repository + if: "startsWith(github.ref, 'refs/tags/')" + env: + INPUT_LOG: ${{ steps.git-log.outputs.log }} + run: | + git add --all + git commit -m "Yabe Siul ${GITHUB_REF#refs/tags/}" -m "$INPUT_LOG" + git push --quiet origin main + git tag ${GITHUB_REF#refs/tags/} -m "${GITHUB_REF#refs/tags/}" + git push --quiet origin ${GITHUB_REF#refs/tags/} \ No newline at end of file diff --git a/constant.php b/constant.php index 26811da..369ab79 100644 --- a/constant.php +++ b/constant.php @@ -26,7 +26,7 @@ class WIND_PRESS /** * @var string */ - public const VERSION = '1.0.0-DEV'; + public const VERSION = '0.0.1'; /** * @var string diff --git a/deploy/deploy-scoped.sh b/deploy/deploy-scoped.sh new file mode 100644 index 0000000..4c9544d --- /dev/null +++ b/deploy/deploy-scoped.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +# see https://stackoverflow.com/questions/66644233/how-to-propagate-colors-from-bash-script-to-github-action?noredirect=1#comment117811853_66644233 +export TERM=xterm-color + +# show errors +set -e + +# script fails if trying to access to an undefined variable +set -u + + +# functions +note() +{ + MESSAGE=$1; + + printf "\n"; + echo "[NOTE] $MESSAGE"; + printf "\n"; +} + + +# configure here +DEPLOY_DIRECTORY=$1 +RESULT_DIRECTORY=$2 + +# --------------------------- + +note "Starts" + +# download whitelist of php-scoper +note "Downloading whitelist of php-scoper" +wget https://github.com/orgrosua/php-scoper-wordpress-excludes/archive/refs/heads/master.zip -O "php-scoper-wordpress-excludes-master.zip" + +# extract whitelist of php-scoper +note "Extracting whitelist of php-scoper" +unzip "php-scoper-wordpress-excludes-master.zip" -d "$DEPLOY_DIRECTORY/deploy" + +# move scoper.inc.php file from $DEPLOY_DIRECTORY to current directory +# note "Moving scoper.inc.php file from $DEPLOY_DIRECTORY to current directory" +# mv "$DEPLOY_DIRECTORY/deploy/scoper.inc.php" . + +# 2. scope it +note "Download php-scoper" +wget https://github.com/humbug/php-scoper/releases/download/0.18.14/php-scoper.phar -N --no-verbose + +# Work around possible PHP memory limits +note "Running scoper to $RESULT_DIRECTORY" +php -d memory_limit=-1 php-scoper.phar add-prefix --output-dir "../$RESULT_DIRECTORY" --config "deploy/scoper.inc.php" --force --ansi --working-dir "$DEPLOY_DIRECTORY"; + +# note "Dumping Composer Autoload" +# composer dump-autoload --working-dir "$RESULT_DIRECTORY" --ansi --classmap-authoritative --no-dev + +# clean deploy files and directories +rm -rf "$DEPLOY_DIRECTORY" +rm -rf "$RESULT_DIRECTORY/deploy" +rm -f "$RESULT_DIRECTORY/composer.json" +rm -f "$RESULT_DIRECTORY/composer.lock" +rm -f "$RESULT_DIRECTORY/.gitattributes" +rm -f "$RESULT_DIRECTORY/.gitignore" +rm -f "$RESULT_DIRECTORY/.phpcs.xml" + +note "Finished" \ No newline at end of file diff --git a/deploy/scoper.inc.php b/deploy/scoper.inc.php new file mode 100644 index 0000000..389dc6e --- /dev/null +++ b/deploy/scoper.inc.php @@ -0,0 +1,232 @@ + $fileInfo->getPathname(), + iterator_to_array( + Finder::create() + ->files() + ->in(dirname(__DIR__) . '/vendor/symfony/polyfill-*') + ->name('bootstrap*.php'), + false, + ), +); + +$polyfillsStubs = array_map( + static fn (SplFileInfo $fileInfo) => $fileInfo->getPathname(), + iterator_to_array( + Finder::create() + ->files() + ->in(dirname(__DIR__) . '/vendor/symfony/polyfill-*/Resources/stubs') + ->name('*.php'), + false, + ), +); + +return [ + // The prefix configuration. If a non null value is be used, a random prefix + // will be generated instead. + // + // For more see: https://github.com/humbug/php-scoper/blob/master/docs/configuration.md#prefix + // 'prefix' => '_Yabe' . $timestamp, + 'prefix' => 'WindPressPackages', + + // By default when running php-scoper add-prefix, it will prefix all relevant code found in the current working + // directory. You can however define which files should be scoped by defining a collection of Finders in the + // following configuration key. + // + // This configuration entry is completely ignored when using Box. + // + // For more see: https://github.com/humbug/php-scoper/blob/master/docs/configuration.md#finders-and-paths + // 'finders' => [ + // Finder::create()->files()->in('src'), + // Finder::create()->files()->in('templates'), + // Finder::create() + // ->files() + // ->ignoreVCS(true) + // ->notName('/LICENSE|.*\\.md|.*\\.dist|Makefile|composer\\.json|composer\\.lock/') + // ->exclude([ + // 'doc', + // 'test', + // 'test_old', + // 'tests', + // 'Tests', + // 'vendor-bin', + // ]) + // ->in('vendor'), + // Finder::create()->append([ + // 'composer.json', + // 'wakaloka-winden.php', + // ]), + // ], + + // List of excluded files, i.e. files for which the content will be left untouched. + // Paths are relative to the configuration file unless if they are already absolute + // + // For more see: https://github.com/humbug/php-scoper/blob/master/docs/configuration.md#patchers + 'exclude-files' => [ + // 'src/a-whitelisted-file.php', + + ...$polyfillsBootstraps, + ...$polyfillsStubs, + ], + + // When scoping PHP files, there will be scenarios where some of the code being scoped indirectly references the + // original namespace. These will include, for example, strings or string manipulations. PHP-Scoper has limited + // support for prefixing such strings. To circumvent that, you can define patchers to manipulate the file to your + // heart contents. + // + // For more see: https://github.com/humbug/php-scoper/blob/master/docs/configuration.md#patchers + 'patchers' => [ + /** + * @see https://github.com/humbug/php-scoper/issues/841 + */ + static function (string $filePath, string $prefix, string $contents): string { + if (preg_match('/vendor\/composer\/autoload_real\.php$/', $filePath)) { + return preg_replace( + [ + "/'Composer\\\\\\\\Autoload\\\\\\\\ClassLoader'/", + "/spl_autoload_unregister\(array\('ComposerAutoloaderInit/", + ], + [ + "'{$prefix}\\\\\\\\Composer\\\\\\\\Autoload\\\\\\\\ClassLoader'", + "spl_autoload_unregister(array('{$prefix}\\\\\\\\ComposerAutoloaderInit", + ], + $contents + ); + } + + return $contents; + }, + ], + + // List of symbols to consider internal i.e. to leave untouched. + // + // For more information see: https://github.com/humbug/php-scoper/blob/master/docs/configuration.md#excluded-symbols + 'exclude-namespaces' => [ + // 'Acme\Foo' // The Acme\Foo namespace (and sub-namespaces) + // '~^PHPUnit\\\\Framework$~', // The whole namespace PHPUnit\Framework (but not sub-namespaces) + // '~^$~', // The root namespace only + // '', // Any namespace, + + 'WindPress', + 'WIND_PRESS', + 'WP_CLI', + 'Symfony\Polyfill', + + 'Bricks', + 'Timber', + 'Blockstudio', + 'Breakdance', + + 'SiteGround_Optimizer', + ], + 'exclude-classes' => array_merge( + $wp_classes, + [ + 'WIND_PRESS', + + 'WP_CLI', + 'WP_CLI_Command', + // 'ReflectionClassConstant', + + 'DOMXPath', + ] + ), + 'exclude-functions' => array_merge( + $wp_functions, + [ + // 'mb_str_split', + + 'wp_cache_flush', + 'rocket_clean_domain', + 'wp_cache_clear_cache', + 'w3tc_flush_all', + 'wpfc_clear_all_cache', + + 'bricks_is_builder_main', + 'bricks_is_builder_iframe', + + 'oxygen_safe_convert_old_shortcodes_to_json', + ] + ), + 'exclude-constants' => array_merge( + $wp_constants, + [ + // Symfony global constants + '/^SYMFONY\_[\p{L}_]+$/', + + 'WP_CONTENT_DIR', + 'WP_CONTENT_URL', + 'ABSPATH', + 'WPINC', + 'WP_DEBUG_DISPLAY', + 'WPMU_PLUGIN_DIR', + 'WP_PLUGIN_DIR', + 'WP_PLUGIN_URL', + 'WPMU_PLUGIN_URL', + 'MINUTE_IN_SECONDS', + 'HOUR_IN_SECONDS', + 'DAY_IN_SECONDS', + 'MONTH_IN_SECONDS', + 'debugger', + + 'BRICKS_VERSION', // Bricks + 'BRICKS_DB_PAGE_HEADER', + 'BRICKS_DB_PAGE_CONTENT', + 'BRICKS_DB_PAGE_FOOTER', + 'BRICKS_DB_TEMPLATE_SLUG', + 'BRICKS_DB_GLOBAL_CLASSES', + + 'CT_PLUGIN_MAIN_FILE', // Oxygen + + 'LC_MU_PLUGIN_NAME', // LiveCanvas + + 'GREENSHIFT_DIR_PATH', // Greenshift + + 'KADENCE_BLOCKS_VERSION', // Kadence Blocks + 'KADENCE_VERSION', // Kadence + + '__BREAKDANCE_VERSION', // Breakdance + ] + ), + + // List of symbols to expose. + // + // For more information see: https://github.com/humbug/php-scoper/blob/master/docs/configuration.md#exposed-symbols + 'expose-global-constants' => false, + 'expose-global-classes' => false, + 'expose-global-functions' => false, + 'expose-namespaces' => [ + // 'Acme\Foo' // The Acme\Foo namespace (and sub-namespaces) + // '~^PHPUnit\\\\Framework$~', // The whole namespace PHPUnit\Framework (but not sub-namespaces) + // '~^$~', // The root namespace only + // '', // Any namespace + ], + 'expose-classes' => [ + 'WIND_PRESS', + ], + 'expose-functions' => [ + 'leak', + ], + 'expose-constants' => [], +]; diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..5048bbc --- /dev/null +++ b/readme.txt @@ -0,0 +1,67 @@ +=== WindPress === +Contributors: suabahasa, rosua +Donate link: https://ko-fi.com/Q5Q75XSF7 +Tags: tailwind css, bricks builder, oxygen builder, breakdance builder +Requires at least: 6.0 +Tested up to: 6.5 +Stable tag: 0.0.1 +Requires PHP: 7.4 +License: GPLv3 +License URI: https://www.gnu.org/licenses/gpl-3.0.html + +The most effortless Tailwind CSS v4 integration for WordPress. + +== Description == + +### WindPress: the #1 Tailwind CSS v4 integration plugin for WordPress. + +WindPress is a platform agnostic Tailwind CSS v4 integration plugin for WordPress that allows you to use the full power of Tailwind CSS v4 within the WordPress ecosystem. + +### FEATURES + +WindPress is packed full of features designed to streamline your workflow. Some of our favorites are: + +* **Customizable Configuration**: The plugin comes with a default Tailwind CSS configuration, but you can easily customize it to fit your needs. +* **Easy to use**: Simplified and intuitive settings to get you up and running quickly. +* **Lightweight and blazingly fast**: The plugin dashboard built on top of WordPress REST API, and a modern JavaScript framework for an instant, responsive user experience. It has a small footprint and won't slow down your site. +* **Compile on the browser. No server is required**: Generate the final CSS file in the browser without server-side tools. None of your data is transferred over the network. + +### SEAMLESS INTEGRATION + +It's easy to build design with Tailwind CSS v4 thanks to the seamless integration with the most popular visual/page builders: + +* [Bricks](https://bricksbuilder.io/) +* [LiveCanvas](https://livecanvas.com/?ref=4008) +* [Oxygen](https://oxygenbuilder.com/) +* [Timber](https://upstatement.com/timber/) +* [Blockstudio](https://blockstudio.dev/?ref=7) **[Soon]** +* [Breakdance](https://breakdance.com/ref/165/) **[Soon]** +* [Builderius](https://builderius.io/?referral=afdfca82c8) **[Soon]** +* [Divi](https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=47622) **[Soon]** +* [Elementor](https://be.elementor.com/visit/?bta=209150&brand=elementor) **[Soon]** +* [Gutenberg](https://wordpress.org/gutenberg) **[Soon]** +* [GreenShift](https://greenshiftwp.com/) **[Soon]** +* [Kadence WP](https://kadencewp.com) **[Soon]** +* [Pinegrow](https://pinegrow.com/wordpress) **[Soon]** +* [Zion Builder](https://zionbuilder.io/) **[Soon]** + +Visit [our website](https://wind.press) for more information. + += Love WindPress? = +- Purchase the [Pro version](https://wind.press) +- Join our [Facebook Group](https://www.facebook.com/groups/1142662969627943) + += Credits = +- Image by [Pixel perfect](https://www.flaticon.com/free-icon/wind_727964) on Flaticon + +== Frequently Asked Questions == + +== Changelog == + += 1.0.0 = +* 🐣 Initial release. +* **New**: Upgraded to Tailwind CSS v4 (4.0.0-alpha.17 next) +* **New**: [Bricks](https://bricksbuilder.io/) integration +* **New**: [LiveCanvas](https://livecanvas.com/?ref=4008) integration +* **New**: [Oxygen](https://oxygenbuilder.com/) integration +* **New**: [Timber](https://upstatement.com/timber/) integration diff --git a/windpress.php b/windpress.php index 92ea362..d9a1e64 100644 --- a/windpress.php +++ b/windpress.php @@ -1,13 +1,13 @@