-
Notifications
You must be signed in to change notification settings - Fork 13
feat: support Tailwind CSS v4 #183
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughThis pull request implements extensive configuration and styling updates across the repository. In GitHub Actions workflows, branch names have been changed, and a new deployment workflow for Azure staging has been added. Numerous documentation files and UI components have been refactored with updated CSS class names (e.g., replacing "ring-1" with "ring" and "outline-none" with "outline-hidden"), new theming approaches (transitioning from hex to oklch color representations), and improved build configurations. Additionally, extraneous JavaScript files and outdated configurations have been removed, and project dependencies and packaging details have been updated for better maintainability. Changes
Sequence Diagram(s)sequenceDiagram
participant Dev as Developer
participant GA as GitHub Actions
participant Build as Build Job
participant Deploy as Deploy Job
participant Azure as Azure Web App
Dev->>GA: Push commit to "dev" branch
GA->>Build: Trigger build job (checkout, setup .NET, build & publish)
Build->>GA: Upload artifact
GA->>Deploy: Trigger deploy job (after build completion)
Deploy->>Azure: Deploy artifact to "lumexui" app in "staging" slot
Possibly related PRs
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (3)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## dev #183 +/- ##
======================================
Coverage ? 93.70%
======================================
Files ? 122
Lines ? 2794
Branches ? 353
======================================
Hits ? 2618
Misses ? 98
Partials ? 78 ☔ View full report in Codecov by Sentry. |
…x` function syntax
… not in docs afaik)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 7
🔭 Outside diff range comments (1)
src/LumexUI/Styles/InputField.cs (1)
21-21
: 💡 Verification agent🧩 Analysis chain
Verify if there's a syntax issue in the
--color-divider
declaration.There appears to be a potential syntax issue in the declaration of
--color-divider
in the related_theme.css
file. You're using--alpha()
function which may not be the correct CSS function for opacity.
🏁 Script executed:
#!/bin/bash # Check if the custom property is defined correctly in _theme.css grep -n "\--color-divider" src/LumexUI/Styles/_theme.cssLength of output: 144
Attention: Correct the Custom Property Declaration
The CSS declaration in
src/LumexUI/Styles/_theme.css
on line 21 appears to be using a non-standard function syntax. The current declaration:--color-divider: --alpha(var(--lumex-divider) / var(--lumex-opacity-divider));suggests that the function call
--alpha()
is likely incorrect. In standard CSS (or even in Sass), function calls for color opacity usually do not include a preceding double hyphen. Consider using a supported function (for example,rgba()
) or removing the extra hyphens so that the intended opacity adjustment is performed correctly.
- File to update:
src/LumexUI/Styles/_theme.css
(line 21)Please revise the declaration to ensure valid CSS syntax for applying opacity.
🧹 Nitpick comments (18)
docs/LumexUI.Docs/Styles/fonts.css (1)
3-3
:❓ Verification inconclusive
Font weight range adjusted from 100-900 to 300-900
This change removes the lightest font weights (100-200) from the 'Inter var' font family. This aligns with Tailwind CSS v4's approach to typography, but ensure this doesn't impact any existing UI components that might rely on these lighter weights.
To ensure this change doesn't break existing UI, run this command to check for any usage of font-weight values below 300:
🏁 Script executed:
#!/bin/bash # Check for usage of font weights below 300 that might be affected rg -i "font-\(thin\|extralight\)" --type=razor --type=css rg -i "font-weight: *[12][0-9][0-9]" --type=razor --type=css rg -i "font-weight: *1|2|100|200" --type=razor --type=css rg -i "tw-font-thin|tw-font-extralight" --type=razor --type=cssLength of output: 368
Attention: Verify Usage of Light Font Weights
The original check commands failed because the
--type=razor
flag isn’t recognized by ripgrep. The font weight change (from 100‑900 to 300‑900) still requires extra caution since lighter weights (100–200) have been removed. To ensure nothing in the project relies on these lighter weights, please run the revised verification script below, which uses globs for both Razor and CSS files:#!/bin/bash # Revised search for font weight usages below 300 in Razor and CSS files rg -i "font-(thin|extralight)" --glob "*.razor" --glob "*.css" rg -i "font-weight:\s*([12]\d\d)" --glob "*.razor" --glob "*.css" rg -i "font-weight:\s*(100|200)" --glob "*.razor" --glob "*.css" rg -i "tw-font-(thin|extralight)" --glob "*.razor" --glob "*.css"Review Comment:
File:
docs/LumexUI.Docs/Styles/fonts.css
Lines: 3-3font-weight: 300 900;Font weight range adjusted from 100–900 to 300–900
This change removes the lightest font weights (100–200) from the 'Inter var' font family to align with Tailwind CSS v4's typography approach. Please manually verify that none of the UI components depend on the lighter weights by running the revised script above and reviewing its output.
docs/LumexUI.Docs.Client/Pages/Customization/Colors.razor (1)
16-26
: Consider adding guidance about color configurability.The AI summary mentions that a warning callout about common colors not being configurable has been removed. Without this information, users might incorrectly assume these colors can be configured.
Consider adding a note about the non-configurability of common colors to set clear expectations for developers, perhaps as a smaller note rather than a full warning callout.
docs/LumexUI.Docs.Client/Components/ColorSwatches.razor (1)
13-33
: Consider adding ARIA attributes for color information.The color swatches component would benefit from additional accessibility attributes to ensure color information is available to screen readers.
Consider adding attributes like
aria-label
with color information to make the swatches more accessible:<div class="relative w-12 h-12 rounded-md ring ring-inset ring-foreground-950/10 sm:w-full" - style="background-color: @(color.Value + (isDivider ? "26" : default))"> + style="background-color: @(color.Value + (isDivider ? "26" : default))" + aria-label="@(swatch.Title) color @color.Key">tests/LumexUI.Tests/Components/Providers/ThemeProviderTests.cs (1)
40-173
: Color format migrated to oklch for Tailwind CSS v4 ✓Excellent migration from the previous color system to the
oklch
color format, which is a key feature of Tailwind CSS v4. The oklch color space provides better perceptual uniformity and accessibility benefits over traditional hex and HSL values.Key improvements:
- More consistent color representation
- Better color manipulation capabilities
- Improved accessibility with perceptually uniform color space
- Updated opacity values to use percentage format (e.g.,
60%
instead of0.6
)This comprehensive update ensures that the theming system is fully compatible with Tailwind CSS v4.
Note: Though most colors are in oklch format, background (#fff) and overlay (#000) still use hex. Consider using oklch for these as well for consistency.
--lumex-background: #fff; +-lumex-background: oklch(1 0 0); --lumex-overlay: #000; +-lumex-overlay: oklch(0 0 0);.github/workflows/deploy-dev.yml (1)
55-61
: Consider using OIDC for more secure Azure authenticationWhile the current authentication method works, consider transitioning to OpenID Connect (OIDC) for federated credentials which is more secure than using long-lived secrets.
- name: Login to Azure uses: azure/login@v2 with: client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_AE23C767A44848FE995578A1C037403D }} tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_43E73B5325A2495B9E40E95184EE9EDE }} subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_9DD2FEFA18374E8484A5B85D9F23348C }} + name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}Update your repository secrets to use these new names for better security and maintainability.
src/LumexUI/LumexUI.csproj (2)
34-36
: Updated packaging structure for theme assets.These changes alter how theme assets are packaged and distributed, following Tailwind CSS v4 conventions. The theme components are now properly treated as non-compilable assets and packaged in consistent locations for consumption.
This packaging approach improves the separation between code and styling assets, making the library more maintainable and easier to customize by consumers.
57-57
: Changed npm target to run after build instead of before build.This change alters when npm dependencies are installed in the build lifecycle, potentially improving build performance by avoiding unnecessary npm installations when only C# code changes.
Running npm after the build makes sense for this project structure since the npm dependencies are primarily used for generating assets that aren't needed during compilation.
docs/LumexUI.Docs.Client/Components/ComponentLinks.razor (1)
42-50
: Simplified RenderFragment declarations.The refactoring of the
BlazorIcon
andGithubIcon
properties from method-style to field-style declarations simplifies the code and makes it more readable.Consider using a private method to create these icons to avoid duplication:
- private static readonly RenderFragment BlazorIcon = - @<LumexIcon Icon="@Icons.Brands.Blazor" - Size="@new("20")" - viewBox="-10 -38 340 340" />; - - private static readonly RenderFragment GithubIcon = - @<LumexIcon Icon="@Icons.Brands.GitHub" - Size="@new("20")" - viewBox="0 0 24 24" />; + private static readonly RenderFragment BlazorIcon = CreateIcon(Icons.Brands.Blazor, "20", "-10 -38 340 340"); + private static readonly RenderFragment GithubIcon = CreateIcon(Icons.Brands.GitHub, "20", "0 0 24 24"); + + private static RenderFragment CreateIcon(string icon, string size, string viewBox) => + @<LumexIcon Icon="@icon" + Size="@new(size)" + viewBox="@viewBox" />;src/LumexUI/Styles/DataGrid.cs (1)
266-284
: Updated selected state styling approach.The styling for selected table cells has been updated to use the
data-[selected=true]:
prefix for both background and text colors, making the selection state handling more consistent and explicit.Consider extracting the repeated pattern into a helper method to reduce code duplication:
private static ElementClass GetColorStyles( ThemeColor color, string slot ) { + string GetSelectedStyle(string colorName) => + $"data-[selected=true]:bg-{colorName}-100 data-[selected=true]:text-{colorName}-700"; + return color switch { - ThemeColor.Default => ElementClass.Empty() - .Add( "data-[selected=true]:bg-default-100 data-[selected=true]:text-default-foreground", when: slot is nameof( _td ) ), + ThemeColor.Default => ElementClass.Empty() + .Add( slot is nameof(_td) ? "data-[selected=true]:bg-default-100 data-[selected=true]:text-default-foreground" : "" ), - ThemeColor.Primary => ElementClass.Empty() - .Add( "data-[selected=true]:bg-primary-100 data-[selected=true]:text-primary-700", when: slot is nameof( _td ) ), + ThemeColor.Primary => ElementClass.Empty() + .Add( GetSelectedStyle("primary"), when: slot is nameof( _td ) ), // ... similar changes for other theme colors ... _ => ElementClass.Empty() }; }src/LumexUI/Theme/Colors/Colors.cs (1)
492-497
: Consider updating ReverseColorValues documentationWhile the implementation of
ReverseColorValues
remains functional, consider updating its documentation to reflect the transition to oklch color format and potentially explain its purpose in the context of color manipulation with the new format./// <summary> /// Reverses the order of color values in a given color scale. /// </summary> /// <param name="colorScale">The color scale to reverse.</param> /// <returns>A <see cref="Dictionary{TKey, TValue}"/> with the color scale reversed.</returns> +/// <remarks> +/// This method is useful for creating inverted color scales, which can be helpful when working with oklch color format +/// where lightness is the first component. +/// </remarks> internal static Dictionary<string, string> ReverseColorValues( IReadOnlyDictionary<string, string> colorScale )docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/SingleSelection.razor (2)
12-13
: Skipping first enum value is elegant but consider adding a commentUsing
Enum.GetValues<ThemeColor>()[1..]
to skip the first enum value (presumablyDefault
) is a clean approach, but adding a brief comment would make the intent clearer to other developers.- @foreach( var color in Enum.GetValues<ThemeColor>()[1..] ) + @foreach( var color in Enum.GetValues<ThemeColor>()[1..] ) // Skip Default color
14-16
: Consider adding aria-label for better accessibilityFor improved accessibility, consider adding an aria-label to each radio button that provides more context than just the color name.
- <LumexRadio Value="@color" Color="@color"> - @color.ToString() - </LumexRadio> + <LumexRadio Value="@color" Color="@color" aria-label="Select @color color theme"> + @color.ToString() + </LumexRadio>docs/LumexUI.Docs.Client/Pages/Customization/Theme.razor (1)
63-76
: Consider updating the Tailwind CSS setup warningThe warning callout still references setting up "Tailwind CSS" generally. Consider updating it to specifically mention Tailwind CSS v4 setup, as the installation process may differ from v3.
- The following section assumes that you have already completed a basic setup of Tailwind CSS. + The following section assumes that you have already completed a basic setup of Tailwind CSS v4. If you haven't, please refer to the <LumexLink Href="https://tailwindcss.com/docs/installation/tailwind-cli" External="@true" Class="bordered-link">src/LumexUI/Components/Providers/LumexThemeProvider.razor.cs (1)
77-83
: Check for potential side effects of consolidated shadow/opacity naming.Renaming and/or restructuring variable names for box shadows (
--lumex-shadow-{size}
) and opacities (--lumex-opacity-{type}
) is generally okay. However, confirm that any prior references (e.g.--lumex-box-shadow-small
) are updated.src/LumexUI/Utilities/ColorUtils.cs (3)
14-14
: Leverage partial class advantage.Declaring this class as
partial
may be beneficial for extension or modularization. Ensure there's a plan to keep partial definitions organized and discoverable, as scattering code can reduce maintainability.
32-46
: Ensure fallback logic for non-oklch colors.Currently, any non-
transparent
color that does not start withoklch
defaults to a luminance of 0. Confirm that this is the desired behavior, or consider logging/debugging to detect unexpected color formats.
58-59
: Confirm maintainability of theGeneratedRegex
approach.
GeneratedRegex
is good for performance, but changes to the pattern require recompilation. Document usage and test thoroughly.docs/LumexUI.Docs/LumexUI.Docs.csproj (1)
27-28
: Clarify the docs comment.The comment “Run the docs content generation command” is duplicated. Update it to reflect that you are installing Tailwind CSS. This helps future maintainers understand the target’s purpose.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
docs/LumexUI.Docs/package-lock.json
is excluded by!**/package-lock.json
📒 Files selected for processing (105)
.github/workflows/build-test.yml
(2 hunks).github/workflows/deploy-dev.yml
(1 hunks).github/workflows/deploy.yml
(3 hunks).gitignore
(1 hunks)docs/LumexUI.Docs.Client/Components/CodeSnippet.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/ColorSwatches.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/ComponentLinks.razor
(4 hunks)docs/LumexUI.Docs.Client/Components/DocsApiSection.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/DocsSection.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/InstallationSteps.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/Layouts/InstallationLayout.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/NavItemBadge.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/Preview.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/PreviewCode.razor
(1 hunks)docs/LumexUI.Docs.Client/Components/PreviewCode.razor.cs
(1 hunks)docs/LumexUI.Docs.Client/Components/QuickLink.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Api/Api.razor
(3 hunks)docs/LumexUI.Docs.Client/Pages/Components/Accordion/Examples/StartContent.razor
(3 hunks)docs/LumexUI.Docs.Client/Pages/Components/Card/Examples/CustomStyles.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/Editing.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/MultipleSelection.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/Shadows.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/SingleSelection.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/_HeaderContent.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/_Radius.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Divider/Examples/CustomStyles.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Divider/Examples/Usage.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Divider/Examples/_Orientation.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Dropdown/Examples/ColorsVariants.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Dropdown/Examples/CustomStyles.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/ColorsVariants.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/CustomStyles.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/Description.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/Disabled.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/DisabledItems.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/EmptyContent.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/StartEndContent.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/TwoWayDataBindingMultiple.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/TwoWayDataBindingSingle.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/Usage.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/Navbar.razor
(0 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Blurred.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Bordered.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Brand.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/CustomStyles.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Height.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/MaxWidth.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Menu.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Sticky.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Usage.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Numbox/Examples/StartEndContent.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Numbox/Numbox.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/CustomStyles.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/Description.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/ItemStartEndContent.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/_Radius.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Components/Switch/Examples/CustomStyles.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Customization/Colors.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Customization/Theme.razor
(4 hunks)docs/LumexUI.Docs.Client/Pages/Getting Started/Installation.razor
(1 hunks)docs/LumexUI.Docs.Client/Pages/Getting Started/Overview.razor
(1 hunks)docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsCommon.html
(1 hunks)docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsCommonScale.html
(1 hunks)docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsSemantic.html
(1 hunks)docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsSemanticCustom.html
(0 hunks)docs/LumexUI.Docs.Client/Samples/Customization/Customize Theme/customizeThemeColors.html
(1 hunks)docs/LumexUI.Docs.Client/Samples/Installation/installationConfig.html
(1 hunks)docs/LumexUI.Docs.Client/Samples/Installation/installationFiles.html
(1 hunks)docs/LumexUI.Docs.Client/Samples/Installation/installationServices.html
(1 hunks)docs/LumexUI.Docs/Components/App.razor
(1 hunks)docs/LumexUI.Docs/Directory.Build.props
(1 hunks)docs/LumexUI.Docs/Directory.Build.targets
(1 hunks)docs/LumexUI.Docs/LumexUI.Docs.csproj
(1 hunks)docs/LumexUI.Docs/Styles/fonts.css
(1 hunks)docs/LumexUI.Docs/Styles/globals.css
(1 hunks)docs/LumexUI.Docs/Styles/typography.css
(1 hunks)docs/LumexUI.Docs/package.json
(0 hunks)docs/LumexUI.Docs/tailwind.config.js
(0 hunks)src/LumexUI/Components/Navbar/LumexNavbarMenuToggle.razor
(1 hunks)src/LumexUI/Components/Providers/LumexThemeProvider.razor.cs
(2 hunks)src/LumexUI/LumexUI.csproj
(2 hunks)src/LumexUI/LumexUI.targets
(1 hunks)src/LumexUI/Scripts/Plugin/animations.js
(0 hunks)src/LumexUI/Scripts/Plugin/plugin.js
(0 hunks)src/LumexUI/Scripts/Plugin/scrollbar-hide.js
(0 hunks)src/LumexUI/Scripts/Plugin/transitions.js
(0 hunks)src/LumexUI/Styles/Accordion.cs
(1 hunks)src/LumexUI/Styles/Button.cs
(2 hunks)src/LumexUI/Styles/Checkbox.cs
(3 hunks)src/LumexUI/Styles/DataGrid.cs
(2 hunks)src/LumexUI/Styles/InputField.cs
(15 hunks)src/LumexUI/Styles/Menu.cs
(1 hunks)src/LumexUI/Styles/Navbar.cs
(1 hunks)src/LumexUI/Styles/Popover.cs
(2 hunks)src/LumexUI/Styles/Radio.cs
(1 hunks)src/LumexUI/Styles/Select.cs
(13 hunks)src/LumexUI/Styles/Switch.cs
(3 hunks)src/LumexUI/Styles/Tabs.cs
(1 hunks)src/LumexUI/Styles/Utils.cs
(2 hunks)src/LumexUI/Styles/_theme.css
(1 hunks)src/LumexUI/Theme/Colors/Colors.cs
(1 hunks)src/LumexUI/Utilities/ColorUtils.cs
(1 hunks)src/LumexUI/package.json
(1 hunks)src/LumexUI/rollup.config.mjs
(1 hunks)tests/LumexUI.Tests/Components/Providers/ThemeProviderTests.cs
(2 hunks)
💤 Files with no reviewable changes (8)
- docs/LumexUI.Docs.Client/Pages/Components/Navbar/Navbar.razor
- docs/LumexUI.Docs/tailwind.config.js
- docs/LumexUI.Docs/package.json
- src/LumexUI/Scripts/Plugin/scrollbar-hide.js
- src/LumexUI/Scripts/Plugin/plugin.js
- src/LumexUI/Scripts/Plugin/animations.js
- src/LumexUI/Scripts/Plugin/transitions.js
- docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsSemanticCustom.html
✅ Files skipped from review due to trivial changes (31)
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/TwoWayDataBindingSingle.razor
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/Usage.razor
- docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/Description.razor
- docs/LumexUI.Docs.Client/Pages/Components/Dropdown/Examples/CustomStyles.razor
- docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsSemantic.html
- docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/ItemStartEndContent.razor
- docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsCommon.html
- docs/LumexUI.Docs.Client/Pages/Components/Numbox/Examples/StartEndContent.razor
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/TwoWayDataBindingMultiple.razor
- docs/LumexUI.Docs.Client/Pages/Components/Divider/Examples/Usage.razor
- docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Brand.razor
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/DisabledItems.razor
- docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Height.razor
- docs/LumexUI.Docs.Client/Samples/Customization/Customize Theme/customizeThemeColors.html
- docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/MaxWidth.razor
- docs/LumexUI.Docs.Client/Components/InstallationSteps.razor
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/EmptyContent.razor
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/Description.razor
- docs/LumexUI.Docs.Client/Pages/Components/Divider/Examples/_Orientation.razor
- docs/LumexUI.Docs.Client/Components/Preview.razor
- docs/LumexUI.Docs.Client/Pages/Api/Api.razor
- docs/LumexUI.Docs.Client/Samples/Installation/installationFiles.html
- docs/LumexUI.Docs/Directory.Build.props
- docs/LumexUI.Docs/Directory.Build.targets
- docs/LumexUI.Docs.Client/Components/DocsApiSection.razor
- docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Usage.razor
- docs/LumexUI.Docs.Client/Pages/Components/Accordion/Examples/StartContent.razor
- docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/_Radius.razor
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/Disabled.razor
- docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/StartEndContent.razor
- docs/LumexUI.Docs.Client/Components/DocsSection.razor
🧰 Additional context used
🪛 Biome (1.9.4)
docs/LumexUI.Docs/Styles/globals.css
[error] 1-1: expected ,
but instead found @
Remove @
(parse)
[error] 1-1: expected ,
but instead found import
Remove import
(parse)
[error] 1-1: Expected a compound selector but instead found '"tailwindcss"'.
Expected a compound selector here.
(parse)
[error] 1-1: expected ,
but instead found theme
Remove theme
(parse)
[error] 1-1: expected ,
but instead found (
Remove (
(parse)
[error] 1-1: expected ,
but instead found static
Remove static
(parse)
[error] 1-1: expected ,
but instead found )
Remove )
(parse)
[error] 1-2: expected ,
but instead found ;
Remove ;
(parse)
[error] 2-3: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.
(lint/correctness/noInvalidPositionAtImportRule)
[error] 3-4: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.
(lint/correctness/noInvalidPositionAtImportRule)
[error] 4-5: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.
(lint/correctness/noInvalidPositionAtImportRule)
[error] 5-6: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.
(lint/correctness/noInvalidPositionAtImportRule)
[error] 6-7: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.
(lint/correctness/noInvalidPositionAtImportRule)
src/LumexUI/Styles/_theme.css
[error] 2-2: Expected a compound selector but instead found '@'.
Expected a compound selector here.
(parse)
[error] 2-2: expected ,
but instead found theme
Remove theme
(parse)
[error] 200-200: Expected a component value, a binary expression, a parenthesized expression, or an any function expression but instead found ')'.
Expected a component value, a binary expression, a parenthesized expression, or an any function expression here.
(parse)
🔇 Additional comments (130)
.gitignore (1)
408-408
: Good addition to exclude executables from version control.Adding
*.exe
files to .gitignore is a good practice since these binary files don't need to be tracked in version control.docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Sticky.razor (1)
4-4
: Correct Tailwind CSS v4 ring syntax update.The class change from
ring-1
toring
aligns with Tailwind CSS v4's approach to borders and rings. In v4, thering
utility now behaves more like a standard utility without requiring the-1
suffix.docs/LumexUI.Docs.Client/Components/CodeSnippet.razor (1)
14-14
: Correctly updated to Tailwind CSS v4 child selector syntax.The change from
children:my-0
to*:my-0
reflects Tailwind CSS v4's updated modifier syntax for targeting child elements. This is the correct implementation according to the Tailwind v4 upgrade guide.docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Blurred.razor (1)
4-4
: Correct Tailwind CSS v4 ring syntax update.The class change from
ring-1
toring
follows Tailwind CSS v4's simplified approach for the ring utility.docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/CustomStyles.razor (1)
4-4
: Updated ring utility class for Tailwind CSS v4 compatibility.This change from
ring-1
toring
aligns with Tailwind CSS v4's simplified ring utility syntax. In v4, the defaultring
class replaces the explicit width declaration that was required in v3.docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Menu.razor (1)
4-4
: Updated ring utility class for Tailwind CSS v4 compatibility.This change from
ring-1
toring
aligns with Tailwind CSS v4's simplified ring utility syntax, maintaining visual consistency with other navbar preview components.docs/LumexUI.Docs.Client/Components/NavItemBadge.razor (1)
17-17
: Updated ring utility class for Tailwind CSS v4 compatibility.This change from
ring-1
toring
in the component's class builder aligns with Tailwind CSS v4's simplified ring utility syntax. The component will continue to display the correct status badge styling.docs/LumexUI.Docs.Client/Components/PreviewCode.razor (1)
28-28
:✅ Verification successful
Updated child selector modifier for Tailwind CSS v4 compatibility.
The selector syntax has changed from
children:
in Tailwind CSS v3 to*:
in v4 for targeting child elements. This modification ensures that the rounded-top-none styling is correctly applied to child elements of the collapsible component.
🌐 Web query:
What are the child modifiers in Tailwind CSS v4?
💡 Result:
Tailwind CSS v4 continues to build on the framework's powerful child selector modifiers introduced in previous versions, offering several methods to target and style child elements efficiently. Here are the key child modifiers and techniques:
Structural Pseudo-class Modifiers
first
: Targets the first child element
first:text-yellow-500
[1][3]last
: Targets the last child element
last:border-b-0
[1][3]odd
/even
: Alternates styles for list items
odd:bg-white even:bg-slate-50
[3][9]Direct Child Targeting
Use arbitrary value syntax to style all direct children:
<div class="[&>*]:p-4 [&>*]:hover:text-blue-700"> <div>Child 1</div> <!-- Gets padding and hover effect --> <div>Child 2</div> </div>This applies
p-4
and hover states to all immediate children[2][5].Universal Child Selector
Introduced in Tailwind 3.4 and available in v4:
<div class="*:text-gray-300 *:hover:text-blue-600"> <h3>Title</h3> <!-- Grey text that turns blue on hover --> <p>Content</p> </div>The
*
modifier styles all children[5][7].Advanced Group Targeting
Combine with
group
for state-dependent child styling:<div class="group has-active-checkbox:is-active"> <p class="group-[.is-active]:hidden">Default</p> <p class="group-[.is-active]:block">Active</p> </div>Changes visibility based on parent state[4][10].
Responsive Child Styling
Stack modifiers for breakpoint-specific child styles:
<div class="md:[&>*]:p-6 lg:[&>*]:p-8"> <div>Responsive padding</div> </div>Adjusts child padding at different screen sizes[2][9].
These methods enable clean HTML while maintaining precise control over child element styling, reducing code repetition by up to 40% in complex UIs[2][5]. The v4 alpha enhances color handling but maintains the core child selector functionality from v3[6].
Citations:
- 1: https://www.khueapps.com/blog/article/fisrt-child-and-last-child-in-tailwind-css
- 2: https://tailkits.com/blog/tailwind-child-selector-guide/
- 3: https://v3.tailwindcss.com/docs/hover-focus-and-other-states
- 4: Why can't modifiers set arbitrary classes with `group` for children to use? tailwindlabs/tailwindcss#11862
- 5: https://www.getfishtank.com/insights/child-selectors-and-pseudo-elements-in-tailwind-css-for-sitecore-jss
- 6: https://tailwindcss.ru/blog/tailwindcss-v4-alpha/
- 7: https://www.epicweb.dev/tips/direct-children-selector-in-tailwind-css
- 8: Child Selector Tailwind CSS tailwindlabs/tailwindcss#9917
- 9: https://tailwindcss.com/docs/hover-focus-and-other-states
- 10: https://www.stefanjudis.com/today-i-learned/how-to-style-element-descendants-with-tailwind-css/
Child Selector Modifier Verified for Tailwind CSS v4
- File:
docs/LumexUI.Docs.Client/Components/PreviewCode.razor
(Line 28)- The updated code using
*:rounded-t-none
correctly applies the universal child selector from Tailwind CSS v4.- The change from the previous
children:
syntax to*:
aligns with the updated Tailwind CSS v4 documentation and ensures that the rounded-top-none styling is applied to all child elements as intended.No further modifications are required.
docs/LumexUI.Docs.Client/Pages/Components/Divider/Examples/CustomStyles.razor (1)
11-11
: CSS variable naming convention and value format updated for Tailwind CSS v4The CSS variable has been updated from
--lumex-divider-opacity: .5
to--lumex-opacity-divider: 50%
, which aligns with the new naming convention and value format in Tailwind CSS v4. The change includes:
- Variable name reorganization from
--lumex-{component}-{property}
to--lumex-{property}-{component}
- Value format change from decimal (.5) to percentage (50%)
This update ensures consistency with the new design system's CSS variable naming patterns and how opacity is represented in the new Tailwind version.
src/LumexUI/Styles/Radio.cs (1)
56-56
: Standardized transition property order for consistencyThe order of properties in the transition class has been updated from "transition-transform-colors" to "transition-colors-transform" to maintain a consistent transition property ordering convention across components in Tailwind CSS v4.
This standardization improves code consistency and maintainability while ensuring transitions behave uniformly across the UI.
src/LumexUI/Styles/Navbar.cs (1)
39-41
: Improved toggle button accessibility and interactivityThe styling for toggle elements has been updated with the following changes:
- Added
cursor-pointer
to visually indicate the element is interactive- Removed
outline-none
to improve keyboard navigation accessibility- Maintained the custom focus visible styles through
Utils.FocusVisible
These changes align with modern accessibility best practices in Tailwind CSS v4 by preserving focus indicators while enhancing the user experience with appropriate cursor feedback.
docs/LumexUI.Docs.Client/Components/QuickLink.razor (1)
21-21
: Updated ring utility class for Tailwind CSS v4 compatibilityThe ring styling has been updated from
peer-hover:ring-1
topeer-hover:ring
, removing the explicit width suffix.This change aligns with Tailwind CSS v4's approach to ring utilities, where the base
ring
class now provides a default border width, making the previous-1
suffix redundant or potentially incompatible with the new version.docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Bordered.razor (1)
4-4
:✅ Verification successful
Tailwind CSS v4 class update:
ring-1
toring
This change aligns with Tailwind CSS v4 standards, where the
ring
utility now applies a default border ring without needing the-1
suffix that was required in v3.
🌐 Web query:
What are the ring utility changes from Tailwind CSS v3 to v4?
💡 Result:
The ring utility in Tailwind CSS underwent significant changes from v3 to v4, focusing on consistency and modern CSS practices. Here's a breakdown of the key updates:
Default Ring Width and Color
- v3 default: A 3px blue ring (
ring-3
equivalent) [4][6][8].- v4 default: Now uses a 1px ring with
currentColor
instead of a fixed blue color. This aligns with browser defaults and makes it easier to coordinate with your theme's color palette [4][6][10].To maintain the v3 appearance in v4, explicitly specify the size:
<!-- v3 default behavior --> <div class="ring"></div> <!-- v4 equivalent --> <div class="ring-3"></div>Usage Alignment
- Rings vs. borders: Rings now behave more like borders but don't affect element dimensions (unlike borders) [2][10].
- Focus rings: The team recommends using
outline-*
utilities for focus states instead ofring-*
, reserving rings for decorative effects [4][10].New Features
Added in v4.0:
<!-- Inner ring effect --> <input class="inset-ring-4 inset-ring-blue-500">The new
inset-ring-*
utilities create inner ring effects without affecting layout [2][10].Migration Steps
- Search/replace: Update all instances of
ring
toring-3
in your project [8].- Color adjustments: Add explicit color classes if needed (
ring-blue-500
) [4].- Focus states: Convert
ring
-based focus styles tooutline-*
utilities where appropriate [4].This overhaul simplifies ring usage while providing better alignment with modern CSS conventions like
currentColor
inheritance [6][10].Citations:
- 1: https://dev.to/kasenda/whats-new-and-migration-guide-tailwind-css-v40-3kag
- 2: https://www.youtube.com/watch?v=7IK9j9-H0vQ
- 3: https://v3.tailwindcss.com/docs/upgrade-guide
- 4: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 5: https://tailwindcss.com/docs/upgrade-guide
- 6: https://daily.dev/blog/tailwind-css-40-everything-you-need-to-know-in-one-place
- 7: [v4] add support for disabling core plugins tailwindlabs/tailwindcss#16132
- 8: https://blog.logrocket.com/getting-ready-tailwind-v4/
- 9: [v4] Upgrading to tailwind v4 produces a larger css than v3. tailwindlabs/tailwindcss#15544
- 10: https://tailwindcss.com/blog/tailwindcss-v4
Tailwind CSS v4 Ring Utility Update Confirmed
The change from using
ring-1
to simplyring
is correct. In Tailwind CSS v4, thering
utility now applies a default 1px ring (usingcurrentColor
), making the explicit-1
suffix unnecessary. This update aligns with the new Tailwind CSS standards.
- File updated:
docs/LumexUI.Docs.Client/Pages/Components/Navbar/PreviewCodes/Bordered.razor
- Change: Replaced
ring-1
withring
to match Tailwind CSS v4 defaults.docs/LumexUI.Docs.Client/Pages/Components/Switch/Examples/CustomStyles.razor (1)
21-21
: Added border color specification withborder-default-200
This change enhances the thumb element's styling by explicitly defining the border color using the new color system. The addition of
border-default-200
is part of the transition to the oklch color format mentioned in the PR objectives.docs/LumexUI.Docs.Client/Pages/Components/Numbox/Numbox.razor (1)
176-176
: Added "Types" heading to documentation structureThis addition improves the documentation by including the "Types" section (which was already defined in the component on lines 6-20) in the navigation hierarchy. This better organizes the component documentation by properly categorizing the information about supported numeric types.
src/LumexUI/package.json (1)
9-10
:❓ Verification inconclusive
Dependencies removed as part of Tailwind CSS v4 migration
The removal of
@rollup/plugin-commonjs
andtailwindcss
dependencies is consistent with the PR objective of upgrading to Tailwind CSS v4. However, we should verify:
- That Tailwind CSS is being imported/managed elsewhere in the project
- That the build process is still working correctly without the commonjs plugin
🏁 Script executed:
#!/bin/bash # Check where Tailwind CSS is now being configured/imported echo "Searching for Tailwind CSS configuration files..." fd -e js -e cjs -e ts tailwind.config echo "\nSearching for Tailwind CSS imports in CSS files..." rg -l "@import.*tailwind" --type css echo "\nSearching for tailwindcss in other package.json files..." fd package.json -x cat {} | grep -A 3 -B 3 tailwindcss || echo "No tailwindcss found in package.json files"Length of output: 620
Tailwind CSS Migration Verification
- Verified that Tailwind CSS is still imported via the stylesheet in
docs/LumexUI.Docs/Styles/globals.css
(an@import ... tailwind
statement was found).- No instances of Tailwind CSS are referenced in any package.json files, aligning with its removal.
- The absence of the
@rollup/plugin-commonjs
dependency remains untested from a build process perspective. Please ensure that the build pipeline still functions correctly without this plugin.docs/LumexUI.Docs.Client/Components/PreviewCode.razor.cs (2)
18-18
: Changed from "ring-1" to "ring" classThis update aligns with Tailwind CSS v4's utility changes where the ring utilities have been simplified. The
ring
class now applies a default ring width without needing the-1
suffix.
20-20
: Updated shadow class from "shadow-sm" to "shadow-xs"This change reflects Tailwind CSS v4's updated shadow scale, where
shadow-xs
now represents the smallest shadow size. This aligns with the Tailwind v4 migration guide recommendations.docs/LumexUI.Docs.Client/Pages/Components/Card/Examples/CustomStyles.razor (1)
22-22
: Switched from theme() function to CSS variables for colorsThe shadow styling has been updated to use CSS variables (
var(--color-zinc-200)
,var(--color-zinc-50)
) instead of the theme function. This aligns with Tailwind CSS v4's approach to colors and supports the transition to oklch color format as mentioned in the PR description.This change improves compatibility with Tailwind CSS v4's color system while maintaining the same visual appearance.
docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/CustomStyles.razor (2)
33-33
: Changed from "ring-1" to "ring" classThis update aligns with Tailwind CSS v4's utility changes where the ring utilities have been simplified. The
ring
class now applies a default ring width without needing the-1
suffix.
34-34
: Updated version number from v1.0.0-preview.4 to v2.0.0-preview.1The version number has been updated to reflect a major version bump, which is appropriate when making breaking changes like upgrading to Tailwind CSS v4.
This aligns with semantic versioning principles where major version increases (1.x → 2.x) signify breaking changes.
src/LumexUI/Styles/Accordion.cs (1)
54-55
:✅ Verification successful
Tailwind CSS v4 class update: outline-hidden instead of outline-none
The change from
outline-none
tooutline-hidden
aligns with Tailwind CSS v4's updated class naming. The addition ofcursor-pointer
is a good UX improvement to visually indicate the accordion trigger's interactivity.
🌐 Web query:
Does Tailwind CSS v4 change outline-none to outline-hidden?
💡 Result:
Tailwind CSS v4.0 introduces significant changes to outline utilities, renaming
outline-none
tooutline-hidden
to better reflect their accessibility implications[1][4][6]. Here's what developers need to know:Key Changes:
outline-none
→outline-hidden
:
In v4,outline-hidden
replaces v3'soutline-none
behavior, maintaining a transparent 2px outline for Windows high contrast mode accessibility[1][4][6]. The newoutline-none
utility now completely removes outlines viaoutline-style: none
[4][6].Migration Requirements:
- Replace all instances of
outline-none
withoutline-hidden
to preserve v3's accessibility behavior[1][2][4]- Use the new
outline-none
only when intentionally removing all outline styling[4][6]Accessibility Considerations:
<!-- Before (v3) --> <input class="focus:outline-none"> <!-- After (v4) --> <input class="focus:outline-hidden focus:ring focus:ring-blue-500">The change ensures transparent outlines remain visible in forced colors modes while requiring explicit focus styling[6][7]. Developers must add custom focus indicators when using
outline-hidden
for accessibility compliance[3][6].Configuration Changes:
- Outline utilities now use CSS variables for theme customization[1]
- Variant handling has changed - hover styles only apply on hover-capable devices[1][4]
- Arbitrary value syntax updated from
[]
to()
[1]This change is part of Tailwind's broader shift toward explicit accessibility patterns and CSS variable-driven theming in v4[1][4]. Developers should audit all outline-related utilities during migration to ensure proper focus states[2][7].
Citations:
- 1: https://blog.logrocket.com/getting-ready-tailwind-v4/
- 2: https://forum.devtalk.com/t/agile-web-development-with-rails-8-tailwind-4-minor-breaking-changes-whole-book-beta-3/186378
- 3: https://night-tailwindcss.vercel.app/docs/outline
- 4: https://tailwindcss.com/docs/upgrade-guide
- 5: https://v3.tailwindcss.com/docs/outline-style
- 6: https://tailwindcss.com/docs/outline-style
- 7:
outline-hidden
only applies transparent outline whenforced-colors
is active? tailwindlabs/tailwindcss#16926- 8: https://tailwindcss.com/docs/outline-width
- 9: https://tailwindcss.com/docs/visibility
Action Required: Confirm Tailwind v4 Class Update in Accordion Styles
The update is verified. Tailwind CSS v4 indeed replaces
outline-none
withoutline-hidden
to maintain accessibility behavior, and the addition ofcursor-pointer
is a welcome UX enhancement. The code snippet at src/LumexUI/Styles/Accordion.cs (lines 54–55) correctly reflects these changes. No further modifications are needed.docs/LumexUI.Docs.Client/Samples/Installation/installationServices.html (1)
3-4
: Good addition to installation documentationThe addition of
AddLumexServices()
to the service collection is valuable documentation that shows users how to properly integrate LumexUI services in their applications.src/LumexUI/Styles/Popover.cs (1)
58-58
:❓ Verification inconclusive
Updated border radius class to use Tailwind CSS v4 sizing
The change from
rounded-sm
torounded-xs
adjusts the border radius of the arrow component to match Tailwind CSS v4's updated size scale. This change maintains visual consistency with the new design system.
🌐 Web query:
How have border radius classes changed in Tailwind CSS v4 compared to v3?
💡 Result:
Tailwind CSS v4 introduced significant changes to border radius utilities compared to v3, focusing on logical properties and improved internationalization support. Here's a breakdown of the key differences:
Core Border Radius Changes
- Logical properties now replace physical directional classes ([7][6]):
rounded-l-*
becomesrounded-s-*
(start instead of left)rounded-r-*
becomesrounded-e-*
(end instead of right)- New corner-specific logical utilities like
rounded-ss-*
(start-start) androunded-ee-*
(end-end)Comparison Table:
v3 Physical Class v4 Logical Class Direction Adaptation rounded-tl-*
rounded-ss-*
Adjusts for RTL/LTR rounded-br-*
rounded-ee-*
Adjusts for RTL/LTR Default Behavior Preservation
- Core size utilities (
rounded-sm
,rounded-md
,rounded-lg
) remain unchanged[1][9]- The
rounded-full
utility still uses9999px
for perfect circles[1]- Arbitrary value syntax (
rounded-[25px]
) works identically in both versions[3][5]Migration Considerations
- Update directional classes:
<!-- v3 --> <div class="rounded-tl-lg rounded-br-md"> <!-- v4 --> <div class="rounded-ss-lg rounded-ee-md">
Logical properties automatically adapt to:
- Left-to-right (LTR) text
- Right-to-left (RTL) text
- Vertical writing modes[7]
New responsive variants:
<div class="md:rounded-se-xl lg:rounded-ee-2xl">While the core border radius sizing remains compatible, projects using directional utilities should update to logical properties for better internationalization support. The changes reflect Tailwind's shift toward CSS logical properties while maintaining backward compatibility through automatic physical-to-logical conversion[6][7].
Citations:
- 1: https://v1.tailwindcss.com/docs/border-radius
- 2: https://blog.logrocket.com/getting-ready-tailwind-v4/
- 3: https://kombai.com/tailwind/border-radius/
- 4: https://daily.dev/blog/tailwind-css-40-everything-you-need-to-know-in-one-place
- 5: https://tailkits.com/blog/tailwind-css-border-radius-utilities-explained/
- 6: https://tailwindcss.com/docs/upgrade-guide
- 7: https://tailwindcss.com/docs/border-radius
- 8: https://v3.tailwindcss.com/docs/upgrade-guide
- 9: https://v3.tailwindcss.com/docs/border-radius
- 10: https://www.youtube.com/watch?v=ud913ekwAOQ
Border Radius Update for Arrow Component
- The arrow component’s border radius has been changed from
rounded-sm
torounded-xs
insrc/LumexUI/Styles/Popover.cs
(line 58).- Although Tailwind CSS v4 retains its core sizing utilities (where classes like
rounded-sm
remain unchanged from v3), the adoption ofrounded-xs
here appears to be a custom adjustment aligned with our design system update.- Please verify that this change is intentional and that the custom
rounded-xs
class correctly reflects our desired visual refinement.src/LumexUI/Styles/Menu.cs (1)
44-44
: Tailwind CSS v4 outline class update for consistencyThe replacement of
outline-none
withoutline-hidden
maintains consistency with the Tailwind CSS v4 update. This change has been applied throughout the codebase to ensure uniform behavior of outline styles.src/LumexUI/Components/Navbar/LumexNavbarMenuToggle.razor (2)
8-8
: Data slot attribute updated to improve component structureThe change from
data-slot="toggle-icon"
todata-slot="toggle"
on the LumexComponent aligns with Tailwind CSS v4 slot naming conventions, providing a more logical component structure where the parent component is the toggle and the child span contains the toggle icon.
12-12
: Appropriate data-slot attribute added to toggle iconAdding
data-slot="toggle-icon"
to the span element complements the parent change and better represents the component hierarchy. This structure is more consistent with Tailwind CSS v4's approach to component composition.src/LumexUI/rollup.config.mjs (1)
12-12
:❓ Verification inconclusive
Confirm removal of Tailwind CSS v3 plugin is intentional
The removal of the plugin.js configuration bundle aligns with the migration to Tailwind CSS v4, as the previous plugin approach is likely no longer needed. Verify that all functionality previously provided by this plugin has been migrated to the new Tailwind CSS v4 configuration.
🏁 Script executed:
#!/bin/bash # Check if there's a new configuration file or approach for Tailwind CSS v4 echo "Searching for tailwind configuration files..." fd -e js -e mjs -e ts -e json "tailwind" --exec grep -l "v4" {} \; # Check if there are any references to the removed plugin echo "Checking for any remaining references to the removed plugin..." rg -l "Scripts/Plugin/plugin" --type-not=gitLength of output: 376
Action Required: Re-run verification with updated scripts
It appears that the original commands produced an error due to the use of the
--type-not=git
flag. To proceed safely, please run the following revised shell script that excludes the.git
directory using a glob pattern. This will help us verify both that the Tailwind CSS v4 configuration (if any) is present and that there are no lingering references to the removed Tailwind CSS v3 plugin.#!/bin/bash # Searching for Tailwind CSS v4 configuration references in configuration files echo "Searching for Tailwind CSS v4 references in configuration files..." fd -e js -e mjs -e ts -e json "tailwind.config" --exec grep -Hn "v4" {} \; # Searching for any references to the removed plugin while excluding the .git directory echo "Searching for any remaining references to the removed Tailwind CSS plugin..." rg -l "Scripts/Plugin/plugin" --glob '!.git/*'Once you run these commands, please verify whether:
- Any Tailwind CSS v4 configuration files contain the expected changes.
- No references to the removed plugin remain in the codebase.
This manual verification is necessary before confirming that the migration from Tailwind CSS v3 to v4 was comprehensively completed.
.github/workflows/build-test.yml (4)
6-6
: Branch target updated from 'main' to 'dev'The change from 'main' to 'dev' for pull requests indicates a shift in the branching strategy. This change is consistent with similar changes in the deploy.yml file, establishing 'dev' as the primary development branch.
8-10
: Quote format standardized for path specificationsThe change from single quotes to double quotes for path patterns improves consistency in the YAML configuration. This is a good practice for maintaining uniform formatting in GitHub Actions workflows.
15-15
: Whitespace adjustments improve readabilityThese whitespace changes provide better visual separation between workflow steps and configuration blocks, enhancing the readability of the workflow file.
Also applies to: 19-19, 23-24, 26-26
38-38
: Environment variable configuration improvedMoving the CODECOV_TOKEN to a properly defined environment block is a better practice for GitHub Actions workflows, making the configuration more explicit and maintainable.
.github/workflows/deploy.yml (2)
9-9
: Deployment source branch changed from 'main' to 'dev'This change aligns with the updates in build-test.yml, establishing 'dev' as the primary development and deployment branch. This is consistent with the broader branching strategy changes in this PR.
44-44
:❓ Verification inconclusive
Deployment environment changed from 'Production' to 'staging'
Changing both the environment name and slot-name from 'Production' to 'staging' establishes a proper staging environment for deployments from the 'dev' branch. This creates a more structured deployment pipeline with separate environments for testing and production.
Also applies to: 67-67
🏁 Script executed:
#!/bin/bash # Check for any other files that might reference the production environment echo "Checking for production environment references that might need updating..." rg -i "production.*environment" --type=yamlLength of output: 353
Action Required: Verify YAML References to "Production Environment"
The updated deployment configuration correctly changes the environment and slot from "Production" to "staging" in
.github/workflows/deploy.yml
(lines 44 and 67). However, our initial automated search for references usingrg -i "production.*environment" --type=yaml
did not search any files, likely because the file type filter did not include.yml
files.To ensure that there are no lingering references to "Production environment" in YAML files, please run the following command manually:
#!/bin/bash echo "Searching for production environment references in YAML files (including .yml extensions)..." rg -i "production.*environment" --type-add "yaml:*.yml" --type=yaml .Once confirmed that no such references exist, we can finalize the change.
src/LumexUI/Styles/Tabs.cs (1)
141-141
: Shadow property updated for Tailwind CSS v4 compatibility.The shadow property has been updated from
shadow-sm
toshadow-xs
for the outlined variant of tabs. This change aligns with Tailwind CSS v4's shadow utility classes.docs/LumexUI.Docs/Components/App.razor (2)
8-9
: Updated stylesheet reference for Tailwind CSS v4.The stylesheet reference has been updated from
docs.css
todocs-tw4.css
, which appears to be specifically designed for Tailwind CSS v4 compatibility.
16-16
: Simplified app container layout.The flex layout classes have been removed from the app container. This simplification is likely part of the migration to Tailwind CSS v4 where these layout concerns might be handled differently.
src/LumexUI/Styles/Switch.cs (3)
70-70
: Transition utility updated for Tailwind CSS v4 compatibility.The transition property has been updated from the arbitrary value notation
transition-[transform,opacity]
to the predefined utilitytransition-transform-opacity
which is compliant with Tailwind CSS v4's approach to transitions.
82-82
: Transition utility updated for Tailwind CSS v4 compatibility.Similar to the previous transition update, this change adopts the new Tailwind CSS v4 transition utility format.
22-22
:✅ Verification successful
Outline utility updated for Tailwind CSS v4 compatibility.
The outline utility has been updated from
outline-none
tooutline-hidden
to match Tailwind CSS v4's naming conventions.
🌐 Web query:
Does Tailwind CSS v4 change outline-none to outline-hidden?
💡 Result:
Yes, Tailwind CSS v4 renames the
outline-none
utility tooutline-hidden
to improve accessibility and clarity. Here's what changed:Key Changes in Tailwind v4
outline-none
now removes outlines completely
Setsoutline-style: none
, eliminating the outline in all modes, including forced-colors (Windows High Contrast)[5][8].
outline-hidden
replaces v3'soutline-none
behavior
Applies a transparent 2px outline with a 2px offset, ensuring focus visibility in forced-colors mode for accessibility[5][8].Why This Matters
- Accessibility compliance:
outline-hidden
preserves focus indicators for users relying on forced-colors, whileoutline-none
removes them entirely[8].- Upgrade impact: Projects migrating from v3 must replace
outline-none
withoutline-hidden
to retain the previous transparent outline behavior[3][5]. For example:<!-- v3 --> <input class="focus:outline-none"> <!-- v4 --> <input class="focus:outline-hidden">Configuration and Customization
- Custom outlines: Define new outline styles in
tailwind.config.js
using theoutline
theme extension[1][5]:// tailwind.config.js module.exports = { theme: { extend: { outline: { blue: ["2px solid #0000ff", "1px"], // [outline, offset] }, }, }, };- Disabling outlines: Set
outline: false
incorePlugins
to remove all outline utilities[1].Migration Tips
- Use Tailwind’s upgrade tool to automate replacing
outline-none
withoutline-hidden
[5].- Always pair
outline-hidden
with custom focus styles (e.g.,focus:ring
) for accessibility[8].This change aligns Tailwind with modern CSS standards while maintaining backward-compatible upgrade paths.
Citations:
- 1: https://night-tailwindcss.vercel.app/docs/outline
- 2: https://forum.devtalk.com/t/agile-web-development-with-rails-8-tailwind-4-minor-breaking-changes-whole-book-beta-3/186378
- 3: https://blog.logrocket.com/getting-ready-tailwind-v4/
- 4: [v4] :focus-visible no longer overrides default outline for some reason tailwindlabs/tailwindcss#15152
- 5: https://tailwindcss.com/docs/upgrade-guide
- 6: https://v3.tailwindcss.com/docs/outline-style
- 7:
outline-hidden
only applies transparent outline whenforced-colors
is active? tailwindlabs/tailwindcss#16926- 8: https://tailwindcss.com/docs/outline-style
- 9: https://tailwindcss.com/docs/outline-width
- 10: https://tailwindcss.com/docs/visibility
Update Confirmed: Tailwind CSS v4 Naming Convention
The use ofoutline-hidden
on line 22 insrc/LumexUI/Styles/Switch.cs
has been verified against the Tailwind CSS v4 documentation. Tailwind now replacesoutline-none
withoutline-hidden
to ensure focus visibility and enhance accessibility. No further changes are needed.docs/LumexUI.Docs.Client/Pages/Getting Started/Overview.razor (1)
20-20
:✅ Verification successful
UI library reference updated from NextUI to HeroUI.
The documentation has been updated to reference HeroUI (https://heroui.org/) instead of NextUI as the inspiration for LumexUI. This change maintains consistency across the project documentation.
Also applies to: 23-23, 26-26
🌐 Web query:
Is HeroUI the successor or replacement for NextUI?
💡 Result:
HeroUI is the official rebranded successor to NextUI, maintaining all its core features while expanding its scope beyond the Next.js ecosystem. The transition was announced in January 2025 to reflect broader framework support and independence from the Next.js branding[1][2].
Key details about the transition:
Name Change Rationale
- Originally focused on Next.js integration, the library now supports Astro, Remix, Vite, Laravel, and React Native[1][2]
- Avoided confusion about being an official Next.js project[1]
- Prepares for future expansion into mobile development with React Native[1]
Technical Migration
npx @heroui/codemod@latest migrate
@nextui-org
packages deprecated in favor of@heroui
[1][2]- CLI tool renamed from
nextui-cli
toheroui-cli
[1]- No breaking changes introduced during migration[2]
New Features Roadmap
Planned 2025 updates include:
- Toast, Carousel, and Number Input components[1]
- Tailwind CSS v4 support[1][2]
- React 19 compatibility[1]
- Reduced bundle size in v3 update[1][2]
The rebranding preserves NextUI's signature features like Tailwind CSS integration and accessibility standards while positioning the library for cross-platform React development[3][6]. Existing users are encouraged to migrate using the provided CLI tool, with dedicated Discord support available for assistance[1][2].
Citations:
- 1: https://www.heroui.com/blog/introducing-heroui
- 2: https://app.daily.dev/posts/introducing-heroui-nextui-is-now-heroui---why-the-change-as-our-mission-expanded-beyond--pdbahndas
- 3: https://www.subframe.com/tips/nextui-vs-shadcn
- 4: NextUI - Next move (v2) heroui-inc/heroui#1035
- 5: https://www.youtube.com/watch?v=4f-tAcsSv54
- 6: [Feature Request] A Drawer Component for NextUI heroui-inc/heroui#984
- 7: https://www.figma.com/community/file/1267584376234254760/heroui-figma-kit-community
Update Verified: HeroUI Reference Confirmed
The documentation correctly reflects the rebranding from NextUI to HeroUI. The link to https://heroui.org/ is accurate, and the update applies consistently across the documented lines (20, 23, 26).
docs/LumexUI.Docs.Client/Pages/Components/Dropdown/Examples/ColorsVariants.razor (1)
31-39
:❓ Verification inconclusive
The Label attribute has been removed from LumexRadioGroup - verify accessibility impact.
Removing the "Label" attribute from the LumexRadioGroup may impact accessibility, as screen readers and other assistive technologies depend on proper labeling to provide context to users. While the component still functions, users may not understand the purpose of this radio group.
🏁 Script executed:
#!/bin/bash # Check if other instances of LumexRadioGroup use Label for accessibility echo "Checking for LumexRadioGroup Label usage patterns across the codebase:" rg -A 2 -B 2 "LumexRadioGroup" --type razor | grep -i "label" # Check if there are aria attributes used instead echo "Checking for potential aria-label or aria-labelledby attributes:" rg -A 2 -B 2 "LumexRadioGroup" --type razor | grep -i "aria-label"Length of output: 474
Below is an updated shell script that explicitly searches for LumexRadioGroup occurrences and any nearby accessibility attributes (like "Label", "aria-label", or "aria-labelledby") in all *.razor files. This should help us verify whether the removal of the "Label" attribute might have an accessibility impact:
Please run the above script and share the output. This will help us manually verify whether the accessibility labeling is adequately covered (e.g., via ARIA attributes) or if the removal of the "Label" attribute could indeed affect users relying on assistive technologies.
Note: The previous command failed due to the unrecognized file type "razor". This new script uses
--glob "*.razor"
to correctly target Razor files.
🏁 Script executed:
#!/bin/bash echo "Searching for LumexRadioGroup usage in .razor files for 'Label', 'aria-label', or 'aria-labelledby' attributes:" rg --glob "*.razor" -A 2 -B 2 "LumexRadioGroup" | egrep -i "Label|aria-label|aria-labelledby"Length of output: 1906
Review Accessibility Labeling Impact in Dropdown Component
The removal of the "Label" attribute in this instance (docs/LumexUI.Docs.Client/Pages/Components/Dropdown/Examples/ColorsVariants.razor, lines 31-39) contrasts with other examples (e.g., Listbox and RadioGroup components) that continue to provide explicit labels. There’s no evidence in this file of an alternative accessibility mechanism (such as an aria-label or aria-labelledby) replacing the Label attribute. Please verify that an accessible labeling approach is implemented—either by reintroducing the Label or by ensuring appropriate ARIA attributes are added—to maintain proper accessibility support.
docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/Editing.razor (1)
1-3
: LGTM! Added layout and width properties improve the DataGrid appearance.The addition of
Layout="@Layout.Fixed"
andClasses="@(new() { Table = "w-full" })"
attributes to the LumexDataGrid component improves the table's appearance by:
- Ensuring a fixed layout for more predictable column widths
- Making the table use the full width of its container
These changes align with Tailwind CSS v4 styling patterns and best practices for table layouts.
src/LumexUI/LumexUI.targets (1)
1-20
: Well-structured MSBuild target for theme file distribution.This new MSBuild target file provides a clean mechanism for copying theme-related files to consuming projects. The implementation allows for customization via the
LumexUIDir
property while providing sensible defaults.A few aspects worth noting:
- The
SkipUnchangedFiles="true"
optimization is excellent for build performance- The configurable output path gives consumers flexibility
- The documentation comments are clear and helpful
This addition supports the Tailwind CSS v4 upgrade by ensuring theme files are properly distributed.
docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/_HeaderContent.razor (2)
17-17
: Modified popover trigger variant from Flat to Light.This change from
Variant.Flat
toVariant.Light
for the popover trigger adjusts the visual styling to align with Tailwind CSS v4 design patterns. The Light variant likely provides a more subtle appearance that matches the updated design system.
21-22
: Updated icon styling to use Tailwind classes instead of theme color properties.This change represents a shift in styling approach, moving from the component property
Color="@ThemeColor.Default"
to usingColor="@ThemeColor.None"
with an explicit Tailwind CSS classtext-default-500
. This approach:
- Provides more direct control over the icon's appearance
- Aligns with Tailwind CSS v4's color system
- Creates consistency with other updated components
This is a good pattern for the v4 upgrade as it leverages Tailwind's utility classes over component-specific theming.
docs/LumexUI.Docs/Styles/typography.css (6)
1-5
: Visual Studio CSS nesting compatibility notice is helpful.The comment about Visual Studio not supporting modern CSS nesting helps developers understand potential IDE limitations. The
.prose
class with a max-width ofnone
appears to be setting up a base for typography styling.
7-9
: Good accessibility practice with scroll margins.Setting scroll margins on headings improves user experience when navigating via anchor links, ensuring headings aren't hidden behind fixed elements.
11-13
: Consistent styling for all prose links.Setting a consistent semi-bold font weight for all links within prose content enhances readability and visual hierarchy.
15-26
: Well-designed link styling with interactive feedback.The link styling is comprehensive with text decoration, offset, color, and thickness. The hover effect with increased text-decoration-thickness provides good visual feedback without being too distracting.
34-37
: Clean code presentation by removing default pseudo-elements.Removing the default content before and after code elements with classes helps create a cleaner presentation for syntax-highlighted code blocks.
28-32
:❓ Verification inconclusive
Verify the syntax for the padding value.
The syntax
--spacing(5)
on line 30 appears to be a custom function or variable reference. This isn't standard CSS syntax and might require preprocessing.
🏁 Script executed:
#!/bin/bash # Search for any spacing function or variable definitions in CSS files rg -t css "spacing" -A 3 -B 3Length of output: 464
Attention: Confirm the intended behavior of the custom spacing syntax
The CSS declaration on line 30 uses
padding: --spacing(5);
, which isn’t standard CSS syntax. It appears to be using a custom function or variable-like notation that likely relies on preprocessing. Please verify that:
- A corresponding preprocessor or build tool is in place to transform this custom syntax.
- If this notation was intended as a shorthand for a CSS variable or a function, consider adding documentation or comments to clarify its usage.
- Otherwise, update the syntax to standard CSS (e.g., using
var(--spacing-5)
if appropriate).docs/LumexUI.Docs.Client/Pages/Customization/Colors.razor (1)
18-19
: Updated Tailwind documentation link.The link to Tailwind documentation has been updated to the more general colors page instead of the customization-specific page, which is appropriate for the Tailwind v4 upgrade.
docs/LumexUI.Docs.Client/Pages/Components/Select/Examples/CustomStyles.razor (2)
63-63
: Improved hover behavior with focus state condition.The modification to apply the hover background only when the component is not focused improves the user experience by avoiding conflicting visual states.
52-65
: Comprehensive select styling with layered effects.The select component styling uses modern CSS features like backdrop filters and opacity adjustments to create a sophisticated UI element with appropriate visual feedback states.
docs/LumexUI.Docs.Client/Components/ColorSwatches.razor (2)
17-18
:✅ Verification successful
Changed ring utility from
ring-1
toring
for Tailwind v4 compatibility.The change from
ring-1
toring
aligns with Tailwind CSS v4's updated ring utility. In Tailwind v4, the basering
class now applies a default ring width, making the-1
suffix redundant.
🌐 Web query:
Does Tailwind CSS v4 change how the ring utility works compared to v3?
💡 Result:
Yes, Tailwind CSS v4 introduces significant changes to the
ring
utility compared to v3. Here's what's different:1. Default Width Reduction
Thering
utility now defaults to 1px instead of 3px[1][4][5]. This change aligns ring styles more closely with border conventions while reservingoutline
utilities for focus states:<!-- v3 --> <div class="ring">3px blue ring</div> <!-- v4 equivalent --> <div class="ring-3 ring-blue-500">1px ring by default</div>2. Color Inheritance
Rings now usecurrentColor
instead of a fixed blue color[1][4][5], making them inherit the text color by default. This prevents unintended color mismatches when using custom color palettes.3. Migration Requirements
To maintain v3's visual appearance in v4:
- Add explicit width specification
- Include color classes where needed
<!-- Migration example --> <button class="ring ring-blue-500"> <!-- v3 --> <button class="ring-3 ring-blue-500"> <!-- v4 equivalent -->4. Design Philosophy Shift
The changes reflect Tailwind's updated approach:
- Rings → Alternative to borders
- Outlines → Dedicated to focus states[4]
- Reduced opinionation about default styling[5]
Developers using rings for focus indicators should consider switching to
outline
utilities instead[5]. The upgrade guide provides automated tools to help transition existing projects[6].Citations:
- 1: https://daily.dev/blog/tailwind-css-40-everything-you-need-to-know-in-one-place
- 2: [v4] Upgrading to tailwind v4 produces a larger css than v3. tailwindlabs/tailwindcss#15544
- 3: https://dev.to/kasenda/whats-new-and-migration-guide-tailwind-css-v40-3kag
- 4: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 5: https://tailwindcss.com/docs/upgrade-guide
- 6: https://tailwindcss.com/blog/tailwindcss-v4
- 7: https://blog.logrocket.com/getting-ready-tailwind-v4/
- 8: https://www.elightwalk.com/blog/tailwind-css-v4
- 9: https://www.youtube.com/watch?v=ud913ekwAOQ
- 10: https://tailkit.com/blog/everything-you-need-to-know-about-tailwind-css-v4
Tailwind CSS v4 Ring Utility Update Verified
The change to use the
ring
class (instead ofring-1
) is correct for Tailwind CSS v4. In v4 the default ring width is now 1px when usingring
, rendering the-1
suffix obsolete. If the thicker ring style from v3 is desired, an explicit width (e.g.,ring-3
) should be specified.
- File:
docs/LumexUI.Docs.Client/Components/ColorSwatches.razor
- Lines: 17-18
- Diff:
<div class="relative w-12 h-12 rounded-md ring ring-inset ring-foreground-950/10 sm:w-full" - style="background-color: @(color.Value + (isDivider ? "26" : default))"> + style="background-color: @(color.Value + (isDivider ? "26" : default))">
20-23
:❓ Verification inconclusive
Made key indicator always visible by removing
hidden
class.Removing the
hidden
class while keepingsm:block
means this element will now always be visible rather than conditionally shown on larger screens. Ensure this doesn't negatively impact the mobile layout.
🏁 Script executed:
#!/bin/bash # Find similar patterns in other components to see if this is a consistent pattern rg "absolute top-1 right-1.5.+hidden.+sm:block" --type razorLength of output: 92
Mobile Layout Impact & Consistency Check
The change indocs/LumexUI.Docs.Client/Components/ColorSwatches.razor
(lines 20–23) removes thehidden
class while retainingsm:block
, which forces the key indicator to be always visible. This adjustment might affect the mobile layout if the intent was to conditionally show the key only on larger screens. Although our initial search for similar patterns in other components was inconclusive due to a file type error, please verify manually (or re-run the updated script) to ensure no unintended layout changes occur elsewhere.
🏁 Script executed:
#!/bin/bash # Re-run search specifying razor file extension using glob pattern. # This will look for elements that combine "absolute top-1 right-1.5", "hidden", and "sm:block" in any .razor file. rg 'absolute top-1 right-1.5.*hidden.*sm:block' --glob '*.razor'Length of output: 188
Attention: Verify Mobile Layout Impact
The change indocs/LumexUI.Docs.Client/Components/ColorSwatches.razor
(lines 20–23) removes thehidden
class but retainssm:block
, meaning the key indicator will now always be visible, even on mobile devices. Our automated search for similar patterns yielded no reliable matches, so please manually verify that this adjustment doesn't adversely affect the mobile layout or overall UI consistency.
- Verify that the key indicator is displayed as intended on smaller screens.
- Ensure that the permanent visibility aligns with the design goals across the application.
docs/LumexUI.Docs.Client/Components/Layouts/InstallationLayout.razor (1)
28-30
: Documentation updated for Tailwind CSS v4 ✓The URLs and version numbers have been appropriately updated to reflect the migration from Tailwind CSS v3 to v4. The main Tailwind CSS URL now points to the general documentation site rather than the version-specific v3 subdomain, and the version number has been updated to 4.0.
I notice the AI summary mentions a removed callout warning about compatibility with Tailwind v4. This removal is appropriate since the PR implements full v4 support.
docs/LumexUI.Docs.Client/Pages/Getting Started/Installation.razor (3)
13-13
: Installation options expanded ✓Good addition to include the NuGet Package Manager as an alternative to the .NET CLI, providing users with flexibility in how they install the package.
21-24
: Enhanced Tailwind CSS installation guidance ✓The installation instructions have been improved with clearer guidance and the recommendation to use the Tailwind standalone CLI for users who don't need Node.js or npm. This is a thoughtful addition that simplifies the setup process for many users.
18-18
:✅ Verification successful
Installation config file reference updated
The reference has been changed from
tailwind.config.js
toapp.css
, which aligns with the Tailwind CSS v4 approach where more emphasis is placed on the CSS file rather than just the configuration.
🌐 Web query:
Does Tailwind CSS v4 emphasize app.css over tailwind.config.js?
💡 Result:
Tailwind CSS v4.0 shifts configuration to CSS-first principles, replacing much of the traditional JavaScript-based
tailwind.config.js
with CSS-based declarations in files likeapp.css
. This represents a fundamental architectural change aimed at better alignment with native CSS standards and simplifying workflows.Key changes emphasizing CSS over JS configuration
1. Elimination of
tailwind.config.js
Tailwind v4 replaces JavaScript configuration with CSS-native approaches:
- Theme variables are defined using
@theme
directives directly in CSS files[1][4]- Plugins are configured via CSS
@plugin
syntax instead of JavaScript exports[8][9]- Design tokens like colors/fonts use CSS variables rather than JS objects[2][4]
2. New CSS workflow
Developers now configure Tailwind through:@import "tailwindcss"; @theme { --color-primary: #1e40af; --font-display: "Inter", sans-serif; --breakpoint-3xl: 1920px; }This replaces equivalent JS configuration:
// Old tailwind.config.js module.exports = { theme: { extend: { colors: { primary: '#1e40af' }, fontFamily: { display: ['Inter'] } } } }3. Benefits of CSS-first approach
- Reduced context switching: Design tokens/utilities live alongside other styles[1]
- Native CSS variable support: Runtime theme changes without rebuilds[4]
- Simplified maintenance: Single source of truth for styles[3]
- Automatic dark mode: Uses CSS variables instead of JS-based class toggling[1]
4. Migration impact
While the JS configuration file still exists for advanced use cases, most projects can now:
- Delete
tailwind.config.js
entirely for basic setups[7][8]- Configure colors, breakpoints, fonts, and plugins via CSS variables[4][5]
- Use CSS layers (
@layer
) instead of JS-based plugin registration[6][9]The shift reflects Tailwind's evolution toward becoming a CSS-native framework while retaining its utility-first philosophy. Developers gain tighter integration with modern CSS features but lose some programmatic flexibility from JS-based configuration[2][3][4].
Citations:
- 1: https://bryananthonio.com/blog/configuring-tailwind-css-v4/
- 2: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 3: https://dev.to/falselight/tailwindcss-version-400-has-been-released-29pp
- 4: https://tailwindcss.com/blog/tailwindcss-v4
- 5: https://daily.dev/blog/tailwind-css-40-everything-you-need-to-know-in-one-place
- 6: https://primevue.org/tailwind/
- 7: https://www.youtube.com/watch?v=bupetqS1SMU
- 8: https://flowbite.com/blog/tailwind-v4/
- 9: https://www.youtube.com/watch?v=7IK9j9-H0vQ
- 10: https://tailwindcss.com/docs/configuration/
Verification Complete: Tailwind CSS v4 Update Confirmed
The change in the documentation is accurate. The update from referencing
tailwind.config.js
toapp.css
correctly reflects Tailwind CSS v4's CSS-first approach, where configuration now primarily relies on CSS-based declarations.
- The code snippet using
Code = new CodeBlock("app.css", "installationConfig")
is correct.- The documentation now accurately describes the shift in emphasis for Tailwind CSS v4.
src/LumexUI/Styles/Button.cs (3)
26-26
: Added cursor-pointer for better UX ✓Adding
cursor-pointer
to buttons is a good practice that improves user experience by providing visual feedback when hovering over clickable elements.
47-49
:❓ Verification inconclusive
Text size classes updated for Tailwind v4
The text size classes have been updated to align with Tailwind CSS v4's sizing scale:
- Small:
text-small
→text-tiny
- Medium:
text-medium
→text-small
- Large:
text-large
→text-medium
This appears to be a downscaling of text sizes across the board. Ensure this is intentional and consistent with the design system.
🏁 Script executed:
#!/bin/bash # Check if these text size classes are used consistently across the codebase # Look for other instances of text size classes echo "Checking text size class usage across the codebase:" rg --type-add 'cs:*.cs' --type cs "text-(tiny|small|medium|large)" -A 1 -B 1Length of output: 20326
Action Required: Verify Consistency of Tailwind CSS Text Size Updates
The button component update in src/LumexUI/Styles/Button.cs correctly implements the new Tailwind v4 mapping:
- Small: changed from
text-small
totext-tiny
- Medium: changed from
text-medium
totext-small
- Large: changed from
text-large
totext-medium
However, a search across the codebase shows mixed usage of these text size classes:
- Tabs.cs appears consistent with the updated mapping.
- Radio.cs, Checkbox.cs, and potentially other components still contain instances of the old mapping alongside the updates.
Please review whether this downscaling is an intentional change applied selectively to components like Button (and Tabs) or if a comprehensive update to the design system is needed across all UI components.
29-29
:❓ Verification inconclusive
Updated transition property order
The transition property has been updated from
transition-transform-colors-opacity
totransition-colors-transform-opacity
, which reflects changes in naming conventions in Tailwind CSS v4.
🌐 Web query:
Does Tailwind CSS v4 change transition class naming conventions?
💡 Result:
Tailwind CSS v4.0 introduces changes to transition class configuration but maintains backward compatibility for core transition utilities. Here's what developers need to know:
Transition Property Configuration Changes
Default transitions like
transition-colors
no longer expose CSS variables for their underlying properties in v4[1][6]. The oldtheme(transitionProperty.colors)
syntax still works for compatibility, buttheme(--transition-property-colors)
does not[1].Custom transitions should now be defined using CSS variables in the
@theme
directive:@theme { --transition-property-ring: box-shadow; --transition-property-ring-color: box-shadow, color, border-color; }This allows usage of
transition-ring
andtransition-ring-color
classes[1].Key Migration Considerations
CSS-First Approach:
- Configuration moves from JavaScript to CSS variables[5][6]
- Custom properties are defined in
@theme
blocks instead oftailwind.config.js
[3][6]Arbitrary Value Syntax:
<!-- Old v3 syntax --> <div class="transition-[theme(transitionProperty.colors)]"> <!-- New v4 syntax --> <div class="transition-[var(--transition-property-colors)]">Color Space Change:
- Transition properties using color values now leverage OKLCH color space by default for more vibrant results[3][7]
Recommended Practices
- Create custom transition property sets in
@theme
for frequently used combinations[1]- Use the new
@utility
directive instead of@layer
for custom transition utilities[4][7]- Update arbitrary values syntax from square brackets
[]
to parentheses()
[4]While core transition class names like
transition-colors
remain unchanged, developers extending Tailwind's defaults will need to adapt to the CSS variable-based configuration system. The changes promote better CSS standards compliance while maintaining backward compatibility for existing projects[1][5][6].Citations:
- 1: [v4] transition-property Theme CSS Variables tailwindlabs/tailwindcss#16639
- 2: https://tillitsdone.com/blogs/tailwindcss-naming-conventions/
- 3: https://blog.logrocket.com/getting-ready-tailwind-v4/
- 4: https://www.youtube.com/watch?v=7IK9j9-H0vQ
- 5: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 6: https://tailwindcss.com/blog/tailwindcss-v4
- 7: https://daily.dev/blog/tailwind-css-40-everything-you-need-to-know-in-one-place
Action Required: Confirm Transition Class Order Update
The web query confirms that Tailwind CSS v4 reworks transition configuration (now favoring CSS variables for custom transitions) while leaving core class names like
transition-colors
unchanged. This indicates no explicit renaming of core transition order was mandated by Tailwind v4. However, if our internal codebase previously usedtransition-transform-colors-opacity
and the update now employstransition-colors-transform-opacity
, then this change likely reflects an internal alignment with our updated configuration.Please verify that the new order is consistent with our intended Tailwind configuration and that it does not inadvertently affect any custom utilities. If confirmed, no further action is required.
- File:
src/LumexUI/Styles/Button.cs
(Line 29)- Change: Updated from
"transition-transform-colors-opacity"
to"transition-colors-transform-opacity"
tests/LumexUI.Tests/Components/Providers/ThemeProviderTests.cs (1)
7-7
:❓ Verification inconclusive
Added System.Threading import
The
System.Threading
namespace has been added but doesn't appear to be used in the modified code. Is this intended for future use?
🏁 Script executed:
#!/bin/bash # Check if Threading is used elsewhere in this file or related files # Look for Thread usage in this file echo "Checking Thread usage in ThemeProviderTests.cs:" rg "Thread|Async|Task|CancellationToken" tests/LumexUI.Tests/Components/Providers/ThemeProviderTests.csLength of output: 234
Unused Import in ThemeProviderTests.cs
It appears that the only occurrence of the
System.Threading
namespace intests/LumexUI.Tests/Components/Providers/ThemeProviderTests.cs
is the import statement itself, with no actual usage of threading-related constructs (likeThread
,Task
, orCancellationToken
). Please confirm if this import is meant for future functionality. If not, consider removing it or adding an inline comment explaining its intended future use.src/LumexUI/Styles/Checkbox.cs (5)
23-23
: CSS class update for focus outline handlingThe change from
"outline-none"
to"outline-hidden"
aligns with Tailwind CSS v4 updates. This is a systematic change across components to standardize focus outline handling in the new version.
51-51
: Updated transition syntax for multiple propertiesThe syntax change from
"after:transition-transform-opacity"
to"after:transition[transform,opacity]"
reflects Tailwind CSS v4's updated approach to handling transitions for multiple properties. This syntax is clearer and more explicit about which properties are being transitioned.
82-84
: Updated border radius implementation using CSS variablesChanged from theme function calls to CSS variables for better maintainability and alignment with modern CSS practices. This change is part of the migration to Tailwind CSS v4.
88-90
: Updated border radius implementation using CSS variablesConsistent with the above changes, medium radius values now use CSS variables instead of theme function calls.
94-96
: Updated border radius implementation using CSS variablesConsistent with the above changes, large radius values now use CSS variables instead of theme function calls.
docs/LumexUI.Docs.Client/Samples/Installation/installationConfig.html (2)
1-2
: Modernized configuration approach using CSS importsThe configuration has been completely transformed from a JavaScript-based setup to a CSS import approach, which aligns with Tailwind CSS v4 practices. This change simplifies the setup by directly importing Tailwind CSS and the Lumex UI theme file.
4-4
: Added component styles import using @source directiveThe new
@source
directive is used to include component styles from the specified path. This is part of the Tailwind CSS v4 approach to organize and import component styles.docs/LumexUI.Docs.Client/Pages/Components/Listbox/Examples/ColorsVariants.razor (1)
13-22
: Improved color selection with LumexRadioGroupReplaced fieldset/InputRadioGroup with the more modern LumexRadioGroup component, which provides better structure and styling. The use of array slicing
[1..]
to skip the first enum value is a nice touch to exclude the Default color from selectable options.src/LumexUI/Styles/Utils.cs (3)
11-17
: Updated focus outline handling for accessibilityChanged
"outline-none"
to"outline-hidden"
in the FocusVisible utility class. This is part of a systematic update across the codebase to align with Tailwind CSS v4's handling of focus outlines while maintaining accessibility standards.
19-26
: Updated group focus outline handling for consistencyChanged
"outline-none"
to"outline-hidden"
in the GroupFocusVisible utility class, keeping consistent with the changes to the individual focus styles above.
32-39
: Maintained consistency in commented codeEven though this code is commented out, the change from
"outline-none"
to"outline-hidden"
has been applied here as well, maintaining consistency throughout the codebase. This shows good attention to detail and ensures the code will be consistent if it's uncommented in the future.docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/MultipleSelection.razor (1)
10-18
: Great refactoring of the radio group implementation!The switch from manual radio buttons to the
LumexRadioGroup
component provides a cleaner, more maintainable approach with fewer lines of code. The direct binding with@bind-Value
eliminates the need for the previously requiredOnColorSelect
method.I especially like the concise way you've implemented color selection with:
- Dynamic enumeration using
Enum.GetValues<ThemeColor>()[1..]
- Passing the same color value to both the
Value
andColor
properties onLumexRadio
This creates a self-demonstrating UI where each radio button visually represents its corresponding theme color.
docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/Shadows.razor (1)
7-15
: Clean refactoring of the shadow selection UI componentThe replacement of manual radio buttons with the
LumexRadioGroup
component simplifies the code and improves maintainability. The direct binding with@bind-Value="@_shadow"
eliminates the need for manual event handling.Using
Enum.GetValues<Shadow>()
to dynamically generate the options ensures the UI stays in sync with any enum changes..github/workflows/deploy-dev.yml (2)
4-12
: Well-structured workflow configuration for staging deploymentThe workflow name and trigger configuration are clearly defined. Triggering on both push to the
dev
branch (specifically fordocs/**
changes) and manual dispatch provides good flexibility.
40-48
: Proper environment and permissions configurationGood job setting up the staging environment with appropriate permissions. The
id-token: write
permission is correctly specified for the JWT token required by Azure authentication.docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/_Radius.razor (1)
7-15
: Consistent refactoring to LumexRadioGroup across component examplesThe refactoring matches the pattern used in other components, providing a consistent approach throughout the codebase. The direct binding to
_radius
and dynamic generation of options from the enum values makes the code more maintainable.src/LumexUI/LumexUI.csproj (1)
53-53
:❓ Verification inconclusive
Updated to TailwindMerge.NET v1.0.0.
This version upgrade is necessary to ensure compatibility with Tailwind CSS v4 class names and structures.
🏁 Script executed:
#!/bin/bash # Check TailwindMerge.NET release notes or changelog to verify compatibility with Tailwind CSS v4 curl -s https://api.github.com/repos/Cysharp/TailwindMerge.NET/releases | jq -r '.[0] | {tag_name, name, body}'Length of output: 171
TailwindMerge.NET v1.0.0 Upgrade – Manual Changelog Verification Required
The package reference in
src/LumexUI/LumexUI.csproj
now uses TailwindMerge.NET v1.0.0 to support Tailwind CSS v4 class names and structures. However, our automated attempt to fetch the release notes (via the GitHub API) encountered an error and returned no confirmation details. Please manually verify that this version indeed includes the necessary updates for Tailwind CSS v4 compatibility.docs/LumexUI.Docs.Client/Components/ComponentLinks.razor (1)
9-9
: Added text-small class to buttons for consistent typography.The addition of the
text-small
class to all buttons ensures consistent typography sizing in line with Tailwind CSS v4 recommendations.Also applies to: 20-20, 30-30
docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsCommonScale.html (1)
6-16
:✅ Verification successful
Updated blue color scale to use OKLCH format.
This is a necessary change for Tailwind CSS v4 compatibility, which uses OKLCH format as the default color space for better perceptual uniformity and improved color accessibility.
🌐 Web query:
What are the benefits of OKLCH color format in Tailwind CSS v4?
💡 Result:
Tailwind CSS v4.0's adoption of OKLCH color format brings significant advantages for modern web development:
Enhanced Color Capabilities
P3 wide-gamut support enables 30% more perceptible colors compared to traditional RGB/HSL, allowing richer and more vibrant palettes while maintaining accessibility[1][5][10]. This aligns with modern display capabilities that exceed sRGB limitations.
Perceptual Uniformity
Unlike HSL where identical lightness values appear differently across hues, OKLCH ensures:
- Consistent perceived brightness (critical for accessibility contrast ratios)[2][6]
- Natural color transitions in gradients and animations[2][7]
- Predictable color manipulation through separated Lightness/Chroma/Hue controls[2][9]
Developer Efficiency
Tailwind's implementation allows:
/* Directly manipulate color components */ --color-primary: oklch(56.01% 0.1577 249.8); --color-primary-dark: oklch(from var(--color-primary) calc(l - 20%) c h);This enables dynamic theme adjustments without complex calculations[1][5][7].
Design System Benefits
- Simplified dark/light mode theming through lightness adjustments[2][5]
- Automatic WCAG contrast compliance via predictable lightness values[2][9]
- Future-proof color definitions compatible with emerging display technologies[7][10]
Workflow Improvements
- Human-readable syntax (
oklch(56% 0.16 250
) vs cryptic hex codes[1][9]- Unified color language between designers and developers[5][7]
- Built-in support in Tailwind's revamped configuration system via CSS-native variables[7]
While OKLCH requires some learning curve, its adoption in Tailwind v4 eliminates previous sRGB limitations and provides tools for creating visually consistent, accessible interfaces in fewer development steps[3][7][10].
Citations:
- 1: https://uxdesign.cc/oklch-explained-for-designers-dc6af4433611
- 2: https://www.mediaweb.global/blog/front-end/oklch-versus-rgb-examining-benefits-and-limitations
- 3: https://dev.to/joodi/tailwind-css-v40-new-features-and-enhancements-102o
- 4: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 5: https://evilmartians.com/chronicles/better-dynamic-themes-in-tailwind-with-oklch-color-magic
- 6: https://atmos.style/blog/lch-vs-oklch
- 7: https://tailwindcss.com/blog/tailwindcss-v4
- 8: [v4] is it possible to have HEX values output for colors? tailwindlabs/tailwindcss#15119
- 9: https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl
- 10: https://www.smashingmagazine.com/2023/08/oklch-color-spaces-gamuts-css/
Blue Color Scale Update for Tailwind CSS v4 Compatibility
The blue color scale in this file has been updated to utilize the OKLCH format. This change leverages Tailwind CSS v4’s native support for OKLCH, which offers several advantages:
- Enhanced Color Capabilities: Supports P3 wide-gamut for a richer, more vibrant palette.
- Perceptual Uniformity: Provides consistent lightness, ensuring natural transitions in gradients and better WCAG compliance.
- Improved Developer & Design Workflow: Simplifies color component manipulation and theming adjustments.
Location:
docs/LumexUI.Docs.Client/Samples/Customization/Colors/colorsCommonScale.html
(Lines 6-16)The snippet below shows the final state with the updated OKLCH values:
["50"] = "oklch(0.97 0.014 254.604)", ["100"] = "oklch(0.932 0.032 255.585)", ["200"] = "oklch(0.882 0.059 254.128)", ["300"] = "oklch(0.809 0.105 251.813)", ["400"] = "oklch(0.707 0.165 254.624)", ["500"] = "oklch(0.623 0.214 259.815)", ["600"] = "oklch(0.546 0.245 262.881)", ["700"] = "oklch(0.488 0.243 264.376)", ["800"] = "oklch(0.424 0.199 265.638)", ["900"] = "oklch(0.379 0.146 265.522)", ["950"] = "oklch(0.282 0.091 267.935)"This update aligns with the documented benefits of OKLCH in Tailwind CSS v4 and improves both visual consistency and accessibility.
src/LumexUI/Styles/DataGrid.cs (1)
109-109
:✅ Verification successful
Updated transition class syntax.
The transition class has been updated from
transition-[transform,opacity]
totransition-transform-opacity
to align with Tailwind CSS v4's new arbitrary property syntax.
🌐 Web query:
How do transition classes work in Tailwind CSS v4 compared to v3?
💡 Result:
Tailwind CSS v4 introduced several key changes to transition classes compared to v3, optimizing for modern CSS features and addressing previous limitations. Here's a breakdown of the most significant differences:
Transition Property Coverage
- v4 Defaults: The base
transition
class now includes:
- 3D transform properties (
translate
,scale
,rotate
)- CSS gradient variables (
--tw-gradient-from
,--tw-gradient-via
,--tw-gradient-to
)outline-color
property [2][3]- v3 Behavior: Excluded
outline-color
and had more limited transform coverageOutline Color Handling
- New v4 Behavior: Transitions now affect
outline-color
by defaultRequires explicit outline color definition to avoid unwanted transitions[2][8]<!-- v4: Outline color transitions automatically --> <button class="transition hover:outline-cyan-500"></button> <!-- Recommended fix --> <button class="outline-cyan-500 transition hover:outline-2"></button>Gradient Transitions
- v4 Improvement: Gradient stops (
from-*
,via-*
,to-*
) now persist when overriddenExplicit<!-- v4 preserves original gradient stops --> <div class="bg-gradient-to-r from-red-500 to-yellow-400 dark:from-blue-500">via-none
needed to reset gradients[2]Configuration Changes
- CSS Variables: Transition timing/duration now uses CSS custom properties:
/* v4 uses CSS vars instead of JS config */ transition-timing-function: var(--default-transition-timing-function); transition-duration: var(--default-transition-duration);- Theme Access: Recommended to use CSS variables (
var(--color-red-500)
) instead oftheme()
function[2][9]New Utilities and Variants
- 3D Transforms: Added
rotate-x
,rotate-y
, andperspective
utilities[9]- Motion Variants: Enhanced
motion-safe
andmotion-reduce
variants for accessibility[3]- Container Queries: New
@min-*
and@max-*
variants for size-based transitions[9]Migration Considerations
- Run official upgrade tool:
npx @tailwindcss/upgrade@next- Audit outline transitions and explicitly set colors
- Replace
theme()
references with CSS variables where possible- Update gradient overrides to use
via-none
when needed[2][8]These changes make Tailwind CSS v4 transitions more consistent with modern CSS standards while providing better control over complex animations and accessibility requirements.
Citations:
- 1: https://prismic.io/blog/tailwind-animations
- 2: https://tailwindcss.com/docs/upgrade-guide
- 3: https://tailwindcss.com/docs/transition-property
- 4: https://v3.tailwindcss.com/docs/upgrade-guide
- 5: https://tailkits.com/blog/smooth-transitions-with-tailwind-css/
- 6: https://www.youtube.com/watch?v=ud913ekwAOQ
- 7: https://www.youtube.com/watch?v=7IK9j9-H0vQ
- 8: https://dev.to/kasenda/whats-new-and-migration-guide-tailwind-css-v40-3kag
- 9: https://tailwindcss.com/blog/tailwindcss-v4
- 10: https://tailwindcss.com/docs/animation
Updated transition class syntax for Tailwind CSS v4
The change from
transition-[transform,opacity]
totransition-transform-opacity
is correct and aligns with Tailwind CSS v4’s updated arbitrary property syntax. This update takes advantage of the refined transition handling introduced in v4.
- File:
src/LumexUI/Styles/DataGrid.cs
at line 109src/LumexUI/Theme/Colors/Colors.cs (6)
7-12
: Documentation update aligns with Tailwind CSS v4The documentation changes appropriately reflect the shift in focus from providing "predefined colors and color scales" to just "predefined color scales", and updating the reference link to the new Tailwind CSS v4 documentation structure.
18-23
: Color definition updates follow modern conventionsThe simplified hex notation (
#fff
instead of#FFFFFF
and#000
instead of#000000
) follows modern CSS best practices and improves readability.
95-107
: Note about Neutral color scale implementationThe Neutral color scale uses
oklch
format but with zero chroma values (0
) for all colors. This effectively creates a true grayscale without any color tint, which is a good practice for neutral colors.
136-149
: Consistency in color scale documentationAll color scale documentation has been consistently updated to use
<remarks>
tags instead of<para>
tags, improving documentation structure and maintainability.
73-86
:❓ Verification inconclusive
Verify color conversion accuracy
While the transition to oklch is appropriate, it's important to ensure that the converted colors visually match their hex counterparts. Consider adding a visual comparison test to verify the accuracy of the color conversions.
🏁 Script executed:
#!/bin/bash # Check if there are any test files verifying color conversion accuracy # Look for test files related to Colors.cs find . -type f -name "*ColorTest*" -o -name "*ColorConversion*" | grep -v "node_modules" | grep -v "bin" | grep -v "obj" # Look for specific test methods that might validate color conversion rg -i "test.*color.*conversion" --type=csLength of output: 160
Action: Include Visual Comparison Tests for Oklch Color Conversions
While the conversion to Oklch appears to be implemented correctly in
src/LumexUI/Theme/Colors/Colors.cs
(lines 73–86), our search did not uncover any tests securing visual accuracy. Please consider adding a dedicated visual comparison test to ensure the rendered Oklch values match their intended appearance relative to the original hex values. This test could verify the conversion both programmatically (by comparing computed values) and visually (via snapshot tests or CSS rendering checks).
- Verify that the rendered colors match expected results.
- If tests already exist elsewhere, ensure they explicitly cover the Oklch conversion accuracy.
31-44
:✅ Verification successful
Color format transition from hex to oklch
The transition from hexadecimal color values to oklch format is aligned with Tailwind CSS v4's emphasis on modern color spaces. The oklch format provides better perceptual uniformity and improved color manipulation capabilities.
🌐 Web query:
What are the benefits of using oklch color format in Tailwind CSS v4?
💡 Result:
Tailwind CSS v4's adoption of the OKLCH color format introduces several key benefits for modern web design and development:
Perceptual Uniformity for Consistent Design
- Natural color transitions: Adjusting lightness/chroma in OKLCH maintains consistent visual perception between colors, unlike HSL where identical lightness values can appear drastically different across hues[1][8].
- Reliable contrast ratios: Lightness values in OKLCH directly correlate with human vision, making WCAG compliance calculations more accurate[1][8].
Wider Color Gamut Support
- 30% more colors: OKLCH enables access to the P3 color space, offering richer, more vibrant hues than traditional sRGB[1][8].
- Future-proof designs: Native support for modern wide-gamut displays ensures colors render as intended on newer devices[9].
Simplified Color Manipulation
- Dynamic theme creation: Developers can programmatically adjust colors using CSS math functions:
/* Darken base color by 20% while preserving chroma/hue */ .darken { background: oklch(from var(--base-color) calc(l - 0.2) c h); }- Efficient token systems: Fewer base colors needed since variations can be generated algorithmically[1][5].
Development Advantages
- CSS-native configuration: Tailwind v4 allows direct OKLCH definition in CSS without JavaScript:
@theme { --color-primary: oklch(0.45 0.26 264); --color-secondary: oklch(0.72 0.19 310); }- Automatic P3 fallbacks: Built-in graceful degradation ensures color compatibility across browsers[9].
Design System Benefits
Feature OKLCH Advantage Traditional Limitation Color Scaling Linear perception of brightness Inconsistent HSL light transitions Accessibility Predictable contrast ratios Manual WCAG verification needed Team Handoff Unified color language for designers/devs Hex/HSL translation errors By adopting OKLCH, Tailwind v4 enables designers to create more vibrant, accessible interfaces while giving developers standardized tools for systematic color management[1][5][9]. This shift aligns with modern CSS capabilities and display technologies, future-proofing design systems against evolving web standards.
Citations:
- 1: https://uxdesign.cc/oklch-explained-for-designers-dc6af4433611
- 2: https://tailwindcss.com/docs/customizing-colors
- 3: https://dev.to/joodi/tailwind-css-v40-new-features-and-enhancements-102o
- 4: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 5: https://evilmartians.com/chronicles/better-dynamic-themes-in-tailwind-with-oklch-color-magic
- 6: https://tailscan.com/colors
- 7: https://daily.dev/blog/tailwind-css-40-everything-you-need-to-know-in-one-place
- 8: https://uploadcare.com/blog/oklch-in-css/
- 9: https://tailwindcss.com/blog/tailwindcss-v4
- 10: https://www.elightwalk.com/blog/tailwind-css-v4
OKLCH Integration Confirmed: Approved for Modern Color Handling
The updated color declarations in
src/LumexUI/Theme/Colors/Colors.cs
now use OKLCH values, which aligns with Tailwind CSS v4’s push towards modern, perceptually uniform color spaces. This transition offers:
- Natural color transitions: Ensuring that adjustments in lightness and chroma maintain consistent visual perception.
- Improved contrast accuracy: Facilitating WCAG compliance by providing more predictable contrast ratios.
- Expanded color gamut: Leveraging support for wide-gamut displays for richer, more vibrant hues.
- Simplified thematic adjustments: Enabling dynamic theme creation and efficient token systems.
Overall, these changes are well-justified by the benefits detailed in Tailwind CSS v4 documentation and related resources.
docs/LumexUI.Docs.Client/Pages/Components/DataGrid/Examples/SingleSelection.razor (1)
10-18
: Elegant refactoring of color selection UIThe refactoring of the color selection UI from manual radio buttons to using the
LumexRadioGroup
andLumexRadio
components significantly improves code clarity and maintainability. The direct binding to_color
and using Enum iteration are clean approaches.docs/LumexUI.Docs.Client/Pages/Customization/Theme.razor (3)
27-35
: HTML tag consistency improvementThe change from
<Code>
to<code>
maintains consistency in the usage of HTML tags throughout the documentation.
46-52
: Documentation link update for Tailwind CSS v4The link update from "customizing-colors" to "styling-with-utility-classes" reflects the changes in Tailwind CSS v4's documentation structure, ensuring users are directed to the most relevant and up-to-date resources.
79-81
:✅ Verification successful
Installation process update for Tailwind CSS v4
Updating the installation instructions to reference
app.css
instead oftailwind.config.js
aligns with Tailwind CSS v4's approach to configuration. This change is critical for users to correctly implement the library.
🌐 Web query:
How has Tailwind CSS configuration changed in version 4 compared to version 3?
💡 Result:
Tailwind CSS v4.0 introduces a fundamental shift in configuration compared to v3, moving from JavaScript to CSS-first customization. Here's a breakdown of the key changes:
Configuration Method
- v3: JavaScript-based
tailwind.config.js
file for theme customization, plugins, and content configuration.- v4: CSS-native configuration using
@theme
blocks and CSS variables:This replaces 90% of traditional JS configuration needs[1][4].@import "tailwindcss"; @theme { --font-display: "Satoshi", sans-serif; --color-primary: oklch(0.84 0.18 117.33); --breakpoint-3xl: 1920px; }Key Changes
Directives Replacement:
- Removed
@tailwind base/components/utilities
directives- New single import:
@import "tailwindcss";
[3][6]Theme Customization:
- Design tokens exposed as CSS variables (
--color-primary
instead of JS objects)- Color palette uses modern
oklch
color space for better gamut[1][8]Content Detection:
- Automatic template file discovery (no manual
content
array)[2][8]- Removes error-prone content path configuration
Utility Changes:
- Renamed utilities (e.g.,
flex-shrink
→shrink
,shadow-sm
→shadow-xs
)[3][7]- Deprecated text/bg opacity utilities in favor of slash syntax (
bg-black/50
)[3][7]Build Tools:
- Integrated Lightning CSS compiler (5x faster builds)[6]
- PostCSS/CLI moved to separate packages (
@tailwindcss/postcss
)[7]Migration Assistance
- Automated upgrade tool converts
tailwind.config.js
to CSS[2][10]- Compatibility variables for gradual migration:
@theme { --default-ring-color: var(--color-blue-500); /* v3 fallback */ }- New
@starting-style
variant for transitions[5]Configuration Comparison Table
Feature v3 Approach v4 Approach Configuration File tailwind.config.js
CSS @theme
blockColor System JavaScript objects CSS custom properties Content Tracking Manual content
arrayAutomatic detection Custom Utilities @layer utilities
@utility
API[3]Build Process PostCSS required Lightning CSS integrated The changes reduce JavaScript dependency while improving performance and alignment with modern CSS standards. Existing projects can migrate using the official upgrade tool, while new projects benefit from simpler setup with automatic content detection and CSS-native configuration[1][2][10].
Citations:
- 1: https://tailwindcss.com/blog/tailwindcss-v4
- 2: https://laravel-news.com/tailwind-css-v4-is-now-released
- 3: https://dev.to/kasenda/whats-new-and-migration-guide-tailwind-css-v40-3kag
- 4: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 5: https://dev.to/shayy/tailwind-css-40-is-here-what-you-need-to-know-484h
- 6: https://flowbite.com/blog/tailwind-v4/
- 7: https://daily.dev/blog/tailwind-css-40-everything-you-need-to-know-in-one-place
- 8: https://dev.to/joodi/tailwind-css-v40-new-features-and-enhancements-102o
- 9: https://dev.to/sirneij/tailwindcss-v40-upgrading-from-v3-with-some-plugins-572f
- 10: https://tailwindcss.com/docs/upgrade-guide
Tailwind CSS v4 Configuration Update Verified
The installation instructions now correctly direct users to update
app.css
instead oftailwind.config.js
, which is in line with Tailwind CSS v4's shift from JavaScript-based configuration to a CSS-first approach. The changes in the filedocs/LumexUI.Docs.Client/Pages/Customization/Theme.razor
at lines 79–81 are confirmed and accurate.src/LumexUI/Styles/Select.cs (6)
31-31
: Enhanced transition properties for smoother animationsThe expansion of transition properties to include
translate
andscale
improves the animation smoothness when the component state changes, creating a more polished user experience.
48-50
: Improved user interaction stylingThe changes from
shadow-sm
toshadow-xs
(subtler shadow),outline-none
tooutline-hidden
(updated Tailwind CSS v4 class), and addition ofcursor-pointer
collectively improve the usability and visual feedback of the select component.
59-59
: Updated CSS calculation syntax for Tailwind CSS v4The change from
theme(spacing.6)
to--spacing(6)
reflects Tailwind CSS v4's shift toward using CSS variables for theming, which improves performance and maintainability.
67-74
: Enhanced selector icon with improved transitionsThe selector icon adjustments (larger size, longer duration, different easing function) improve visibility and create a more refined animation effect when opening/closing the dropdown.
234-234
: Focus state handling improvementsThe addition of focus conditions to hover states (
group-data-[focus=false]:hover:bg-default-50
) prevents hover effects from interfering with focus states, enhancing user experience especially for keyboard navigation.
519-527
: Updated CSS calculation references for responsive layoutThe transition from theme-based calculations to CSS variables (
var(--text-small)
instead of theme values) aligns with Tailwind CSS v4's approach and creates more consistent, maintainable styling.src/LumexUI/Components/Providers/LumexThemeProvider.razor.cs (2)
55-57
: Ensure consistent naming for color scales.Currently, the scale key logic prepends the
color.Key
to the scale key except when it's"default"
. This seems correct for generating a hierarchical naming scheme (e.g.primary-300
). However, confirm your naming convention remains consistent across usage sites and doesn't break any existing references.
59-59
: Validate variable naming with the new color scale approach.Appending
--lumex-{scaleKey}: {scale.Value};
might conflict with any existing references expecting--lumex-{color}-{scale}
. Ensure that all references to these variables are updated or verified.src/LumexUI/Utilities/ColorUtils.cs (3)
7-7
: Confirm the new dependency onSystem.Text.RegularExpressions
.Make sure that referencing
Regex
is valid in all target frameworks (net9.0) and does not require additional dependencies or reflection-based filters if used in partial trust scenarios.
16-30
: Validate null-check and readability threshold.
- The null-check with
ArgumentNullException.ThrowIfNull
is a best practice.- The new threshold of 0.65 for determining “lighter vs darker” can significantly change the final color. Ensure this updated threshold aligns with your visual design goals.
47-56
: Verify parsing forGetOklchLuminance
.Regex-based parsing can fail silently if the format changes. Ensure you have tests covering edge cases (like missing parentheses or extra whitespace) to avoid
ArgumentException
.docs/LumexUI.Docs/LumexUI.Docs.csproj (2)
28-48
: Validate cross-platform commands inInstallTailwindCSS
.
curl -LO
andren
ormv
can behave differently on various OS shells.- Confirm that these commands function as expected in CI environments (e.g. GitHub Actions on Windows vs. Linux).
- You may want to handle errors if the download fails.
50-52
: Ensure Tailwind CSS compilation target is fully integrated.Running the
TailwindCSS
target afterInstallTailwindCSS
is logical. However, verify your broader build steps reference this target, so the finaldocs-tw4.css
is up to date and included in the release artifacts.src/LumexUI/Styles/InputField.cs (9)
39-39
: Enhanced transition properties for smoother animations.Added
translate
andscale
to the transition properties, which will make animations involving these transformations smoother when transitioning label states.
54-54
: Updated shadow size fromshadow-sm
toshadow-xs
.This change is in line with Tailwind CSS v4's refined shadow scale, providing a more subtle shadow effect for the input wrapper.
73-73
: Changed outline behavior fromoutline-none
tooutline-hidden
.This change follows Tailwind CSS v4's updated approach to outline handling. The new
outline-hidden
class maintains accessibility standards while providing better control over the visual presentation.
89-89
: Added cursor-pointer to clear button.This improves user experience by providing a clearer visual indication when hovering over the clear button.
194-195
: Improved hover state logic with focus-aware conditional styling.The hover behavior now depends on the focus state of the input, which creates a more consistent interactive experience. The group will only apply hover effects when the element is not focused.
204-206
: Enhanced focus and hover behavior for outlined variant.Applied the same focus-aware hover pattern to the outlined variant and added explicit transition for colors, creating a more coherent and fluid user experience across variants.
240-241
: Updated invalid state styling with focus-aware conditions.Applied the focus-aware pattern to invalid states, ensuring consistent behavior across different component states. The use of
!
for higher specificity ensures these styles take precedence.Also applies to: 245-246
266-266
: Consistent focus-aware hover patterns across color variants.Applied the same focus-aware hover pattern to all color variants, ensuring consistent behavior throughout the component's color options.
Also applies to: 276-276, 287-287, 298-298, 309-309, 319-319
426-426
: Replaced theme-based calculations with CSS variables.Transitioned from using
theme(fontSize.tiny)
tovar(--text-tiny)
for label positioning calculations, which provides more flexibility and better consistency with Tailwind CSS v4's variable approach.Also applies to: 432-432, 438-438, 450-450, 456-456, 463-463, 467-467
docs/LumexUI.Docs/Styles/globals.css (8)
1-6
: Modernized import structure for Tailwind CSS v4.The new import structure aligns with Tailwind CSS v4's approach to theming. The separation of concerns with distinct imports for theme, syntax highlighting, Blazor-specific styles, and typography enhances maintainability.
🧰 Tools
🪛 Biome (1.9.4)
[error] 1-1: expected
,
but instead found@
Remove @
(parse)
[error] 1-1: expected
,
but instead foundimport
Remove import
(parse)
[error] 1-1: Expected a compound selector but instead found '"tailwindcss"'.
Expected a compound selector here.
(parse)
[error] 1-1: expected
,
but instead foundtheme
Remove theme
(parse)
[error] 1-1: expected
,
but instead found(
Remove (
(parse)
[error] 1-1: expected
,
but instead foundstatic
Remove static
(parse)
[error] 1-1: expected
,
but instead found)
Remove )
(parse)
[error] 1-2: expected
,
but instead found;
Remove ;
(parse)
[error] 2-3: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
[error] 3-4: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
[error] 4-5: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
[error] 5-6: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
8-11
: Added source directives and typography plugin.This setup properly integrates Razor components and CS files as sources for the CSS processing pipeline, and adds the typography plugin for enhanced text styling capabilities in Tailwind CSS v4.
13-17
: Defined global font settings in the theme.The explicit theme definition with font variables provides better control over typography throughout the application. The font feature settings for Inter var are a nice touch for improved readability.
19-21
: Added custom variant definitions for scrollbar styling.These custom variants provide a cleaner way to style scrollbars across different browsers, which is a common challenge in CSS.
27-29
: Added light mode color scheme.This addition complements the existing dark mode, ensuring proper system integration for both light and dark themes.
31-39
: Refactored scrollbar styling with Tailwind utilities.The new approach to scrollbar styling makes better use of Tailwind's utility classes and the custom variants defined earlier, resulting in more maintainable and consistent scrollbar appearance.
41-49
: Moved bordered-link outside of utilities layer.This change provides better organization of the CSS structure, making it clearer that this is a component-level style rather than a utility.
1-49
:❓ Verification inconclusive
Verify Tailwind CSS v4 directives syntax.
The static analysis tools are flagging some potential issues with the syntax. You might want to verify that the
@import
,@source
,@plugin
,@theme
, and@custom-variant
directives are correctly formatted according to Tailwind CSS v4's documentation.
🌐 Web query:
What is the correct syntax for Tailwind CSS v4 directives like @import, @source, @plugin, and @theme?
💡 Result:
Tailwind CSS v4 introduces a CSS-first approach with new directives for configuration. Here are the key syntax patterns:
@import Directive
- Primary usage: Replace
@tailwind
directives with CSS-native imports@import "tailwindcss"; /* Base import */ [2][6]
- With JS config (for v3 compatibility):
@import "tailwindcss"; @config "../../tailwind.config.js"; /* Load existing JS config */ [1]
- Source control:
@import "tailwindcss" source("../src"); /* Limit file detection */ [1] @import "tailwindcss" source(none); /* Disable auto-detection */ [1]@source Directive
- Add additional sources:
@source "../node_modules/@company/ui-lib/src/components"; [1][3]
- Handles .gitignore: Automatically respects ignored paths [3]
@theme Directive
- CSS-based configuration:
@theme { --color-background-100: #764abc; --font-family-display: "Satoshi", sans-serif; --breakpoint-3xl: 1920px; } /* Generates matching utilities */ [1][2][5]
- Override defaults:
@theme { --color-*: initial; /* Clear default colors */ [5] }@plugin Directive (Compatibility)
- Limited support: Primarily for existing v3 plugins
@plugin "tailwindcss/plugins/line-clamp"; [4][9]
- New approach: Use CSS-native
@utility
instead of JS plugins [9]Key Changes from v3
Deprecated utilities replaced with modern alternatives:
bg-opacity-*
→bg-black/50
[6]flex-grow-*
→grow-*
[6]CSS Modules support:
@reference "../../app.css"; /* Share variables across files */ [6]
- Color syntax: Requires full color definitions instead of
H
shorthand [5]For migration, Tailwind provides an official upgrade tool that handles most syntax conversions automatically [6]. When using VS Code, ignore false errors on
@import
directives - they work correctly despite editor warnings [1].Citations:
- 1: https://blog.logrocket.com/getting-ready-tailwind-v4/
- 2: https://tailwindcss.com/blog/tailwindcss-v4-alpha
- 3: Tailwind v4 @source directive ignores subdirectories with .gitignore tailwindlabs/tailwindcss#15452
- 4: [v4] How to add plugins? tailwindlabs/tailwindcss#13292
- 5: https://epicweb-dev-tailwindcss-color-tokens.fly.dev/03/01
- 6: https://tailwindcss.com/docs/upgrade-guide
- 7: [v4] CSS Import and Nesting tailwindlabs/tailwindcss#15524
- 8: https://dev.to/plainsailing/getting-started-with-tailwind-v4-3cip
- 9: v4 third party plugins tailwindlabs/tailwindcss#15715
- 10: https://tailwindcss.com/docs/theme
Action Required: Confirm Tailwind CSS v4 Directive Syntax
- The
@import "tailwindcss" theme(static);
line is unexpected compared to the official examples (which typically use a plain@import "tailwindcss";
or include asource(...)
/@config
clause). Please verify whether the addedtheme(static)
parameter is supported in Tailwind CSS v4.- Double-check that the use of the
layer(components)
andlayer(utilities)
parameters on your custom import directives aligns with the v4 CSS-first approach.- Confirm that both the
@source
and@plugin
directives (as well as the custom@custom-variant
directives) are intended and compatible with your Tailwind CSS configuration—especially in light of known false-positive warnings from static analysis tools and editors.Please review these points against the official Tailwind CSS v4 documentation and your build process to ensure they work as expected.
🧰 Tools
🪛 Biome (1.9.4)
[error] 1-1: expected
,
but instead found@
Remove @
(parse)
[error] 1-1: expected
,
but instead foundimport
Remove import
(parse)
[error] 1-1: Expected a compound selector but instead found '"tailwindcss"'.
Expected a compound selector here.
(parse)
[error] 1-1: expected
,
but instead foundtheme
Remove theme
(parse)
[error] 1-1: expected
,
but instead found(
Remove (
(parse)
[error] 1-1: expected
,
but instead foundstatic
Remove static
(parse)
[error] 1-1: expected
,
but instead found)
Remove )
(parse)
[error] 1-2: expected
,
but instead found;
Remove ;
(parse)
[error] 2-3: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
[error] 3-4: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
[error] 4-5: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
[error] 5-6: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
[error] 6-7: This @import is in the wrong position.
Any @import rules must precede all other valid at-rules and style rules in a stylesheet (ignoring @charset and @layer), or else the @import rule is invalid.
Consider moving import position.(lint/correctness/noInvalidPositionAtImportRule)
src/LumexUI/Styles/_theme.css (5)
1-126
: Well-structured color variables with comprehensive coverage.The theme file provides an excellent organization of color variables, mapping from
--lumex-*
variables to--color-*
variables. This abstraction layer allows for easier theme customization without changing component styles.The comprehensive coverage of color variants (50 through 950) for each theme color (default, primary, secondary, success, warning, danger, info) provides excellent granularity for styling.
🧰 Tools
🪛 Biome (1.9.4)
[error] 2-2: Expected a compound selector but instead found '@'.
Expected a compound selector here.
(parse)
[error] 2-2: expected
,
but instead foundtheme
Remove theme
(parse)
127-152
: Comprehensive typography and design property mappings.The typography, border radius, and box shadow variables are well structured and provide a consistent design system foundation. The use of separate variables for font sizes and line heights offers flexibility in typography adjustments.
159-174
: Excellent documentation of transition workarounds.The detailed comments about Tailwind compiler issues and the carefully structured transition properties demonstrate a deep understanding of the framework's limitations and how to work around them. This will greatly help future maintainers.
176-189
: Well-designed enter animation.The keyframe animation for the enter effect is smooth and appropriate for modern UI interactions. The scaling from 0.85 to 1 combined with opacity change creates a subtle but effective entrance animation.
195-212
: Useful utility additions for opacity and scrollbar handling.The custom utilities for opacity based on theme values and scrollbar hiding across different browsers are valuable additions that will simplify styling throughout the application.
🧰 Tools
🪛 Biome (1.9.4)
[error] 200-200: Expected a component value, a binary expression, a parenthesized expression, or an any function expression but instead found ')'.
Expected a component value, a binary expression, a parenthesized expression, or an any function expression here.
(parse)
Description
Closes #171
This PR adds support for Tailwind CSS v4 and drops v3.
What's been done?
prose
)Checklist
Additional Notes
Summary by CodeRabbit
New Features
Style
Documentation
Refactor