Skip to content

Conversation

@DDonochVA
Copy link
Contributor

@DDonochVA DDonochVA commented Nov 20, 2025

Summary by CodeRabbit

  • New Features

    • Global theming with light/dark modes and shared visual tokens
  • Improvements

    • Widespread styling refinements for consistent spacing, rounding, shadows and typography
    • Responsive layout adjustments for header, footer and key blog sections
    • Updated UI element visuals (buttons, cards, badges, forms, icons, tooltips)
  • Bug Fixes

    • Minor presentation fixes to ensure predictable rendering across components

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Nov 20, 2025

Walkthrough

Upgrades Tailwind to v4, adds PostCSS plugin config, replaces shared preset with app-specific tailwind config, introduces a new global CSS theming file (light/dark tokens and utilities), adds the global CSS to the blog build, and applies widespread Tailwind v4 class-syntax/token adjustments across many components.

Changes

Cohort / File(s) Summary
Build & Config
apps/blog/.postcssrc.json, apps/blog/project.json, apps/blog/tailwind.config.js, tailwind.preset.js, package.json
Add PostCSS config for @tailwindcss/postcss; include global CSS in app build styles; convert app tailwind config to explicit content globs; collapse shared preset to {}; bump Tailwind to v4 and add @tailwindcss/postcss dependency.
Global styles & theming
libs/shared/assets/src/lib/styles/global.css, libs/shared/assets/src/lib/styles/main.scss, libs/blog/articles/ui-article-content/src/lib/article-content/article-content.component.scss
Add comprehensive global.css with CSS variables, light/dark theme blocks, utilities and keyframes; remove previous Tailwind directives and theming from main.scss; article SCSS now references the new global.css.
Important-modifier & utility syntax updates
multiple components (e.g., libs/blog/shared/ui-pagination/..., libs/blog/shared/ui-dynamic-text-clamp/..., libs/blog/ad-banner/..., libs/blog/shared/ui-button/...)
Migrate important-modifier placement and related utility syntax (e.g., !p-2p-2!, !hiddenhidden!, and similar token shifts).
Shortened/renamed utilities
multiple components (e.g., libs/blog/ad-banner/..., libs/blog/layouts/..., libs/blog/shared/...)
Replace older long tokens with v4 equivalents (e.g., flex-shrink-0shrink-0, flex-growgrow, break-wordswrap-break-word, roundedrounded-sm, w-[1px]w-px).
Gradient & CSS-var syntax changes
multiple roadmap and navigation components (e.g., libs/blog/roadmap/..., libs/blog/layouts/ui-navigation/...)
Replace bg-gradient-to-* with bg-linear-to-*; convert CSS var bracket syntax from [--var] to ( --var ) style tokens and adjust class ordering/important placement.
Footer / Layout responsive refactor
libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.html, .../footer.component.scss, .../header/*, .../layout.component.html
Replace SCSS grid-area layout with responsive Tailwind grid/order/span utilities; replace max-w-screen-xl with max-w-(--breakpoint-xl) and update mobile menu offscreen classes (-top-[100%]-top-full, translate-y-[100%]translate-y-full).
Component-specific presentation edits
many components across articles, authors, newsletter, partners, search, pagination, cards, tooltip, social icons, roadmap, etc. (see diff)
Numerous class-string edits: typography sizes, rounding scales, outline variants, aspect-ratio syntax, shadow size changes, color token changes (hex → named), and small markup class reorderings.
i18n
apps/blog/src/assets/i18n/en.json
Minor text update: synopsisRules.section1 wording changed ("outline-solid paragraphs").

Sequence Diagram(s)

sequenceDiagram
    participant Build as Build Pipeline
    participant PostCSS as PostCSS (.postcssrc.json)
    participant Tailwind as Tailwind v4
    participant GlobalCSS as libs/shared/assets/global.css
    participant App as Blog App

    Build->>PostCSS: load config
    PostCSS->>Tailwind: initialize `@tailwindcss/postcss`
    Tailwind->>GlobalCSS: process theme layers & utilities
    GlobalCSS-->>Tailwind: provide CSS tokens & `@layer` base
    Tailwind->>App: emit compiled CSS (v4 syntax)
    App->>App: components use updated class tokens
    note right of Tailwind: Class/token conversions applied (important-placement, linear gradients, var syntax)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Files needing extra attention:
    • libs/shared/assets/src/lib/styles/global.css — new comprehensive theming and custom-variant logic
    • tailwind.preset.js — now empty; confirm no consumers rely on previous preset exports
    • apps/blog/tailwind.config.js & apps/blog/project.json — ensure content globs and build styles are correct so classes are included
    • Footer/layout SCSS → HTML refactor — verify responsive behavior and visual parity across breakpoints
    • Randomized class-string edits across many components — spot-check a representative set for runtime rendering regressions

Possibly related PRs

Suggested reviewers

  • DamianBrzezinskiHoA
  • mateuszbasinski

Poem

🐰 I hopped through classes, swapped bangs with grace,

from gradients linear to a cleaner place.
New tokens, dark themes, and utilities bright —
the warren’s CSS now shines in v4 light. ✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore: upgrade tailwind to v4' accurately reflects the main change: a comprehensive upgrade of Tailwind CSS from v3 to v4, including dependency updates, configuration changes, and class syntax modernization throughout the codebase.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/tw-4

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@valueadd-robot
Copy link

PR is detected, will deploy to dev environment

@valueadd-robot
Copy link

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (6)
libs/blog/ad-banner/ui/src/lib/infinite-slider-directive/al-infinite-slider.directive.ts (1)

36-38: Narrow the eslint-disable-line to a specific rule

Using a bare // eslint-disable-line suppresses all rules on this line, which can hide unrelated issues later. Prefer explicitly targeting the intended rule, e.g.:

alias: 'alInfiniteSliderOf', // eslint-disable-line <rule-id> — alias required for structural directive syntax

or adjust the ESLint config so this alias pattern doesn’t require an inline disable.

libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-basic-node/roadmap-basic-node.component.ts (1)

62-72: Confirm angular-love margin and visual emphasis are intentional

angular-love now uses m-[4px] while primary/secondary use m-[2px], and it gets a stronger gradient (bg-linear-to-r ... text-white). If this extra spacing/emphasis is not deliberate, consider aligning the margin with the other variants for consistency; otherwise this is fine as-is.

tailwind.preset.js (1)

1-2: Either remove unused preset or confirm it isn’t referenced by any Tailwind config

Exporting an empty object here is harmless if no tailwind.config.* files still include this preset, but it’s a bit misleading:

  • If it’s no longer used, consider deleting tailwind.preset.js to avoid confusion.
  • If any config still has presets: [require('./tailwind.preset')], they’ll effectively inherit an empty base, which may not be what you want after the v4 migration.

A quick search for tailwind.preset in the repo should confirm whether it’s safe to remove.

libs/blog/shared/ui-card/src/lib/card-skeleton.component.ts (1)

38-40: Shadow tweak is fine; consider theming the skeleton background

Reducing to shadow-xs is a safe visual adjustment. Given CardComponent now uses bg-al-card, you may want the skeleton to use the same (bg-al-card instead of bg-white) so it follows light/dark theme tokens consistently, unless the bright skeleton background is intentional.

apps/blog/tailwind.config.js (1)

4-11: Config is valid, but content is redundant in Tailwind v4

This minimal config works, but in Tailwind v4 the content option is ignored in favor of automatic source detection and @source directives in CSS. You can safely drop the content array here and keep only theme and plugins for a cleaner v4-style config, unless you plan to reintroduce @config-based behavior.

libs/shared/assets/src/lib/styles/global.css (1)

1-156: Global Tailwind v4 theming setup looks solid; consider centralizing breakpoint tokens here

The new global.css follows Tailwind v4’s CSS‑first approach well:

  • @import 'tailwindcss'; + @theme define your al-* color tokens, backgrounds, shadows, and the Pulsate animation in one place.
  • Light/dark variants on :root and :root[data-theme='dark'] align with the data-theme toggling in app-theme.store.ts, and @custom-variant dark lets you keep using dark: utilities.
  • The al-scroll and al-link utilities are reasonable global helpers and keep most layout styling inline in templates, which matches this repo’s preference for inline Tailwind classes. Based on learnings.

Given multiple templates now use max-w-(--breakpoint-xl), this file is a natural place to define --breakpoint-xl in the @theme block if it isn’t already defined elsewhere, so the breakpoint width token is easy to discover and maintain.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 83a9b63 and 40ccaca.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (45)
  • apps/blog/.postcssrc.json (1 hunks)
  • apps/blog/project.json (1 hunks)
  • apps/blog/src/assets/i18n/en.json (1 hunks)
  • apps/blog/tailwind.config.js (1 hunks)
  • libs/blog/ad-banner/ui/src/lib/ad-image-banner/ad-image-banner.component.html (1 hunks)
  • libs/blog/ad-banner/ui/src/lib/banner-carousel/al-banner-carousel.component.ts (1 hunks)
  • libs/blog/ad-banner/ui/src/lib/infinite-slider-directive/al-infinite-slider.directive.ts (2 hunks)
  • libs/blog/articles/feature-article/src/lib/article-details/article-details-skeleton.component.ts (2 hunks)
  • libs/blog/articles/ui-article-card/src/lib/components/article-regular-card/article-regular-card-skeleton.component.ts (1 hunks)
  • libs/blog/articles/ui-article-content/src/lib/article-content/article-content.component.scss (1 hunks)
  • libs/blog/articles/ui-article-list-title/src/lib/ui-article-list-title/ui-article-list-title.component.html (1 hunks)
  • libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.component.html (1 hunks)
  • libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.stories.ts (2 hunks)
  • libs/blog/authors/ui-author-card/src/lib/author-card/author-card-template.component.ts (2 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.html (3 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.scss (0 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/header/components/header-hamburger.component.ts (1 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/header/components/header-mobile-menu.component.ts (1 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/header/header.component.ts (1 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/layout/layout.component.html (1 hunks)
  • libs/blog/layouts/ui-navigation/src/lib/language-picker/language-picker.component.ts (2 hunks)
  • libs/blog/newsletter/feature-newsletter/src/lib/feature-newsletter/newsletter.component.html (5 hunks)
  • libs/blog/newsletter/feature-newsletter/src/lib/page/newsletter-examples/newsletter-examples.component.html (2 hunks)
  • libs/blog/partners/ui-partners/src/lib/partners-list/partners-list.component.html (1 hunks)
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-header/roadmap-dialog-header.component.ts (1 hunks)
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-subtitle/roadmap-dialog-subtitle.component.ts (1 hunks)
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog.component.html (1 hunks)
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-basic-node/roadmap-basic-node.component.ts (2 hunks)
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-cluster/roadmap-cluster.component.ts (2 hunks)
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-node-label/roadmap-node-label.component.ts (1 hunks)
  • libs/blog/roadmap/ui-roadmap/src/lib/components/vertical-connector-arrow/vertical-connector-arrow.component.ts (1 hunks)
  • libs/blog/search/feature-search/src/lib/feature-search/search-dialog/search-dialog.component.html (1 hunks)
  • libs/blog/shared/ui-button/src/lib/button/button.component.ts (1 hunks)
  • libs/blog/shared/ui-card/src/lib/card-skeleton.component.ts (1 hunks)
  • libs/blog/shared/ui-card/src/lib/card.component.ts (3 hunks)
  • libs/blog/shared/ui-dynamic-text-clamp/src/lib/dynamic-text-clamp/dynamic-text-clamp.component.html (1 hunks)
  • libs/blog/shared/ui-not-found/src/lib/not-found-page.component.ts (1 hunks)
  • libs/blog/shared/ui-pagination/src/lib/pagination/pagination.component.html (3 hunks)
  • libs/blog/shared/ui-social-media-icons/src/lib/social-media-icons.component.ts (1 hunks)
  • libs/blog/shared/ui-tooltip/src/lib/ui-tooltip/ui-tooltip.component.ts (1 hunks)
  • libs/blog/writing-rules/feature-writing-rules/src/lib/rules-row/rules-row.component.html (3 hunks)
  • libs/shared/assets/src/lib/styles/global.css (1 hunks)
  • libs/shared/assets/src/lib/styles/main.scss (0 hunks)
  • package.json (2 hunks)
  • tailwind.preset.js (1 hunks)
💤 Files with no reviewable changes (2)
  • libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.scss
  • libs/shared/assets/src/lib/styles/main.scss
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-02-24T15:58:21.460Z
Learnt from: DDonochVA
Repo: HouseOfAngular/angular-love PR: 390
File: libs/blog/home/feature-home/src/lib/home-page/home-page.component.html:1-26
Timestamp: 2025-02-24T15:58:21.460Z
Learning: In the angular-love project, prefer using inline Tailwind classes over extracting them into separate CSS files, as it provides better visibility and maintains consistency with the codebase.

Applied to files:

  • libs/shared/assets/src/lib/styles/global.css
  • libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.component.html
  • apps/blog/tailwind.config.js
  • libs/blog/roadmap/ui-roadmap/src/lib/components/vertical-connector-arrow/vertical-connector-arrow.component.ts
  • libs/blog/ad-banner/ui/src/lib/banner-carousel/al-banner-carousel.component.ts
  • libs/blog/articles/feature-article/src/lib/article-details/article-details-skeleton.component.ts
  • libs/blog/layouts/ui-navigation/src/lib/language-picker/language-picker.component.ts
  • libs/blog/shared/ui-card/src/lib/card.component.ts
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog.component.html
  • libs/blog/shared/ui-pagination/src/lib/pagination/pagination.component.html
📚 Learning: 2025-02-24T16:17:27.933Z
Learnt from: DDonochVA
Repo: HouseOfAngular/angular-love PR: 390
File: libs/blog/home/feature-home/src/lib/home-page/home-page.component.html:1-26
Timestamp: 2025-02-24T16:17:27.933Z
Learning: In the angular-love project, use modern Angular control flow (for, if) instead of structural directives (*ngFor, *ngIf) for template iteration and conditional rendering.

Applied to files:

  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-header/roadmap-dialog-header.component.ts
🧬 Code graph analysis (8)
libs/shared/assets/src/lib/styles/global.css (2)
libs/blog/app-theme/data-access-app-theme/src/app-theme.store.ts (4)
  • setThemeAttribute (48-58)
  • CCAppThemeConsumer (47-59)
  • store (15-36)
  • AppThemeStore (7-9)
apps/blog/src/app/app.component.ts (1)
  • AppComponent (14-43)
libs/blog/shared/ui-dynamic-text-clamp/src/lib/dynamic-text-clamp/dynamic-text-clamp.component.html (1)
libs/blog/shared/ui-dynamic-text-clamp/src/lib/dynamic-text-clamp/dynamic-text-clamp.component.ts (2)
  • DynamicTextClampComponent (26-35)
  • toggleReadMore (32-34)
libs/blog/layouts/ui-layouts/src/lib/layout/layout.component.html (1)
libs/blog/layouts/ui-layouts/src/lib/layout/layout.component.ts (3)
  • LayoutComponent (23-40)
  • layoutConfig (26-39)
  • LayoutConfig (8-10)
libs/blog/authors/ui-author-card/src/lib/author-card/author-card-template.component.ts (2)
libs/blog/authors/ui-author-card/src/lib/author-card/author-card.component.ts (2)
  • AuthorCardComponent (42-92)
  • clampText (51-51)
libs/blog/authors/ui-author-card/src/lib/author-card/author-card-data-model.ts (1)
  • UiAuthorCard (3-13)
libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-header/roadmap-dialog-header.component.ts (2)
libs/blog/roadmap/ui-roadmap-node/src/lib/types/roadmap-node.ts (1)
  • AngularLoveNode (22-27)
libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog.component.ts (2)
  • RoadmapDialogComponent (43-67)
  • isAngularNode (20-22)
libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.html (1)
libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.ts (1)
  • FooterComponent (38-102)
libs/blog/newsletter/feature-newsletter/src/lib/page/newsletter-examples/newsletter-examples.component.html (1)
libs/blog/newsletter/feature-newsletter/src/lib/page/newsletter-examples/newsletter-examples.component.ts (1)
  • NewsletterExamplesComponent (7-7)
libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.stories.ts (1)
libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents-scroll-spy.directive.ts (1)
  • TableOfContentsScrollSpyDirective (20-75)
🔇 Additional comments (55)
libs/blog/writing-rules/feature-writing-rules/src/lib/rules-row/rules-row.component.html (3)

17-17: Class reordering is semantically sound.

The reordering of padding utilities (line 17) and margin utilities (line 21) does not change functionality and aligns with consistent ordering practices for Tailwind v4 migrations.

Also applies to: 21-21


40-40: Utility updates align with Tailwind v4 conventions.

The changes from rounded to rounded-sm and addition of leading-4 are valid Tailwind v4 adjustments. The button styling is clean and maintainable.

Also applies to: 49-49


30-31: Verify custom utilities are properly configured in the v4 Tailwind config.

This component relies on custom utilities that must be defined in the updated Tailwind v4 configuration:

  • Custom colors: bg-al-pink, border-al-gray-200, bg-al-radial-gradient
  • Custom shadow with compound selector: md:hover:shadow-al-primary
  • Arbitrary grid utilities: grid-rows-[1fr], grid-rows-[0fr]

Since this is part of a larger migration, ensure that the shared UI tokens and theme configuration in the v4 setup includes all these custom utilities and that arbitrary bracket syntax still resolves correctly.

Also applies to: 3-3, 21-21, 40-40, 49-49

libs/blog/ad-banner/ui/src/lib/infinite-slider-directive/al-infinite-slider.directive.ts (1)

20-27: Tailwind v4 class rename in example is correct

The switch to shrink-0 grow-0 basis-full matches Tailwind v4’s flex-shrink-* / flex-grow-*shrink-* / grow-* renames and keeps the intended layout semantics for the slider items. No further changes needed.

libs/blog/authors/ui-author-card/src/lib/author-card/author-card-template.component.ts (2)

32-34: Correct Tailwind v4 migration for text wrapping.

The change from break-words to wrap-break-word correctly implements the Tailwind v4 text wrapping control syntax.


52-52: Correct Tailwind v4 migration for important modifier.

The important modifier position change from dark:!bg-al-radial-gradient to dark:bg-al-radial-gradient! correctly implements the Tailwind v4 breaking change where the ! modifier must come after the utility name instead of before.

libs/blog/newsletter/feature-newsletter/src/lib/page/newsletter-examples/newsletter-examples.component.html (2)

17-17: LGTM!

The refactor from rounded-[2rem] to rounded-4xl correctly adopts Tailwind v4's standard theme utilities, improving maintainability and consistency.


2-2: CSS variable migration concern does not apply—no CSS variables found in module.

Verification across the entire libs/blog/newsletter/feature-newsletter/src module found no CSS variable references in either v3 bracket syntax ([--var-name]) or v4 parentheses syntax ((--var-name)). The conditional concern in the original review comment ("If the codebase uses CSS variables...") is not applicable to this codebase. No action required.

libs/blog/newsletter/feature-newsletter/src/lib/feature-newsletter/newsletter.component.html (4)

16-23: Tailwind v4 syntax updated correctly.

The flex-growgrow change aligns with Tailwind v4 conventions where flex utility variants were simplified.


26-33: Tailwind v4 syntax updated correctly.

The flex-growgrow change aligns with Tailwind v4 conventions. Consistent refactor across form inputs.


55-59: Variant order updated for Tailwind v4.

The change from peer-checked:[&>...] to [&>...]:peer-checked: correctly reflects Tailwind v4's left-to-right variant reading convention.


79-81: ****

rounded-xs is a standard Tailwind v4 utility—not a custom or undefined class. The v3-to-v4 migration specifically updates <utility>-sm utilities to their <utility>-xs equivalents. The change from rounded-sm to rounded-xs is correct and requires no additional configuration. No custom definition in tailwind.config.js is needed.

Likely an incorrect or invalid review comment.

libs/blog/shared/ui-dynamic-text-clamp/src/lib/dynamic-text-clamp/dynamic-text-clamp.component.html (2)

16-16: Important modifier placement correctly updated for Tailwind v4.

The important modifier syntax has been correctly updated from the v3 prefix style (!hidden) to the v4 suffix style (hidden!), aligning with Tailwind v4's breaking change where the ! modifier now comes after the utility name.


18-18: line-clamp-none is a valid Tailwind CSS v4 utility—no changes needed.

The line-clamp-none class removes clamping in Tailwind CSS v4, and the important modifier placement (line-clamp-none!) is correct. The code is as intended.

libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-basic-node/roadmap-basic-node.component.ts (1)

19-23: Tailwind v4 class updates for label and button look good

The move to z-20 and bg-white plus the existing light:/text tokens keeps the layout and theming semantics intact; no Angular or Tailwind v4 issues stand out here.

Also applies to: 27-36

libs/blog/layouts/ui-layouts/src/lib/header/components/header-hamburger.component.ts (1)

22-24: LGTM! Minor styling adjustment for consistency.

The change from rounded to rounded-sm is appropriate for the Tailwind v4 upgrade and maintains visual consistency across the application.

libs/blog/shared/ui-not-found/src/lib/not-found-page.component.ts (1)

22-22: Correct Tailwind v4 migration for text wrapping.

The change from break-words to wrap-break-word aligns with Tailwind v4's updated text wrapping utilities. This ensures the 404 title breaks properly on narrow viewports.

libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.stories.ts (2)

88-88: LGTM! Styling consistency update.

The change from rounded to rounded-sm maintains visual consistency with the Tailwind v4 upgrade across the application.


9-10: The module boundary bypass is intentional and appropriate for Storybook configuration.

The eslint-disable is necessary because type:ui modules cannot import from type:data-access per your Nx module boundary constraints. However, Storybook stories require data-access providers (like TranslocoHttpLoader) to set up test configurations. This is a standard, documented exception pattern. TranslocoHttpLoader is legitimately used at line 31 to configure Transloco in the story providers, and no alternative path exists since it's only exported from the data-access layer.

No changes needed.

libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-header/roadmap-dialog-header.component.ts (1)

22-22: Correct Tailwind v4 gradient syntax migration.

The change from bg-gradient-to-r to bg-linear-to-r is required for Tailwind v4 compatibility. The new syntax is part of v4's expanded gradient system that now includes linear, radial, and conic gradients.

libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog.component.html (1)

2-2: Correct Tailwind v4 gradient syntax migration.

The change from bg-gradient-to-br to bg-linear-to-br properly updates the gradient utility for Tailwind v4 compatibility while maintaining the bottom-right gradient direction.

libs/blog/shared/ui-tooltip/src/lib/ui-tooltip/ui-tooltip.component.ts (1)

8-8: Excellent refactoring to standard Tailwind utilities.

The changes from arbitrary values (max-w-[13rem], rounded-[0.25rem]) to standard utilities (max-w-52, rounded-sm) are mathematically equivalent and improve maintainability by using Tailwind's design system scales.

apps/blog/src/assets/i18n/en.json (1)

279-279: Unrelated change in Tailwind upgrade PR.

This translation content update appears unrelated to the Tailwind v4 upgrade. While the improved copy is beneficial, consider whether this should be in a separate PR for better change tracking and review clarity.

If this was an intentional improvement noticed during the upgrade work, that's fine—just confirming it wasn't accidentally included.

libs/blog/ad-banner/ui/src/lib/banner-carousel/al-banner-carousel.component.ts (1)

20-20: Required Tailwind v4 flex utility migration.

The changes from flex-shrink-0 flex-grow-0 to shrink-0 grow-0 are required for Tailwind v4 compatibility. This is a documented breaking change where the flex utility prefixes have been shortened for better ergonomics.

Also applies to: 25-25

libs/blog/ad-banner/ui/src/lib/ad-image-banner/ad-image-banner.component.html (1)

4-4: LGTM! Correct Tailwind v4 important modifier syntax.

The important modifier has been correctly migrated from the prefix position (!relative) to the suffix position (relative!) as required by Tailwind v4.

Based on library documentation.

libs/blog/articles/ui-article-card/src/lib/components/article-regular-card/article-regular-card-skeleton.component.ts (1)

10-10: Verify the selector scope change from direct children to all descendants.

The class update includes two changes:

  1. ✓ Important modifier correctly migrated: !p-0p-0!
  2. ⚠️ Selector changed: [&>*]: (direct children) → *: (all descendants)

The selector change means padding suppression now applies to all nested elements inside <al-card>, not just immediate children. Confirm this broader scope is intentional.

Based on library documentation.

libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-subtitle/roadmap-dialog-subtitle.component.ts (1)

9-9: LGTM! Correct Tailwind v4 utility class migration.

The utility class has been correctly migrated from flex-grow to grow as required by Tailwind v4.

Based on library documentation.

libs/blog/articles/ui-article-list-title/src/lib/ui-article-list-title/ui-article-list-title.component.html (2)

4-4: LGTM! Typography scale updated.

The font size has been updated from text-xl to text-3xl, adjusting the visual hierarchy of the title.


8-8: LGTM! Cleaner height token usage.

Using h-px instead of h-[1px] is more idiomatic and aligns with Tailwind's built-in utilities.

package.json (1)

50-50: LGTM! Tailwind v4 dependencies correctly added and updated.

The package versions align with the Tailwind v4 migration:

  • Added @tailwindcss/postcss v4.1.17 for the new PostCSS-based build
  • Updated prettier-plugin-tailwindcss to v0.7.1 (compatible with v4)
  • Updated tailwindcss to v4.1.17

Also applies to: 137-137, 141-141

libs/blog/shared/ui-social-media-icons/src/lib/social-media-icons.component.ts (1)

30-31: LGTM! Using semantic color utilities.

Replacing arbitrary hex values (text-[#fff], text-[#000]) with named utilities (text-white, text-black) improves readability and aligns with the global theming system introduced in this PR.

libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-cluster/roadmap-cluster.component.ts (2)

10-10: LGTM! Correct Tailwind v4 syntax migrations.

The class string correctly updates:

  • CSS variable syntax: border-[--primary-foreground]border-(--primary-foreground) (brackets to parentheses)
  • Gradient syntax: gradient utilities now use the linear/radial/conic prefixes

Based on library documentation.


28-28: LGTM! Correct Tailwind v4 gradient and CSS variable syntax.

The host class correctly migrates:

  • bg-gradient-to-brbg-linear-to-br (new gradient syntax)
  • border-[--primary-foreground]border-(--primary-foreground) (CSS variable syntax)

Based on library documentation.

libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-node-label/roadmap-node-label.component.ts (2)

33-33: LGTM! Consistent kebab-case naming.

The class name has been updated from camelCase (comingSoon) to kebab-case (coming-soon), improving consistency with CSS naming conventions.


35-35: LGTM! Correct Tailwind v4 gradient syntax.

The gradient utility has been correctly migrated from bg-gradient-to-r to bg-linear-to-r as required by Tailwind v4.

Based on library documentation.

libs/blog/articles/feature-article/src/lib/article-details/article-details-skeleton.component.ts (2)

55-55: Correct use of Tailwind v4 important modifier on margin-top

mt-4! correctly moves the important modifier to the end of the utility, matching Tailwind v4’s required syntax while preserving the previous layout behavior for the table-of-contents skeleton. This also keeps skeleton styling inline with the rest of the component, which aligns with your existing preference for inline Tailwind utilities.


76-79: Skeleton share section updates look consistent and non-breaking

The second skeleton card’s mt-4! update is consistent with Tailwind v4 important syntax, and the cleanup of the inner container class (ml-10 flex h-10 w-[100px]) only affects formatting, not behavior. No issues from a layout or Tailwind-compatibility standpoint.

libs/blog/partners/ui-partners/src/lib/partners-list/partners-list.component.html (1)

4-4: Confirm aspect-2/1 and custom outline utilities are defined in Tailwind config

The updated anchor uses:

  • light:outline-solid light:outline-1 light:outline-al-border
  • aspect-2/1

These look like custom utilities / theme keys. They’re fine as long as:

  • outline-solid, outline-1, and outline-al-border are declared in your Tailwind v4 theme or via @utility.
  • An aspectRatio key of '2/1' is configured (e.g., aspectRatio: { '2/1': '2 / 1' }), so aspect-2/1 actually generates CSS.

Without those, Tailwind won’t emit the expected styles and the partner tiles may collapse or lose outlines.

libs/blog/layouts/ui-layouts/src/lib/header/components/header-mobile-menu.component.ts (1)

19-22: Off-canvas mobile menu translation remains correct with -top-full / translate-y-full

Switching from -top-[100%] / translate-y-[100%] to -top-full / translate-y-full preserves the slide-in-from-top behavior while using standard Tailwind utilities, which is cleaner and more idiomatic in v4.

Closed: -top-full keeps the menu fully above the viewport.
Opened: translate-y-full brings it exactly into view, in combination with transition-transform duration-300.

Looks good; just ensure this still feels smooth on real mobile devices and under prefers-reduced-motion.

libs/blog/search/feature-search/src/lib/feature-search/search-dialog/search-dialog.component.html (3)

11-11: Tokenized max-w-(--breakpoint-xl) aligns with Tailwind v4 CSS var syntax

Switching from max-w-screen-xl to max-w-(--breakpoint-xl) follows the new parentheses-based CSS variable convention in Tailwind v4 and centralizes your breakpoint width as a design token.

Just ensure --breakpoint-xl is defined in your global CSS/theme (e.g., on :root or a light/dark theme wrapper) so this dialog width is actually applied.


16-16: Header row border/radius tightening is safe and consistent

Changing the search header row to use rounded-sm keeps the visual hierarchy subtle and matches the general move toward smaller radii in the rest of the PR. No behavioral impact; purely visual and consistent with the updated design language.


20-20: outline-hidden is the right Tailwind v4 replacement for fully removing the outline

Replacing outline-none with outline-hidden matches Tailwind v4’s new outline semantics (where outline-none no longer fully removes the outline).

Functionally this keeps the prior behavior of hiding the focus outline on the search input. From an accessibility perspective, it’s worth double-checking that you still have a clear visible focus style (e.g., via parent border, shadow, or background change) for keyboard users.

libs/blog/layouts/ui-navigation/src/lib/language-picker/language-picker.component.ts (1)

27-27: LGTM! Correct Tailwind v4 important modifier syntax.

The important modifier has been correctly moved to the end of the utility class (block! instead of !block), which aligns with Tailwind v4's breaking change requiring the ! modifier after the utility name.

Also applies to: 47-47

libs/blog/roadmap/ui-roadmap/src/lib/components/vertical-connector-arrow/vertical-connector-arrow.component.ts (2)

8-8: LGTM! Correct Tailwind v4 migrations.

The changes correctly update:

  • flex-growgrow (per Tailwind v4 naming)
  • border-l-[var(--primary)]border-l-(--primary) (CSS variables now use parentheses)

12-12: Border width utilities are valid in Tailwind v4.

Tailwind v4 supports plain numeric border-width utilities (e.g., border-t-30, border-r-16) that map directly to pixel values without brackets. The code changes are correct and follow Tailwind v4 conventions.

libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.component.html (2)

9-9: LGTM! Correct Tailwind v4 migrations.

The class updates properly migrate to Tailwind v4 syntax:

  • w-[1px]w-px (using standard utility)
  • Important modifiers moved to the end: first:before:top-1/2!, first:before:h-1/2!, last:before:h-1/2!

14-14: LGTM! Outline and class binding updates.

The changes include:

  • Explicit outline-solid for clarity (Tailwind v4 requires explicit outline styles)
  • Removed double-space formatting in line 17
  • Correct important modifier position in line 19: [class.bg-al-primary!]

Also applies to: 17-19

apps/blog/project.json (1)

33-33: LGTM! Global CSS file added for centralized theming.

The addition of the global CSS file aligns with the PR's objective to introduce a comprehensive theming system with CSS variables and light/dark theme support.

apps/blog/.postcssrc.json (1)

1-5: LGTM! Correct Tailwind v4 PostCSS configuration.

The new PostCSS configuration properly enables the @tailwindcss/postcss plugin, which is the recommended approach for Tailwind v4 integration.

libs/blog/shared/ui-pagination/src/lib/pagination/pagination.component.html (1)

11-11: LGTM! Correct Tailwind v4 important modifier syntax.

The important modifiers have been correctly moved to the end of the utility classes (p-2! instead of !p-2) across all three buttons, which aligns with Tailwind v4's breaking change.

Also applies to: 31-31, 47-47

libs/blog/layouts/ui-layouts/src/lib/header/header.component.ts (1)

32-32: LGTM! Correct CSS variable syntax for Tailwind v4.

The change from max-w-screen-xl to max-w-(--breakpoint-xl) correctly uses the new parentheses syntax for CSS variables in Tailwind v4, enabling dynamic breakpoint values from the theme system.

libs/blog/shared/ui-button/src/lib/button/button.component.ts (1)

24-29: Tailwind v4 important modifier migration for link variant looks correct

Using underline! instead of !underline matches Tailwind v4’s post-utility important syntax and will correctly override the base no-underline class for link buttons.

libs/blog/layouts/ui-layouts/src/lib/layout/layout.component.html (1)

4-7: CSS variable-based max-width looks right; ensure --breakpoint-xl is defined

Switching to max-w-(--breakpoint-xl) uses the correct Tailwind v4 CSS-variable syntax and keeps the roadmap conditional logic intact. Please just confirm that --breakpoint-xl is defined in your global theme so non‑roadmap layouts don’t accidentally fall back to the default max-width.

libs/blog/shared/ui-card/src/lib/card.component.ts (1)

45-48: Card hover, dark variant, and shadow updates line up with Tailwind v4 utilities

  • outline-solid + outline-1 + color utilities give a clear hover outline and use the new v4 outline-style API.
  • Dark card host classes correctly use suffix ! to override base padding and background (p-4!, bg-al-background!) while still composing with the base al-card styles.
  • The shift to shadow-xs on the main card matches the skeleton and is a safe visual refinement.

No functional issues spotted here.

Also applies to: 84-87, 102-104

libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.html (1)

6-35: Footer grid re-layout looks consistent; verify responsive ordering and breakpoint token

The new grid container (max-w-(--breakpoint-xl), xl:grid-cols-[auto_1fr_auto]) and the explicit order-* / col-span utilities on the three sections create a clear, breakpoint-aware footer layout while preserving DOM order. Please sanity-check the layout at mobile, sm, and xl breakpoints and confirm --breakpoint-xl is defined in your theme so the shared max-width behaves as intended across layout and footer.

Comment on lines +1 to +2
@reference '../../../../../../shared/assets/src/lib/styles/global.css';

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Invalid SCSS directive: @reference is not recognized.

The @reference directive is not a standard SCSS/Sass directive. The standard directives for importing stylesheets are:

  • @import (legacy)
  • @use (modern, recommended)
  • @forward (for re-exporting)

This will likely cause a compilation error.

Apply this diff to fix the directive:

-@reference '../../../../../../shared/assets/src/lib/styles/global.css';
+@use '../../../../../../shared/assets/src/lib/styles/global.css';

Or if you need the legacy import behavior:

-@reference '../../../../../../shared/assets/src/lib/styles/global.css';
+@import '../../../../../../shared/assets/src/lib/styles/global.css';
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@reference '../../../../../../shared/assets/src/lib/styles/global.css';
@use '../../../../../../shared/assets/src/lib/styles/global.css';
🤖 Prompt for AI Agents
In
libs/blog/articles/ui-article-content/src/lib/article-content/article-content.component.scss
lines 1-2, the nonstandard `@reference` directive is causing compilation errors;
replace it with a standard Sass/CSS import (prefer `@use
'../../../../../../shared/assets/src/lib/styles/global'` for modern SCSS modules
or `@import '../../../../../../shared/assets/src/lib/styles/global.css'` if you
need legacy CSS import behavior), ensuring the path and file extension match the
target file.

@@ -1,5 +1,5 @@
<div
class="relative mt-2 h-[600px] w-[300px] rounded-[2.5rem] border-[14px] border-gray-800 bg-gray-800 dark:border-gray-800"
class="relative mt-2 h-[600px] w-[300px] rounded-[2.5rem] border-14 border-gray-800 bg-gray-800 dark:border-gray-800"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Verify that border-14 produces the intended 14px border width.

The change from border-[14px] to border-14 relies on a theme-scale definition. Ensure the Tailwind v4 configuration defines border-14 to produce a 14px border (not a different value from the theme's default scale).


🏁 Script executed:

#!/bin/bash
# Description: Search for border-width scale definitions in Tailwind config
# Expected: Confirm border-14 maps to 14px, or identify if theme has custom spacing

fd -e 'config.ts' -e 'config.js' -e 'tailwind.config.ts' -e 'tailwind.config.js' |
  xargs rg -A 10 -B 2 "border|spacing|theme" 2>/dev/null | head -100

Length of output: 1811


Revert border-14 to border-[14px] or add border-14 to the theme configuration.

The Tailwind v4 configuration at apps/blog/tailwind.config.js does not define a custom border-14 utility. The default Tailwind v4 scale includes only 0, 1, 2, 4, and 8. The change from border-[14px] (an arbitrary value that works in v4) to border-14 (undefined) will remove the border styling at runtime. Either revert the class name or extend the theme with the custom border width.

🤖 Prompt for AI Agents
In
libs/blog/newsletter/feature-newsletter/src/lib/page/newsletter-examples/newsletter-examples.component.html
around line 2, the class uses border-14 which isn't defined in the Tailwind v4
config so the border will disappear at runtime; revert the classname to the
working arbitrary value border-[14px] or add a borderWidth: { '14': '14px' }
entry to apps/blog/tailwind.config.js under theme.extend to expose border-14,
then rebuild to ensure the utility is recognized.

@valueadd-robot
Copy link

PR is detected, will deploy to dev environment

@valueadd-robot
Copy link

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
libs/blog/articles/ui-article-content/src/lib/article-content/article-content.component.scss (1)

1-2: Invalid SCSS directive: @reference is not recognized.

The @reference directive is not a standard SCSS/Sass directive and will cause compilation errors. The valid directives for importing stylesheets are:

  • @use (modern, recommended)
  • @import (legacy)
  • @forward (for re-exporting)

Apply this diff to fix the directive:

-@reference '../../../../../../shared/assets/src/lib/styles/global.css';
-
+@use '../../../../../../shared/assets/src/lib/styles/global';

Or if you need to import CSS directly:

-@reference '../../../../../../shared/assets/src/lib/styles/global.css';
-
+@import '../../../../../../shared/assets/src/lib/styles/global.css';

Based on past review comments.

🧹 Nitpick comments (1)
libs/shared/assets/src/lib/styles/global.css (1)

130-139: Consider consolidating duplicate border color rules.

Lines 131-133 duplicate the border color setting from lines 121-128. While both @layer base blocks are valid, the duplicate rule is redundant.

Consider consolidating into a single @layer base block:

 @layer base {
-  :root {
+  * {
+    border-color: rgb(var(--border));
+  }
+
+  :root {
     --primary: 213 1 89;
     --foreground: 20 21 27;
     ...
     color-scheme: light;
   }

   :root[data-theme='dark'] {
     ...
   }

-  *,
-  ::after,
-  ::before,
-  ::backdrop,
-  ::file-selector-button {
-    border-color: var(--color-gray-200, currentColor);
-  }
-}
-
-@layer base {
-  * {
-    border-color: rgb(var(--border));
-  }
-
   body {
     background-color: rgb(var(--background));
     color: rgb(var(--foreground));
   }
 }

This eliminates the redundancy and uses the correct token throughout.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 40ccaca and 31fe751.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (45)
  • apps/blog/.postcssrc.json (1 hunks)
  • apps/blog/project.json (1 hunks)
  • apps/blog/src/assets/i18n/en.json (1 hunks)
  • apps/blog/tailwind.config.js (1 hunks)
  • libs/blog/ad-banner/ui/src/lib/ad-image-banner/ad-image-banner.component.html (1 hunks)
  • libs/blog/ad-banner/ui/src/lib/banner-carousel/al-banner-carousel.component.ts (1 hunks)
  • libs/blog/ad-banner/ui/src/lib/infinite-slider-directive/al-infinite-slider.directive.ts (2 hunks)
  • libs/blog/articles/feature-article/src/lib/article-details/article-details-skeleton.component.ts (2 hunks)
  • libs/blog/articles/ui-article-card/src/lib/components/article-regular-card/article-regular-card-skeleton.component.ts (1 hunks)
  • libs/blog/articles/ui-article-content/src/lib/article-content/article-content.component.scss (1 hunks)
  • libs/blog/articles/ui-article-list-title/src/lib/ui-article-list-title/ui-article-list-title.component.html (1 hunks)
  • libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.component.html (1 hunks)
  • libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.stories.ts (2 hunks)
  • libs/blog/authors/ui-author-card/src/lib/author-card/author-card-template.component.ts (2 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.html (3 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.scss (0 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/header/components/header-hamburger.component.ts (1 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/header/components/header-mobile-menu.component.ts (1 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/header/header.component.ts (1 hunks)
  • libs/blog/layouts/ui-layouts/src/lib/layout/layout.component.html (1 hunks)
  • libs/blog/layouts/ui-navigation/src/lib/language-picker/language-picker.component.ts (2 hunks)
  • libs/blog/newsletter/feature-newsletter/src/lib/feature-newsletter/newsletter.component.html (5 hunks)
  • libs/blog/newsletter/feature-newsletter/src/lib/page/newsletter-examples/newsletter-examples.component.html (2 hunks)
  • libs/blog/partners/ui-partners/src/lib/partners-list/partners-list.component.html (1 hunks)
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-header/roadmap-dialog-header.component.ts (1 hunks)
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-subtitle/roadmap-dialog-subtitle.component.ts (1 hunks)
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog.component.html (1 hunks)
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-basic-node/roadmap-basic-node.component.ts (2 hunks)
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-cluster/roadmap-cluster.component.ts (2 hunks)
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-node-label/roadmap-node-label.component.ts (1 hunks)
  • libs/blog/roadmap/ui-roadmap/src/lib/components/vertical-connector-arrow/vertical-connector-arrow.component.ts (1 hunks)
  • libs/blog/search/feature-search/src/lib/feature-search/search-dialog/search-dialog.component.html (1 hunks)
  • libs/blog/shared/ui-button/src/lib/button/button.component.ts (1 hunks)
  • libs/blog/shared/ui-card/src/lib/card-skeleton.component.ts (1 hunks)
  • libs/blog/shared/ui-card/src/lib/card.component.ts (3 hunks)
  • libs/blog/shared/ui-dynamic-text-clamp/src/lib/dynamic-text-clamp/dynamic-text-clamp.component.html (1 hunks)
  • libs/blog/shared/ui-not-found/src/lib/not-found-page.component.ts (1 hunks)
  • libs/blog/shared/ui-pagination/src/lib/pagination/pagination.component.html (3 hunks)
  • libs/blog/shared/ui-social-media-icons/src/lib/social-media-icons.component.ts (1 hunks)
  • libs/blog/shared/ui-tooltip/src/lib/ui-tooltip/ui-tooltip.component.ts (1 hunks)
  • libs/blog/writing-rules/feature-writing-rules/src/lib/rules-row/rules-row.component.html (3 hunks)
  • libs/shared/assets/src/lib/styles/global.css (1 hunks)
  • libs/shared/assets/src/lib/styles/main.scss (0 hunks)
  • package.json (2 hunks)
  • tailwind.preset.js (1 hunks)
💤 Files with no reviewable changes (2)
  • libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.scss
  • libs/shared/assets/src/lib/styles/main.scss
🚧 Files skipped from review as they are similar to previous changes (30)
  • libs/blog/shared/ui-social-media-icons/src/lib/social-media-icons.component.ts
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-node-label/roadmap-node-label.component.ts
  • package.json
  • libs/blog/layouts/ui-layouts/src/lib/layout/layout.component.html
  • libs/blog/newsletter/feature-newsletter/src/lib/page/newsletter-examples/newsletter-examples.component.html
  • libs/blog/layouts/ui-layouts/src/lib/header/components/header-mobile-menu.component.ts
  • libs/blog/shared/ui-dynamic-text-clamp/src/lib/dynamic-text-clamp/dynamic-text-clamp.component.html
  • libs/blog/shared/ui-pagination/src/lib/pagination/pagination.component.html
  • apps/blog/src/assets/i18n/en.json
  • libs/blog/shared/ui-not-found/src/lib/not-found-page.component.ts
  • libs/blog/roadmap/ui-roadmap/src/lib/components/vertical-connector-arrow/vertical-connector-arrow.component.ts
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-basic-node/roadmap-basic-node.component.ts
  • libs/blog/shared/ui-card/src/lib/card-skeleton.component.ts
  • libs/blog/layouts/ui-layouts/src/lib/header/components/header-hamburger.component.ts
  • libs/blog/ad-banner/ui/src/lib/ad-image-banner/ad-image-banner.component.html
  • libs/blog/newsletter/feature-newsletter/src/lib/feature-newsletter/newsletter.component.html
  • libs/blog/roadmap/ui-roadmap-node/src/lib/components/roadmap-cluster/roadmap-cluster.component.ts
  • libs/blog/shared/ui-card/src/lib/card.component.ts
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-header/roadmap-dialog-header.component.ts
  • libs/blog/articles/feature-article/src/lib/article-details/article-details-skeleton.component.ts
  • libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog.component.html
  • libs/blog/ad-banner/ui/src/lib/infinite-slider-directive/al-infinite-slider.directive.ts
  • libs/blog/shared/ui-button/src/lib/button/button.component.ts
  • libs/blog/articles/ui-article-card/src/lib/components/article-regular-card/article-regular-card-skeleton.component.ts
  • libs/blog/search/feature-search/src/lib/feature-search/search-dialog/search-dialog.component.html
  • libs/blog/shared/ui-tooltip/src/lib/ui-tooltip/ui-tooltip.component.ts
  • libs/blog/layouts/ui-layouts/src/lib/header/header.component.ts
  • tailwind.preset.js
  • libs/blog/ad-banner/ui/src/lib/banner-carousel/al-banner-carousel.component.ts
  • libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.component.html
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-02-24T15:58:21.460Z
Learnt from: DDonochVA
Repo: HouseOfAngular/angular-love PR: 390
File: libs/blog/home/feature-home/src/lib/home-page/home-page.component.html:1-26
Timestamp: 2025-02-24T15:58:21.460Z
Learning: In the angular-love project, prefer using inline Tailwind classes over extracting them into separate CSS files, as it provides better visibility and maintains consistency with the codebase.

Applied to files:

  • libs/blog/layouts/ui-navigation/src/lib/language-picker/language-picker.component.ts
  • apps/blog/tailwind.config.js
🧬 Code graph analysis (3)
libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.html (1)
libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.ts (1)
  • FooterComponent (38-102)
libs/shared/assets/src/lib/styles/global.css (2)
libs/blog/app-theme/data-access-app-theme/src/app-theme.store.ts (4)
  • setThemeAttribute (48-58)
  • CCAppThemeConsumer (47-59)
  • store (15-36)
  • AppThemeStore (7-9)
apps/blog/src/app/app.component.ts (1)
  • AppComponent (14-43)
libs/blog/authors/ui-author-card/src/lib/author-card/author-card-template.component.ts (1)
libs/blog/authors/ui-author-card/src/lib/author-card/author-card.component.ts (2)
  • AuthorCardComponent (42-92)
  • clampText (51-51)
🔇 Additional comments (23)
libs/blog/writing-rules/feature-writing-rules/src/lib/rules-row/rules-row.component.html (2)

17-17: Class reordering looks good.

These are purely cosmetic reorderings (padding and margin utilities) that don't affect functionality or Tailwind v4 compliance.

Also applies to: 21-21


40-40: Button styling updates align with Tailwind v4 patterns.

The changes correctly use rounded-sm (replacing the older rounded styles) and add leading-4 for better typography control. Class reordering is appropriate.

Verify that the custom color tokens (bg-al-pink, border-al-gray-200) are properly defined in the new Tailwind v4 configuration. Since custom tokens are referenced here but the config files are outside this review, please confirm these tokens are available in the updated tailwind.config.ts or global CSS theming file.

Also applies to: 49-49

libs/blog/roadmap/ui-roadmap-dialog/src/lib/roadmap-dialog-subtitle/roadmap-dialog-subtitle.component.ts (1)

9-9: Correct Tailwind v4 migration!

The class change from flex-grow to grow correctly follows the Tailwind v4 breaking changes. The functionality remains identical—the divider will still grow to fill available space.

libs/blog/articles/ui-table-of-contents/src/lib/table-of-contents/table-of-contents.stories.ts (2)

9-9: LGTM: Lint bypass is appropriate for Storybook.

The eslint-disable comment is acceptable here as Storybook files often need to import across module boundaries for demonstration purposes.


88-88: LGTM: Border radius update aligns with styling refinements.

The change from rounded to rounded-sm is a valid Tailwind utility and appears to be part of the broader styling consistency improvements.

libs/blog/layouts/ui-navigation/src/lib/language-picker/language-picker.component.ts (2)

27-27: Correct Tailwind v4 migration: Important modifier moved to end.

The change from !block to block! correctly implements Tailwind v4's breaking change where the important modifier must now appear at the end of the utility class.


47-47: Correct Tailwind v4 migration: Important modifier moved to end.

The change from !block to block! correctly implements Tailwind v4's breaking change where the important modifier must now appear at the end of the utility class.

libs/blog/authors/ui-author-card/src/lib/author-card/author-card-template.component.ts (2)

52-52: Correct Tailwind v4 migration: Important modifier moved to end.

The change from dark:!bg-al-radial-gradient to dark:bg-al-radial-gradient! correctly implements Tailwind v4's breaking change where the important modifier must now appear at the end of the utility class.


32-34: No issues found. The wrap-break-word utility is correct for Tailwind v4.

The change from break-words to wrap-break-word aligns with Tailwind v4's explicit overflow-wrap utilities. The code migration is appropriate and no changes are needed.

libs/blog/layouts/ui-layouts/src/lib/footer/footer.component.html (2)

6-6: Correct Tailwind v4 migration: CSS variable syntax updated.

The use of max-w-(--breakpoint-xl) correctly implements Tailwind v4's breaking change where CSS variables now use parentheses instead of brackets (OLD: max-w-[--breakpoint-xl]).


8-18: LGTM: Responsive layout restructuring looks good.

The footer layout has been restructured with explicit ordering (order-1, order-2, order-3) and responsive alignment utilities. This provides better control over the layout across different breakpoints.

apps/blog/.postcssrc.json (1)

1-5: LGTM: PostCSS configuration for Tailwind v4.

The PostCSS configuration correctly sets up the @tailwindcss/postcss plugin, which is the standard approach for integrating Tailwind CSS v4 with the build pipeline.

libs/blog/articles/ui-article-list-title/src/lib/ui-article-list-title/ui-article-list-title.component.html (2)

4-4: LGTM: Font size increased for better visual hierarchy.

The change from text-xl to text-3xl increases the heading size, improving visual hierarchy. This is a valid Tailwind utility and appears to be an intentional design update.


8-8: LGTM: Semantic utility for 1px height.

The change from h-[1px] to h-px uses the semantic Tailwind utility for 1-pixel height, which is more concise and idiomatic than the arbitrary value syntax.

libs/blog/partners/ui-partners/src/lib/partners-list/partners-list.component.html (1)

4-4: The change from aspect-[2/1] to aspect-2/1 is valid. Tailwind CSS v4 supports the slash shorthand (e.g., aspect-2/1) for aspect ratios, making both syntaxes acceptable. The refactored code is correct as written.

Likely an incorrect or invalid review comment.

apps/blog/project.json (1)

33-33: LGTM!

The addition of the global CSS file correctly integrates the new Tailwind v4 theming system into the blog build. The file order ensures proper CSS cascade.

apps/blog/tailwind.config.js (2)

4-7: LGTM!

The explicit content patterns correctly cover both the app source and shared libraries, ensuring Tailwind v4 processes all relevant files for class detection.


3-12: PostCSS configuration is correctly set up for Tailwind v4.

Verification confirms that apps/blog/.postcssrc.json contains the proper @tailwindcss/postcss plugin configuration, and the project uses Tailwind CSS v4.1.17. The minimal tailwind.config.js with the CSS-first approach is properly supported by the PostCSS setup.

libs/shared/assets/src/lib/styles/global.css (5)

1-1: LGTM!

Correct Tailwind v4 import syntax, replacing the previous @tailwind base/components/utilities directives.


3-70: LGTM!

The @theme directive correctly defines custom design tokens following Tailwind v4 conventions. The token structure supports both light and dark themes through CSS custom properties.


72-72: LGTM!

The custom dark variant correctly implements attribute-based theme switching, aligning with the theme store implementation that sets the data-theme attribute.


74-98: LGTM!

The root theme tokens are well-structured with consistent RGB triplet definitions for both light and dark modes, following a clear theming pattern.


121-128: Fix undefined color token reference.

Line 126 references --color-gray-200 which is not defined in the @theme block above. This appears to be leftover from a previous implementation.

Apply this diff to use the defined border color token:

   *,
   ::after,
   ::before,
   ::backdrop,
   ::file-selector-button {
-    border-color: var(--color-gray-200, currentColor);
+    border-color: rgb(var(--border));
   }

This aligns with your defined theme tokens and will properly respect light/dark mode border colors.

Likely an incorrect or invalid review comment.

Comment on lines +141 to +152
@utility al-scroll {
&::-webkit-scrollbar {
width: 0.625rem;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
border-radius: 0.5rem;
background-color: var(--color-gray-400);
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fix undefined color token reference.

Line 150 references --color-gray-400 which is not defined in the @theme block. This will fall back to browser defaults.

Consider defining the token in your @theme block or using an existing token:

 @utility al-scroll {
   &::-webkit-scrollbar {
     width: 0.625rem;
   }
   &::-webkit-scrollbar-track {
     background-color: transparent;
   }
   &::-webkit-scrollbar-thumb {
     border-radius: 0.5rem;
-    background-color: var(--color-gray-400);
+    background-color: rgb(var(--muted));
   }
 }

Alternatively, add --color-al-gray-400 to your @theme block if you need a specific gray shade for scrollbars.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@utility al-scroll {
&::-webkit-scrollbar {
width: 0.625rem;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
border-radius: 0.5rem;
background-color: var(--color-gray-400);
}
}
@utility al-scroll {
&::-webkit-scrollbar {
width: 0.625rem;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
border-radius: 0.5rem;
background-color: rgb(var(--muted));
}
}
🤖 Prompt for AI Agents
In libs/shared/assets/src/lib/styles/global.css around lines 141 to 152 the
scrollbar thumb uses an undefined CSS variable --color-gray-400; update the
theme or CSS to use a defined token: either add --color-gray-400 to the @theme
block with the intended color value, or replace the usage with an existing token
(for example --color-al-gray-400 or another defined gray variable) so the
scrollbar thumb resolves to a defined color.

Comment on lines +154 to +156
@utility al-link {
@apply text-red-500 hover:underline dark:text-blue-400;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

Verify dark variant works with custom theme switching.

The dark: variant on line 155 relies on Tailwind's default dark mode implementation, but you've defined a custom variant using @custom-variant dark with data-theme attribute selector.

Verify that the dark: prefix correctly applies with your custom data-theme attribute approach:

If the dark variant doesn't work as expected, you may need to configure Tailwind's darkMode setting in tailwind.config.js:

module.exports = {
  darkMode: ['selector', '[data-theme="dark"]'],
  // ... rest of config
};

🏁 Script executed:

#!/bin/bash
# Search for usage of al-link utility to see if dark mode works correctly

echo "=== Searching for al-link usage ==="
rg -n "al-link" --type html --type ts -C 2

echo -e "\n=== Checking dark variant implementation ==="
# Verify if there are other dark: usages in the codebase
rg -n "dark:" --type html --type ts -g "!node_modules" | head -20

Length of output: 3281



---

🏁 Script executed:

```shell
#!/bin/bash
# Find and check tailwind config
echo "=== Finding tailwind config ==="
fd -n "tailwind.config" . --type f

echo -e "\n=== Checking global.css for custom dark variant ==="
cat libs/shared/assets/src/lib/styles/global.css | head -30

echo -e "\n=== Searching for @custom-variant dark definition ==="
rg -n "@custom-variant" --type css

Length of output: 1640



---

🏁 Script executed:

```shell
#!/bin/bash
# Find tailwind config files with proper syntax
echo "=== Finding tailwind config files ==="
fd "tailwind.config" --type f

echo -e "\n=== Check if tailwind.config exists and inspect darkMode ==="
if [ -f "tailwind.config.ts" ]; then
  echo "=== Content of tailwind.config.ts ==="
  cat tailwind.config.ts
elif [ -f "tailwind.config.js" ]; then
  echo "=== Content of tailwind.config.js ==="
  cat tailwind.config.js
else
  echo "No tailwind.config file found at root"
fi

echo -e "\n=== Checking global.css for complete custom variant context ==="
sed -n '70,75p' libs/shared/assets/src/lib/styles/global.css

Length of output: 372



---

🏁 Script executed:

```shell
#!/bin/bash
echo "=== Content of apps/blog/tailwind.config.js ==="
cat apps/blog/tailwind.config.js

echo -e "\n=== Content of libs/shared/storybook/tailwind.config.js ==="
cat libs/shared/storybook/tailwind.config.js

echo -e "\n=== Checking if al-link custom utility works with dark variant ==="
sed -n '154,156p' libs/shared/assets/src/lib/styles/global.css

Length of output: 827



---

🏁 Script executed:

```shell
#!/bin/bash
echo "=== Finding tailwind.preset.js ==="
fd "tailwind.preset" --type f

echo -e "\n=== Content of tailwind preset ==="
cat tailwind.preset.js 2>/dev/null || echo "File not found at root, searching..."

echo -e "\n=== Searching for all preset files ==="
find . -name "*tailwind*preset*" -type f 2>/dev/null | head -10

Length of output: 215


Add darkMode configuration to tailwind.config.js to enable the custom dark: variant with data-theme attribute.

Your custom dark variant is defined in global.css line 72 using the data-theme attribute, but without a matching darkMode configuration in Tailwind, the dark: prefix will use Tailwind's default media-query-based dark mode instead. Add the following to apps/blog/tailwind.config.js:

module.exports = {
  darkMode: ['selector', '[data-theme="dark"]'],
  content: [
    join(__dirname, 'src/**/*.{ts,html}'),
    join(__dirname, '../../libs/**/*.{ts,html}'),
  ],
  theme: {
    extend: {},
  },
  plugins: [],
};

Without this, dark:text-blue-400 in the al-link utility will not apply when the data-theme="dark" attribute is present on the DOM.

🤖 Prompt for AI Agents
In libs/shared/assets/src/lib/styles/global.css around lines 154-156 you use a
dark: utility (dark:text-blue-400) tied to data-theme but Tailwind isn't
configured to use the data-theme selector; open apps/blog/tailwind.config.js and
add a darkMode entry using the selector pattern (e.g. darkMode: ['selector',
'[data-theme="dark"]']), ensure the content array includes your app src and the
libs glob so Tailwind picks up classes, then rebuild so the custom dark: variant
applies when data-theme="dark".

@DDonochVA DDonochVA merged commit 5fa6c74 into main Nov 20, 2025
2 checks passed
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.

3 participants