Repository navigation
2.0.0 (2026-11-12)
⚠ BREAKING CHANGES
-
NTComponents, NTComponents.AspNetCore, and
NTComponents.Extensions no longer ship net9.0 builds. -
feat!: remove legacy TnT components and obsolete APIs
Delete every TnT* component, service, and enum along with the obsolete
NTInputSelect and NTInputFile, their scripts, styles, and tests. Rename the
surviving shared types to NT names (NTEvent, NTDisabledDateTime,
NTVirtualizeItemsProviderResult, NTComponentIdentifier, NTServiceExt), move
still-used helper types into their own files, and drop the AspNetCore
TnTItemsProviderRequest model binder and the NTC1077-1079 suppressions.
Update the docs site examples, LiveTest pages, AOT smoke app, and tests to
the NT equivalents, remove LiveTest demos that only exercised TnT
components, and replace the README color-migration section with a 2.0
upgrade guide.
-
TnT* components, AddTnTServices(), ITnTDialogService,
ITnTToastService, TnTColor, Size, TextAlign, LayoutDirection, NTInputSelect,
and NTInputFile are removed. Use the NT* equivalents listed in the README. -
ci(release): publish to NuGet with trusted publishing
Replace the long-lived NUGET_API_KEY secret with NuGet/login OIDC in the
release and prerelease workflows. The short-lived key from the login step
pushes the packages and unlists superseded previews; the jobs now need
id-token: write and the NUGET_USER secret.
- chore(charts): bump submodule for trusted publishing
Picks up the Charts AGENTS.md net10/net11 fix and its NuGet trusted
publishing workflows.
- ci: pin Playwright jobs to Ubuntu 24.04
ubuntu-latest now resolves to Ubuntu 26.04, where Playwright cannot
install Chromium. Pin the AOT Linux x64 smoke, the dotnet-test matrix, and
the release job (all install Playwright) to ubuntu-24.04, matching the
arm64 runner.
-
chore(charts): bump submodule for the Ubuntu 24.04 runner pin
-
ci: install Playwright Chromium without apt dependencies
The hosted Ubuntu runners cannot reach the Ubuntu package mirrors, so the
--with-deps apt step failed every Linux integration and AOT smoke job. The
runner images already ship Google Chrome and its system libraries, so
install only the Chromium browser the tests use.
- test(fab): drop legacy TnTFabContainer offset checks
The FAB offsets page no longer renders TnT FAB containers, so the test
timed out waiting for .tnt-fab-container. Keep the NT FAB placement checks,
including the legacy .tnt-header/.tnt-footer class variants the FAB styles
still support.
- ci(aot): make the browser smoke observable and bounded
macOS AOT jobs hung after publish with no output, and the job timeout
discarded their logs. Log each browser smoke attempt, bound the DevTools
socket close and the static server's socket reads, and pass Chrome
--use-mock-keychain and --password-store=basic so a fresh profile cannot
block on the macOS keychain. Move the 20-minute limit to the smoke step,
where a timeout keeps the log, and give the job 30 minutes.
- ci(aot): smoke-test macOS with Safari instead of headless Chrome
Headless Chrome hung on macOS after DevTools connected, so macOS now runs
the browser smoke through safaridriver (WebDriver) and checks the same
smoke marker. AOT_SMOKE_BROWSER still selects a Chromium browser. The
Chromium DevTools calls get a hard 10-second wall-clock bound, and both
paths log progress every 10 seconds.
- ci(aot): report browser errors when the Safari smoke fails
Safari renders the AOT smoke app but never shows its toast or snackbar.
Collect window errors, unhandled rejections, and console errors in the
smoke app, and on a failed Safari smoke print them with the page-script
registration state, toast and snackbar host counts, and module import
results.
- ci(aot): build the TypeScript modules before the AOT smoke publish
The components' .razor.js modules are compiled from TypeScript and are not
checked in, and the AOT workflow never built them, so every module import
in the smoke app fell back to index.html. Safari reported the text/html
MIME type; the previous Chromium check passed without the modules. Check
out submodules, run npm ci, and run build:ts:release on every runner, as
the release workflow does.
- ci(aot): expect NT color variables in the smoke check
NTColor.ToCssNTColorVariable() emits var(--nt-color-), but the smoke
marker still expected var(--tnt-color-) for the toast and snackbar
colors. The old Chromium check passed without evaluating this, so the
stale values went unnoticed.
- feat(theme)!: drop --tnt-color tokens and the theme compatibility stylesheet
Move every theme token to --nt-color-. Remove nt-theme-compat, which
mapped --nt-color- to --tnt-color-, and stop NTHeadDependencies from
loading it; --nt-color-transparent now lives in nt-measurements. Remove
the $tnt-color- SCSS aliases, the --tnt-color fallback in the color
lookup, and the legacy aliases the theme creator wrote. The theme runtime
fallback, snackbar defaults, docs site and LiveTest themes, Material
theme converter, and the Charts AOT test app now use --nt-color-*.
-
themes and custom CSS must define and use --nt-color-*
tokens; --tnt-color-* tokens are no longer read. -
refactor!: rename every tnt- name to nt-
Rename the remaining tnt- CSS classes, custom properties, SCSS mixins and
variables, data-tnt-* attributes, the element, and the
date picker's dataset keys to their nt- forms.
Where an nt- equivalent already existed, remove the tnt- copy instead:
the theme runtime's data-tnt-theme* attributes, tnt-* attribute fallbacks,
and tnt-theme-changed event; the .tnt-header/.tnt-footer FAB selectors;
and the static tnt- typescale mixins and classes, whose callers now use
the token-based nt- mixins.
Remove code that only served removed TnT components: the accordion and
side-nav toggles, the TnTBody fill-remaining observer, the unstyled
injection, addHidden, the legacy supporting-text key
handler, and the unused _inputBase, _buttonStyleMixins, _corners, and
_textAlignments partials.
-
tnt- CSS classes, custom properties, data attributes,
the element, and the tnt-theme-changed event are now
nt-. Update custom CSS, JavaScript, and test selectors that target them. -
refactor!: rename the tntid attribute and tnt_ id prefix to ntid and nt_
Components now mark their root with an ntid attribute whose generated
values start with nt_. NTComponents.customAttribute and the component
identifier constant follow the new name.
-
the component identifier attribute is now ntid and
generated identifiers start with nt_. Update selectors that target
[tntid] or tnt_ values. -
chore: rename the private npm package to ntcomponents-js-tests
-
chore: clean up legacy TnT references found in review
- Drop compilerconfig.json and .gitignore entries for removed components.
- Remove the bUnit mock for the deleted TnTRippleEffect module.
- Stop checking and setting the legacy __tntThemeBootstrapped flag.
- Remove the dead "TnT" type-name filters in the docs catalog and its test.
- Rename the TnTComponents..test.js suites to NTComponents..test.js and
the tnTEvent test variable to ntEvent. - Update docs and agent instructions that still described TnTComponents,
legacy TnT components, ToLegacyColor(), or .NET 9 support. - Keep the sans-serif fallback in nt-typescale(), which the removed
tnt-typescale() provided, and align the unused title-medium size
variable with the 16px Material 3 baseline.
-
chore(charts): bump submodule for the README cleanup
-
ci(coverage): raise the coverage threshold to 90%
-
ci(coverage): evaluate coverage across the whole project
-
animation: NTAnimation.Once and AnimateOut are removed. Use
Repeat (Once, Reverse, or Replay) for visible animations and
Trigger="Manual" with Shown to animate content in and out. Distance is
now nullable and defaults per variant (24px for slides, 30px for shared
axis). -
icons: Icon parameters on NT components now use NTIcon instead
of TnTIcon, and MaterialIcon.Color is NTColor? instead of TnTColor.
Replace TnTColor.X with NTColor.X, and use null where OnSurface or None
was used to inherit the text color. -
size: ButtonSize on NT buttons, NTNavLink, NTButtonGroup,
NTFabMenu, and NTSplitButton; Size on NTProgress, NTLoader, and
NTBreadcrumb; NTInputFile.InputButtonSize and UploadButtonSize; and
NTButtonBase.EffectiveProgressSize now use NTSize. Replace Size.X with
NTSize.X, Size.XS with NTSize.Smallest, and Size.XL with
NTSize.Largest.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
- colors: Color parameters on NT components (buttons, cards,
chips, menus, navigation, form fields, progress, tags, tooltips,
toasts, snackbars, and others), INTSnackbar, INTToast, the
INTSnackbarService and INTToastService ShowAsync overloads,
NTSnackbarQueueScriptOptions, and NTButtonBase.EffectiveProgressColor
now use NTColor instead of TnTColor. Replace TnTColor.X with NTColor.X;
use null or Transparent where TnTColor.None was used. Apps that do not
render NTHeadDependencies must load _content/NTComponents/nt-theme-compat.css
or define --nt-color-* variables.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
-
tests: CI now enforces 90% line and branch coverage for NTComponents.
-
NTCarousel: Carousel API, layout, and item registration model have changed; required parameters and accessibility contracts enforced.
-
mcp,api,validation,docs,infra: Public API input validation is now enforced; invalid requests return errors instead of being normalized or ignored. CORS, host, and rate limiting are now strictly applied. TypeScript build/minification is required before .NET builds. See README for migration details.
-
core,ci,docs: Removed DynamicallyAccessedMembers from generic type constraints and updated TnTInputFile disposal logic for .NET 11 compatibility. Consumers targeting .NET 11 may need to update their code to match new API requirements.
-
Components now use NT-prefixed names for improved SSR compatibility and closer Material 3 alignment.
-
Component rework
-
refactor(snackbar): move elevation to C# and update sizing
Elevation is now applied via a dynamic class in C# instead of a SCSS mixin. Snackbar sizing uses logical properties (inline-size, max-inline-size, min-inline-size) for improved responsiveness and writing mode support.
- refactor(snackbar): move rendering/queue to JS module
Major overhaul of NTSnackbar:
-
Components now use NT-prefixed names for improved SSR compatibility and closer Material 3 alignment.
-
test: improve reliability of debounce and result tests
Refactored tests to use Bunit's WaitForAssertion instead of Task.Delay for more deterministic and reliable assertions. Changed Search_DebouncesProperly to a synchronous test and replaced async input simulation with direct Input calls. These changes reduce timing flakiness and improve test clarity.
- fix(tests): improve coverage and debounce test logic
Split coverage collection per test project and merge results in CI. Refactored Search_DebouncesProperly to async, increased debounce interval, and improved assertion reliability.
Features
- add Apply method for sorting and paging (60cf3ba)
- add controller test for NTItemsProviderRequest binding (06ed019)
- add descending sort indicator styling (346ebe3)
- add implicit conversions for provider requests (35b4852)
- add NT-prefixed enum replacements (2891e23)
- add RefreshAsync to NTFabMenu and test coverage (ad86951)
- add static page script rendering and tests (153e134)
- analyzers/carousel: add NTCarousel config analyzer, runtime validation, and tests (b0de768)
- analyzers: add packaging, release, and validation automation (acee53a)
- analyzers: add rules for chip, navigation rail, window, accordion, virtualize, responsive, dialog, badge and owned attributes (6e29ba4)
- analyzers: add TnTColor migration analyzer and code fix (4bf6f78)
- analyzers: grade rules by impact and document every rule (07ca2fb)
- analyzers: port card, carousel, data grid, progress and animation rules to the render tree walker (4ac685e)
- analyzers: port icon button, FAB and FAB menu rules to the shared walker (598b1f8)
- analyzers: port input rules and add form and editor rules (NTC1059-1064, NTC1104-1108) (3ebbbde)
- analyzers: port split button, button group, menu and nav link rules (9e058eb)
- analyzers: report ignored layout parameters and builder helpers (b495d58)
- analyzers: report missing parents, nested forms, and undefined enums (3241ac1)
- animation: add triggers, repeat modes, and staggered NTAnimation (cfd2468)
- autocomplete: support grouped options via child content (73d68b2)
- blazor,interop,disposal: idempotent, safe disposal for NTComponents (7f2381e)
- breadcrumb: add SSR-compatible breadcrumb component (2ff585f)
- build, deps: update TypeScript to v7, refactor build, and refine dependency management (64b5adc)
- build: add TypeScript build step to pipeline (051c52a)
- build: support multiple NuGet sources via RestoreSources (cc88af8)
- button-group: enable custom attributes passthrough to individual buttons (306ea5e)
- button: add progress indicator support (6115474)
- catalog,api,mcp: add paging, richer docs, validation, and MCP resource support (5724fe3)
- charts: document legend scrolling and long axis labels (70fc0b3)
- colors: add Material 3 NTColor roles (381ce08)
- combobox: add popover support and fixed menu layer (f7a70c7)
- components: add NTLazyLoader and tab fix (423e8d9)
- container-view: customize and collapse on-this-page navigation (9d9b301)
- container-view: exclude whole regions from On this page navigation (159b234)
- core,analyzers,forms,tests: improve package validation, form field UX, and test coverage (c34b456)
- core,ci,docs: add .NET 11 preview support, update workflows, fix breaking API changes (28ce729)
- core: add NTDebouncer and obsolete TnTDebouncer (b483e96)
- data-grid: cache and reuse provider sort plan (17dcd57)
- data-grid: improve sort control accessibility & SSR (3e3df43)
- data-grid: support custom initial sort direction (1781b5e)
- datagrid: add NTGridSort and template column sorting (0b4b92e)
- datagrid: improve column state tracking and header updates (acc8fc0)
- datagrid: improve URI state, refresh, and disposal (3eb44eb)
- debug-console: add NTDebugConsole for in-app session logs (e557bfb)
- deployment: add production deploy workflow & scripts (e2ae481)
- deploy: refactor prod workflow to use GH-hosted runner, Tailscale, and SSH (40b2568)
- deps: update Microsoft.CodeAnalysis.CSharp to 5.6.0 (8367e2c)
- dialog: add NTDialogParameters for type-safe params (d1c898e)
- dialog: support deferred and parameterized content (68cd0f7)
- docs,tests: curated demos, improved sandbox, E2E suite (1f426aa)
- docs/tools: add Material 3 theme creator tool to docs site (be13040)
- docs: enhance OpenAPI support and typed API responses (b9981f9)
- docs: generate code documentation for NTComponents.Charts (773873c)
- drop net9, remove legacy TnT components, NuGet trusted publishing (#129) (40109ef)
- editor: rework NTRichTextEditor surface, tools, and value sync (a94995a)
- fab: update default size to small, refactor placement (e238ae8)
- form: add date range picker (5ef6849)
- form: add NTColorPicker and rebuild NTInputColor around it (412e4ef), closes #rrggbb #rrggbbaa
- form: add responsive field grid and section layout (2a6c3e2)
- form: improve field alignment and radio group layout (ee98fb5)
- Full documentation site (#19) (1ff20a9), closes C#-side
- github-actions: add dependabot auto-merge workflow (77e5013)
- grid: adapt NTDataGrid to small screens (eb81e47)
- grid: add drag-to-scroll to NTDataGrid (3998546)
- grid: add FullHeight to fill a bounded page layout (ebf00b3)
- grid: add navigation state to paging and tests (295beda)
- grid: use history.replaceState for URL updates (2eb17e0)
- head,theme: stabilize theme slots & optimize navigation (486ec82)
- head: refactor and optimize theme/head dependencies (4ad1a49)
- input-date-time: compact UI, suppress native pickers (881199f)
- layout: refactor to CSS container queries, improve overflow, add tests (3994144)
- loader: morph to a random shape on each step (f5c245e)
- mark legacy binders and request as obsolete (8b6bf62)
- mark NTInputSelect and option as obsolete (6657013)
- matrix test/coverage, NTDialog TitleContent, infra (a24c5cb)
- mcp,api,validation,docs,infra: public contract hardening, validation, rate limiting, and UI/UX improvements (e31f152)
- mcp: compact MCP API, paging, and result types (a045fa4)
- menu: attach NTContextMenu to an element by id (c869776)
- menus: add TargetSelector to NTContextMenu (bb13f0f)
- navrail: use the modal rail on small portrait screens (4b198bf)
- nt-wizard: refactor layout with .nt-wizard-body container (35c3ad4)
- NTCarousel: refactor autoplay and layout for isolation (32c33bb)
- NTCarousel: refactor to Material 3, add layouts, a11y, and autoplay (2259451)
- NTComponents.MCP: add MCP server for searchable NTComponents catalog (c017d9f)
- NTContainerView: add content wrapper and grid layout (031ee0d)
- NTDataGrid: add customizable expand/collapse button text (d542714)
- NTDataGrid: add expandable row details & variable-height virtualization (28b456a)
- NTDataGrid: add RefreshDataGridAsync API and tests (61de983)
- NTDialog: add button spacing options (26df2bd)
- NTDialog: support Open param for modal in interactive (fd65700)
- NTDialog: support parameterized button templates (e209158)
- NTForm: add @key directive using _model for re-render (bc211fa)
- NTInputDateTime,IntersectRestrictionDemo: parent-driven form demo, native input buffer, and tests (faed0e4)
- NTInputDateTime: add render mode demo, enhance pickers, parsing, and deployment asset checks (12b2bdf)
- NTNavigationRail,NTTypeahead,NTDataGrid,NTAutocomplete: add new features, visual options, and improved behaviors (e0dbb27)
- ntnavigationrail,ntwizard,ntlayout: enhance responsive, accessibility, and test coverage (05f4044)
- NTNavigationRail: add CloseOnNavigation param for popover control (de69a41)
- NTSelect: support all value types as TValue (d871e41)
- NTTabView: add programmatic tab selection API, JS interop, and demo (ec39e46)
- NTTabView: improve streaming, registration, and tests (cd2f5be)
- NTTabView: render registration gate via static fragment; restrict gate visibility (2c4156e)
- NTToast: sync toast progress bar timing on move (5a2217f)
- promote toast/snackbar hosts above dialogs (4d018ae)
- requests: require StartIndex for provider requests (67484e8)
- responsive: add responsive visibility (1f1267e)
- rich-text-editor: add source mode and aria label tool (c165271)
- rich-text-editor: switch to sanitized HTML model (0587efa)
- scheduler: add Material 3 scheduler/calendar with event drag/drop, color, and tests (a40ac9c)
- scheduler: add NTScheduler.razor.js with drag-and-drop logic (376a685)
- site: add Charts documentation, demos and getting started guide (9fb0b6a)
- site: add setup guide and header theme selector (7cc1d16)
- site: let the theme creator recolor the whole site (c2a26b4)
- site: rebuild component docs around hand-written examples (7b9eebe)
- snackbar,toast: SSR-safe queue scripts & deduplication (04e3507)
- snackbar: support multiple actions per snackbar (6969790)
- split PascalCase in column titles for readability (da497d3)
- support flexible Sorts query for item requests (4432490)
- tabs: add NTPopoutTab that pops out into a window (2eda91c)
- test: add Playwright Chromium smoke test support (1efceed)
- tests: add NTDialog Buttons parameter update test (de560fc)
- tests: expand and enforce coverage for NTComponents (79cd5af)
- timezone: Added time zone retrieval component (fe1813f)
- typeahead: menu escapes clipped containers & popover (ad8a96a)
- validation: unify field validation CSS classes (0936cb8)
- virtualization: add anchored refresh and scroll support (a3d431b)
- virtualize: debounce scroll-driven loads (22a25f8)
- virtualize: persist and restore grid scroll position (dc0c3e9)
- window: add floating window system, service, and docs (4da1bd9)
- window: cascade new windows and add inline Floating mode (855e991)
- wizard: add deferred validation demo & navigation logic (51ad531)
- wizard: improve small screen layouts and tests (bfae971)
- wizard: persist visited step state and improve UX (62ef6f8)
- wizard: refine step indicator interactivity logic (c30adea)
- wizard: track visited invalid steps, improve validity (e505391)
- workflow: add manual review if auto-merge fails (e698ed3)
- workflow: auto-approve Dependabot minor/patch PRs before merge (c6e2980)
Bug Fixes
- analyzers: fall back to the component location for unmapped attributes (de9d782)
- aot: improve reliability and speed of AOT CI (426f16a)
- build: compile Charts assets in the root TypeScript build (1763176)
- build: let Components.Authorization flow to net11 consumers (d94f423)
- buttons: keep selected outlined buttons filled (513d2dc)
- carousel: align autoplay control and item placement with M3 (deab162)
- ci: Fixed broken CI tests (7966f3e)
- ci: prevent net9 macOS AOT smoke timeouts (de280a0)
- ci: remove --no-build from dotnet pack in prerelease (3d83321)
- ci: update macOS arm64 runner to macos-15 (006168b)
- combobox: leave Blazor-owned hidden inputs to interactive renders (d3df677)
- components: preserve rapid edits and context-menu interactions (667df7b)
- core: make TnTDebouncer thread-safe and robust (238206f)
- data-grid: refine sticky header z-index targeting (1915f72)
- datagrid: persist prerendered provider results (05ab5b0)
- deploy: restore wasm workloads via solution, update charts submodule (0aed8da)
- deps: align hosts with updated Charts packages (5f6d2f6)
- deps: patch Components.WebAssembly.Server RCE advisories (34df92b)
- deps: remove the Authorization pin Dependabot added to Extensions (26a34b0), closes #106
- dialog: pin the icon button to the corner of centered dialogs (9ade7d3)
- dialog: treat null parameters as empty collections (95b982b)
- e2e: update toolbar count and color style checks (f836d6a)
- fab: clear layout headers and footers (3810b63)
- fix test reliability (c6170a4)
- form: avoid redundant validation notifications and renders (11e93b6)
- form: fire BindAfter on blur only after a change (eff6194)
- form: show chosen file names in static NTFileUpload (fbb027f)
- grid: defer initial provider load until columns settle (d6fefd6)
- grid: keep placeholder rows at data row height (c5505c7)
- grid: keep placeholder rows at the data row height (c6d72e0)
- grid: validate prerender persistence key (0af165c)
- include member name in validation result (db67444)
- input: improve autofill styling for input fields (54bf3e7)
- layout: size nested body around present regions (06fa3fc)
- loader: refactor NTLoader for Material-style morph/rotation (6a37f92)
- make RefreshDataGridAsync truly async (9febfad)
- mcp: align schemas with tool responses (def945a)
- mcp: list reference types that derive from exposed parameter types (5ae9e37)
- nav-rail: preserve full-width indicator indent (3a16bf0)
- navigation-rail: prevent disposal of unrelated rails (7b33d17)
- NTDialog: render DefaultButtons component correctly (68718a6)
- NTInputBase: update dense label spacing and input visibility (8874ab8)
- NTTab: use IconMetadata for header icons, add tests (fb5d9e3)
- popover layering for toast/snackbar & demo (98f0d7c)
- release: add release pipeline tests and downgrade changelog (0f21f9d)
- release: stop the NTComponents package check referencing TnTColor (1b7a0a3)
- remove sticky positioning from NTForm Fields header (3942d13)
- scheduler: use the NT title-medium type scale for day numbers (3a63706)
- site: apply scoped preview colors to modern components (26f57fb)
- site: exclude NTBadge from the component catalog (457a6f1)
- site: keep shown example code inside the docs container (7aa3834)
- site: make component demos interactive and recoverable (5b2e97f)
- styles: use Material 3 key and ambient elevation shadows (4e5b46c)
- tab-view: reach NTTab panels from scoped styles (cb88df5)
- tabs: docked NTPopoutTab content fills the tab panel height (35ec525)
- test updates (995c9db)
- tests (38ad27f)
- tests: add AngleSharp package reference (f12493d)
- tests: Fixed broken tests (1d03680)
- tests: Fixed flaky test (2724d1d)
- theme: add legacy color token compatibility (bf69738)
- theme: set the theme preload href before its rel (d056deb)
- theme: synchronize controls after runtime initialization (81761b0)
- toast: reformat XML docs, add error overload (680e0bb)
- tooltip: render NTTooltip in the top layer so masked containers can't clip it (89db4e9)
- tooltip: use the Material 3 medium corner for rich tooltips (7649e0e)
- typeahead: preserve newest asynchronous lookup results (98c18c8)
- use scalar JS bridge for toast/snackbar (2cb2abb)
- virtualize: reload cached rows when a background load reports a new total (9efe306)
- window: raise and drag windows rendered after the script loads (90c99d8)
Performance Improvements
- buttons: simplify class building in buttons, cards, chips and carousel (e93e9f9)
- components: trim per-render work in navigation, menus, overlays and theming (52b0d1a)
- core: cut allocations in shared builders and base components (79685cf)
- fonts: load Roboto and icon fonts from separate stylesheets (41be583)
- form: cache per-render work in form base classes and inputs (00d0dfd)
- grid: cut per-row and per-render work in NTDataGrid (e85f92a)
- js: share button interaction listeners and track active ripple hosts (442d51e)
- scheduler: resolve each event once per render and lay out lanes in one sweep (6abb471)
- shapes: ship precomputed shape points instead of generating them (7cb7519)