Designer help, every page
This page lists every page of the designer help, section by section. New here? Begin with Designers: start here.
Contents
Theme design
Designs, siteaccesses, the cascade, CSS and JavaScript, accessibility, dark mode, right to left, CSP, performance, layouts, tutorials and checklists.
- What a design is
- Designs and siteaccesses
- The design cascade
- Design extensions
- The design directory layout
- The pagelayout
- Pagelayout variables
- Choosing a starting theme
- The themes that ship with Exponential
- A tour of the media theme
- A tour of the simple theme
- A tour of the starter theme
- A tour of the super theme
- The ezwebin design as a base
- Admin designs overview
- Previewing a design on a siteaccess
- Debugging a design
- Designs in a multisite installation
- Design glossary
- Loading stylesheets
- Loading JavaScript
- The ezcss and ezscript operators
- The packer
- The packer cache and deploys
- No version queries on asset links
- Images in a design
- Image aliases
- Fonts in a design
- Icons in a design
- SVG images
- jQuery in designs
- Favicons and touch icons
- Print stylesheets
- Responsive design
- Breakpoints and container widths
- Testing at zoom levels
- Accessibility basics for themes
- Color contrast
- Keyboard and focus
- Landmarks and headings
- Skip links
- Accessible forms
- Reduced motion
- Dark mode overview
- Design tokens
- Dark mode with prefers-color-scheme
- The theme toggle and the pre-paint guard
- admin4 tokens
- admin4 components
- admin4 module stylesheets
- The admin styling rules test
- Right-to-left designs
- Logical CSS properties
- CSP-safe design
- No inline CSS
- No inline JavaScript
- External resources and CDNs
- Caching for designers
- Theme performance
- Image performance
- Measuring CLS and LCP
- Layouts for designers
- Layout types and zones
- Block definitions
- Block view templates
- Shared layouts and linked zones
- Layout rules
- Styling layout blocks
- Tutorial: create a theme extension
- Tutorial: override a full view
- Tutorial: build a landing page with layouts
- Tutorial: add dark mode
- Tutorial: internationalize a theme
- Tutorial: a right-to-left theme
- Tutorial: port a static HTML design
- Tutorial: two sites, two designs
- Tutorial: add an admin module stylesheet
- Checklist: theme launch
- Checklist: accessibility
- Checklist: performance
- Checklist: CSP
- Checklist: dark mode
- Checklist: right to left
- Checklist: code review for templates
Templates
The template language, operators and functions, fetching content, view modes, overrides and debugging.
- Templates overview
- TPL syntax basics
- Variables and def
- Attributes and dot notation
- If and conditions
- Foreach loops
- While and do loops
- For loops
- Switch and case
- Include
- Section (legacy)
- Set-block and append-block
- Cache-block
- Run-once
- Literal and delimiters
- Comments
- Operators overview
- String operators
- Array operators
- Logic and comparison operators
- Math operators
- cond and first_set
- Wash and escaping
- URL operators
- The i18n operator
- Dates, numbers and l10n
- The ezini operator
- The ezhttp operator
- Role and policy operators
- PHP string functions as operators
- ezjscore template operators
- Operator reference
- Function reference
- Template style guide
- Common template mistakes
- Translating template strings
- Fetch basics
- Fetching nodes and lists
- Fetch filters and sorting
- Fetch performance
- Nodes, objects and attributes
- attribute_view_gui
- content_view_gui
- node_view_gui
- Datatype view templates
- Datatype edit templates
- View modes
- Full view
- Line view
- Embed view
- Embed inline view
- Custom view modes
- Node templates by class
- Override basics
- Override match keys
- Override ordering
- Override a single node
- Override by section
- Override by parent
- Rich text templates
- Custom tags templates
- The persistent variable
- Module result and content info
- Menus and navigation
- Breadcrumbs
- Pagination
- Search results template
- User and login templates
- Forms in templates
- Edit, remove and create buttons on the site
- Custom edit templates
- Alternate layouts (print, popup and your own)
- Error templates
- Template debugging
- Template path comments
- The template editor
- Template compilation and cache
- Fetching a layout in templates
Theme extensions
Metadata, settings, packaging and the RAD wizards for theme extensions.
- Theme extensions: start here
- What a theme extension is
- Naming your theme extension
- The folder structure of a theme extension
- ezinfo.php: what the About page reads
- extension.xml: the packaged description
- Keeping every version field in sync
- Copyright and author lines
- The LICENSE file of a theme
- Writing the README of a theme
- INSTALL.md and CHANGELOG.md
- Registering the design: DesignExtensions[]
- The design settings a theme ships
- Settings files in an extension
- Siteaccess settings inside a theme
- Giving a theme its own settings file
- Activating a theme: ActiveExtensions and ActiveAccessExtensions
- Loading order and which theme wins
- Declaring dependencies in extension.xml
- Template operators in a theme
- Translations in a theme
- The share folder: demo images, files and seed data
- Bundling content class packages with a theme
- The design extension wizard (Setup > RAD)
- The design wizard's parts, one by one
- Downloading the wizard's result as a zip
- From the wizard's output to the first commit
- Putting a theme under Git
- A .gitignore for themes
- composer.json for a theme
- The Composer installer and the extension's folder name
- require and suggest: what a theme depends on
- Testing a Composer install before publishing
- What an Exponential package (.ezpkg) is
- The site style package
- Exporting an extension as a package
- The secret check before an extension is packaged
- The package creator wizard, step by step
- Choosing a license in the package wizard
- Classic XML and JSON packages
- Exporting and importing with ezpm
- Validating a package before you share it
- Installing your package on a test site
- Composer package or .ezpkg: which to ship
- Checklist: the theme extension is ready
- Troubleshooting theme extensions
Distribution
Repositories, versions, releases, Packagist, licenses and publishing a theme.
- Distributing a theme: start here
- Choosing where to publish
- Creating the GitHub repository
- Repository name, description and topics
- A README that explains and sells
- The first push and the default branch
- Choosing a version number
- After .9 comes .10: only the last position counts
- Sorting tags correctly
- Checking what is already published
- Bumping the version before the tag
- Annotated tags
- A pushed tag is permanent
- GitHub releases
- Writing release notes
- When a release goes wrong
- Changelog entries: Added, Updated, Removed, Renamed, Fixed
- Keeping a CHANGELOG.md
- Submitting a theme to Packagist
- Keeping Packagist up to date automatically
- Packagist shows an old version
- Version constraints your users write
- File checksums (share/filelist.md5)
- Licensing choices: an overview
- The GPL for theme code
- The GFDL for theme documentation
- Creative Commons for images and graphics
- Third-party fonts, icons and libraries
- Commercial terms next to the GPL
- Copyright notices in files
- Screenshots for a theme
- Screenshot checklist
- Running a demo site
- Demo content for a theme
- Listing a theme on projects.exponential.earth
- Announcing a theme on share.exponential.earth
- Documenting a theme on eZpedia
- Issue tracker and support channel
- A security policy for a theme
- Checklist: before you publish
Sales
Selling themes and services around them.
- Selling themes and services: start here
- What you can sell around a theme
- The GPL and selling: what is allowed
- What buyers receive
- Licensing models, as options
- Images and fonts under separate licenses
- Pricing models, as options
- Pricing a custom theme project
- Estimating theme work
- Support offerings
- Designing support tiers
- Response times and commitments
- Maintenance subscriptions
- Delivering updates to paying customers
- Custom theme services
- Customization and white-label work
- Training and workshops
- Where Exponential themes are found today
- Selling from your own site
- Writing a theme's product page
- Demos that sell
- Contracts and terms
- Warranty and liability
- Refund policies, as options
- Taxes and invoices
- Names and trademarks
- Working with agencies and partners
- Funding an open source theme
- Customer data and privacy
- Checklist: ready to sell
Maintenance life cycle
Compatibility, upgrades, security, deprecation, end of life and forks.
- The maintenance life cycle: start here
- The life cycle of a theme
- A support policy for your theme
- Following Exponential releases
- Reading a changelog as a designer
- A compatibility matrix
- PHP version compatibility
- Declaring compatibility
- An upgrade test environment
- Upgrade testing, step by step
- Comparing your overrides with the standard templates
- JavaScript library upgrades (jQuery 4, no YUI)
- Removing inline scripts and styles
- An accessibility audit for every release
- A CSP audit for every release
- Visual regression checks: light, dark, zoom
- A performance audit for every release
- Security fixes in themes
- Handling security reports
- Publishing a security release
- Keeping dependencies up to date
- A deprecation policy
- Deprecating a setting or a template
- Breaking changes and the next major version
- End of life
- Announcing end of life
- Archiving a repository
- Handing a theme over to a new maintainer
- Transferring the repository and the Packagist package
- Adopting an abandoned theme
- Forking a theme
- Rebranding a fork, fairly
- Credits and attribution
- Contributing back upstream
- Pull requests to someone else's theme
- Keeping a fork in sync
- A maintenance calendar
- Checklist: one maintenance cycle
Related pages
- Designers: start here
- Free documentation: this page is free to copy, translate and improve under the GNU FDL 1.3.
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.