Skip to content

release: Tailwind CSS v4 + 12 months of develop (target ~v0.5.0)#151

Open
programad wants to merge 72 commits into
mainfrom
develop
Open

release: Tailwind CSS v4 + 12 months of develop (target ~v0.5.0)#151
programad wants to merge 72 commits into
mainfrom
develop

Conversation

@programad
Copy link
Copy Markdown
Contributor

Summary

Brings develop up to main for the next published rocketicons release. Spans 71 non-merge commits since v0.4.1-release (Jun 2024), with the headline being first-class Tailwind CSS v4 support across the rocketicons plugin, the React Native runtime (NativeWind v4), and the ignition docs site.

This is the first release-targeting PR since Sep 2024.

What lands

Tailwind v4 ecosystem

  • @rocketicons/tailwind plugin: full migration to TW v4 (@plugin, @theme, @custom-variant, prefix support). 57 new plugin tests.
  • rocketicons runtime + NativeWind: bumped v2 → v4.2.2; new Expo native-test app pinning the v4 path against regressions.
  • Ignition docs site: migrated to TW v4 (CSS-first config, dropped tailwind.config.ts) and to Next.js 15 async-params API.
  • Breaking change (footer in 47d225f30): @rocketicons/tailwind now requires tailwindcss >=4. Note: the releaser does not auto-major-bump on BREAKING CHANGE: footers — predicted bump is v0.5.0-release. If we want a true 1.0.0 we'd have to hand-edit the bumped versions before merging this PR.

CLI + tooling

  • New @rocketicons/cli commands (71c21b5db, 1f32f1623, 14140d555)
  • Utils extracted into a separate package (63cfe9e4e, 3e8627b99, e74712c9f)
  • Bundle optimization + static generation strategies for ignition (a7e40ad34)

Icons

  • feat(icons): package type now exposes IconTree data
  • Lucide icons updated
  • fix(icons): correct handling of tailwind prefix

Ignition fixes (post-v4-migration)

  • fix(ignition): dark mode + sticky header (this PR's last regression batch)
  • fix(ignition): load performance, search icons, static page generation
  • fix: hover state regression on state page

Deployment / CI

  • AWS Amplify init + Coolify config
  • .npmrc-based registry auth fix for monorepo workspaces
  • setup.sh improvements

Predicted CI behavior

prepare-release.yml will run on this PR (it triggers on opened/sync against main):

  1. Build all packages, run all tests
  2. npx rocketclimb-sh releaser walks all 71 commits since v0.4.1-release:
    • Computes per-package bumps (feat → minor, others → patch)
    • Predicted root bump: v0.4.1v0.5.0-release (the -release suffix is guaranteed because packages/icons, packages/core, packages/tailwind all have substantive changes since the last tag)
    • Rewrites CHANGELOG.md per package
    • Pushes a ci(releaser): bump packages versions and update changelog for develop commit directly onto develop — this is intentional and matches the existing pattern (visible in develop history)
    • Generates release-notes.md
  3. Uploads tag artifact + deployable .tgz for the Release Packages workflow

When this PR merges to main:

  1. release.yml reads the tag artifact, creates the v0.5.0-release git tag
  2. Because the tag includes -release: tar zxf rocketicons-*.tgz && (cd package && npm publish)rocketicons@0.5.0 published to npm (using the new NPM_TOKEN org secret rotated 2026-05-08)
  3. GitHub Release created from release-notes.md
  4. Triggers ignition production deploy on Vercel (VERCEL_TOKEN is from May 2024 — may have expired; if so the Vercel step fails after npm publish succeeded, and we just rotate that token and re-run the failed job)

Pre-merge checklist

  • prepare-release workflow completes green
  • Bumped versions in PR commits look correct (especially packages/icons/package.json for the published rocketicons version)
  • release-notes.md reads cleanly
  • If we want a 1.0.0 major bump (because of the TW v4 breaking change), manually edit the bumped versions in a follow-up commit before merging

programad and others added 30 commits May 1, 2025 12:43
…on strategies

- Added comprehensive bundle size optimization guide in BUNDLE-OPTIMIZATION.md.
- Implemented static optimization for Vercel in STATIC-OPTIMIZATION.md.
- Updated package.json and package-lock.json for new dependencies and scripts.
- Introduced new scripts for JSON icon generation and bundle analysis.
- Refactored icon loading components to utilize PublicJSONIcon for better performance.
- Enhanced documentation and README with optimization details and quick commands.
programad and others added 11 commits March 13, 2026 11:24
# Conflicts:
#	package-lock.json
#	package.json
#	packages/ignition/src/algolia-indexer.ts
#	packages/ignition/src/app/[lang]/(content)/icons/[collectionid]/[iconid]/page.tsx
#	packages/ignition/src/app/[lang]/(content)/icons/[collectionid]/layout.tsx
#	packages/ignition/src/app/[lang]/(content)/icons/[collectionid]/page.tsx
#	packages/ignition/src/app/[lang]/(content)/icons/page.tsx
#	packages/ignition/src/app/[lang]/(content)/opengraph/[...params]/route.tsx
#	packages/ignition/src/app/[lang]/(sitemaps)/iconsitemap/[collectionid]/sitemap.xml/route.ts
#	packages/ignition/src/app/[lang]/(sitemaps)/sitemap.xml/route.ts
#	packages/ignition/src/app/components/icons/get-icons-data.ts
#	packages/ignition/src/app/components/icons/icon-loader.tsx
#	packages/ignition/src/app/components/icons/icons-collection/collection-title-box.tsx
#	packages/ignition/src/app/components/icons/icons-collection/content.tsx
#	packages/ignition/src/app/components/icons/icons-collection/icon-info/info-handler.tsx
#	packages/ignition/src/app/components/icons/icons-collection/icon-info/loader.tsx
#	packages/ignition/src/app/components/icons/icons-collections-tastes.tsx
#	packages/ignition/src/app/components/opengraph.tsx
#	packages/ignition/src/app/components/search/search-hits.tsx
#	packages/ignition/src/app/components/sidebar/sidebar-left.tsx
#	packages/ignition/src/app/components/usage/state-management/index.tsx
#	packages/ignition/src/app/components/usage/utils.tsx
#	packages/ignition/src/app/sitemap_index.xml/route.ts
#	packages/ignition/src/app/utils/svg-as-json.ts
#	packages/ignition/src/middleware.ts
#	packages/ignition/src/statics-generator/index.ts
#	packages/ignition/src/statics-generator/manifest-loader.ts
#	packages/ignition/src/statics-generator/tastes-loader.ts
- Upgrade tailwindcss dependency from 3.4.1 to 4.2.1
- Add @tailwindcss/postcss as devDependency
- Replace config() API with theme() API for TW v4 PluginAPI
- Remove @rocketclimb/tw-utils dependency (sanitize inlined)
- Remove prefix interpolation (TW v4 handles prefixes via CSS)
- Infer PluginAPI type from createPlugin Parameters<>
- Rewrite integration tests to use @tailwindcss/postcss + @plugin
- Update config-handler test mocks for theme() API

BREAKING CHANGE: Plugin now requires tailwindcss >=4.0.0
TW v4 handles prefix automatically for addComponents() output.
Users configure prefix via @import 'tailwindcss' prefix(xp);
and the engine automatically prefixes generated selectors.
No manual prefix handling needed in plugin code.
Integration tests (22):
- Default class: inline-block, padding, .icon-ri scoping
- Size classes: test.each for all 11 sizes (xs through 7xl)
- Variants: outlined/filled with stroke/fill CSS rules
- Colors: sky-500 default color
- Safelisted: icon-default always present without content
- CSS structure: no unresolved @apply, proper @layer, clean output

Config-handler edge cases (10 new):
- Empty, null, string-only colors
- DEFAULT color handling
- No baseStyle, no variants
- Auto-500 shade selection and first-shade fallback
- Whitespace sanitization
- Compound color-size splitting (sky-500-base)

Styles-generator edge cases (8 new):
- Chaining, class merging, ordering
- Custom class prefix
- Native mode: prop merging, base classes, variant skipping

Test count: 14 → 57 (4x increase)
- Upgrade nativewind from 2.0.11 to 4.2.2 (stable, TW v4 compat)
- Update icons peerDeps: nativewind >=4, tailwindcss >=4
- Remove @rocketclimb/tw-utils from root and icons dependencies
- Add packages/native-test Expo app for native icon verification
  - NativeWind v4.2.2 + TW v4 + rocketicons showcase
  - Test page: 11 sizes, variants, colors, dark mode toggle
  - iOS only (macOS dev team), isolated from root workspaces
Three v4 migration regressions in ignition:

- Unlayered html/body bg rule was beating @layer utilities, so
  `bg-background dark:bg-background-dark` on <body> was overridden
  by `background-color: var(--color-white)` even when <html>.dark
  was set — body rendered white in dark mode, header (slate-900/0.7)
  looked gray over it, docs content area looked light. Wrap base
  styles in @layer base.
- `var(--spacing-16)` is undefined in v4 (only `--spacing` is
  exposed); the invalid calc dropped `.content-area` height, so the
  page scrolled instead of the inner container, and the lg:static
  header scrolled away. Switched to `calc(var(--spacing) * 16)`.
- `.modal-context` had `min-h: 100vh` (a floor), so on the home
  page the wrapper grew past viewport and the page scrolled.
  Cap at `height: 100vh` on lg:, and add `lg:min-h-0` down the
  flex chain so the cap propagates to the overflow-y-auto child.

Also dropped ~180 lines of duplicate component definitions that
were already inside @layer components above.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: Tailwind CSS v4 migration (rocketicons + ignition + nativewind v4)
CI for the v0.5.0 prepare-release was failing in `Run tests` because
@rocketicons/tailwind's integration test (`packages/tailwind/src/index.test.ts`)
loads `@tailwindcss/postcss`, which loads `@tailwindcss/oxide`, which
loads a per-platform native binary (`@tailwindcss/oxide-linux-x64-gnu`
on the runner) declared as an optional dependency.

`actions/cache` was restoring node_modules from a pre-TW-v4 cache via
`restore-keys`, then `npm install` ran but didn't add the missing Linux
variant — known npm bug npm/cli#4828. `npm ci` wipes node_modules and
installs strictly from the lockfile (which already lists all platform
variants), so the right binary lands every time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
programad and others added 2 commits May 7, 2026 21:32
fix(cicd): use npm ci so TW v4 oxide native binary resolves on Linux
The previous prepare-release run still failed at the @rocketicons/tailwind
integration test even with `npm ci` because the runner was on Node 18, and
@tailwindcss/oxide@4.2.1 (TW v4's native Rust core, loaded via
@tailwindcss/postcss) requires Node >=20 — its native binary refuses to
load on 18 with "Cannot find native binding". Same constraint applies to
Next.js 15 and the rest of the v4 stack we just adopted.

Changes:

- All four GitHub workflows: NODE_VERSION 18.x -> 22.x.
- Add `.nvmrc` pinning local dev to Node 22 (matches CI).
- Set engines.node ">=20" on the three published packages
  (rocketicons, @rocketicons/tailwind, @rocketicons/utils) so consumers
  installing the new release on Node 18 get a clear warning instead of
  a runtime crash from oxide.

Verified locally on Node 22.19.0:

- npm run test-all: 79 tests pass (utils 22 + tailwind 57)
- npm run lint-all: no warnings/errors
- npm run --workspaces typecheck: all 6 packages clean
- npm run build-all: ignition Next 15 build completes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
programad and others added 2 commits May 7, 2026 21:47
fix(cicd): bump stack to Node 22 (TW v4 / @tailwindcss/oxide need >=20)
…nt failures

Two issues bundled because they were exposed by the same release attempt:

1. `.versions.json` was missing entries for `utils`, `cli`, and
   `native-test` (added to the workspace after the last release).
   `tailwind` was also stale (0.2.5 vs current 0.2.6). When the releaser
   walks commits since the last tag and accumulates per-package bump
   types, it then calls `bumpVersion(versions[pkgName], type, true)` —
   for missing entries that's `bumpVersion(undefined, ...)`, which
   crashes inside `VERSION_MATCHER.exec(undefined)` with a confusing
   TypeError. The crash happened before the `-release` marker logic, so
   the resulting workflow path was wrong, no .tgz was produced, and the
   artifact upload failed with "Input required and not supplied: path".

2. The workflow's bash glue masked the crash. The previous step was:

       echo "TAG_NAME=$(npm run release | grep v)" >> $GITHUB_OUTPUT

   When `npm run release` crashed and `grep v` matched nothing, the
   pipeline failed but the outer `echo` succeeded, so the step exited 0
   with an empty TAG_NAME. Subsequent steps silently produced broken
   artifacts. This is exactly the "happy-path-only" CI bug class that
   makes release pipelines untrustworthy.

Changes:

- `.versions.json`: add `utils`, `cli`, `native-test` entries with
  their current package.json versions; correct `tailwind` to 0.2.6.

- `prepare-release.yml`:
  * New "Validate .versions.json is in sync with workspaces" step
    runs before the releaser and fails fast with a clear actionable
    message if any workspace is missing from .versions.json.
  * Rewrote "Prepare tag or release" to use `set -euo pipefail`,
    capture releaser output to a file, extract the tag with a strict
    regex (`^v[0-9]+\.[0-9]+\.[0-9]+(-[a-z0-9]+)*`), and explicitly
    fail the step if no tag was produced. Also annotates a clear
    `::error::` message instead of swallowing the crash.
  * Same hardening on "Get generated package name" so an empty
    *.tgz directory produces a clear error instead of the cryptic
    "Input required and not supplied: path" from upload-artifact.
  * Fixed long-standing typo "genereated" -> "generated".

After this lands, a future workspace addition that forgets
.versions.json will fail in the validation step with a one-line
actionable message, and any future releaser crash will surface
immediately at its origin instead of corrupting downstream artifacts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
programad and others added 3 commits May 7, 2026 22:09
…ilent-failures

fix(cicd): sync .versions.json + harden release pipeline against silent failures
Disables the publish-ignition jobs in prepare-release.yml and release.yml
with `if: false` until the rocketicons.io hosting story is settled. The
project has a half-finished Vercel-to-AWS-Amplify migration in flight
(amplify.yml is present, amplify/ scaffold exists), the VERCEL_TOKEN org
secret is from May 2024 and likely expired, and rocketicons.io currently
returns NXDOMAIN — so the Vercel deploy step has been failing every
release attempt without changing anything users see. Inline comments on
both workflows explain why and point at the re-enable path.

Crucially, npm publish is independent of the Vercel jobs in release.yml,
so disabling them does NOT block the rocketicons package release.

Also:
- Add release-output.log to .gitignore (the file the hardened "Prepare
  tag or release" step writes to). The releaser auto-pushed this temp
  file in commit a4fbdd0; removing it from tracking here.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@programad programad requested a review from amorimjj May 8, 2026 02:00
The latest prepare-release run looked successful but never uploaded the
`tag-artifact` artifact. release.yml depends on it
(actions/download-artifact -name tag-artifact, then `cat .tagrc` to read
PENDING_TAG) — without it, the merge-to-main publish flow would fail
immediately on "Download tag artifact".

Root cause: actions/upload-artifact@v4 silently skips hidden files
unless `include-hidden-files: true` is set; `.tagrc` (with the leading
dot) is treated as hidden. The step exits "success" with only a warning
in the log, so we never noticed.

Fix: set `include-hidden-files: true` on the tag-artifact upload step.

Verified on the failed run 25532192649: tag-artifact is missing from
the artifact list while data-helpers and deployable-artifacts (both
contain only non-hidden paths) uploaded fine. Inline comment in the
workflow links to upload-artifact's documented hidden-file behavior so
the next time we add a dotfile artifact, the gotcha is obvious.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants