diff --git a/.github/ISSUE_TEMPLATE/agent-task.yml b/.github/ISSUE_TEMPLATE/agent-task.yml new file mode 100644 index 0000000000..ac609c27cd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/agent-task.yml @@ -0,0 +1,50 @@ +name: "Agent Task" +description: "Structured task for coding agents" +labels: ["agent"] +body: + - type: textarea + id: goal + attributes: + label: Goal / Acceptance Criteria + description: "What does 'done' look like? Be specific." + placeholder: "Example: Add a new customizer control to the dashboard app and ensure it renders on the frontend." + validations: + required: true + + - type: textarea + id: constraints + attributes: + label: Constraints / Do Not Touch + description: "List files/areas to avoid or any guardrails." + placeholder: "Example: Do not edit build outputs directly; do not change vendor/ or node_modules/." + validations: + required: false + + - type: textarea + id: relevant_files + attributes: + label: Relevant Files (if known) + description: "Optional: point the agent to likely files." + placeholder: "Example: assets/apps/dashboard/src/, inc/customizer/, AGENTS.md" + validations: + required: false + + - type: textarea + id: tests + attributes: + label: Tests to Run + description: "Default is PHP lint/PHPStan/PHPUnit unless explicitly scoped out. Add the JS/E2E steps when those areas are touched." + value: | + Default: + - composer run lint + - composer run phpstan + - phpunit + + When JS/TS files are touched: + - yarn run lint + - yarn run build + + When UI/E2E flows are touched: + - yarn run test:playwright + validations: + required: true diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 0000000000..e976e94610 --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,61 @@ +name: "Copilot Setup Steps" + +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + # The job MUST be called `copilot-setup-steps` for the Copilot coding agent to pick it up. + copilot-setup-steps: + runs-on: ubuntu-22.04 + permissions: + contents: read + services: + mysql: + image: mysql:5.7 + env: + MYSQL_ROOT_PASSWORD: root + ports: + - 3306/tcp + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + # These steps run before the agent starts, to pre-install dependencies and tools. + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "16" + cache: "yarn" + + - name: Install JavaScript dependencies + run: yarn install --frozen-lockfile + + - name: Install Playwright browsers + run: npx playwright install --with-deps chromium + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "7.4" + extensions: simplexml, mysql + tools: phpunit, phpunit-polyfills, wp-cli, phpcs, phpstan + + - name: Install PHP dependencies + env: + GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} + run: COMPOSER=composer-dev.json composer install --prefer-dist --no-progress + + - name: Build assets + run: yarn run build + + - name: Install WordPress Test Suite + run: | + bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1:${{ job.services.mysql.ports['3306'] }} diff --git a/AGENTS.md b/AGENTS.md index cc33d1026b..ebaec38c54 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -49,9 +49,15 @@ yarn run format:scss ## Testing ```bash -# PHP unit tests -./vendor/bin/phpunit -./vendor/bin/phpunit tests/test-neve.php # Single test file +# PHP unit tests. Prerequisites: MySQL, the WordPress test suite, and the PHPUnit +# Polyfills. Neither PHPUnit nor the Polyfills are composer deps here: GitHub-hosted +# runners ship PHPUnit preinstalled globally, and setup-php adds the Polyfills +# (tools: phpunit-polyfills). copilot-setup-steps.yml installs both. Install the suite once: +bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 +# On macOS the suite installs under $TMPDIR; export WP_TESTS_DIR so PHPUnit finds it: +# export WP_TESTS_DIR="$TMPDIR/wordpress-tests-lib" +phpunit # phpunit is NOT a composer dep here; use the global one (CI/copilot-setup provide it) +phpunit tests/test-neve.php # Single test file # E2E tests (Playwright, requires WordPress environment) yarn run test:playwright diff --git a/composer.lock b/composer.lock index a00fc00159..8d9b1df441 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "codeinwp/themeisle-sdk", - "version": "3.3.53", + "version": "3.3.54", "source": { "type": "git", "url": "https://github.com/Codeinwp/themeisle-sdk.git", - "reference": "a657eaedf62cc84c82e539167ac9e19b3e618ce8" + "reference": "095c2d0f1388af0b0196c492a7f79e2fd092dab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/a657eaedf62cc84c82e539167ac9e19b3e618ce8", - "reference": "a657eaedf62cc84c82e539167ac9e19b3e618ce8", + "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/095c2d0f1388af0b0196c492a7f79e2fd092dab1", + "reference": "095c2d0f1388af0b0196c492a7f79e2fd092dab1", "shasum": "" }, "require-dev": { @@ -43,9 +43,9 @@ ], "support": { "issues": "https://github.com/Codeinwp/themeisle-sdk/issues", - "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.53" + "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.54" }, - "time": "2026-06-18T07:32:53+00:00" + "time": "2026-06-23T13:43:47+00:00" }, { "name": "wptt/webfont-loader", diff --git a/globals/google-fonts.php b/globals/google-fonts.php index 2ee0aa9e76..2e4e952565 100644 --- a/globals/google-fonts.php +++ b/globals/google-fonts.php @@ -1,6 +1,6 @@ array( '400', '700',), 'BIZ UDPGothic' => array( '400', '700',), 'BIZ UDPMincho' => array( '400', '700',), + 'BJCree' => array( '400', '500', '600', '700',), 'Babylonica' => array( '400',), 'Bacasime Antique' => array( '400',), 'Bad Script' => array( '400',), @@ -434,6 +435,7 @@ 'Dangrek' => array( '400',), 'Darker Grotesque' => array( '300', '400', '500', '600', '700', '800', '900',), 'Darumadrop One' => array( '400',), + 'Datatype' => array( '100', '200', '300', '400', '500', '600', '700', '800', '900',), 'David Libre' => array( '400', '500', '700',), 'Dawning of a New Day' => array( '400',), 'Days One' => array( '400',), @@ -736,6 +738,8 @@ 'Intel One Mono' => array( '300', '400', '500', '600', '700', '300italic', '400italic', '500italic', '600italic', '700italic',), 'Inter' => array( '100', '200', '300', '400', '500', '600', '700', '800', '900', '100italic', '200italic', '300italic', '400italic', '500italic', '600italic', '700italic', '800italic', '900italic',), 'Inter Tight' => array( '100', '200', '300', '400', '500', '600', '700', '800', '900', '100italic', '200italic', '300italic', '400italic', '500italic', '600italic', '700italic', '800italic', '900italic',), + 'Iosevka Charon' => array( '300', '400', '500', '700', '300italic', '400italic', '500italic', '700italic',), + 'Iosevka Charon Mono' => array( '300', '400', '500', '700', '300italic', '400italic', '500italic', '700italic',), 'Irish Grover' => array( '400',), 'Island Moments' => array( '400',), 'Istok Web' => array( '400', '700', '400italic', '700italic',), @@ -1489,6 +1493,8 @@ 'Playwrite NO' => array( '100', '200', '300', '400',), 'Playwrite NO Guides' => array( '400',), 'Playwrite NZ' => array( '100', '200', '300', '400',), + 'Playwrite NZ Basic' => array( '100', '200', '300', '400',), + 'Playwrite NZ Basic Guides' => array( '400',), 'Playwrite NZ Guides' => array( '400',), 'Playwrite PE' => array( '100', '200', '300', '400',), 'Playwrite PE Guides' => array( '400',), @@ -1659,7 +1665,8 @@ 'Ruthie' => array( '400',), 'Ruwudu' => array( '400', '500', '600', '700',), 'Rye' => array( '400',), - 'STIX Two Math' => array(), + 'SN Pro' => array( '200', '300', '400', '500', '600', '700', '800', '900', '200italic', '300italic', '400italic', '500italic', '600italic', '700italic', '800italic', '900italic',), + 'STIX Two Math' => array( '400',), 'STIX Two Text' => array( '400', '500', '600', '700', '400italic', '500italic', '600italic', '700italic',), 'SUSE' => array( '100', '200', '300', '400', '500', '600', '700', '800', '900', '100italic', '200italic', '300italic', '400italic', '500italic', '600italic', '700italic', '800italic', '900italic',), 'SUSE Mono' => array( '100', '200', '300', '400', '500', '600', '700', '800', '100italic', '200italic', '300italic', '400italic', '500italic', '600italic', '700italic', '800italic',), diff --git a/inc/compatibility/starter-content/custom-css.php b/inc/compatibility/starter-content/custom-css.php index 54dffc0ef9..a3c96c8b87 100644 --- a/inc/compatibility/starter-content/custom-css.php +++ b/inc/compatibility/starter-content/custom-css.php @@ -92,6 +92,16 @@ /* Generic image rounding inside starter pages */ .folio-round img{border-radius:16px} +/* Process steps */ +.folio-step{height:auto;background:var(--nv-site-bg,#fff);transition:transform .2s ease,box-shadow .2s ease;box-shadow:0 1px 2px rgba(15,23,42,.04)} +.folio-step:hover{transform:translateY(-4px);box-shadow:0 22px 48px rgba(15,23,42,.10)} +.folio-step-num{display:block;font-size:30px;font-weight:800;color:var(--nv-primary-accent,#2563EB);line-height:1;margin:0 0 4px} +@media(min-width:783px){.folio-step{height:100%}} + +/* Pricing cards */ +.folio-pricing-featured{box-shadow:0 24px 50px rgba(37,99,235,.18)} +.folio-pricing-featured .folio-btn-outline .wp-block-button__link{border-color:rgba(255,255,255,.5)} + /* ---- Block editor only ---- */ /* The editor renders core/html previews in a sandboxed iframe whose box stretches to the available width, which breaks flex rows (squeezed labels) and centering. diff --git a/inc/compatibility/starter-content/home.php b/inc/compatibility/starter-content/home.php index aaaea99a50..854765ad52 100644 --- a/inc/compatibility/starter-content/home.php +++ b/inc/compatibility/starter-content/home.php @@ -218,6 +218,156 @@ + +
Our Process
+ + + +A clear, collaborative process that turns ideas into results.
+ + + +01
+ + + +We listen, ask the right questions, and map your goals, audience, and opportunities.
+02
+ + + +We craft wireframes and polished designs, refined together until every detail feels right.
+03
+ + + +We develop with clean, fast, responsive code, keeping you in the loop at every milestone.
+04
+ + + +We deploy, test thoroughly, and provide ongoing support so your project keeps growing.
+Pricing
+ + + +Straightforward pricing for every stage. See the full breakdown on our pricing page.
+ + + +$19 /mo
+ + + +For small projects getting started online.
+$49 /mo
+ + + +For growing businesses that need more power.
+Custom
+ + + +For large-scale projects with custom needs.
+Pricing
+ + + +Choose the plan that fits your project. Every tier includes ongoing support and a dedicated point of contact.
+$19 /mo
+ + + +Perfect for small projects and getting your presence online.
+ + + +Up to 5 pages
+Mobile responsive
+Email support
+Basic SEO setup
+Popular
+$49 /mo
+ + + +For growing businesses that need more power and priority support.
+ + + +Unlimited pages
+Advanced features
+Priority support
+SEO & marketing tools
+Custom
+ + + +For large-scale projects with complex needs and a dedicated team.
+ + + +Everything in Professional
+Dedicated team
+Custom integrations
+SLA & account manager
+Absolutely. You can upgrade or downgrade at any time, and changes take effect at the start of your next billing cycle with prorated adjustments.
+We accept all major credit cards and PayPal, plus wire transfers for enterprise accounts. Every payment is processed securely.
+No setup fees on any plan. Enterprise engagements may include a one-time onboarding service depending on scope, agreed up front.
+Yes. Annual billing saves you roughly 20% compared with paying monthly. Reach out for enterprise and custom arrangements.
+Tell us about your project and we'll recommend the right plan and a clear next step.
+ + + + +