Install the extension gridelements and include it at Include static (from extensions). Create a folder fileadmin/templates/grids/ and add the files

<!-- section.html -->
<section class="{classesSection} {layout} frame-{frame-class} {f:if(condition: '{frame-space-before}', then: ' frame-space-before-{frame-space-before}', else: '')} {f:if(condition: '{frame-space-after}', then: ' frame-space-after-{frame-space-after}', else: '')}" id="{elementID}">
    <f:format.raw>{data.tx_gridelements_view_column_401}</f:format.raw>
</section>
<!-- /section.html -->
section.html
<!-- 1_col.html -->
<div class="{classesContainer} {layout} frame-{frame-class} {f:if(condition: '{frame-space-before}', then: ' frame-space-before-{frame-space-before}', else: '')} {f:if(condition: '{frame-space-after}', then: ' frame-space-after-{frame-space-after}', else: '')}" id="{elementID}">
    <div class="{classesRow}">
        <div class="{classesCol_1}">
            <f:format.raw>{data.tx_gridelements_view_column_401}</f:format.raw>
        </div>
    </div>
</div>
<!-- /1_col.html -->
1_col.html
<!-- 2_cols.html -->
<div class="{classesContainer} {layout} frame-{frame-class} {f:if(condition: '{frame-space-before}', then: ' frame-space-before-{frame-space-before}', else: '')} {f:if(condition: '{frame-space-after}', then: ' frame-space-after-{frame-space-after}', else: '')}" id="{elementID}">
    <div class="{classesRow}">
        <div class="{classesCol_1}">
            <f:format.raw>{data.tx_gridelements_view_column_401}</f:format.raw>
        </div>
        <div class="{classesCol_2}">
            <f:format.raw>{data.tx_gridelements_view_column_402}</f:format.raw>
        </div>
    </div>
</div>
<!-- /2_cols.html -->
2_cols.html
<!-- 3_cols.html -->
<div class="{classesContainer} {layout} frame-{frame-class} {f:if(condition: '{frame-space-before}', then: ' frame-space-before-{frame-space-before}', else: '')} {f:if(condition: '{frame-space-after}', then: ' frame-space-after-{frame-space-after}', else: '')}" id="{elementID}">
    <div class="{classesRow}">
        <div class="{classesCol_1}"><f:format.raw>{data.tx_gridelements_view_column_401}</f:format.raw></div>
        <div class="{classesCol_2}"><f:format.raw>{data.tx_gridelements_view_column_402}</f:format.raw></div>
        <div class="{classesCol_3}"><f:format.raw>{data.tx_gridelements_view_column_403}</f:format.raw></div>
    </div>
</div>
<!-- /3_cols.html -->
3_cols.html
<!-- 4_cols.html -->
<div class="{classesContainer} {layout} frame-{frame-class} {f:if(condition: '{frame-space-before}', then: ' frame-space-before-{frame-space-before}', else: '')} {f:if(condition: '{frame-space-after}', then: ' frame-space-after-{frame-space-after}', else: '')}" id="{elementID}">
    <div class="{classesRow}">
        <div class="{classesCol_1}"><f:format.raw>{data.tx_gridelements_view_column_401}</f:format.raw></div>
        <div class="{classesCol_2}"><f:format.raw>{data.tx_gridelements_view_column_402}</f:format.raw></div>
        <div class="{classesCol_3}"><f:format.raw>{data.tx_gridelements_view_column_403}</f:format.raw></div>
        <div class="{classesCol_4}"><f:format.raw>{data.tx_gridelements_view_column_404}</f:format.raw></div>
    </div>
</div>
<!-- /4_cols.html -->
4_cols.html
tt_content.gridelements_pi1.20.10.setup {


    section < lib.gridelements.defaultGridSetup
    section {
	cObject = FLUIDTEMPLATE
	cObject {
	    file = fileadmin/templates/grids/section.html
	    variables {
		classesSection = COA
		classesSection {
		    10 = LOAD_REGISTER
		    10 = TEXT
		    10.data = field:flexform_classesSection

		    20 = TEXT
		    20.stdWrap.dataWrap = {register:classesSection}

		    30 = RESTORE_REGISTER
		}
                elementID = TEXT
                elementID.field = uid
                elementID.wrap = grid-|

                layout = TEXT
                layout.field = layout
                layout.wrap = layout-|

                frame-class = TEXT
                frame-class.field = frame_class
                frame-space-before = TEXT
                frame-space-before.field = space_before_class
                frame-space-after = TEXT
                frame-space-after.field = space_after_class

	    }
	}

	wrap = |

    }

    one_col  < .section
    one_col {
	cObject = FLUIDTEMPLATE
	cObject {
	    file = fileadmin/templates/grids/1_col.html
	    variables {
		classesContainer = COA
		classesContainer {
		    10 = LOAD_REGISTER
		    10 = TEXT
		    10.data = field:flexform_classesContainer

		    20 = TEXT
		    20.stdWrap.dataWrap = {register:classesContainer}

		    30 = RESTORE_REGISTER
		}
		classesRow = COA
		classesRow {
		    10 = LOAD_REGISTER
		    10 = TEXT
		    10.data = field:flexform_classesRow

		    20 = TEXT
		    20.stdWrap.dataWrap = {register:classesRow}

		    30 = RESTORE_REGISTER
		}
		classesCol_1 = COA
		classesCol_1 {
		    10 = LOAD_REGISTER
		    10 = TEXT
		    10.data = field:flexform_classesCol_1

		    20 = TEXT
		    20.stdWrap.dataWrap = {register:classesCol_1}

		    30 = RESTORE_REGISTER
		}
	    }
	}

	wrap = |

    }

    two_cols < .one_col
    two_cols {
	cObject = FLUIDTEMPLATE
	cObject {
	    file = fileadmin/templates/grids/2_cols.html
	    variables < tt_content.gridelements_pi1.20.10.setup.one_col.cObject.variables
	    variables {
		classesCol_2 = COA
		classesCol_2 {
		    10 = LOAD_REGISTER
		    10 = TEXT
		    10.data = field:flexform_classesCol_2

		    20 = TEXT
		    20.stdWrap.dataWrap = {register:classesCol_2}

		    30 = RESTORE_REGISTER
		}
	    }
	}
    }

    three_cols < .two_cols
    three_cols {
	cObject = FLUIDTEMPLATE
	cObject {
	    file = fileadmin/templates/grids/3_cols.html
	    variables < tt_content.gridelements_pi1.20.10.setup.two_cols.cObject.variables
	    variables {
		classesCol_3 = COA
		classesCol_3 {
		    10 = LOAD_REGISTER
		    10 = TEXT
		    10.data = field:flexform_classesCol_3

		    20 = TEXT
		    20.stdWrap.dataWrap = {register:classesCol_3}

		    30 = RESTORE_REGISTER
		}
	    }
	}
    }

    four_cols < .three_cols
    four_cols {
	cObject = FLUIDTEMPLATE
	cObject {
	    file = fileadmin/templates/grids/4_cols.html
	    variables < tt_content.gridelements_pi1.20.10.setup.three_cols.cObject.variables
	    variables {
		classesCol_4 = COA
		classesCol_4 {
		    10 = LOAD_REGISTER
		    10 = TEXT
		    10.data = field:flexform_classesCol_4

		    20 = TEXT
		    20.stdWrap.dataWrap = {register:classesCol_4}
		    30 = RESTORE_REGISTER
		}
	    }
	}
    }

}
setup
tx_gridelements.setup {

    # section
    section {
        title = Section
	config {
	    colCount = 1
	    rowCount = 1
	    rows {
		1 {
		    columns {
			1 {
			    name = Content
				colPos = 401
			}
		    }
		}
	    }
	}
	# icon = EXT:nxbase/ext_icon.gif
	flexformDS (
	    <T3DataStructure>
		<meta>
		    <langDisable>1</langDisable>
		</meta>
		<ROOT type="array">
		    <type>array</type>
		    <el type="array">
                        <classesSection type="array">
			    <TCEforms type="array">
				<label>Class(es) for the section:</label>
				<config type="array">
				    <type>input</type>
				    <default></default>
				</config>
			    </TCEforms>
			</classesSection>
		    </el>
		</ROOT>
	    </T3DataStructure>
	)
    }
     # /section

    # one_col
    one_col {
	title = 1 column
	config {
	    colCount = 1
	    rowCount = 1
	    rows {
		1 {
		    columns {
			1 {
			    name = Content
				colPos = 401
			}
		    }
		}
	    }
	}
	# icon = EXT:nxbase/ext_icon.gif
	flexformDS (
	    <T3DataStructure>
		<meta>
		    <langDisable>1</langDisable>
		</meta>
		<ROOT type="array">
		    <type>array</type>
		    <el type="array">
                        <classesContainer type="array">
			    <TCEforms type="array">
				<label>Class(es) for container:</label>
				<config type="array">
				    <type>input</type>
				    <default>container</default>
				</config>
			    </TCEforms>
			</classesContainer>
                        <classesRow type="array">
			    <TCEforms type="array">
				<label>Class(es) for row:</label>
				<config type="array">
				    <type>input</type>
				    <default>row</default>
				</config>
			    </TCEforms>
			</classesRow>
			<classesCol_1 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 1</label>
				<config type="array">
				    <type>input</type>
				    <default>col-12</default>
				</config>
			    </TCEforms>
			</classesCol_1>
		    </el>
		</ROOT>
	    </T3DataStructure>
	)
    }
     # /one_col

    # two_cols
    two_cols {
	title = 2 columns
	config {
	    colCount = 2
	    rowCount = 1
	    rows {
		1 {
		    columns {
			1 {
			    name = Content left column
			    colPos = 401
			}
			2 {
			    name = Content right column
			    colPos = 402
			}
		    }
		}
	    }
	}
	# icon = EXT:nxbase/ext_icon.gif
	flexformDS (
	    <T3DataStructure>
		<meta>
		    <langDisable>1</langDisable>
		</meta>
		<ROOT type="array">
		    <type>array</type>
		    <el type="array">
                        <classesContainer type="array">
			    <TCEforms type="array">
				<label>Class(es) for container:</label>
				<config type="array">
				    <type>input</type>
				    <default>container</default>
				</config>
			    </TCEforms>
			</classesContainer>
			<classesRow type="array">
			    <TCEforms type="array">
				<label>Class(es) for row</label>
				<config type="array">
				    <type>input</type>
				    <default>row</default>
				</config>
			    </TCEforms>
			</classesRow>
			<classesCol_1 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 1</label>
				<config type="array">
				    <type>input</type>
				    <default>col-12 col-md-6</default>
				</config>
			    </TCEforms>
			</classesCol_1>
			<classesCol_2 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 2</label>
				<config type="array">
				    <type>input</type>
				    <default>col-12 col-md-6</default>
				</config>
			    </TCEforms>
			</classesCol_2>
		    </el>
		</ROOT>
	    </T3DataStructure>
	)
    }
    # /two_cols
	
    # three_cols
    three_cols {
	title = 3 columns
	config {
	    colCount = 3
	    rowCount = 1
	    rows {
		1 {
		    columns {
			1 {
			    name = Content left column
			    colPos = 401
			}
			2 {
			    name = Content middle column
			    colPos = 402
			}
			3 {
			    name = Content right column
			    colPos = 403
			}
		    }
		}
	    }
	}
	# icon = EXT:nxbase/ext_icon.gif
	flexformDS (
	    <T3DataStructure>
		<meta>
		    <langDisable>1</langDisable>
		</meta>
		<ROOT type="array">
		    <type>array</type>
		    <el type="array">
                        <classesContainer type="array">
			    <TCEforms type="array">
				<label>Cass(es) for container:</label>
				<config type="array">
				    <type>input</type>
				    <default>container</default>
				</config>
			    </TCEforms>
			</classesContainer>
                        <classesRow type="array">
			    <TCEforms type="array">
				<label>Class(es) for row:</label>
				<config type="array">
				    <type>input</type>
				    <default>row</default>
				</config>
			    </TCEforms>
			</classesRow>
			<classesCol_1 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 1</label>
				<config type="array">
				    <type>input</type>
				    <default>col-4</default>
				</config>
			    </TCEforms>
			</classesCol_1>
			<classesCol_2 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 2</label>
				<config type="array">
				    <type>input</type>
				    <default>col-4</default>
				</config>
			    </TCEforms>
			</classesCol_2>
			<classesCol_3 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 3</label>
				<config type="array">
				    <type>input</type>
				    <default>col-4</default>
				</config>
			    </TCEforms>
			</classesCol_3>
		    </el>
		</ROOT>
	    </T3DataStructure>
	)
    }
    # /three_cols

    # four_cols
    four_cols {
	title = 4 columns
	config {
	    colCount = 4
	    rowCount = 1
	    rows {
		1 {
		    columns {
			1 {
			    name = Content column 1
			    colPos = 401
			}
			2 {
			    name = Content column 2
			    colPos = 402
			}
			3 {
			    name = Content column 3
			    colPos = 403
			}
			4 {
			    name = Content column 4
			    colPos = 404
			}
		    }
		}
	    }
	}
	# icon = EXT:nxbase/ext_icon.gif
	flexformDS (
	    <T3DataStructure>
		<meta>
		    <langDisable>1</langDisable>
		</meta>
		<ROOT type="array">
		    <type>array</type>
		    <el type="array">
                        <classesContainer type="array">
			    <TCEforms type="array">
				<label>Class(es) for container:</label>
				<config type="array">
				    <type>input</type>
				    <default>container</default>
				</config>
			    </TCEforms>
			</classesContainer>
                        <classesRow type="array">
			    <TCEforms type="array">
				<label>Class(es) for row:</label>
				<config type="array">
				    <type>input</type>
				    <default>row</default>
				</config>
			    </TCEforms>
			</classesRow>
			<classesCol_1 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 1</label>
				<config type="array">
				    <type>input</type>
				    <default>col-3</default>
				</config>
			    </TCEforms>
			</classesCol_1>
			<classesCol_2 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 2</label>
				<config type="array">
				    <type>input</type>
				    <default>col-3</default>
				</config>
			    </TCEforms>
			</classesCol_2>
			<classesCol_3 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 3</label>
				<config type="array">
				    <type>input</type>
				    <default>col-3</default>
				</config>
			    </TCEforms>
			</classesCol_3>
			<classesCol_4 type="array">
			    <TCEforms type="array">
				<label>Class(es) for column 4</label>
				<config type="array">
				    <type>input</type>
				    <default>col-3</default>
				</config>
			    </TCEforms>
			</classesCol_4>
		    </el>
		</ROOT>
	    </T3DataStructure>
	)
    }
    # /four_cols
		
}
page ts