NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
TypeScript/JS lib for dashboard layout and creation, responsive, mobile support, no external dependencies, with many wrappers (React, Angular, Vue, Ember, knockout...)
Last release 23 days ago
21 Sep 2026
Release timing varies
gaps range from 9 days to 4 months
Nearly every release is documented
notes for 58 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
141 releases · first in 2015
2 BIG changes - new mode?: 'top' | 'float' | 'list' | 'compact' replacing old float:boolean , and cellHeight:'fill' to make rows take entire fixed siz
2 BIG changes - new mode?: 'top' | 'float' | 'list' | 'compact' replacing old float:boolean, and cellHeight:'fill' to make rows take entire fixed size grid.
mode?: 'top' | 'float' | 'list' | 'compact' - items are continuously re-flowed in sequential (row-major) order, like a re-orderable list: dragging, resizing, adding or removing an item re-flows everyone else instead of pushing them down, and dropping an item on another takes its place. See newcellHeight: 'fill' - rows divide the container height. See new 'fill' optionOne column per quarter.
feat: #2781 #2781 mobile: pause to drag/reszie vs scroll behavior
PrintOptions.breakInside and .gs-print-avoid-break-after so section (nested grids) and tables can fragment across pagesmoveBefore() instead of appendChild() in _sortDom() so reordering doesn't reload iframesacceptWidgetsfeat: #701 removed printMode as we support much better printing now that doesn't compromise.
printMode as we support much better printing now that doesn't compromise.PrintOptions.mode for app custom settingsreg: #3340 regression: strict mode (v13.0.0) fails columnWidth without .breakpoints - thank you Daniel Cohen Gindi
feat: #3336 printMode?: 'flow' | 'exact' to support 2 very differenrt options due to browser bug. uddated demos to showcase one vs the other (and mode
feat: #701 major printing support for grids using PrintOptions (pageBreak, hide, orientation, ...)
reg: #3340 regression: strict mode (v13.0.0) fails columnWidth without .breakpoints - thank you Daniel Cohen Gindi
fix: #3324 vue files missing from package
NEW: React wrapper: re-did to follow the Angular pattern (drag&Drop between grid doesn't destroy content), events, lazyLoad support, fix memory leak,
navigator.maxTouchPoints > 0 now returning true on desktop (macOS trackpad)name = input<string>()feat: #3250 full RTL support - thank you Daniel Cohen Gindi
fix: #3237 updateOptions() fixes for columnOpts, maxRow. load() not cloning
regression: #3214 touch device with real mouse event fix (caused by #3191 in last release)
feat: #3104 Custom resize div element target - thank you Marvin Heilemann
updateOption() update lazyLoadlayoutsNodesChange()DO NOT USE 12.4.0 as missing some export like 12.3.3, which was fixed in this release
Nothing published for this version
fix: #3139 Utils:removeInternalForSave() to skip arrays
fix: #3136 more tweaks to save(columnCount) option.
fix: #2493 added save(columnCount) option. Nested grid now use container saved column count.
feat: #3047 added .grid-stack-dragging to grid when child is being dragged so we can set cursor:grabbing . Updated demo.
feat: #3047 added .grid-stack-dragging to grid when child is being dragged so we can set cursor:grabbing . Updated demo.
feat: now using typedoc to generate doc (HTML and markup) from code. improved code examples and comments.
fix: #3099 scroll take into account ScrollContainer position
fix: #3102 React demo now support multiple grids
fix: #3021 correctly reset widget back (to last known position) when released outside
fix: #3070 incorrect property name 'sizeToContent' when cleaning up invalid attributes
fix: #3070 incorrect property name 'sizeToContent' when cleaning up invalid attributes
fix: #3077 incorrect node._id check
fix: #3054 Avoid reflows via explicitly setting minRow
fix: #3085 opts.minRow being updated
fix: #3064 fix GridStack.updateCB(w) crash
feat: #3061 added GridStack.updateCB(w) that gets called after a widget has been updated (eg: load() after initial layout) instead of created
fix #3043 fix opts.animate again
fix #3043 fix opts.animate again
fix #3048 nested grid resizeToContentCBCheck() fix
fix #3038 updateOptions() fix opts.minRow being undefined
feat #2671 subgrid now propagate events to topmost grid. Use el.gridstackNode.grid to know which (sub) grid.
feat #2671 subgrid now propagate events to topmost grid. Use el.gridstackNode.grid to know which (sub) grid.
fix #3028 updateOptions() no longer modifies passed in struct. only field we check are being handled too.
fix #3029 resizeToContent() fix for nested grid with content above
fix #3030 resizeToContentCheck() wasn't blocking _ignoreLayoutsNodeChange at end of the loop
rem #3022 removed ES5 support (IE doesn't support CSS vars needed now)
rem #3027 remove legacy code support for disableOneColumnMode, oneColumnSize, oneColumnModeDomSort
feat: #2854 Removed dynamic stylesheet and migrated to CSS vars. Thank you lmartorella
feat: #2854 Removed dynamic stylesheet and migrated to CSS vars. Thank you lmartorella
feat: #3013 columns no longer require custom classes nor gridstack-extra.css as we now use CSS vars.
fix: #2978 Very slow operation in 11.2.0 and higher with large blocks
fix: #2947 loading responsive layout:'list' into smaller screen doesn't layout correctly.
revert: #2981 Locked was incorrectly changed. fixed doc instead
feat: #2975 prepareDragDrop(el, force) option to force re-creation of the drag&drop event binding
feat: #2975 prepareDragDrop(el, force) option to force re-creation of the drag&drop event binding
feat: #2989 new updateOptions(o: GridStackOptions) to update PARTIAL list of options after grid as been created
fix: #2980 dd-touch circular dependency
fix: #2667 sidebar items not honoring gs-w (enter-leave-re-enter)
fix: #2987 gs-size-to-content to support numbers
fix: #2981 Locked not working as expected
fix: #2921 replace initMouseEvent with MouseEvent constructor and added composed: true
fix: #2921 replace initMouseEvent with MouseEvent constructor and added composed: true
fix: #2939 custom drag handle not working with LazyLoad
fix: #2955 angular circular dependency
fix: #2951 shadow DOM dragging re-appending fix
fix: #2964 minW larger than column fix
feat: #2965 internal _prepareDragDropByNode(n) is now public as prepareDragDrop(el) so Angular, React, and others can call once the DOM content elements have been added (the outside grid item divs are always created before content)
break: #2959 Util.createWidgetDivs() has moved to GridStack.createWidgetDivs() to remove circular dependencies
feat: added isIgnoreChangeCB() if changeCB should be ignored due to column change, sizeToContent, loading, etc...
feat: added isIgnoreChangeCB() if changeCB should be ignored due to column change, sizeToContent, loading, etc...
feat: added responsive_none.html demo and fixed layout:'none' to bound check the layout (no-op unless it must change)
feat: #2695 'Esc' to cancel now works on sidebar external items, also works dragging over trash.
feat: #2695 'Esc' to cancel now works on sidebar external items, also works dragging over trash.
feat: #2852 better React example. Thank you CNine
fix: #2852 grid in tabs correctly handles CSS. Thank you Luciano Martorella
fix: #2900 use attr data-gs-widget instead of gridstacknode (supported as well for backward compatibility)
fix: #2877 angular wrapper uses standalone, while now being compatible down to ng14. thanks to andre-steudel
fix: #2877 angular wrapper uses standalone, while now being compatible down to ng14. thanks to andre-steudel
fix: #2886 added gs-size-to-content support
fix: #2887 mobile nested grid TypeError: e.currentTarget is null
fix: #2878 make sure sub-grid inherit parent opts by default, with subgrid defaults.
fix: #2878 make sure sub-grid inherit parent opts by default, with subgrid defaults.
fix: #2879 sub-grid item sizeToContent:true now handle content above/below sub grid.
feat: #2864 added GridStackOptions.layout for nested grid reflow during resize. default to 'list'.
feat: #2864 added GridStackOptions.layout for nested grid reflow during resize. default to 'list'.
fix: #2859 re-enabled tests and fix numerous issues found (see CL). Also thank you Luciano Martorella for getting me going and starting it.
fix: #2851 added support for custom max layout saving - Thank you Luciano Martorella
fix: #2492 loading same layout with overlapping widget fix. v10.3.0 regression.
fix: #2834 v11 angular missing package.json
fix: #2834 v11 angular missing package.json
fix: #2835 make sure we have unique USER id
feat: #2826 Lazy loading of widget content until visible ( GridStackOptions.lazyLoad and GridStackWidget.lazyLoad )
feat: #2826 Lazy loading of widget content until visible ( GridStackOptions.lazyLoad and GridStackWidget.lazyLoad )
feat: #2818 support for Angular Component hosting true sub-grids (that size according to parent) without requring them to be only child of grid-item-content.
fix: #2231 , #1840 , #2354 big overall to how we do sidepanel drag&drop helper. see release notes.
fix: #2736 safe practices around GridStackWidget.content no longer setting innerHTML
fix: #2741 resizeToContent JS error with nested grid
fix: #2734 rotate() JS error
fix: #2741 resizeToContent JS error with nested grid
fix: #2740 nested grid drag fix
fix: #2730 resizing left from right most item works
fix: #2327 remove dataTransfer mention as not supported
fix: #2720 load() now creates widgets in order (used to be reverse due to old collision code)
fix: #2683 check for fixed grid maxRow during resize
fix: #2683 check for fixed grid maxRow during resize
fix: #2694 prevent 'r' rotation to items that can't resize (locked, noResize, fixed sizes)
fix: #2709 support for multiple drag targets - Thank you nickfulcher
fix: #2669 load() sometimes restore incorrectly
feat: #2682 You can now press 'Esc' to cancel a move|resize, 'r' to rotate during a drag. added GridStack.rotate() as well - Thank you John B. for thi
feat: #2682 You can now press 'Esc' to cancel a move|resize, 'r' to rotate during a drag. added GridStack.rotate() as well - Thank you John B. for this feature sponsor.
fix: #2672 dropping into full grid JS error
fix: #2676 handle minW resizing when column count is less
fix: #2677 allow button as handle dragging
fix: #2628 removeAll() does not trigger Angular's ngOnDestroy
fix: #2628 removeAll() does not trigger Angular's ngOnDestroy
fix: #2503 Drag and drop a widget on top of a locked widget - Thank you JakubEleniuk
fix: #2584 wrong sort order during 1 column resize - Thank you JakubEleniuk again.
fix: #2639 load() with mix of new item without coordinates
fix: #2633 Drop into full grid causes crash
fix: #2559 changed angular demos (support 1 column)
fix: #2453 recreated grid trash issue
fix: #2620 allow resizing with sizeToContent:NUMBER is uses
feat: #2574 Allow cell height in cm and mm units
feat: #2574 Allow cell height in cm and mm units
feat: #2578 allow different scaling between drag toolbar and grid
fix: #2577 ui-resizable-s/-n style fix
fix: #2576 column('none') now ignores layouts
fix: #2560 nested grid fix (enter can call leave which can call enter again) - Thank you v1talii-dev
fix: #2596 prevent SSR crash
fix: #2610 using passive:true for mousemove events
fix: #2612 restrict vertical resize if sizeToContent:true
demo: nested.htm now has nested create and drag&drop example - Thank you fredericrous
fix: #2552 DOM init doesn't sizeToContent
fix: #2552 DOM init doesn't sizeToContent
fix: #2561 issues with sizeToContent animation, cleanup, etc...
fix: #2427 sizeToContent supports rem/em cell height
fix: #2558 remove style node in shadow root
fix: #2556 make sure 'new GridStack(el)' set el.gridstack=this right away
cleanup: #2550 Optimize resize arrow (~88% lighter from 1.82 KB to 225B)
feat #2542 we now support much richer responsive behavior with GridStackOptions.columnOpts including any breakpoint width:column pairs, or automatic c
feat #2542 we now support much richer responsive behavior with GridStackOptions.columnOpts including any breakpoint width:column pairs, or automatic column sizing.
disableOneColumnMode , oneColumnSize , oneColumnModeDomSort have been removed (see v10 migration doc)
fix #2525 Fixed unhandled exception happening in _mouseMove handler
fix #2525 Fixed unhandled exception happening in _mouseMove handler
fix potential crash in resizeToContentCheck() if grid gets deleted by the time the delay happens
fix #2527 Incorrect layout on grid load in one column mode
fix #2496 animation on init, introduced in 8.1.1
feat #1275 div scale support - Thank you elmehdiamlou for implementing this teh right way (add scale to current code)
feat #1275 div scale support - Thank you elmehdiamlou for implementing this teh right way (add scale to current code)
fix #2489 moved the dropped event handler to after doing everything (no more setTimeout) - Thanks arnoudb for suggesting a fix.
fix #2497 Utils.parseHeight() fix
fix column(1) to not restore if disableOneColumnMode on size change
revert #2263 div scale support - causing too many issues for now (#2498 #2491)
revert #2263 div scale support - causing too many issues for now (#2498 #2491)
fix #2492 calling load() allows overlapping widgets
fix #1275 div scale support - Thank you VincentMolinie for implementing this
fix - sub-grid styles now look for immediate correct parent, not any depth above.
fix - sub-grid styles now look for immediate correct parent, not any depth above.
fix #2469 "Invalid height" error CSS minHeight
fix #2394 nested grid size issue when sub-items moved up/down
fix _updateContainerHeight() to use height rather than min-height again (apart for nested grids which need it) and partial getComputedStyle CSS minHei
feat: nested grids now support sizeToContent to size themselves to how many sub items they contain - Thank you @Helix for sponsoring this!
feat: nested grids now support sizeToContent to size themselves to how many sub items they contain - Thank you @Helix for sponsoring this!
fix #2449 full grid maxRow fix
fix #2435 directionCollideCoverage() tweaks
fix #2435 directionCollideCoverage() tweaks
fix resizeToContent() to handle node.h (using when cellHeight changes or we resize) vs DOM sizing (rest of the time)
renamed fitToContent to sizeToContent (API BREAK)
renamed fitToContent to sizeToContent (API BREAK)
feat: sizeToContent now supports being boolean|number to limit the height but user can resize past that, unlike maxH.
feat: resizeToContentParent now on GridStackWidget for those widgets that need to resize differently.
fix 'resizecontent' event fix not called.
fix 'resizecontent' event fix not called.
partial fix #2427 sizeToContent when calling cellHeight()/addWidget()/MakeWidget()
fix #2413 support touchscreen+mouse devices. Thank you @Ruslan207
fix #2413 support touchscreen+mouse devices. Thank you @Ruslan207
tweak to sizeToContent from #2412 . Thank you @JonSohn
feat #404 added GridStackOptions.sizeToContent and GridStackWidget.sizeToContent to make gridItems size themselves to their content (no scroll bar), c
feat #404 added GridStackOptions.sizeToContent and GridStackWidget.sizeToContent to make gridItems size themselves to their content (no scroll bar), calling GridStack.resizeToContent(el) whenever the grid or item is resized.
also added new 'resizecontent' event, and resizeToContentCB and resizeToContentParent vars.
fix #2406 inf loop when autoPosition after loading into 1 column, then 2.
feat #2378 attribute DDRemoveOpt.decline to deny the removal of a specific class.
feat #2378 attribute DDRemoveOpt.decline to deny the removal of a specific class.
fix: dragging onto trash now calls removeWidget() and therefore GridStack.addRemoveCB (for component cleanup)
feat: load() support re-order loading without explicit coordinates ( autoPosition or missing x,y ) uses passed order.
feat #2358 column(N, 'list'|'compact'|...) resizing now support reflowing content as list
fix #2349 grid NoMove vs item NoMove support
fix #2349 grid NoMove vs item NoMove support
fix #2352 .ui-draggable-dragging z-index for modal dialogs
fix #2357 NaN inf loop when using cellHeight rem/em
fix #2354 max-w cloning issue fix
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →