Skip to content

Services navigation

The Services menu and the /services/ pages are both built from content pages of the Services content type. Where a page sits in the hierarchy decides where it shows in the menu, and its Body Template decides how the page itself is laid out.

This page is the overview: how the menu is put together, which template to use, and what each field and image does. For step-by-step instructions, use the workflows:

How service pages make the menu

LevelWhat it isDesktop menuMobile menu
1A top-level service page, such as Window TintingListed down the left. With children it opens a tab and gets an Explore [name] link; without children it is a plain linkShown
2A child of a level 1 pageA tile in that tab: the page’s Alt image 1, cropped to a wide 3:1 strip, with its name under itShown
3A child of a level 2 pageNot shownShown. None is on the menu today: the only level 3 page, Trailcore Service Body by Utemaster, has show-on-menu off
  • A page appears only if it is Active and set to show on the menu.
  • Items are ordered by Sort Order, highest first, then by name A to Z. Window Tinting (Sort Order 5) comes first; the other level 1 pages are on 0.
  • The theme doesn’t cap how many items each level holds. Accessory Fitment & Solutions has 14 level 2 pages on the menu, Vehicle Protection 4 and Window Tinting 3. Signage & Graphics is a plain link, because all four of its children are inactive (2026-10-20 pull).
  • Each level 1 tab also has a content panel on the right, filled from that page’s Related Content. If the page has none, the panel falls back to the page set in the serve_menu_content content zone.

The three service templates

Set the template in the page’s Body Template field.

TemplateUse forChild cardsProduct price list (Label 1)Typeform (Label 3)
service-parentA level 1 service with child service pagesYesNoNo
servicesA single service page with no childrenNoYesYes
serviceNewThe same as services, plus a fixed “Why Choose Altapac?” sectionNoYesYes
  • services is also used outside the Services menu. The store location pages (/locations/kotara, /locations/burwood/bullbars and so on) are Learn pages with services typed in as their template.
  • serviceNew is live on one page only, Roof Rack Installation. Its company section is written into the theme and can’t be edited in cPanel. See The serviceNew company section.
  • Every service child page except Roof Rack Installation has Body Template left blank (30 of 31 in the 2026-10-20 pull). A blank template gives the services layout. Setting services explicitly gives the same layout without relying on the store’s default.

A parent in the hierarchy doesn’t have to use service-parent. Use it only when the children are service pages that should be shown as cards. If you are unsure, ask the WebMaster.

Fields on every service page

All three templates open with the same banner and description block.

Main image

  • Where it shows: as the banner behind the page heading. It is cropped to fill the width, and the banner is at least 330px tall. The crop changes with screen size.
  • Size: house standard is 1450px wide, landscape, PNG or JPG. The theme doesn’t check the size.
  • Guidelines: keep the subject in the centre, and don’t put text or transparency in the image. The heading and Short Description are printed over it in white, with a dark fade towards the bottom.

Page heading

  • The banner heading is the SEO page heading (SEOPageHeading) if one is set, otherwise the page Name. No service page sets an SEO page heading today (2026-10-20 pull), so every banner shows the Name.

Short Description (ShortDescription1)

  • Where it shows: under the heading on the banner, and as the text on the page’s card on its parent.
  • Length: aim for 140 to 180 characters. Keep it plain text, with no links.
  • Not the meta description: the page’s meta description comes from the SEO meta description field (SEOMetaDescription), not from the Short Description. If that field is empty, the store falls back to “Name - Name”.

Description 1

  • Where it shows: left of Alt image 1, under the banner.
  • Length: about 250 words is a guideline. Start with an H2 heading; the page already has its H1 in the banner.
  • Description 1 is not inside #_Custom-page-content, so styles scoped to that wrapper don’t reach it.

Alt image 1 (alt_1)

  • Size: upload at 450 × 450 (square). It is the page’s one square image for the whole site, also used for menu thumbnails and cards. The theme doesn’t check the size.
  • Where it shows: in up to three places on the Services side, each cropped differently:
    • beside Description 1 on the page itself, at 3:2
    • on the page’s card on its parent, filling the card width and cropped to 200px high (about 340 × 200 on desktop)
    • as the page’s tile in the desktop Services menu (level 2 pages), cropped to 3:1 and partly greyed until hovered.
  • Guidelines: every crop keeps the middle of the square and cuts the top and bottom, most of all in the 3:1 menu tile. Keep the subject in the centre, filling the frame, so it still reads at menu-tile size.

Description 2 (optional)

  • Where it shows: a section at the bottom of the page, inside a wrapper with the id _Custom-page-content. If Description 2 is empty, the section isn’t printed.
  • Styling: prefix every CSS selector with #_Custom-page-content. See Custom CSS and HTML in page content.
  • Icons: Font Awesome Free 6.2 is loaded on every page.

Service parent template (service-parent)

Page order: banner, child cards, Description 1 with Alt image 1, then Description 2.

The parent builds one card per child page. Each card shows the child’s Alt image 1, Name and Short Description, and links to the child. Cards are three across on desktop, so three or more children work best. A child gets a card only if all of these are true:

  • it is a direct child of this page (grandchildren don’t get a card)
  • its content type is Services
  • it is active
  • it is set to show on the menu.

Cards use the same order as the menu: Sort Order highest first, then name A to Z. If no child qualifies, the card section isn’t shown. Signage & Graphics is like this today because all four of its children are inactive. If a page has no children at all, use services instead.

Leave Label 1 and Label 3 empty on parents. There is no price list or Typeform slot. A form on a parent page has to be pasted into Description 2 as embed code, as Window Tinting does today.

Services template (services and serviceNew)

Page order: banner, Description 1 with Alt image 1, the product price list (if switched on), then Description 2 with the Typeform at its top (if set). serviceNew then adds its company section and Description 3.

Product price list

The price list is a row of cards, one per service product, each with a Call Us button that rings the main store number. It doesn’t use the products assigned to the page in the usual Maropost way.

  • Where the products come from: a product feed at /export//service-product.json. The page shows only the products whose category value in that feed includes the page’s Content ID. Assigning a product to the page does nothing unless the feed carries the ID.
  • Label 1 switches it on. Any text in Label 1 turns the list on, and that text is the heading shown above the cards. Case doesn’t matter. Empty Label 1 means no list, whatever is in the feed. If no product in the feed matches the page, nothing shows, not even the heading.
  • Live state: no service page shows a price list today. No page has Label 1 set, and only 4 of the 99 products in the feed carry a page ID (all for Automotive Window Tinting).

To set one up, follow Add a product price list.

Typeform booking form (Label 3)

Label 3 can hold a Typeform embed ID: the data-tf-live value from the form’s embed code, not the short ID in a share link. The form is placed at the top of the Description 2 section, so it only appears when Description 2 has content.

No live page uses Label 3 today. Every Typeform on a service page is embed code pasted into Description 2 (2026-10-20 pull). Before you move a page over to Label 3, read Add a Typeform. If you leave the pasted copy in place, the page shows two forms.

For developers

Theme files this page is based on

From Altapac-ReDev, branch development:

  • src/templates/cms/service-parent.template.html: hero, then content_menu content_type:'services' sortby:'sortorder, name' show_empty:'1' category:'[@content_id@]' start_category:'[@content_id@]' with *level_1 only; card image thumb:'alt_1' at width="450px" height="300px", CSS #service-children .card-img-top { height: 200px; object-fit: cover }. Heading guarded via [@children_heading@] (commit 406e84c, AUD-87); live main prints it unguarded.
  • src/templates/cms/services.template.html: product list inside [%if [@content_label1@] %] (lines 137-227), fetches /export//service-product.json, filters on String(product.category).split(',') containing [@content_id@], unhides only when a card renders (commit c4bfdae, AUD-36). Typeform <div data-tf-live="[@content_label3@]"> nested in [%if [@content_description2@] %] (230-239).
  • src/templates/cms/serviceNew.template.html: same list (203-292) and Typeform (295-306); “Why Choose Altapac?” inside [%if [@content_description3@] || [@content_description2@] %] (308-404, commit b987e8f, AUD-86); Description 3 at 407-411 reuses id="_Custom-page-content".
  • src/templates/headers/includes/components/desk-Menu.template.html: Services mega-menu (from line 115), level 2 img.lvl2-image from thumb:'alt_1'; fallback zone serve_menu_content. CSS in src/css/custom.css (img.lvl2-image aspect-ratio 3/1, grayscale 0.6).
  • Hero heading [%url_info name:'page_heading' default:'[@content_name@]'/%]; meta description from url_info name:'meta_description' in headers/includes/head.template.html.
  • Font Awesome Free 6.2.0, src/css/fontawesomev6/, loaded from footers/includes/scripts.template.html.

Template use per page is from Altapac-Content pages/**/meta.json (pulled 2026-10-20). Live checks and feed details are recorded in the service pages workflow.