Releases: antaresdk/sus-core
Releases · antaresdk/sus-core
Release list
v1.1.0
Added
- Storybook shell with a look of its own. Its tokens, classes and fonts are independent of the product stylesheets, so switching skin, theme or density changes the component you are inspecting, not the instrument around it.
- Scoped cascade roots. A subtree can declare itself the cascade root, so a panel may show a component under a theme of its own while the rest of the application keeps another.
- Closed variant axes for stories. A story declares the set of values a variant may take, so the state matrix shows real rows instead of a single unnamed line.
- Component role registry. Which states a component owes and where its focus ring lives are declared as data, and the storybook matrix shows a state column only when the role owes that state.
- Geometry anomalies are detected. Beside the former "visible but zero-size", the probe now reports out-of-bounds, clipped, overlapping and off-canvas elements, each with a threshold you can set.
- History and reset in the storybook. Back and forward through visited stories, and a reset that returns the story to the seed its author chose rather than to type defaults.
Changed
- Matrix cells fit their content. A cell grows to the natural size of the instance; a component too large for a grid gets a state switcher on a single full-size instance instead of a wall of clipped thumbnails.
- Overlays are usable from the keyboard. Modals, drawers, sheets and dialogs trap focus, move it inside on open and return it to the opener on close.
- The stage no longer jumps. One canvas height for every story and popover, scrolling on both axes, and a line that says when the content is wider than the window.
- Value clamping is quiet on declared aliases and reports only values it does not know.
- Font assets trimmed from 42 faces to the 10 actually used, with their licence texts alongside.
Fixed
- The focus ring is visible on a primary fill. Its ink is a token of its own instead of an alias of the brand colour, so a selected segment or an active tab shows focus.
- The ring survives a re-render and waits for a child that appears late.
- A stack overflow when the safe-area story expanded its matrix.
- The canvas grid tile is drawn at its own size instead of being stretched across the canvas.
- The vertical scrollbar is styled like the horizontal one.
Also included since v1.0.18
Authoring
@variantsin Sharq: a component declares its variant axes in the template, and the compiler emits the rules, the class binding and the allowed set.rung(family, step): a step of the dimension ladder resolved at compile time inside a template.- Nested rules in Sharq stylesheets.
- Generated-to-source maps next to every generated stylesheet, so a rule points back at the template line that produced it.
- AOT-safe
v-forkeys, and a clear compile error instead of a broken type when an unknown UI Toolkit event is bound.
Runtime
- Storybook engine moved into core as an opt-in sample: story registry, environment chips, state matrix, live instance and controls derived from the component's own properties.
- Visibility through a class.
v-showandBindVisibilityhide with asus-hiddenclass instead of writing inline display, so a stylesheet can override it. - Fonts through stylesheets: no font is assigned from code any more.
SusSafeAreaandSusApp.UseSafeAreafor notch and gesture insets.- Input device and glyphs: last active device (pointer, keyboard, gamepad, touch) with glyph resolution for prompts, plus a shared touch-target minimum token.
- Slot containers carry stable classes, so a slot can be styled without C#.
Fixed
- Reactive property re-entrancy: a watcher that reads a value while it is being written is no longer misattributed to another effect, and
Peek()reads a value without registering a dependency. - Bind cascade desync: a derived value written during a bind pass no longer leaves the bound text or class one generation behind.
- Companion stylesheets inherit: a C# subclass of a styled component keeps its ancestor's stylesheet instead of silently losing it.
- A repeating motion stops when its target leaves the panel instead of ticking a dead element.
- Headless runs without a graphics device no longer emit breakpoint errors.
- Install diagnostics for classic sets: no false "relocated" or "residual" reports for nested skin modules, and scene comparison ignores line endings so Unity stops asking about changes that are not there.
- Overlay host resolution unified across all mount paths; world-space panels declare their domain by class.
Performance
- Reflection accessors for child-property binding are cached instead of resolved on every change.
- The per-frame update tick is scheduled only for component types that actually override it, removing a 60 Hz no-op on every component.
1.0.18
[1.0.18] - 2026-08-18
Added
SusMotion— code-driven tween builder for UITK inline styles (opacity / scale / translate /
rotate / background-color) with a fluent API,SusEasecurves,SusRestoreMode, presets
(SusMotionPresets: FadeIn/Out, SlideIn/Out, Bounce, PunchScale, Shake) and
SusMotionStagger.Children. One active play per target; distinct fromSusTransition
(USS enter/leave phases). Tests added.
Fixed
- WebGL
RangeError: Maximum call stack size exceededon deep synchronous mounts: a bind /
WatchEffectaction that adds a freshly built child during the parent's own attach-flush
re-enteredFlushPendingBindUpdatesOnAttachone stack level deeper per nested reveal. The
synchronous flush depth is now capped at 1; nested flushes are queued and drained iteratively
by the outermost caller within the same tick (nothing is deferred to the scheduler, nothing
is dropped). Regression tests added.
Changed
- README: first-touch section (requirements,
.sharqquickstart, exit cost); legacy product
comparison dropped. - Versioned hooks:
scripts~/pre-push/scripts~/prepare-commit-msgcarry the attribution
guard (no AI trailers in the pushed range).
v1.0.17
Added
- SUS Set Doctor:
RootFileProvenance— reads the packer'sGenerated for: <set> v<version>
marker in generated root files (README / LICENSE / Third-Party Notices) and warns (never
"delete") when a smaller set's re-import overwrote the root files of a larger installed set. ResourcesFolderIconProvider: a requested icon weight (e.g.Fill) that the curated set does
not ship degrades toRegularinstead of returning no image.
Fixed
- Reactive sibling attach-flush race: several freshly built reactive components attached in the
same synchronous cascade could lose their post-attach bind catch-up (blank / uncoloured
BindClass/BindVisibilitytargets); the flush is now applied without a per-component
one-shot scheduler item. Regression tests added. SusWorldSpacePanel: the auto-created world-spacePanelSettingsstays in Screen Space until
the firstAttachElementcall — apps that never mount world-space UI no longer keep an idle
WorldSpace panel alive.- Public doc-comments in
SusSetDoctorno longer mention internal tool names.
Changed
- Test infrastructure:
SusLogLevelGuardAttributeresetsSusLog.Levelaround every test in
the shared PlayMode domain;scripts~/prepare-commit-msgis the versioned hook (PowerShell
copy removed). - README: community links (Discord / Telegram);
Docs/13-audits.mdcallback-audit count fixed.
v1.0.16
Added
- SUS Set Doctor v2: reads every per-module
sus-module.jsonand per-setsus-set.<set>.json
underAssets/and attributes each path to its owner. "Delete" is advised only for a path that
belongs to a module which is present but no longer lists it (Residual); everything else is
reported without a destructive hint (Unattributed,ModuleManifestMissing,IncompleteSet,
Relocated). Installing the Kit set on top of the Complete set no longer suggests removing the
Game module. SusClassicSampleLocator(Editor): resolves a module's sample folder under a classic
(.unitypackage) install from itssus-module.json, so the Kit/Game Setup menus work for a
classic purchaser instead of asking to install a package they never had.
Fixed
BindTransitionVisibility: the "no animation on initial mount" latch is now gated on the first
real layout pass instead of the first reactive run, so a component whose prop is set right after
construction (beforeAdd()) no longer plays a real Enter animation on its first paint
(expansion panels captured atopacity: 0).- Sample asmdefs are
autoReferenced: false— a purchaser'sAssembly-CSharpno longer
implicitly references sample code.
Changed
- Package push gate (
scripts~/pre-push): docs check runs always and first; version bump is
hard-required on source changes.
v1.0.15
Added
- SUS Set Doctor (Editor,
Window/SUS/Set Doctor+ auto-run on load/import): detects the three
states that silently break a classic (.unitypackage) install — a UPM package and the same
module underAssets/at once, residual files left over from an older set version, and a
version mismatch between modules — and prints what to delete/re-import. - Classic-layout starter assets and
sharq.gen.jsondiscovery for modules installed under
Assets/(not only underPackages/). - Project-local Phosphor icon subset provider + sample README (icon-subset sample).
SusUiProbemarks truncated single-line text nodes; dev console filter chips have stable names
for UX targeting.
Fixed
OverlayHost.ClearAll/ClearCategoryno longer corrupt the UIR render tree when a close
re-enters the host.- Bindings and schedules survive a relocation-only detach (portal / self-teleporting elements),
so overlay components no longer close themselves while opening. v-if/transitionelements: a hidden-at-mount element re-appears at its authored sibling
index instead of jumping to last child; the first evaluation snaps to the start state instead
of playing a leave animation.- Portal popups resync width/position on
GeometryChangedEvent, not only atShow(). - Fast Enter Play Mode: dev/diagnostic statics are reset on Enter Play Mode.
- Samples: dangling
PanelSettingsreference in Comp/ThemeShowcase/SusKeepAlive. - Sharq source generator: a
[CreateProperty(default: "…")]string default lost its quotes and
overrode the author's field initializer, and a field with a trailing// commentafter;
skipped its[UxmlAttribute]companion. String literals are re-emitted verbatim, the author's
initializer wins, trailing comments are preserved (regenerate.g.csin dependent packages).
Changed
- Docs: internal workspace paths removed from buyer-facing docs; translation artifacts fixed;
screenshots added.
v1.0.14
Changed
- The dev console (
SusConsoleService) is now styled by a stylesheet instead of C# inline styles:
Runtime/Resources/SusRuntime/sus-console.uss, loaded onto the console root on firstShow().
Every colour is a design token, so the console follows the active theme, and a project can
restyle it by overriding the.sus-console*classes — previously the look was compiled into the
service and could not be changed at all. Documented inDocs/17-console.md.
Fixed
- The open console looked broken: filter buttons, text fields and the scrollbar rendered with the
UI Toolkit defaults (light grey controls, white input boxes, editor-chrome scroller) on top of a
dark game UI. Filters are now chips that show which one is active, inputs are dark with
placeholders, and the scroller is a thin dragger. - The status line under the log said either the active filter or how many entries were shown,
depending on which code path updated it last. It now always shows both. SusConsoleService.InstanceandOnDuplicateCommandsurvived leaving Play Mode with Domain
Reload disabled (Fast Enter Playmode), so the next session could start with a console pointing
at a destroyed panel. Both are reset onSubsystemRegistration, matching the other services.
v1.0.13
Fixed
Assets → Create → SUS → Sharq Screenproduced a file that did not compile in a project with
only this package installed: the template's script section referencedSharq.Router, which
lives in a separate package. The navigation call is now a commented example, so the created
component compiles as-is and still shows how to wire a router when one is installed.- The Screen and Modal templates styled themselves with token names this package does not define,
so every colour silently fell back to a hardcoded literal. They now use the--sus-*tokens
fromdesign-tokens.uss. - Generated code lost its artifacts permanently when
Generated/was missing — a fresh clone of a
project that does not commit that folder, or a "delete it and let it regenerate" cleanup. Both
the content hash and the section cache reported "nothing changed", so nothing was written back
and the project stayed uncompilable until a.sharqfile was edited by hand. A missing artifact
now counts as a change. - The header of a generated file recorded the absolute path of the machine that ran the generator,
so teams committingGenerated/got a one-line diff per teammate. The path is now project
relative.
Removed
- Three unused template files (
HomeScreen.sharq.txt,SettingsScreen.sharq.txt,MyApp.cs.txt)
that shipped inEditor/Templates/but were referenced by nothing — leftovers of the setup flow
that now lives inEditor/Setup/Starter~, and stale copies of it.
v1.0.12
Fixed
- Icon SVGs were imported with the vector cropped to its geometry bounds instead of the source
viewBox. Since aVectorImageis painted as a stretched background, sparse glyphs came out
distorted:minus(an 18×1 bar inside a 24×24 box) filled its element as a solid block, and
check/ the carets rendered visibly larger than the rest of the set. All shipped icons — the
built-in subset and the optional Phosphor sample — now preserve the viewBox, so one set of
icons is optically consistent at any size. - New icon SVGs dropped into a
Resources/SusRuntime/Icons/**folder get that import setting by
default (SusIconImportDefaults); existing.metafiles are never overwritten.
v1.0.11
Changed
- The full Phosphor set (1,512 icons x 6 weights, 31 MB) moved out of
Runtime/Resourcesinto the
optionalPhosphor Icon Setsample. The package now ships a 127-icon subset — everything the
built-in components use — soResources, which lands in every player build, is 1.6 MB
instead of 32.5 MB. Import the sample if you need the long tail; it keeps the same
SusRuntime/Icons/phosphor/{weight}/{name}resource path, so no code changes are required.
The manifest already declared this sample, but the assets had never been moved, which also
broke store packaging.
sus-core 1.0.10
SusLog, SusIconElement, space/radius tokens, optional sharq.gen.json namespace, domain-reload hygiene.