# Templates and Design

<p class="callout info">The Templates and Design module allows administrators to heavily customize the visual functionality and branding of the User Portal. Its primary purpose is to structure the visual layout around your core page content, ensuring the portal accurately reflects your corporate branding and provides a seamless user experience. This article is intended for OPS-COM administrators.</p>

## Setup and Configuration

Configuring your portal's design involves creating a foundational layout and then building specific templates within that layout.

**Admin Side:**

### Creating a Layout

1. Hover over **[System Configuration](https://opscom.wiki/books/setup-configuration-for-admins/chapter/system-configuration)** and click **[Templates and Design](https://opscom.wiki/books/setup-configuration-for-admins/page/templates-and-design)**.
2. Click the **Create Layout** button located at the top right of the page.
3. Enter a descriptive name for your new layout in the provided field.
4. Click the **Save Changes** button. The layout will now appear in your Layouts list.
5. Click the **Non-Default** drop-down menu and select **Default** if you wish to make this the active layout for your system.

### Creating Templates

1. Hover over **[System Configuration](https://opscom.wiki/books/setup-configuration-for-admins/chapter/system-configuration)** and click **[Templates and Design](https://opscom.wiki/books/setup-configuration-for-admins/page/templates-and-design)**.
2. Click **Toggle Templates** next to your newly created layout to display its available templates.
3. Click the **Create** button to begin adding specific section templates to the layout, including bilingual support for English and French.

**User Side:** End-users do not interact with the setup of templates. They will simply view the customized layout when navigating the User Portal to register, add vehicles, purchase permits, or pay violations.

## Using this Feature

The OPS-COM User Portal is split into specific visual sections using templates. All core text content is added through **[Pages and Content Blocks](https://opscom.wiki/books/setup-configuration-for-admins/page/pages-and-content-blocks)**, while templates wrap around that content to provide styling and structure.

### Template Sections

- **Header:** The top of your page containing the header image, logos, and primary user navigation.
- **Content\_Header:** An upper section to place content, such as alerts or user information, before the main body.
- **Content:** The core content of your pages. This cannot be added from the templates module and requires you to navigate to the system messaging tools.
- **Content\_Footer:** A lower section appearing after the core content. You can use this to display subsequent alerts, messages, or additional context.
- **Footer:** The bottom of your page used to advertise important information, provide contact details, or display software versioning.

### Available Actions &amp; Buttons

- **Toggle Templates:** Click this button to instantly display all of the section templates currently attached to a specific layout.
- **Edit:** Click this button next to a layout or section name to modify its details and source code.
- **Archive:** Click this button to safely retire a layout that you are no longer using without permanently deleting its history.

### Default System Templates

If you adjust the scripts and styles to the point of breaking your site, or you are unsure what your changes have done, you can refer to the default templates below to quickly restore your page's functionality and style.

**Default Script Template**

<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="25282dd3-8bd2-43a2-8172-07e830e44191" data-macro-name="code" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9-"><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark js expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9--1"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div><div class="line number11 index11 alt2">11</div><div class="line number12 index12 alt1">12</div><div class="line number13 index13 alt2">13</div><div class="line number14 index14 alt1">14</div><div class="line number15 index15 alt2">15</div><div class="line number16 index16 alt1">16</div><div class="line number17 index17 alt2">17</div><div class="line number18 index18 alt1">18</div><div class="line number19 index19 alt2">19</div><div class="line number20 index20 alt1">20</div><div class="line number21 index21 alt2">21</div><div class="line number22 index22 alt1">22</div><div class="line number23 index23 alt2">23</div><div class="line number24 index24 alt1">24</div><div class="line number25 index25 alt2">25</div><div class="line number26 index26 alt1">26</div><div class="line number27 index27 alt2">27</div><div class="line number28 index28 alt1">28</div><div class="line number29 index29 alt2">29</div><div class="line number30 index30 alt1">30</div><div class="line number31 index31 alt2">31</div><div class="line number32 index32 alt1">32</div><div class="line number33 index33 alt2">33</div><div class="line number34 index34 alt1">34</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<script>`</div><div class="line number1 index1 alt2">`    ``$(``function``(){`</div><div class="line number2 index2 alt1">`        ``$.fn.shuffle = ``function``() {`</div><div class="line number3 index3 alt2"> </div><div class="line number4 index4 alt1">`            ``var` `allElems = ``this``.get(),`</div><div class="line number5 index5 alt2">`                ``getRandom = ``function``(max) {`</div><div class="line number6 index6 alt1">`                    ``return` `Math.floor(Math.random() * max);`</div><div class="line number7 index7 alt2">`                ``},`</div><div class="line number8 index8 alt1">`                ``shuffled = $.map(allElems, ``function``(){`</div><div class="line number9 index9 alt2">`                    ``var` `random = getRandom(allElems.length),`</div><div class="line number10 index10 alt1">`                        ``randEl = $(allElems[random]).clone(``true``)[0];`</div><div class="line number11 index11 alt2">`                    ``allElems.splice(random, 1);`</div><div class="line number12 index12 alt1">`                    ``return` `randEl;`</div><div class="line number13 index13 alt2">`                ``});`</div><div class="line number14 index14 alt1"> </div><div class="line number15 index15 alt2">`            ``this``.each(``function``(i){`</div><div class="line number16 index16 alt1">`                ``$(``this``).replaceWith($(shuffled[i]));`</div><div class="line number17 index17 alt2">`            ``});`</div><div class="line number18 index18 alt1"> </div><div class="line number19 index19 alt2">`            ``return` `$(shuffled);`</div><div class="line number20 index20 alt1"> </div><div class="line number21 index21 alt2">`        ``};`</div><div class="line number22 index22 alt1">`        ``$(``'#slideshow-header div'``).shuffle();`</div><div class="line number23 index23 alt2">`        ``$(``"#slideshow-header > div:gt(0)"``).hide();`</div><div class="line number24 index24 alt1"> </div><div class="line number25 index25 alt2">`        ``setInterval(``function``() {`</div><div class="line number26 index26 alt1">`            ``$(``'#slideshow-header > div:first'``)`</div><div class="line number27 index27 alt2">`                ``.fadeOut(1000)`</div><div class="line number28 index28 alt1">`                ``.next()`</div><div class="line number29 index29 alt2">`                ``.fadeIn(1000)`</div><div class="line number30 index30 alt1">`                ``.end()`</div><div class="line number31 index31 alt2">`                ``.appendTo(``'#slideshow-header'``);`</div><div class="line number32 index32 alt1">`        ``},  10000);`</div><div class="line number33 index33 alt2">`    ``});`</div><div class="line number34 index34 alt1">`</script>`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="7f85a1ef-2387-40fd-a9b4-a9103778ab02" data-macro-name="code" id="bkmrk-default-style-templa"><div class="codeHeader panelHeader pdl hide-border-bottom">**Default Style Template**<span class="collapse-source expand-control"><span class="expand-control-icon icon expanded"> </span></span></div><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark css expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9--2"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div><div class="line number11 index11 alt2">11</div><div class="line number12 index12 alt1">12</div><div class="line number13 index13 alt2">13</div><div class="line number14 index14 alt1">14</div><div class="line number15 index15 alt2">15</div><div class="line number16 index16 alt1">16</div><div class="line number17 index17 alt2">17</div><div class="line number18 index18 alt1">18</div><div class="line number19 index19 alt2">19</div><div class="line number20 index20 alt1">20</div><div class="line number21 index21 alt2">21</div><div class="line number22 index22 alt1">22</div><div class="line number23 index23 alt2">23</div><div class="line number24 index24 alt1">24</div><div class="line number25 index25 alt2">25</div><div class="line number26 index26 alt1">26</div><div class="line number27 index27 alt2">27</div><div class="line number28 index28 alt1">28</div><div class="line number29 index29 alt2">29</div><div class="line number30 index30 alt1">30</div><div class="line number31 index31 alt2">31</div><div class="line number32 index32 alt1">32</div><div class="line number33 index33 alt2">33</div><div class="line number34 index34 alt1">34</div><div class="line number35 index35 alt2">35</div><div class="line number36 index36 alt1">36</div><div class="line number37 index37 alt2">37</div><div class="line number38 index38 alt1">38</div><div class="line number39 index39 alt2">39</div><div class="line number40 index40 alt1">40</div><div class="line number41 index41 alt2">41</div><div class="line number42 index42 alt1">42</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<style>`</div><div class="line number1 index1 alt2">`  ``body {`</div><div class="line number2 index2 alt1">`    ``background``: ``black` `url``(/uploads/FILES/OC_TOMA/parking-deck.jpg) ``center` `center``;`</div><div class="line number3 index3 alt2">`    ``background-``size``: cover;`</div><div class="line number4 index4 alt1">`    ``background-attachment``: ``fixed``;`</div><div class="line number5 index5 alt2">`    ``color``: ``#FFF``;`</div><div class="line number6 index6 alt1">`  ``}`</div><div class="line number7 index7 alt2">`  ``.card, .modal, .list-group-item {`</div><div class="line number8 index8 alt1">`    ``color``: ``#333``;`</div><div class="line number9 index9 alt2">`  ``}`</div><div class="line number10 index10 alt1">`  ``.slideshow-header {`</div><div class="line number11 index11 alt2">`    ``position``:``relative``;`</div><div class="line number12 index12 alt1">`  ``}`</div><div class="line number13 index13 alt2">`  ``.slideshow-header .slides {`</div><div class="line number14 index14 alt1">`    ``z-index``: ``0``;`</div><div class="line number15 index15 alt2">`    ``position``:``absolute``;`</div><div class="line number16 index16 alt1">`    ``top``:``0px``;`</div><div class="line number17 index17 alt2">`    ``left``:``0px``;`</div><div class="line number18 index18 alt1">`    ``right``:``0px``;`</div><div class="line number19 index19 alt2">`    ``bottom``:``0px``;`</div><div class="line number20 index20 alt1">`    ``display``:flex;`</div><div class="line number21 index21 alt2">`    ``align-items: ``center``;`</div><div class="line number22 index22 alt1">`    ``justify-``content``: ``center``;`</div><div class="line number23 index23 alt2">`  ``}`</div><div class="line number24 index24 alt1">`  ``.slideshow-header .overlay {`</div><div class="line number25 index25 alt2">`    ``z-index``: ``1``;`</div><div class="line number26 index26 alt1">`    ``position``:``relative``;`</div><div class="line number27 index27 alt2">`  ``}`</div><div class="line number28 index28 alt1">`  ``#slideshow-header {`</div><div class="line number29 index29 alt2">`    ``overflow``: ``hidden``;`</div><div class="line number30 index30 alt1">`    ``opacity:``0.8``;`</div><div class="line number31 index31 alt2">`    ``box-shadow: ``0` `0` `20px` `rgba(``0``, ``0``, ``0``, ``0.4``);`</div><div class="line number32 index32 alt1">`  ``}`</div><div class="line number33 index33 alt2"> </div><div class="line number34 index34 alt1">`  ``#slideshow-header > div {`</div><div class="line number35 index35 alt2">`    ``width``:``100%``;`</div><div class="line number36 index36 alt1">`    ``position``: ``absolute``;`</div><div class="line number37 index37 alt2">`  ``}`</div><div class="line number38 index38 alt1"> </div><div class="line number39 index39 alt2">`  ``#slideshow-header div img {`</div><div class="line number40 index40 alt1">`    ``width``: ``100%``;`</div><div class="line number41 index41 alt2">`  ``}`</div><div class="line number42 index42 alt1">`</style>`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="af804e06-34ed-4274-bf51-205e34a144ce" data-macro-name="code" id="bkmrk-default-header-templ"><div class="codeHeader panelHeader pdl hide-border-bottom">**Default Header Template**<span class="collapse-source expand-control"><span class="expand-control-icon icon expanded"> </span></span></div><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark xml expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9--3"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<``div` `class``=``"text-center slideshow-header"``>`</div><div class="line number1 index1 alt2">`  ``<``div` `class``=``"slides"` `id``=``"slideshow-header"``>`</div><div class="line number2 index2 alt1">`    ``<``div``><``img` `src``=``"<a href="https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-downtown.jpg%22">https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-downtown.jpg"</a>` `/></``div``>`</div><div class="line number3 index3 alt2">`    ``<``div``><``img` `src``=``"<a href="https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-hospital.jpg%22">https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-hospital.jpg"</a>` `/></``div``>`</div><div class="line number4 index4 alt1">`    ``<``div``><``img` `src``=``"<a href="https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-postoffice.jpg%22">https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-postoffice.jpg"</a>` `/></``div``>`</div><div class="line number5 index5 alt2">`  ``</``div``>`</div><div class="line number6 index6 alt1">`  ``<``div` `class``=``"overlay"``>`</div><div class="line number7 index7 alt2">`    ``<``img` `alt``=``""` `class``=``"img-fluid"` `src``=``"/MEDIA/demo_extras/TomahawkUniversity_logo.png"` `style``=``"display:inline; width: 450px; margin-top: 80px; margin-bottom:80px;"``/>`</div><div class="line number8 index8 alt1">`  ``</``div``>`</div><div class="line number9 index9 alt2">`</``div``>`</div><div class="line number10 index10 alt1">`[user_menu]`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="696fc053-1a67-4886-bce0-fb2fe92e62f4" data-macro-name="code" id="bkmrk-default-footer-templ"><div class="codeHeader panelHeader pdl hide-border-bottom">**Default Footer Template**<span class="collapse-source expand-control"><span class="expand-control-icon icon expanded"> </span></span></div><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark xml expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9--4"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div><div class="line number11 index11 alt2">11</div><div class="line number12 index12 alt1">12</div><div class="line number13 index13 alt2">13</div><div class="line number14 index14 alt1">14</div><div class="line number15 index15 alt2">15</div><div class="line number16 index16 alt1">16</div><div class="line number17 index17 alt2">17</div><div class="line number18 index18 alt1">18</div><div class="line number19 index19 alt2">19</div><div class="line number20 index20 alt1">20</div><div class="line number21 index21 alt2">21</div><div class="line number22 index22 alt1">22</div><div class="line number23 index23 alt2">23</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<``div` `class``=``"bg-light text-dark"``>`</div><div class="line number1 index1 alt2">`    ``<``div` `class``=``"container py-3"``>`</div><div class="line number2 index2 alt1">`        ``<``div` `class``=``"row"``>`</div><div class="line number3 index3 alt2">`            ``<``div` `class``=``"col-sm"``>`</div><div class="line number4 index4 alt1">`                ``<``img` `class``=``"img-fluid mb-3 mb-md-0"` `src``=``"//assets.OPSCOM.com/images/opscom-logo-tagline-120.png"` `alt``=``"Operations Commander"` `/>`</div><div class="line number5 index5 alt2">`            ``</``div``>`</div><div class="line number6 index6 alt1">`            ``<``div` `class``=``"col-sm text-right"``>`</div><div class="line number7 index7 alt2">`                ``<``address``>`</div><div class="line number8 index8 alt1">`                    ``<``strong``>Tomahawk DEMO University</``strong``><``br` `/>`</div><div class="line number9 index9 alt2">`                    ``92 Bridge St., Carleton Place, ON<``br` `/>`</div><div class="line number10 index10 alt1">`                    ``K7C 2V3<``br` `/>`</div><div class="line number11 index11 alt2">`                    ``+1.855.410.4141<``br` `/>`</div><div class="line number12 index12 alt1">`                    ``<``a` `href``=``"mailto:info@ops-com.comcom"``>info@ops-com.comcom</``a``>`</div><div class="line number13 index13 alt2">`                ``</``address``>`</div><div class="line number14 index14 alt1">`            ``</``div``>`</div><div class="line number15 index15 alt2">`        ``</``div``>`</div><div class="line number16 index16 alt1">`        ``<``div` `class``=``"row"``>`</div><div class="line number17 index17 alt2">`            ``<``div` `class``=``"col text-center"``>`</div><div class="line number18 index18 alt1">`                ``<``p``>The <``em``>complete</``em``> parking and security management solution that links parking, violation and incident management collectively.</``p``>`</div><div class="line number19 index19 alt2">`                ``<``p``><``span` `style``=``"color:black;"``>Operations</``span``><``span` `style``=``"color:red;"``>Commander</``span``> (<``a` `href``=``"<a href="https://OPSCOM.com%22/">https://OPSCOM.com"</a>``>OPSCOM</``a``>) will <``strong``>AMPLIFY</``strong``>, <``strong``>AUTOMATE </``strong``>and <``strong``>ANALYZE </``strong``>your parking and security needs.</``p``>`</div><div class="line number20 index20 alt1">`            ``</``div``>`</div><div class="line number21 index21 alt2">`        ``</``div``>`</div><div class="line number22 index22 alt1">`    ``</``div``>`</div><div class="line number23 index23 alt2">`</``div``>`</div></div></td></tr></tbody></table>

</div></div></div></div>---

## <span style="color: rgb(22, 145, 121);">Best Practices and Considerations</span>

- <span style="color: rgb(22, 145, 121);">**Avoid complex code changes if non-technical:** **If you are non-technical, it is highly advised not to change the raw code for Scripts, Styles, Header, and Footer Templates.** Instead, rely on the provided default templates to ensure site stability.</span>
- <span style="color: rgb(22, 145, 121);">**Use verified script vendors:** **Only use verified script vendors like Bootstrap and jQuery to avoid breaking site functionality.** Unverified JavaScript vendors can actively disrupt the user portal and cause elements to load incorrectly.</span>
- <span style="color: rgb(22, 145, 121);">**Leverage API integrations:** **Use the OPS-COM API to integrate with pay stations and other devices.** This allows you to securely grab and display useful information from your users directly within your portal templates.</span>