Repository navigation
fix: use one Tailwind CLI per machine and survive slow downloads - #48
Merged
Merged
Conversation
init downloaded the 112 MB Tailwind CLI into every project, held it in memory and gave up after five minutes, so on a slow connection init failed and left the project uninitialised. The build's own download used MSBuild's default timeout and wrote straight into the project, and nothing kept the binary out of git. - The CLI lives once per machine in ~/.shellui/bin (or SHELLUI_CACHE_DIR) and init and the build run it from there; a copy in .shellui/bin still wins. Projects hold no binary. - Downloads stream to a .partial file, resume with Range, retry, and stop only after 60 s without data; the file appears once its size matches. - If the download fails, init finishes the rest and the build retries. - .shellui/.gitignore of "*" keeps the folder out of git. - update replaces a targets file any released CLI wrote, unless edited, and removes a project copy identical to the shared one.
Shewart
added a commit
that referenced
this pull request
Oct 13, 2026
Release notes and version references for 0.4.0-alpha.2. **In this release** (already on main): - #48: the Tailwind CLI is downloaded once per machine and run from there, so projects hold no binary; downloads survive slow connections; `init` carries on if the download fails; `.shellui/` is git-ignored; `update` moves older projects onto the shared CLI - #46: `update` installs new dependencies and keeps files you changed (`--force` to overwrite); `remove` finds layouts and custom paths; the package `TimePicker` value fix; `color-scheme` for light and dark - #44: `shellui-theme.css` no longer 404s when linked directly - #43: NuGet package icon and README logo **This PR** - `Directory.Build.props`: suffix `alpha.2` - Docs name stable `0.3.4` and prerelease `0.4.0-alpha.2` (README, VERSIONING_STRATEGY, CLI_INSTALLATION, CLI_SYNTAX, FAQ, QUICKSTART); stable-docs links point to `v0.3.4` - The version fallbacks in `VersionHelper` and `ComponentMetadata` (still `0.3.0` on main) are now `0.4.0-alpha.2` - `docs/RELEASE_NOTES.md`: the 0.4.0-alpha.2 section, plus the 0.3.4 and 0.3.3 sections from `release/v0.3`; `scripts/extract-release-notes.sh 0.4.0-alpha.2` extracts it **Release checks** (on `9c7cfac` plus this commit) - Release build has 0 warnings, and all 334 tests pass - A 0.3.4 project updated with the packed alpha.2 CLI: targets refreshed, the 112 MB project copy of Tailwind removed, 54 components updated, the edited `AppSidebar` kept, 5 new dependencies installed, builds 0/0 - A fresh Identity app, `init --yes --dashboard 02` then `add auth-01 data-table chat qr-code time-picker`: uses the shared Tailwind CLI and builds 0/0; `.shellui` holds only its `.gitignore` - All 93 direct targets together in `my-app` build 0/0 on net8.0, net9.0 and net10.0, with no project copies of the CLI - The packed `ShellUI.Components` in a browser: `window.ShellUI` loads, TimePicker shows its value, dark mode sets `color-scheme` (including the native date input), Popover closes on Escape, Command runs `Action` then `CommandSelected`, no console errors
Merged
Shewart
added a commit
that referenced
this pull request
Oct 21, 2026
Brings the 0.4 prerelease fixes to the stable line as 0.3.5. Each fix is a cherry-pick from main, adapted where 0.3 differs; 0.4-only features and the breaking template changes (Input/Textarea variants, the Stepper rework, the Toast/Skeleton/Pagination/NavigationMenuItem API changes) stay in 0.4. **CLI** - One Tailwind CLI per machine in `~/.shellui/bin`, resumable download with retries, `init` finishes when the download fails; `update` moves existing projects onto it (#48) - `update` keeps local changes (content hash per file, `--force` overwrites) and installs new dependencies; `remove` uses the install path (#46) - `add` never downgrades a NuGet package the project already references (#56) - `init` supports Razor class libraries, plus `docs/razor-class-library.md` (#53) - Release workflow publishes with NuGet Trusted Publishing (#59) **Components (package and templates)** - `Shell.Cn` merges conflicting classes, so `Class` overrides a component's own (#51) - Focus trap in Dialog, AlertDialog, Sheet and Drawer; the non-compositional Sheet and Drawer panels take focus and close on Escape (#50) - RadioGroup and RadioGroupItem `Disabled` (template), ScrollArea, DatePicker weekday, TimePicker `Step`, DateRangePicker and EmptyState (template), Label `for`, FileUpload icon, Sheet/Drawer click propagation and close button, CarouselItem (part of #52) **Adapted for 0.3** - `ComponentInstaller.InstallComponent` returns `bool` so `update` can report failures; the update tests use 0.3's registry entries - 0.3 has no compositional AlertDialog parts; `AlertDialog` renders through `DialogContent`, so it gets the trap from there - Docs mention only what 0.3 has (no auth layouts, Bootstrap cleanup or `qr-code`) - Safelist regenerated (`scrollbar-*` and the Material Symbols class gone, `w-9` added) **This PR also** - Bumps `Directory.Build.props` and the version references to `0.3.5` - Adds the `# ShellUI v0.3.5` section to `docs/RELEASE_NOTES.md`; `scripts/extract-release-notes.sh 0.3.5` extracts it **Release checks** - Release build has 0 warnings, and all 250 tests pass - `Shell.Cn` leaves all 1,235 of 0.3's own class strings unchanged when merged alone - An app set up with the released 0.3.4 CLI (45 components), updated with the packed 0.3.5 CLI: 47 updated, `Build/ShellUI.targets` replaced, the project's Tailwind copy removed, `.shellui/.gitignore` added, builds 0/0; a later local edit to `Card.razor` is skipped by `update` - CLI templates in a browser: RadioGroup selects (disabled item ignored), ScrollArea scrolls, `Class="px-8 bg-destructive"` replaces the button's `px-4 bg-primary`, DatePicker puts 1 October 2026 under Thursday, TimePicker `Step="15"` lists 00/15/30/45 and Cancel closes it, Dialog and Sheet keep Tab and Shift+Tab inside, wrap, and return focus to the trigger on Escape, the Sheet with only `Description` shows its close button - The packed `ShellUI.Components` in a browser: the same Cn, DatePicker, TimePicker, ScrollArea and focus-trap checks, Label renders `for`, FileUpload shows an SVG icon, clicks inside a Sheet don't reach the parent; no console errors - All 76 direct targets together in `my-app` build 0/0 on net8.0, net9.0 and net10.0 (176 registry entries)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
initdownloaded the 112 MB Tailwind CLI into every project, held it in memory, and gave up after five minutes. On a slow connectioninitfailed and left the project uninitialised (found during the 0.4.0-alpha.2 release checks). The build's own download used MSBuild's default timeout and wrote straight into the project, and nothing kept the binary out of git.One CLI per machine
~/.shellui/bin/tailwindcss-<version>-<platform>(orSHELLUI_CACHE_DIR), the same locationscripts/rebuild-precompiled-css.shuses.initandBuild/ShellUI.targetsrun it from there, so projects hold no binary..shellui/binstill takes precedence..shellui/.gitignorecontaining*keeps the folder out of git without touching the project's.gitignore.Downloads that survive slow connections
.partialfile; resumed with HTTP Range after a dropped connection; up to 4 attempts; abandoned only after 60 s with no data (no overall time limit). A 404 fails at once.initspinner, and every 10% when there's no terminal..partialwith retries and a 30-minute limit, and renames only on success.When the download fails
initfinishes everything else (config, CSS, components) and warns. The build retries, and its warning names the exact URL and the file path to save it to.Existing projects
shellui updatereplacesBuild/ShellUI.targetswhen it's an unedited copy from any released CLI. There have been two standalone versions (0.0.1–0.3.4 and 0.4.0-alpha.1), matched by hash, and both are tested against the real files those CLIs wrote. It then adds the ignore file, and deletes the project's copy of the CLI if it's identical to the shared one. An edited targets file is left alone, with a note.Checked
initwith an empty cache: downloaded 107 MB in 65 s and built. The old code timed out on the same connection.initwith a warm cache: 2 s, with no binary in the project.initstill completed, and the build warned with the URL and path..shellui, and the build is 0/0.update: targets refreshed, its 112 MB copy removed, and the build is 0/0.