Luix v1.3.0 - The Tokens & Fonts Update
New diagnostics (gated by luix.propValidation.enabled, on by default)
- Numeric-range warnings —
Transparency = 1.5,Rotation = 720,
BorderSizePixel = 100, etc. Per-prop bounds. - TextScaled gotcha —
TextScaled = truewith a pure-scaleSize
(or noSize) collapses text to zero — now flagged with a fix
recommendation.
Color contrast warnings (off by default)
luix.contrastWarnings.enabled — flags any TextColor3 whose
WCAG-AA contrast ratio against the nearest ancestor's
BackgroundColor3 falls below 4.5:1. Both colors must be literal
Color3 expressions; reactive Fusion/Vide values are skipped.
Design tokens beyond color
Mirror of luix.palette for two more types:
luix.spacing— typeUDim.to surface entries like
spacing.md→UDim.new(0, 16).luix.fonts— typeFont.to surface entries like
fonts.display→Font.fromName("Gotham", Enum.FontWeight.Bold).
Empty by default; opt-in via user config.
Color3 → palette extractor
Cursor on any Color3 literal → 💡 Save Color3 to luix.palette… —
prompts for a token name and a target (User / Workspace settings).
The literal is added to luix.palette so it surfaces in future
Color3. completions.
Frame-stats CodeLens (off by default)
luix.frameStatsLens.enabled — ▸ Frame — 24 descendants, 4 layers deep above every meaty subtree. luix.frameStatsLens.minDescendants
(default 5) controls the threshold.
Workspace-wide validation summary (off by default)
luix.workspaceValidation.enabled — the Luix sidebar shows
"Project diagnostics — N warnings · M errors across X files".
Click jumps to the Problems panel. Aggregates Luix + every other
publisher's diagnostics.
Class picker on ( (off by default)
luix.classNameCompletion.triggerOnOpenParen — typing e( (without
a quote) opens the class picker; accepting inserts the full
"ClassName", { … }) body. Off by default because ( is a broad
trigger; on saves one keystroke per element when enabled.
CFrame.Angles snippets
cfangles → CFrame.Angles(math.rad(…), math.rad(…), math.rad(…))
cfanglesrad → CFrame.Angles(…, …, …) (radians form)
Background — workspace index persistence (on by default)
luix.indexPersistence.enabled — the parsed component index is now
saved to disk between sessions; unchanged files skip re-parsing on
cold start. Speeds up activation on large workspaces with no
behavioral difference. Disable to keep Luix offline.
Background — opt-in Roblox API-dump augmentation
luix.useRobloxApiDump — fetch the community-maintained
Mini-API-Dump JSON once a day and add any new properties Roblox has
shipped to existing classes' completion lists. Additive only — the
hand-curated built-in data still wins on conflicts.
Roblox font family + weight autocomplete
- Inside
Font.fromName("…"), the family dropdown surfaces 36
built-in Roblox families with their supported weights. Popular UI
families (BuilderSans, Gotham, Roboto, SourceSansPro, …) sort first. - After
Enum.FontWeight.inside aFont.fromName(...)call, the
weight dropdown shows ONLY the weights the family actually ships.
Font.fromName("Cartoon", Enum.FontWeight.|)lists justRegular;
Font.fromName("Roboto", Enum.FontWeight.|)lists all nine. luix.customFontslets you register custom font families and
their supported weights — they merge into the same completions,
surface above built-ins, and weight-filter the same way.
Font (deprecated) removed from TextLabel / TextButton / TextBox
These classes no longer suggest the deprecated Font property —
only FontFace shows up in the completion list. The existing
deprecation diagnostic still catches anyone who writes
Font = Enum.Font.X and offers the Replace with FontFace = …
quick-fix.
Smarter value completion for Color3 / UDim / Font props
Accepting BackgroundColor3 / TextColor3 / Padding / FontFace
now inserts a Color3. / UDim. / Font. prefix and auto-opens
the suggest dropdown. The dropdown lists:
- Built-in constructors first —
fromRGB,fromHex,new,
fromHSV(for Color3);new(for UDim);fromName,fromId(for
Font). Picking one inserts the full call with per-channel tab stops
preserved. - Tokens defined in your settings below —
palette.primary,
spacing.md,fonts.display, … swap the prefix for the literal
expression.
Type f to filter to constructors; type p (or s / fonts) to
filter to tokens.
RichText <font> / <stroke> / <mark> — no more presumptuous defaults
Accepting one of these tags now leaves the attribute slot empty and
parks the cursor inside the tag. Type any letter and the attribute
completion fires — pick color, size, weight, etc. and the
value-with-quote pair fills in. Previously the snippet always
pre-filled color="…" regardless of intent.
Other improvements
- Prop completion no longer doubles trailing commas: typing
Bac,
then acceptingBackgroundColor3produces a single trailing comma
with the cursor after it, regardless of the existing,. - Prop / anchor-preset completions are now gated to key position —
typingFontFace = Font.|no longer surfacesBackgroundColor3/
anchor:c/ etc. alongside the font constructors. - All settings now live under the
luix.*prefix. The silent
fallback to legacyreactLuauPropsHelper.*keys has been removed
because VS Code'sinspect()could mistake a user-set{}(equal
to the default) for "not set" and quietly pick up the old keys.
Anyone with stalereactLuauPropsHelper.*entries needs to rename
them toluix.*(the format is identical). - All user-visible strings, diagnostic codes, and the diagnostic
collection have been re-branded fromreact-luau-props-helperto
luixso the Problems panel and hover tooltips show the right
source. .vscodeignoreextended to excludedevforum-post/, design SVG /
PNG drafts,PUBLISHING.md, lockfile, and tooling configs.
Marketplace package size stays under ~135 KB.