Build CSS with Tailwind 4.3.3 standalone and daisyUI 5.7.47

tools/tailwind.sh downloads the pinned Tailwind binary and daisyUI's .mjs
plugins into the gitignored .tools/tailwind/, checking each against a pinned
sha256, so neither developers nor CI need Node. MSBuild compiles
Styles/app.css into wwwroot/css/app.css (also gitignored) on every build,
skipping the step when no source changed. The output is added to Content before
ResolveProjectStaticWebAssets, so a clean-clone publish still gets its .gz/.br
copies and a service-worker-assets.js entry.

index.html now loads css/app.css, plus ionicons as its own stylesheet. The old
bundle stays in the tree until the markup is migrated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-03 11:24:51 +02:00
1 parent b9dc865053
commit 3551da1b02
5 files changed
+141 -1

No files matched your search

+36
View File
@@ -26,6 +26,42 @@
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
</ItemGroup>
<!-- Tailwind CSS standalone + daisyUI (tools/tailwind.sh) compile Styles/app.css into wwwroot/css/app.css on every
build. The output is gitignored, so on a clean clone it doesn't exist when the wwwroot\** Content glob is
evaluated; IncludeTailwindOutput adds it before ResolveProjectStaticWebAssets, without which it would be
published without its .gz/.br copies and outside service-worker-assets.js. -->
<PropertyGroup>
<TailwindToolsDir>$(MSBuildProjectDirectory)/.tools/tailwind/</TailwindToolsDir>
<TailwindExe>$(TailwindToolsDir)tailwindcss</TailwindExe>
<TailwindMode Condition="'$(Configuration)' == 'Release'">--minify</TailwindMode>
<TailwindMode Condition="'$(TailwindMode)' == ''">--optimize</TailwindMode>
</PropertyGroup>
<ItemGroup>
<TailwindSource Include="Styles/**/*.css;**/*.razor;**/*.cs;wwwroot/index.html" Exclude="bin/**;obj/**;.tools/**" />
</ItemGroup>
<Target Name="EnsureTailwindTools" Condition="!Exists('$(TailwindExe)') Or !Exists('$(TailwindToolsDir)daisyui.mjs') Or !Exists('$(TailwindToolsDir)daisyui-theme.mjs')">
<Exec Command="bash tools/tailwind.sh fetch" WorkingDirectory="$(MSBuildProjectDirectory)" />
</Target>
<Target Name="TailwindCompile" DependsOnTargets="EnsureTailwindTools"
Condition="'$(DesignTimeBuild)' != 'true' And '$(NoBuild)' != 'true' And '$(SkipTailwind)' != 'true'"
Inputs="@(TailwindSource);$(TailwindExe);$(TailwindToolsDir)daisyui.mjs;$(TailwindToolsDir)daisyui-theme.mjs;$(MSBuildProjectFullPath)"
Outputs="wwwroot/css/app.css;$(IntermediateOutputPath)tailwind.stamp">
<Exec Command="&quot;$(TailwindExe)&quot; -i Styles/app.css -o wwwroot/css/app.css $(TailwindMode)" WorkingDirectory="$(MSBuildProjectDirectory)" />
<!-- The CLI leaves an unchanged output untouched, which would make this target rerun on every build. -->
<Touch Files="wwwroot/css/app.css;$(IntermediateOutputPath)tailwind.stamp" AlwaysCreate="true" />
</Target>
<Target Name="IncludeTailwindOutput" BeforeTargets="ResolveProjectStaticWebAssets" DependsOnTargets="TailwindCompile">
<!-- Spelled exactly like the SDK's wwwroot\** glob: publish de-duplicates by comparing OriginalItemSpec strings. -->
<ItemGroup>
<Content Remove="wwwroot\css\app.css" />
<Content Include="wwwroot\css\app.css" Condition="Exists('wwwroot\css\app.css')" />
</ItemGroup>
</Target>
<ItemGroup>
<Compile Update="Resources\ErrorMessages.Designer.cs">
<DesignTime>True</DesignTime>