@@ -38,32 +38,37 @@ const calcFactor = <T>(value: T | T[], breakpointIndex: number): T => {
3838}
3939
4040const parseGridNode = ( elements : HTMLCollection ) : GridNode [ ] => {
41- let index = 0
42- return Array . from ( elements ) . map ( ( element ) => {
41+ return Array . from ( elements ) . reduce ( ( buf , element ) => {
4342 const style = getComputedStyle ( element )
44- const origin = element . getAttribute ( 'data-origin-span' )
43+ const visible = ! ( style . display === 'none' )
44+ const origin = element . getAttribute ( 'data-grid-span' )
4545 const span = parseSpan ( style . gridColumnStart ) ?? 1
4646 const originSpan = Number ( origin ?? span )
4747 if ( ! origin ) {
48- element . setAttribute ( 'data-origin -span' , String ( span ) )
48+ element . setAttribute ( 'data-grid -span' , String ( span ) )
4949 }
50- const start = index
51- const end = ( index += span ) - 1
52- return {
53- start,
54- end,
50+ return buf . concat ( {
5551 span,
52+ visible,
5653 originSpan,
5754 element,
58- }
59- } )
55+ } )
56+ } , [ ] )
6057}
6158
6259const calcChildTotalColumns = ( nodes : GridNode [ ] ) =>
63- nodes . reduce ( ( buf , node ) => buf + node . span , 0 )
60+ nodes . reduce ( ( buf , node ) => {
61+ if ( ! node . visible ) return buf
62+ if ( node . originSpan === - 1 ) return buf + 1
63+ return buf + node . span
64+ } , 0 )
6465
6566const calcChildOriginTotalColumns = ( nodes : GridNode [ ] ) =>
66- nodes . reduce ( ( buf , node ) => buf + node . originSpan , 0 )
67+ nodes . reduce ( ( buf , node ) => {
68+ if ( ! node . visible ) return buf
69+ if ( node . originSpan === - 1 ) return buf + 1
70+ return buf + node . originSpan
71+ } , 0 )
6772
6873const calcSatisfyColumns = (
6974 width : number ,
@@ -95,12 +100,39 @@ const parseSpan = (gridColumnStart: string) => {
95100const factor = < T > ( value : T | T [ ] , grid : Grid < HTMLElement > ) : T =>
96101 isValid ( value ) ? calcFactor ( value as any , grid . breakpoint ) : value
97102
103+ const resolveChildren = ( grid : Grid < HTMLElement > ) => {
104+ let walked = 0 ,
105+ rowIndex = 0
106+ if ( ! grid . ready ) return
107+ grid . children = grid . children . map ( ( node ) => {
108+ if ( ! node . visible ) return node
109+ const columnIndex = walked % grid . columns
110+ const remainColumns = grid . columns - columnIndex
111+ const originSpan = node . originSpan
112+ const targetSpan = originSpan > grid . columns ? grid . columns : originSpan
113+ const span = targetSpan > remainColumns ? remainColumns : targetSpan
114+ const gridColumn =
115+ originSpan === - 1 ? `span ${ remainColumns } / -1` : `span ${ span } / auto`
116+ if ( node . element . style . gridColumn !== gridColumn ) {
117+ node . element . style . gridColumn = gridColumn
118+ }
119+ walked += span
120+ if ( columnIndex === 0 ) {
121+ rowIndex ++
122+ }
123+ node . row = rowIndex
124+ node . column = columnIndex + 1
125+ return node
126+ } )
127+ }
128+
98129export type GridNode = {
99- start ?: number
100- end ?: number
130+ visible ?: boolean
131+ column ?: number
132+ row ?: number
101133 span ?: number
102134 originSpan ?: number
103- element ?: Element
135+ element ?: HTMLElement
104136}
105137export class Grid < Container extends HTMLElement > {
106138 options : IGridOptions
@@ -258,15 +290,19 @@ export class Grid<Container extends HTMLElement> {
258290 this . width = rect . width
259291 this . height = rect . height
260292 }
261- this . options ?. onDigest ?.( this )
293+ resolveChildren ( this )
294+ if ( this . ready ) {
295+ this . options ?. onDigest ?.( this )
296+ }
262297 } )
263298 const mutationObserver = new MutationObserver ( digest )
264299 const resizeObserver = new ResizeObserver ( digest )
265300 resizeObserver . observe ( this . container )
266301 mutationObserver . observe ( this . container , {
267- attributeFilter : [ 'style' ] ,
302+ attributeFilter : [ 'style' , 'class' ] ,
268303 attributes : true ,
269304 childList : true ,
305+ subtree : true ,
270306 } )
271307 initialize ( )
272308 return ( ) => {
@@ -280,23 +316,11 @@ export class Grid<Container extends HTMLElement> {
280316 return ( ) => { }
281317 }
282318
319+ /**
320+ * @deprecated
321+ */
283322 calcGridSpan = ( span : number ) => {
284- if ( ! this . ready ) {
285- return span
286- }
287- if ( span === - 1 ) {
288- const prevOriginTotalColumns = this . childOriginTotalColumns - 1
289- const prevTotalColumns = this . childTotalColumns - 1
290- const remainTotalColumns = this . columns - prevOriginTotalColumns
291- const remainOriginTotalColumns = this . columns - prevTotalColumns
292- const minRemainTotalColumns = Math . max (
293- remainTotalColumns ,
294- remainOriginTotalColumns
295- )
296- if ( minRemainTotalColumns < 0 ) return 1
297- return minRemainTotalColumns > 0 ? minRemainTotalColumns : this . columns
298- }
299- return this . columns < span ? this . columns : span
323+ return span
300324 }
301325
302326 static id = ( options : IGridOptions = { } ) =>
0 commit comments