← All updates

CHANGELOG

June 2026

Show success snackbar after canvas nodes are saved to Firestore. 306 changes in all: 2 new, 289 fixes, 2 reverted, 4 changed and 9 behind the scenes.

The Aglyn Team · Jun 2026

Everything that reached production in June 2026. See every commit from this month on GitHub

New

  • show success snackbar after canvas nodes are saved to Firestore
  • UI components: migrate MUI v6→v9 across apps and libs

Fixed

  • updated root jest config to fix deprecated import
  • convert all library jest.config.ts files from CJS to ESM
  • avoid setState during render in AglynAppProvider
  • move canvas initialization out of observer render into useEffect
  • replace deprecated observer(fn, {forwardRef}) with observer(forwardRef(fn))
  • wrap node.sx mutation in MobX action in element-styles-form
  • migrate Firestore persistence to FirestoreSettings.cache API
  • repair canvas save — fix nodesToJSON call, Firestore serialization, and computedFn arity errors
  • wrap addNodeFromPreset mutation in runInAction, silence HMR Firestore re-init error
  • replace export * from mitt with explicit named exports to silence Turbopack warning
  • replace export * from use-debounce with explicit named exports to silence Turbopack warning
  • replace export * from mitt in emitter.ts with explicit named type exports
  • omit undefined optional fields from AglynNode.toJSON to satisfy Firestore
  • omit empty nodes/props/sx from AglynNode.toJSON to reduce Firestore storage
  • disable droppable for the actively dragged tree node to fix leaf drop targeting
  • register updateNodeProps as a MobX action to satisfy strict-mode
  • silence spurious "unknown" console error when user dismisses the component picker
  • revert forwardRef on Branch — Fragment has no DOM root to attach a ref to
  • remove dev-only route type import from console next-env.d.ts
  • reliably collapse hierarchy nodes regardless of selection or manual expansion state
  • keep selection indicator in sync with viewport changes
  • resolve Vercel deployment failures across all three Next.js apps
  • removed tsconfig options for debugging
  • suppress TS6059 rootDir warnings in rollup build to expose actual errors
  • force webpack bundler for tenant and console production builds
  • add skipTypeCheck to all rollup library builds
  • suppress MUI "use client" rollup warnings to expose actual build errors
  • add rollup-skip-typecheck and suppress-use-client to all modified rollup libs
  • suppress TS6059 in buildStart and INVALID_ANNOTATION from node_modules
  • intercept emitFile in TypeScript plugin to suppress relative-path .d.ts fatal error
  • externalize next/ and @aglyn/ in rollup builds, suppress circular dep noise
  • Rollup: standardize all rollup libs with external-packages and skip-typecheck plugins
  • correct RECAPTCHA env var name typo (RECPATCHA → RECAPTCHA)
  • ignore local vercel dir
  • Mdi: add explicit Icon type to generated icon constants to resolve TS7018
  • Firebase: inline process.env refs directly in fbClientAppOptions
  • Array overrides: use Object.defineProperty to prevent MUI sx for..in poisoning
  • destructure key/id before rest spread to stop React key-in-spread warnings
  • UI components: replace titleTypographyProps/subheaderTypographyProps with slotProps
  • UI components: add nativeButton={false} to Button variants rendering custom components
  • Console: remove globalThis from console.log to prevent cross-origin SecurityError
  • Next: disable devIndicators to prevent HMR race-condition TypeError
  • Console: restore cookie-based theme switcher broken by MUI v9 codemod
  • UI components: replace PaperProps with slotProps.paper on Menu and Dialog
  • Console: revert theme switcher to useColorScheme — the correct hook for CssVarsProvider
  • Besigner: replace alpha() calls with CSS-variable channel rgba pattern
  • Themes: set colorSchemeSelector='class' to enable setMode() toggling
  • Besigner: fix ReferenceError — alpha was never imported in node-tree-view
  • Box styler: move alignItems/justifyContent to sx on Legend (MUI v9)
  • Box styler: move marginTop/marginBottom into sx on Legend (MUI v9)
  • Themes: use CSS var refs for mode-sensitive colors in tabs and canvas
  • Besigner: use CSS var refs in viewport-frame, accordion, drop-indicator
  • Forms: migrate inputProps/InputProps to slotProps (MUI v9)
  • Themes: fix dark-mode CSS vars for logos, box-styler, toggle button, and grid item warning
  • Console: move invalid DOM props into sx to silence React v19 warnings
  • UI components: exclude sx/ownerState from BackgroundImageComponent DOM forwarding
  • UI components: base BackgroundImageComponent on Box for component polymorphism
  • Console: use CSS var refs for palette in card and breadcrumb styles
  • Console: convert alpha badge colors to channel pattern in hosts page
  • Besigner ui: use CSS var refs for palette in breadcrumbs, outline, frame
  • Shared ui: use CSS var refs in loading modal, splash screen, nav bar
  • Shared ui: use CSS var refs in card-list-item and popper arrow
  • Besigner/forms: use CSS var refs in legend, color swatch, icon select
  • Patch: replace inputProps with slotProps.input in @data-driven-forms TextField
  • Console: replace @mui/lab LoadingButton with core Button
  • Patch: replace xs flat prop with size object in @data-driven-forms FormFieldGrid
  • Forms: replace flat xs/sm Grid props with size object in FormFieldGridProps
  • Besigner: use CSS var refs for value chip colors in ElementInfo
  • Besigner: flatten sx array in ElementInfo value chip to restore blue background
  • Besigner: pass all sx items into mergeSxProps directly to avoid nested array
  • Console: remove FormFieldGridProps from displayName field in host setup
  • Www: migrate flat xs/sm/md Grid item props to size object
  • Patch: replace flat Grid xs/item props with size object in sub-form
  • Themes: resolve MUI v6 type incompatibilities in vendor/mui.ts
  • UI components: remove stale rest.sx ref in NavigationView after sx destructure
  • Besigner ui color picker: extend ColorGridProps with StackProps
  • Shared ui jsx forms: replace removed onActionClick/renderItem props on CardListItem
  • Shared ui jsx forms: fix DDF useFieldApi type errors for MUI v6 form fields
  • Forms: use double cast for useFieldApi in SwitchComponent
  • Aglyn plugin mui: add StackWithFlexProps for MUI v6 Stack compatibility
  • Nextjs config: add SVGR webpack rule with svgo disabled for SVG icon imports
  • Shared svg icons: remove Apache license comment headers from SVG files
  • Webpack: exclude all SVG rules and bypass SVGO in SVGR loader
  • UI components: remove isAsyncMode re-export from react-is vendor barrel
  • Console: transpile @mui and @emotion packages to resolve ESM/CJS interop crash
  • Canvas: move makeAutoObservable after property assignments in AglynNode
  • Besigner ui: replace form onChange/onBlur with FormSpy auto-save for Select fields
  • Sites: replace match().length with RegExp.test() in middleware switch
  • Sites: pass object to getHost in host API route
  • Sites: scope getAllScreens query to the requested host
  • Sites: remove server-side canvas.setNodes and use useEffect for emitter
  • Shared util rest api: write to res in requireHeader instead of returning Response object
  • Www: write auth errors to res instead of returning Response object
  • Www: replace lru-cache maxAge with ttl for entry expiration
  • Www: return error response when form submission fails instead of always 200
  • Www: assign fbAdminApp when Firebase Admin is already initialized
  • Sites: fix toFirestore mutation and broken versionRef.get() in useScreen
  • Sites: stop mutating input in useScreenVersion toFirestore
  • Sites: guard against undefined hostId in HostProvider
  • Sites: rename shadowing locals in useModifyDocCallback
  • UI components: swap winX/winY in getOffset to correct element position
  • UI components: fix storage write-back loop guard in useLocalStorageItemState
  • UI components: remove rest args from useInterval effect deps
  • UI components: remove rest args from useTimeout effect deps
  • UI components: invert mounted guard in useTimeoutDelay start callback
  • UI components: fix delay priority logic in useTimeoutDelay start
  • UI components: spread refs as useMemo deps in useMergeRefs
  • UI components: onKeyUp in ZoomablePanningComponent called wrong prop callback
  • UI components: pass updated state to onContentDidMount in SandboxFrame
  • Besigner json editor: remove data from defaultValue sync effect deps
  • Besigner json editor: fix double-encoded str and pass parsed value to onSave
  • Besigner json editor: remove debug console.log from render body
  • Aglyn plugin mui: remove invalid 'paragraph' variant from Typography
  • Aglyn plugin mui: correct AppBar preset category and displayName
  • Aglyn plugin mui: rename AppBar import alias from Toolbar to AppBar
  • Aglyn plugin mui: use direction prop instead of sx.flexDirection in Stack presets
  • Core data app: call super.onDestroy() instead of super.onInitialize() in AglynModuleModel
  • Core data app: bind this when calling handleLoader from forEach
  • Core util app: fix lineal validation always bypassed due to wrong enum lookup
  • Core util app: use for...of instead of for...in when deleting child nodes
  • Core util app: fix reversed _hasOwnProperty arguments in canvas handlers
  • Core util app: use componentId field instead of \$id for parent accumulator seed
  • Core util app: use ||= to initialize nodes array in handleCanvasMoveElement
  • Core util app: fix off-by-one in history past array trim
  • Core feature renderer: fix wrong default export in use-aglyn-element-index-in-parent
  • Core feature renderer: swap store accessors in canvas element hooks
  • Core feature renderer: remove explicit value={undefined} from ElementsContext.Provider
  • Core data app: fix inverted error guard in setResolver, registerListener, trigger
  • Besigner data app: resolve appName before deleting from internal apps map
  • Besigner data app: prevent defaultsDeep from mutating options.defaults
  • Besigner data app: reuse nowItem in setCanvasItem instead of calling value() twice
  • Besigner data app: add equality guard to setDnd to prevent spurious emissions
  • Besigner data app: correct BESIGNER_SET_PANEL module augmentation to singular payload
  • Besigner feature canvas designer: fix Pikaso re-creation and missing cleanup
  • Besigner ui color picker: sync internal color state when colorProp changes
  • Besigner ui color picker: stop spreading rest props onto every nested Stack in ColorGrid
  • Besigner ui form fields: sync localValue and fix forwardRef shadow in ToggleButtonFormControl
  • Sites: strip \$id from toFirestore in useHostRef converter
  • Sites: strip \$id in toFirestore and avoid mutation in fromFirestore
  • Shared util rest api: send 405 instead of 404 for disallowed request methods
  • Shared ui snackstack: fix typo INSTRCUTED → INSTRUCTED in handleEntered
  • Shared feature fbserver: always assign fbAdminApp when Firebase is pre-initialized
  • Shared util tools: stop objectGetDeepProperty from mutating source object
  • Platform: getPreset was looking up this.schemas instead of this.presets
  • Platform: duplicateNode fallback index inserts before last instead of appending
  • Aglyn besigner: setPanel inverted guard made it a no-op
  • Aglyn besigner: deletePanel inverted guard prevented any deletion
  • Aglyn besigner: isPanelOpen checked panel existence not panel.open
  • Aglyn besigner: panelsById called Map.reduce which does not exist
  • Aglyn besigner: isValidLinealRelationship passed node \$id as componentId
  • Console: deleteScreen targeted root 'screens' collection instead of subcollection
  • Console: host setup basic form received Firebase doc() fn as initialValues
  • Console: buildRoute used strict null check, turning undefined keys into 'undefined'
  • Www: signUpForm and signInForm mapped emailField to the password slot
  • Www: formIsValid returned true when any single field was valid
  • Console: add missing MUI sub-packages to transpilePackages
  • Console: webpack config applied twice due to deepFillIn target priority
  • Sites: misleading debug log and invalid redirect URL in middleware
  • Console: nested <main> element inside <main> in DashboardLayout
  • Console: remove dead status variable and unreachable SplashScreen guard
  • Www: pass loading and onRowClick directly, not nested in DataGridProps
  • Core util app: swap swapped _hasOwnProperty args in utils.canvas.ts
  • Www: buildOption referenced undefined item variable instead of option param
  • Sites: listUsers page size was 5 instead of 1000
  • Console: listUsers page size was 5 instead of 1000
  • Shared util tools: arraySortByDeepProperty returned -1 instead of 0 for equal elements
  • Core util app: flag base values in InvalidLinealRelationFlag were not powers of 2
  • Shared util tools: function Object() { [native code] } in Normalized crashed when called without props
  • Shared util timestamp: reciprocal values in TimeExchange were computed by negating exponents
  • Shared util tools: numeronym kind param was silently ignored due to string enum reverse lookup
  • Platform: null guard in plugin manager fires after property dereference
  • Platform: remove debug console.log calls from canvas-manager
  • Platform: remove debug logs and test scaffold from canvas-manager-tree
  • Platform: remove module-level test scaffold from node.store
  • Shared data forms: remove regex delimiters from VALIDATE_LENGTH_RANGE
  • Core data admin: remove debug console.log from getAdminTenant
  • Core util app: remove debug console.log calls from canvas utils
  • Core feature singleton: remove debug console.log from singleton setup
  • Core data app: remove debug console.log calls from app controllers
  • Aglyn besigner: remove debug console.log calls from dnd-manager
  • UI components: remove debug console.log calls from hooks and components
  • Aglyn besigner ui: remove debug console.log calls from components and hooks
  • Aglyn plugin mui: remove debug console.log calls from plugin lifecycle
  • Shared ui jsx forms: replace subpath import with main barrel for besigner-ui-color-picker
  • Aglyn besigner ui: replace broken subpath imports with main barrel imports
  • Besigner ui box styler: use export type for Measurements re-export
  • Aglyn besigner ui: remove dead react-dnd code from use-leaf-drag and use-leaf-drop
  • Aglyn besigner ui: remove listItemClasses.selected which does not exist in mui v6
  • Core feature renderer: remove unimplemented Context.Provider missing value prop
  • Aglyn besigner ui: add missing initial value to useRef
  • Shared util tools: resolve implicit any and missing return type errors
  • Dependencies: add missing type declarations for untyped vendor packages
  • Shared data mdi: fix index-signature property access and absolute import path
  • Besigner json editor: add explicit type parameter to next/dynamic call
  • Aglyn besigner ui: replace removed Typography align prop with sx textAlign
  • Aglyn besigner ui: resolve miscellaneous type errors
  • UI components: fix implicit any and return type mismatch
  • Shared libraries: replace subpath imports with barrel imports across libs
  • Sites: fix subpath imports and missing barrel exports
  • Shared util tools: export IndexOf type and import it in createChainedFunction
  • Besigner ui box styler: use export type for Measurements re-export
  • UI components: replace console.log with console.warn in error catch blocks
  • Aglyn besigner: add type annotations to determineDropRegion parameters
  • Aglyn besigner: add type annotations to withinRegion parameters
  • Themes: override ToggleButton focus-visible style for dark mode
  • Aglyn besigner ui: observe element itself in ResizeObserver for overlay sync
  • Themes: fix ToggleButton selected state too dark in dark mode
  • Themes: guarantee ToggleButton focus/selected overrides reach CSS vars theme
  • Besigner ui: set FormControl color=secondary in InlineFormControl
  • Shared util dom: add explicit types to untyped guard and controller params
  • Shared util rest api: type initializeMiddleware params as any
  • UI components: add explicit types to getStyles, getOffset, getStyle, getPosition
  • Shared ui snackstack: type useEventCallback fn param
  • Core data admin: type compress/decompress value params as any
  • Platform: fix isolatedModules violation — export type UnistNode in ast.ts
  • Besigner ui form fields: replace MdiIcon subpath import with barrel import
  • App tenant: replace tenant-feature-instance subpath import with barrel import
  • Shared ui jsx forms: type RenderItemContent item and key params
  • Shared util dom: add missing types to PageTitleObject fields and setScreenNumber
  • UI components: type handleError destructured params in mui-shadow-dom
  • Shared ui snackstack: type SnackbarProps fields and event handler params
  • Sites: type useScreenVersionRef destructured params
  • UI components: add missing use-local-storage-item-state export to barrel
  • UI components: add missing ResizeableStack export to barrel
  • Core feature renderer: remove bogus string literal default export from barrel
  • Plugins ui mui: import MDI icon path constants from shared-data-mdi not shared-ui-jsx
  • Plugins ui mui: import mdiViewArray from shared-data-mdi not shared-ui-jsx
  • App www: import MDI icon paths from shared-data-mdi not shared-ui-jsx
  • Apps: split mixed MDI icon path imports from shared-data-mdi vs shared-ui-jsx
  • Aglyn besigner ui: type untyped params in buildOptions, withTabPanelInner, stylesSchema
  • Core ui renderer: type defaultRenderLeaf leaf param as LeafType
  • UI components: replace console.log with console.warn in use-local-storage-item-state
  • Platform: type require() calls and move platform to module-level
  • Apps: guard debug console.log behind !IS_PRODUCTION and use console.debug in middleware
  • UI components: type grid-list index param and dependencyManager BaseClass
  • Apps: type implicit-any params in a11yProps, getServerSideProps, Index, Contact, Loading
  • Apps: remove unguarded console.log debug statements from production code
  • Shared libraries: type implicit-any params in form utils and layout components
  • Aglyn besigner ui: replace invalid CSS outlineOffset number with string value
  • Apps console: remove redundant as-any casts on AuthErrorAlertComponent error prop
  • Apps tenant: type data accumulator objects in getAllUsers and getAllScreens
  • Shared ui snackstack: remove ts-ignore by typing context default and using ts-expect-error
  • Apps console: replace ts-ignore with proper window type cast for dev global
  • Shared libraries: replace ts-ignore with ts-expect-error and fix omitContainerKeys reduce typing
  • Apps: type users data array and simplify ElementsContext default
  • Shared libraries: remove redundant as-any casts in json-editor handleClose and class key generation
  • Aglyn besigner: type determineDropRegion regions param and DndManager dropRegion field
  • Shared util tools: type getFunctionComponentName, getWrappedComponentName, applyMixins params
  • Themes: type addShade, addShadeVariants params and responsiveFontSizesOptions
  • Shared libraries: narrow any to unknown in useAglynElementData, AglynAttributeSchema, ComponentPickerReject
  • UI components: type GetLayout initialProps param instead of any
  • Shared data mdi: type writeFile dir, fileName, contents params in icon generator script
  • Aglyn besigner ui: type TextAlignToggleButtonGroup and handleFormCancel params
  • Shared ui jsx forms: type handleClickAway and handleFocus event params
  • Aglyn besigner ui: type handleTabChange event and value params
  • Aglyn besigner ui: type component-picker handlers and guard fuse.js dynamic import errors
  • Besigner ui box styler: type handleChange and fix value/quantity state mismatch
  • Besigner ui box styler: type BoxButtonStyler editing state as boolean
  • Aglyn plugin mui: type load and destroy rest params
  • Core data app: type AglynModule load and destroy rest params
  • Core data app: type AglynBaseModel logger passthrough methods
  • UI components: type useNodeProperty node state and ref callback
  • UI components: type container/root state as ShadowRoot in shadow dom components
  • Aglyn besigner ui: type moreButton state as HTMLButtonElement
  • Shared ui snackstack: type rest params in handleClose, setAutoHideTimer, useEventCallback
  • UI components: type handler rest params in use-timeout and use-debounced-transition
  • UI components: guard localStorage.removeItem with try/catch in removeState
  • Aglyn besigner ui: type component-picker node map callback params
  • UI components: remove redundant double parens in setState calls
  • Sites: type useScreenRef and useHostRef destructured params
  • Build: resolve two shared-lib TS errors breaking all three Vercel apps
  • Shared util tools: correct createChainedFunction return type to match implementation
  • UI components: correct ShadowDomContext type and Portal container cast for ShadowRoot
  • UI components: cast offsetParent to Element after nodeType narrowing in use-element-position
  • UI components: cast generic node to JSX.Node in useNodeProperty return tuple
  • Themes: fix tonalOffset NaN bug when object form is passed, fix PaletteColor typing
  • Shared ui jsx forms: remove reference to nonexistent Icon.key property
  • UI components: correct GetLayout initialProps type to match NextPageGetLayoutFn signature
  • Besigner ui box styler: pass Measurement object to onChange instead of raw CSS string
  • Besigner json editor: use local stringified data state for Editor defaultValue
  • Aglyn besigner ui: fix broken preset color swatches and broaden field type
  • Apps silo: add missing @jsx and jest to tsconfig types array
  • Apps silo: fix wrong import path, dead field, and mistyped sample data
  • Apps www: replace broken deep-path re-exports in aglyn-deprecated with barrel imports
  • Apps www: update rate-limit middleware for lru-cache v10 named export and Options API
  • Apps www: rename NextMiddleware to Middleware per next-api-middleware API
  • Apps: widen users array type to object since toJSON() has no index signature
  • Apps console: remove dead presets field from sample component schema
  • Apps console: remove dead unused components and fix MUI x-data-grid GridColDef rename

Reverted

  • Themes: restore dark-mode primary color to original #2C3540
  • undo ToggleButton focus/selected theme override attempts

Changed

  • removed all rollups custom configs generated by ai
  • testing small fix and updated react-use due to vercel error
  • apply renderer improvements to aglyn-node-renderer
  • Shared ui: use mergeSxProps for all sx merges in NavigationView

Behind the scenes

  • added nx ci workflow
  • set up NX Cloud self-healing CI
  • set up NX Cloud self-healing CI
  • next dev automated file
  • testing whether removing verbose flag will show vercel error
  • trigger fresh Vercel build with corrected env var names
  • Shared data mdi: normalize generated MDI icon files
  • Shared ui: lint formatting in navigation-view
  • Update README.md

Share this article

The Aglyn Team

We're building the open web platform. Follow along as we ship — and tell us what you need.

Start building on Aglyn.

Free to start — design your first page and publish in minutes.