June 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
We're building the open web platform. Follow along as we ship — and tell us what you need.