One sign-in for both of PrivaPub's APIs: the root logs in on /clientapi, picks a persona, and each persona gets its own Mastodon token in exchange for the JWT (PersonaExchange). HttpService picks credentials and JSON by route (JWT and camelCase for /clientapi, the persona token and snake_case for /api, nothing for /oauth), retries a refused persona token once, and records every request for the nerd stats. The feed page is three columns: navigation with a persona switcher, the feed with a tab per kind (home, local, federated, nearby, communities and circles, direct, notifications, favourites, bookmarks, hashtags), and a 3D globe that looks at the spherical mean of the posts in view and draws a pulse and an arc to a hovered one. Posts sit at their own place, their event's venue, the reader (located posts) or their author's server as PrivaPub publishes it. Cards favourite, boost, bookmark, reply, mute, block and delete; the composer posts with a content warning, visibility, media and alt text, or as a located post. Older pages load as the end nears; newer ones are polled while visible. Nerd stats in tooltips: provenance, author and server, place, media, counts, paging, the globe's camera and frame rate. The mock (Faker, MessagesService, the Message models and store) and the OIDC template leftovers are gone. Strings in English and Italian. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
127 lines
6.5 KiB
XML
127 lines
6.5 KiB
XML
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
|
|
|
|
<PropertyGroup>
|
|
<TargetFramework>net10.0</TargetFramework>
|
|
<Nullable>disable</Nullable>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
|
|
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<PackageReference Include="BlazorZXingJs" Version="0.5.13" />
|
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.9" />
|
|
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="10.0.9" />
|
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.9" PrivateAssets="all" />
|
|
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.9" />
|
|
<PackageReference Include="BlazorDownloadFileFast" Version="1.0.0.1" />
|
|
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
|
|
<PackageReference Include="DnetIndexedDb" Version="2.4.1" />
|
|
<PackageReference Include="Markdig" Version="0.30.4" />
|
|
<PackageReference Include="Microsoft.Extensions.Localization" Version="10.0.9" />
|
|
<PackageReference Include="Toolbelt.Blazor.HeadElement" Version="7.3.1" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
|
|
</ItemGroup>
|
|
|
|
<!-- Tailwind CSS standalone + daisyUI, vendored in tools/tailwind/ (see tools/tailwind.sh), compile Styles/app.css into
|
|
wwwroot/css/app.css on every build, offline. 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>
|
|
<TailwindVendorDir>$(MSBuildProjectDirectory)/tools/tailwind/</TailwindVendorDir>
|
|
<TailwindExe>$(MSBuildProjectDirectory)/.tools/tailwind/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/**;tools/**" />
|
|
</ItemGroup>
|
|
|
|
<!-- Unpacks the vendored binary when it is missing or the vendored archive changed (an upgrade). -->
|
|
<Target Name="EnsureTailwindTools" Inputs="$(TailwindVendorDir)tailwindcss-linux-x64.xz;tools/tailwind.sh" Outputs="$(TailwindExe)">
|
|
<Exec Command="bash tools/tailwind.sh prepare" WorkingDirectory="$(MSBuildProjectDirectory)" />
|
|
<Touch Files="$(TailwindExe)" />
|
|
</Target>
|
|
|
|
<Target Name="TailwindCompile" DependsOnTargets="EnsureTailwindTools"
|
|
Condition="'$(DesignTimeBuild)' != 'true' And '$(NoBuild)' != 'true' And '$(SkipTailwind)' != 'true'"
|
|
Inputs="@(TailwindSource);$(TailwindExe);$(TailwindVendorDir)daisyui.mjs;$(TailwindVendorDir)daisyui-theme.mjs;$(MSBuildProjectFullPath)"
|
|
Outputs="wwwroot/css/app.css;$(IntermediateOutputPath)tailwind.stamp">
|
|
<Exec Command=""$(TailwindExe)" -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>
|
|
<!-- Points the development build at a local PrivaPub; the published app reads appsettings.json only. -->
|
|
<Content Update="wwwroot\appsettings.Development.json" CopyToPublishDirectory="Never" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<Compile Update="Resources\ErrorMessages.Designer.cs">
|
|
<DesignTime>True</DesignTime>
|
|
<AutoGen>True</AutoGen>
|
|
<DependentUpon>ErrorMessages.resx</DependentUpon>
|
|
</Compile>
|
|
<Content Remove="wwwroot\vendor\fontawesome.css" />
|
|
<None Include="wwwroot\vendor\fontawesome.css" />
|
|
<Content Remove="wwwroot\vendor\ionicons.css" />
|
|
<Content Remove="wwwroot\vendor\open-iconic.css" />
|
|
<Content Remove="wwwroot\vendor\solid.css" />
|
|
<None Include="wwwroot\vendor\solid.css" />
|
|
<Content Remove="wwwroot\vendor\open-iconic.min.css" />
|
|
<Content Remove="wwwroot\webfonts\fa-solid-900.eot" />
|
|
<None Include="wwwroot\webfonts\fa-solid-900.eot" />
|
|
<Content Remove="wwwroot\webfonts\fa-solid-900.ttf" />
|
|
<None Include="wwwroot\webfonts\fa-solid-900.ttf" />
|
|
<Content Remove="wwwroot\webfonts\fa-solid-900.woff" />
|
|
<None Include="wwwroot\webfonts\fa-solid-900.woff" />
|
|
<Content Remove="wwwroot\webfonts\fa-solid-900.woff2" />
|
|
<None Include="wwwroot\webfonts\fa-solid-900.woff2" />
|
|
<Content Remove="wwwroot\fonts\open-iconic.eot" />
|
|
<None Include="wwwroot\fonts\open-iconic.eot" />
|
|
<Content Remove="wwwroot\fonts\open-iconic.otf" />
|
|
<None Include="wwwroot\fonts\open-iconic.otf" />
|
|
<Content Remove="wwwroot\fonts\open-iconic.svg" />
|
|
<None Include="wwwroot\fonts\open-iconic.svg" />
|
|
<Content Remove="wwwroot\fonts\open-iconic.ttf" />
|
|
<None Include="wwwroot\fonts\open-iconic.ttf" />
|
|
<Content Remove="wwwroot\fonts\open-iconic.woff" />
|
|
<None Include="wwwroot\fonts\open-iconic.woff" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\SocialPub\PrivaPub.ClientModels\PrivaPub.ClientModels.csproj" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<Content Update="wwwroot\vendor\ionicons.min.css">
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
</Content>
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<EmbeddedResource Update="Resources\AllStrings.resx">
|
|
<Generator>ResXFileCodeGenerator</Generator>
|
|
<LastGenOutput>AllStrings.Designer.cs</LastGenOutput>
|
|
</EmbeddedResource>
|
|
<EmbeddedResource Update="Resources\ErrorMessages.resx">
|
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
|
<LastGenOutput>ErrorMessages.Designer.cs</LastGenOutput>
|
|
</EmbeddedResource>
|
|
</ItemGroup>
|
|
|
|
</Project>
|