Refactor theme comments and descriptions to use a consistent hyphen format instead of an em dash. Update color palette values in theme settings and JSON configuration for improved aesthetics. Enhance contact section icons with Font Awesome for better visual representation. Add GitHub Copilot and contributor instructions for improved collaboration and development practices.
This commit is contained in:
75
copilot-instructions.md
Normal file
75
copilot-instructions.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# GitHub Copilot & Contributor Instructions
|
||||
|
||||
Purpose: guidance for using GitHub Copilot (and for humans) when working on this repo.
|
||||
|
||||
**Repo overview**
|
||||
- `theme/`: WordPress theme source (PHP, theme assets, includes). Edit here for theme behavior, templates, and assets.
|
||||
- `pages/`: PHP page templates used by WordPress (e.g., `about.php`, `contact.php`). These are page-level templates or example pages.
|
||||
- `theme/assets/`: CSS/JS/SVG used by the theme. `assets/css/main.css` and `assets/js/main.js` are the main files.
|
||||
- `theme/inc/`: PHP helpers and feature modules (enqueueing, AJAX handlers, setup, theme defaults, generator, settings).
|
||||
- `parts/`: small HTML snippets (header/footer) included by templates.
|
||||
- `patterns/` and `templates/`: reusable patterns and template HTML files.
|
||||
|
||||
**Goals when editing**
|
||||
- Keep changes small and focused per PR.
|
||||
- Preserve WordPress conventions (use `wp_enqueue_script`/`wp_enqueue_style`, action/filter hooks, and template hierarchy).
|
||||
- Avoid breaking backward compatibility for theme consumers unless explicitly required.
|
||||
|
||||
**Local development (recommended quick steps)**
|
||||
- Testing is handled by the repository owner; do not run WordPress locally unless explicitly requested.
|
||||
|
||||
Manual checks you can run locally before submitting changes:
|
||||
- PHP syntax: `php -l path/to/file.php`
|
||||
- Theme header: ensure `style.css` at `theme/style.css` contains valid theme metadata.
|
||||
|
||||
**Editing the theme**
|
||||
- Primary entry points: `theme/functions.php`, `theme/index.php`, `theme/assets/`, and `theme/inc/*`.
|
||||
- Add / modify reusable sections in `parts/header.html` and `parts/footer.html`.
|
||||
- For new templates: follow WP template naming (e.g., `page-{$slug}.php`) or create a template with a `/* Template Name: ... */` comment.
|
||||
- Use `theme/inc/enqueue.php` (or existing helpers) to add scripts/styles — keep asset handles unique and versioned.
|
||||
|
||||
**Pages folder usage**
|
||||
- `pages/*.php` contains standalone page templates or examples. When adding a new page template, document how it should be attached in WP admin (page template comment or theme settings).
|
||||
|
||||
**Testing & validation**
|
||||
- Run `php -l` on changed PHP files before committing.
|
||||
- For CSS/HTML, use browser devtools and the W3C validator for critical pages.
|
||||
- If adding JS, test in Safari and Chrome on macOS (this repo is tested on macOS by default).
|
||||
|
||||
**Code style & safety**
|
||||
- Follow existing code patterns in `theme/`.
|
||||
- Escape outputs (use `esc_html()`, `esc_attr()`, `wp_kses_post()` where appropriate) for user-facing output.
|
||||
- Nonces: use `wp_nonce_field()`/`check_admin_referer()` for forms/AJAX in `theme/inc/ajax.php`.
|
||||
|
||||
**Commit and PR guidance**
|
||||
- Keep commits focused: one feature/bugfix per PR.
|
||||
- Provide a clear PR description: what changed, why, and how to test locally.
|
||||
- Run `php -l` and a quick manual smoke-test before opening PR.
|
||||
|
||||
**Using GitHub Copilot effectively for this repo**
|
||||
- Provide context in prompts: mention exact file path(s) and constraints (WordPress version targets, PHP version, browser compatibility).
|
||||
- Good prompt pattern:
|
||||
- Short summary of intent.
|
||||
- Files or functions to change (provide paths).
|
||||
- Constraints (e.g., "must use wp_enqueue_script", "no breaking changes to header markup").
|
||||
- How to test the change.
|
||||
|
||||
Example Good Prompt:
|
||||
"Refactor theme/inc/enqueue.php to register and enqueue a new frontend script `theme-main` from `theme/assets/js/main.js`. Use `wp_enqueue_script` with dependency `jquery` and version based on file `filemtime`. Make sure it loads in the footer. Show the exact code to add and where."
|
||||
|
||||
Example Bad Prompt:
|
||||
"Make the theme faster." (too vague — include file, objective, and measurable change)
|
||||
|
||||
**When to ask for human review**
|
||||
- Changes to security-sensitive code (nonce handling, AJAX endpoints).
|
||||
- Template structure changes that may break theme consumers.
|
||||
- Large refactors that affect multiple parts of the theme.
|
||||
|
||||
**Owner / Maintainers**
|
||||
- If unsure, open a draft PR and assign it to the repository owner for review.
|
||||
|
||||
---
|
||||
If you want, I can also:
|
||||
- Add a quick `Makefile` or NPM scripts for common checks (PHP lint, CSS/JS lint).
|
||||
- Add a sample `wp-env` configuration for one-command local setup.
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
?>
|
||||
<!-- wp:oribi/page-hero-animated {"label":"About Us","title":"The Complete Digital Signage Solution","description":"An Oribi Technology Services company, OTS Signs delivers enterprise-grade digital signage solutions that help businesses communicate, engage, and grow."} /-->
|
||||
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Our Story","heading":"Built by People Who Understand Technology","description":"OTS Signs was born from a simple idea: digital signage should be powerful yet simple. As part of the Oribi Technology Services family, we bring years of IT infrastructure expertise to the signage industry. We understand networks, security, and reliability — and we\u0027ve built a platform that reflects that knowledge. Our team combines deep technical skills with creative vision to deliver signage solutions that truly work for your business.","visual":"📺"} /-->
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Our Story","heading":"Built by People Who Understand Technology","description":"OTS Signs was born from a simple idea: digital signage should be powerful yet simple. As part of the Oribi Technology Services family, we bring years of IT infrastructure expertise to the signage industry. We understand networks, security, and reliability, and we\u0027ve built a platform that reflects that knowledge. Our team combines deep technical skills with creative vision to deliver signage solutions that truly work for your business.","visual":""} /-->
|
||||
|
||||
<!-- wp:oribi/intro-section {"variant":"alt","label":"Our Mission","heading":"Empowering Businesses to Communicate Better","description":"We believe every business deserves access to professional-grade digital signage. Our mission is to make it affordable, reliable, and effortless — so you can focus on what matters most: your customers. Whether you\u0027re a single-location café or a multi-site enterprise, our platform scales to meet your needs without compromising on quality or support.","visual":"🎯","reversed":true} /-->
|
||||
<!-- wp:oribi/intro-section {"variant":"alt","label":"Our Mission","heading":"Empowering Businesses to Communicate Better","description":"We believe every business deserves access to professional-grade digital signage. Our mission is to make it affordable, reliable, and effortless, so you can focus on what matters most: your customers. Whether you\u0027re a single-location café or a multi-site enterprise, our platform scales to meet your needs without compromising on quality or support.","visual":"","reversed":true} /-->
|
||||
|
||||
<!-- wp:oribi/value-section {"variant":"normal","label":"What Sets Us Apart","heading":"Why Businesses Choose OTS Signs","lead":"We\u0027re not just a software company — we\u0027re a full-service digital signage partner.","columns":3} -->
|
||||
<!-- wp:oribi/value-section {"variant":"normal","label":"What Sets Us Apart","heading":"Why Businesses Choose OTS Signs","lead":"We\u0027re not just a software company. We\u0027re a full-service digital signage partner.","columns":3} -->
|
||||
<!-- wp:oribi/value-card {"iconType":"fontawesome","faIcon":"fas fa-camera","title":"In-House Content Production","description":"Professional photography, video production, and graphic design services to ensure your signage always looks its best."} /-->
|
||||
<!-- wp:oribi/value-card {"iconType":"fontawesome","faIcon":"fas fa-server","title":"Infrastructure Expertise","description":"Built on enterprise-grade cloud infrastructure by the same team that manages IT systems for businesses across the region."} /-->
|
||||
<!-- wp:oribi/value-card {"iconType":"fontawesome","faIcon":"fas fa-handshake","title":"Partnership Approach","description":"We work as an extension of your team. Dedicated support, personalised onboarding, and ongoing optimisation."} /-->
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
* Post Types: page
|
||||
*/
|
||||
?>
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Try It","title":"See It in Action","description":"Experience our digital signage platform firsthand. Request access to our live demo instance and explore every feature — no commitment required."} /-->
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Try It","title":"See It in Action","description":"Experience our digital signage platform firsthand. Request access to our live demo instance and explore every feature, no commitment required."} /-->
|
||||
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Live Demo","heading":"Explore Our Demo Instance","description":"Our demo environment gives you full access to the OTS Signs CMS platform. Create content, schedule displays, explore integrations, and see exactly how your digital signage will look and feel in production. No credit card needed — just fill in the form below and we\u0027ll send you access within 24 hours.","visual":"🎬"} /-->
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Live Demo","heading":"Explore Our Demo Instance","description":"Our demo environment gives you full access to the OTS Signs CMS platform. Create content, schedule displays, explore integrations, and see exactly how your digital signage will look and feel in production. No credit card needed. Just fill in the form below and we\u0027ll send you access within 24 hours.","visual":""} /-->
|
||||
|
||||
<!-- wp:oribi/feature-section {"variant":"alt","label":"What You\u0027ll See","heading":"Full Platform Access","lead":"The demo instance includes all the features available on our Pro plan.","columns":3} -->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-desktop","title":"Content Management","description":"Upload images, videos, and HTML content. Create playlists and manage your media library."} /-->
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
* Post Types: page
|
||||
*/
|
||||
?>
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Hardware","title":"Player Devices Built for Reliability","description":"Our digital signage players are engineered for performance, security, and simplicity. Plug in, connect, and start displaying — it\u0027s that easy."} /-->
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Hardware","title":"Player Devices Built for Reliability","description":"Our digital signage players are engineered for performance, security, and simplicity. Plug in, connect, and start displaying. It\u0027s that easy."} /-->
|
||||
|
||||
<!-- wp:oribi/platform-section {"label":"Our Devices","heading":"Hardware That Just Works","lead":"Purpose-built player devices designed for 24/7 commercial use with zero maintenance."} -->
|
||||
<!-- wp:oribi/platform-row {"heading":"Use Existing Screens","description":"Our digital signage players work on any screen with HDMI, so you can easily integrate them into your current setup. No need to replace your existing displays — just plug in our player and start broadcasting. If you need a complete solution, we also offer bundled packages that include both the player and a high-quality commercial-grade display.","btnText":"Get a Quote","btnUrl":"/contact"} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Intelligent Offline Playback","description":"Our player devices are engineered to keep your message on screen, even when the internet isn\u0027t available. Content is cached locally so your displays continue running seamlessly. When connectivity returns, new content syncs automatically — no manual intervention needed.","btnText":"See Features","btnUrl":"/features","reversed":true} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Use Existing Screens","description":"Our digital signage players work on any screen with HDMI, so you can easily integrate them into your current setup. No need to replace your existing displays. Just plug in our player and start broadcasting. If you need a complete solution, we also offer bundled packages that include both the player and a high-quality commercial-grade display.","btnText":"Get a Quote","btnUrl":"/contact"} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Intelligent Offline Playback","description":"Our player devices are engineered to keep your message on screen, even when the internet isn\u0027t available. Content is cached locally so your displays continue running seamlessly. When connectivity returns, new content syncs automatically, no manual intervention needed.","btnText":"See Features","btnUrl":"/features","reversed":true} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Enterprise-Grade Security","description":"Every device is hardened with enterprise-grade security protocols. Encrypted communications, secure boot, and remote management capabilities ensure your signage network stays protected. Automatic firmware updates keep your devices current without any downtime.","btnText":"Learn More","btnUrl":"/about"} /-->
|
||||
<!-- /wp:oribi/platform-section -->
|
||||
|
||||
@@ -24,6 +24,6 @@
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-temperature-low","title":"Silent Operation","description":"Fanless design means zero noise, making our players perfect for quiet environments like lobbies and restaurants."} /-->
|
||||
<!-- /wp:oribi/feature-section -->
|
||||
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Bundles Available","heading":"Complete Display Solutions","description":"Need screens too? We offer bundled packages that include our player device paired with a commercial-grade display — rated for 24/7 operation with enhanced brightness and durability. Available in a range of sizes from 32\" to 75\". Contact us for custom configurations and volume pricing.","visual":"🖥️"} /-->
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Bundles Available","heading":"Complete Display Solutions","description":"Need screens too? We offer bundled packages that include our player device paired with a commercial-grade display, rated for 24/7 operation with enhanced brightness and durability. Available in a range of sizes from 32\" to 75\". Contact us for custom configurations and volume pricing.","visual":""} /-->
|
||||
|
||||
<!-- wp:oribi/cta-banner {"heading":"Need Help Choosing?","text":"Our team can recommend the right device and display combination for your specific environment and use case.","btnText":"Request a Quote","btnUrl":"/contact"} /-->
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
<!-- wp:oribi/faq-section {"label":"Platform \u0026 Pricing","heading":"Plans, Pricing \u0026 Platform","lead":"Common questions about our plans, what\u0027s included, and how pricing works."} -->
|
||||
<!-- wp:oribi/faq-item {"question":"What\u0027s included in the Essentials plan?","answer":"The Essentials plan includes up to 20 screens, a custom subdomain, shared CMS server, content scheduling with day-parting, integration with live data sources, unlimited user seats, and the ability to publish content to your signs in minutes. It\u0027s $7 per screen per month, or $70 per screen annually."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"What does the Pro plan include?","answer":"The Pro plan supports 500+ screens with a custom domain, dedicated CMS server, custom live data integrations, priority support, advanced analytics, SSO and role-based access, SLA guarantee, and a dedicated account manager. Contact us for pricing tailored to your needs."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Are there any hidden fees?","answer":"No. Our pricing is fully transparent. The per-screen monthly or annual fee covers everything — CMS access, software updates, cloud hosting, and standard support. Content creation services and hardware are quoted separately."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Are there any hidden fees?","answer":"No. Our pricing is fully transparent. The per-screen monthly or annual fee covers everything. CMS access, software updates, cloud hosting, and standard support. Content creation services and hardware are quoted separately."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Can I switch plans later?","answer":"Absolutely. You can upgrade from Essentials to Pro at any time as your business grows. We\u0027ll handle the migration seamlessly with no disruption to your displays."} /-->
|
||||
<!-- /wp:oribi/faq-section -->
|
||||
|
||||
<!-- wp:oribi/faq-section {"variant":"alt","label":"Setup \u0026 Integration","heading":"Getting Started","lead":"Everything about setup, installation, and integrating with your existing systems."} -->
|
||||
<!-- wp:oribi/faq-item {"question":"How long does setup take?","answer":"Most installations are up and running within a day. Plug in our player device, connect to your network, and your content appears on screen. Our team handles the CMS configuration and can have your first content ready to display immediately."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Can I use my existing screens?","answer":"Yes! Our players work with any screen that has an HDMI input. TVs, commercial displays, or monitors — if it has HDMI, our player works with it. No need to replace your existing hardware."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Can I use my existing screens?","answer":"Yes! Our players work with any screen that has an HDMI input. TVs, commercial displays, or monitors. If it has HDMI, our player works with it. No need to replace your existing hardware."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"How do live data integrations work?","answer":"We can connect your existing web dashboards, APIs, RSS feeds, social media accounts, and other data sources to your digital signage. Data updates are reflected in real-time on your displays. The Essentials plan supports standard integrations, while Pro includes custom integration development."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Do I need special internet bandwidth?","answer":"Our players are designed to be bandwidth-efficient. Content is cached locally and synced incrementally. A standard business internet connection is more than sufficient. For locations with limited connectivity, our offline playback ensures your content keeps running."} /-->
|
||||
<!-- /wp:oribi/faq-section -->
|
||||
@@ -27,7 +27,7 @@
|
||||
<!-- wp:oribi/faq-item {"question":"What happens if my internet goes down?","answer":"Our intelligent player devices continue playing cached content even when offline. When connectivity returns, new content syncs automatically. Your displays never go dark."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"How secure is the platform?","answer":"We use enterprise-grade security throughout our stack: end-to-end encryption for all communications, secure boot on player devices, role-based access control in the CMS, and SOC 2-aligned cloud infrastructure. Your content and network are always protected."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"What kind of support do you offer?","answer":"Essentials plans include email support with a 24-hour response time. Pro plans include priority support with a dedicated account manager, phone support, and guaranteed SLA response times."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Can I create content myself, or do you do it for me?","answer":"Both! Our CMS is designed for self-service content creation with drag-and-drop simplicity. We also offer professional content creation services — photography, video production, and graphic design — to make your signage look its absolute best."} /-->
|
||||
<!-- wp:oribi/faq-item {"question":"Can I create content myself, or do you do it for me?","answer":"Both! Our CMS is designed for self-service content creation with drag-and-drop simplicity. We also offer professional content creation services: photography, video production, and graphic design, to make your signage look its absolute best."} /-->
|
||||
<!-- /wp:oribi/faq-section -->
|
||||
|
||||
<!-- wp:oribi/cta-banner {"heading":"Still Have Questions?","text":"Our team is happy to answer anything not covered here. Get in touch and we\u0027ll help.","btnText":"Contact Us","btnUrl":"/contact"} /-->
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
?>
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Platform","title":"Technology Designed to Work for You","description":"Our application platform lets you publish content instantly across any network, with built-in real-time analytics. Its secure, cloud-native architecture scales effortlessly while keeping deployments fast and maintenance minimal."} /-->
|
||||
|
||||
<!-- wp:oribi/platform-section {"label":"Core Features","heading":"Powerful Tools, Simple Experience","lead":"Everything you need to create, schedule, and manage stunning digital signage content — from a single dashboard."} -->
|
||||
<!-- wp:oribi/platform-section {"label":"Core Features","heading":"Powerful Tools, Simple Experience","lead":"Everything you need to create, schedule, and manage stunning digital signage content, from a single dashboard."} -->
|
||||
<!-- wp:oribi/platform-row {"heading":"Manage All Your Screens in One Place","description":"Our cloud CMS offers the power and flexibility to manage digital displays for businesses of all sizes. Whether you\u0027re a single location or a multi-site enterprise, our digital signage network is built to grow with you.","btnText":"Get Started","btnUrl":"/contact"} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Dynamic Content Scheduling","description":"Effortlessly schedule your content for maximum impact. Plan ahead by setting content to play at specific times, daypart, or even trigger based on real-world events. Automate your messaging to ensure the right information is displayed at the right time.","btnText":"See Pricing","btnUrl":"/pricing","reversed":true} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Use Existing Screens","description":"Our digital signage players work on any screen with HDMI, so you can easily integrate them into your current setup. If you need a complete solution, we also offer bundled packages that include both the player and a high-quality commercial-grade display.","btnText":"View Devices","btnUrl":"/devices"} /-->
|
||||
@@ -17,7 +17,7 @@
|
||||
<!-- /wp:oribi/platform-section -->
|
||||
|
||||
<!-- wp:oribi/feature-section {"variant":"alt","label":"Capabilities","heading":"Built for Modern Business","lead":"From content creation to analytics, our platform covers every step of your digital signage journey.","columns":3} -->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-cloud","title":"Cloud-Native CMS","description":"Access your content management system from anywhere. No software to install — just log in and start publishing."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-cloud","title":"Cloud-Native CMS","description":"Access your content management system from anywhere. No software to install. Just log in and start publishing."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-clock","title":"Content Scheduling","description":"Set content to play at specific times with day-parting. Automate your messaging for maximum impact."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-chart-line","title":"Live Data Integration","description":"Connect your existing web dashboards, social feeds, and real-time data sources directly to your displays."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-wifi","title":"Offline Playback","description":"Content keeps playing even when the internet goes down. Our players cache content locally for uninterrupted display."} /-->
|
||||
@@ -25,9 +25,9 @@
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-shield-halved","title":"Enterprise Security","description":"End-to-end encryption, role-based access control, and secure cloud infrastructure protect your content and network."} /-->
|
||||
<!-- /wp:oribi/feature-section -->
|
||||
|
||||
<!-- wp:oribi/value-section {"variant":"normal","label":"Why Choose Us","heading":"The OTS Signs Advantage","lead":"We don\u0027t just provide software — we deliver a complete digital signage experience.","columns":3} -->
|
||||
<!-- wp:oribi/value-section {"variant":"normal","label":"Why Choose Us","heading":"The OTS Signs Advantage","lead":"We don\u0027t just provide software. We deliver a complete digital signage experience.","columns":3} -->
|
||||
<!-- wp:oribi/value-card {"iconType":"fontawesome","faIcon":"fas fa-camera","title":"Professional Content","description":"Our in-house photography and video production team creates stunning visuals that make your signage stand out."} /-->
|
||||
<!-- wp:oribi/value-card {"iconType":"fontawesome","faIcon":"fas fa-rocket","title":"Publish in Minutes","description":"Upload content and push it to your screens instantly. No waiting, no complex workflows — just fast deployment."} /-->
|
||||
<!-- wp:oribi/value-card {"iconType":"fontawesome","faIcon":"fas fa-rocket","title":"Publish in Minutes","description":"Upload content and push it to your screens instantly. No waiting, no complex workflows. Just fast deployment."} /-->
|
||||
<!-- wp:oribi/value-card {"iconType":"fontawesome","faIcon":"fas fa-headset","title":"Dedicated Support","description":"Our team is always available to help with setup, content creation, troubleshooting, and ongoing optimisation."} /-->
|
||||
<!-- /wp:oribi/value-section -->
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
?>
|
||||
<!-- wp:oribi/hero-animated {"label":"● Digital Signage Solutions","title":"Turn any screen into a dynamic communication tool.","highlightWord":"dynamic","description":"Digital signage is the modern way to connect with your audience. From eye-catching retail displays to dynamic informational screens, we craft tailored solutions that capture attention and deliver your message.","primaryBtnText":"Get Started","primaryBtnUrl":"/contact","secondaryBtnText":"Request Demo","secondaryBtnUrl":"/demo","stat1Value":"6+","stat1Label":"Industries Served","stat2Value":"500+","stat2Label":"Screens Supported","stat3Value":"99.9%","stat3Label":"Uptime"} /-->
|
||||
|
||||
<!-- wp:oribi/feature-section {"variant":"normal","label":"The Complete Package","heading":"Everything You Need for Engaging Digital Signage","lead":"High-quality visuals, real-time data, and reliable playback — all managed from one powerful platform.","columns":4} -->
|
||||
<!-- wp:oribi/feature-section {"variant":"normal","label":"The Complete Package","heading":"Everything You Need for Engaging Digital Signage","lead":"High-quality visuals, real-time data, and reliable playback, all managed from one powerful platform.","columns":4} -->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-camera","title":"Showcase Your Products","description":"Professional photography and video production services to showcase your products, services, or environment with polished, engaging content.","url":"/features"} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-chart-line","title":"Live Data Integrations","description":"Integrate your existing web dashboards and real-time data with our platform to bring your most important information to life on digital signage.","url":"/features"} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-utensils","title":"Digital Menu Boards","description":"Make your menu as appealing as your product. We incorporate your branding and include high-quality photography to showcase your offerings.","url":"/solutions"} /-->
|
||||
@@ -29,4 +29,4 @@
|
||||
<!-- wp:oribi/link-card {"iconType":"fontawesome","faIcon":"fas fa-play-circle","title":"Request a Demo","description":"See our platform in action. Request access to our live demo instance.","linkText":"Try It Out","linkUrl":"/demo"} /-->
|
||||
<!-- /wp:oribi/link-section -->
|
||||
|
||||
<!-- wp:oribi/cta-banner {"heading":"Ready to Transform Your Screens?","text":"Get in touch to discuss your digital signage needs. No pressure, no jargon — just a conversation about how we can help.","btnText":"Get Started Today","btnUrl":"/contact"} /-->
|
||||
<!-- wp:oribi/cta-banner {"heading":"Ready to Transform Your Screens?","text":"Get in touch to discuss your digital signage needs. No pressure, no jargon. Just a conversation about how we can help.","btnText":"Get Started Today","btnUrl":"/contact"} /-->
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
* Post Types: page
|
||||
*/
|
||||
?>
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Pricing","title":"Affordable Solutions, Scalable Options","description":"Simple, transparent pricing designed to grow with your business. Every plan includes our core platform features — no hidden fees, no surprises."} /-->
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Pricing","title":"Affordable Solutions, Scalable Options","description":"Simple, transparent pricing designed to grow with your business. Every plan includes our core platform features, no hidden fees, no surprises."} /-->
|
||||
|
||||
<!-- wp:oribi/feature-section {"variant":"normal","label":"All Plans Include","heading":"Core Features on Every Plan","lead":"No matter which plan you choose, you get the full power of our digital signage platform.","columns":4} -->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-clock","title":"Content Scheduling","description":"Day-parting, time-based triggers, and automated content rotation included on every plan."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-chart-line","title":"Live Data Integration","description":"Connect your web dashboards and real-time data sources directly to your digital signage."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-users","title":"Unlimited User Seats","description":"Add your entire team — no per-user charges or access limitations."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-users","title":"Unlimited User Seats","description":"Add your entire team, no per-user charges or access limitations."} /-->
|
||||
<!-- wp:oribi/feature-card {"iconType":"fontawesome","faIcon":"fas fa-rocket","title":"Publish in Minutes","description":"Upload content and push it to your screens instantly across your entire network."} /-->
|
||||
<!-- /wp:oribi/feature-section -->
|
||||
|
||||
@@ -21,6 +21,6 @@
|
||||
<!-- wp:oribi/pricing-card {"name":"Pro","tagline":"Contact us for more information","features":["500+ screens","Custom domain","Dedicated CMS server","Custom live data integrations","Priority support","Advanced analytics","SSO & role-based access","SLA guarantee","Dedicated account manager"],"btnText":"Contact Sales","btnUrl":"/contact","featured":true,"badge":"Enterprise"} /-->
|
||||
<!-- /wp:oribi/pricing-section -->
|
||||
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Try Before You Buy","heading":"Want to See How Our Platform Works?","description":"Request access to our demo instance and explore the full platform — no commitment required. See how easy it is to create, schedule, and publish digital signage content.","visual":"🖥️"} /-->
|
||||
<!-- wp:oribi/intro-section {"variant":"normal","label":"Try Before You Buy","heading":"Want to See How Our Platform Works?","description":"Request access to our demo instance and explore the full platform, no commitment required. See how easy it is to create, schedule, and publish digital signage content.","visual":""} /-->
|
||||
|
||||
<!-- wp:oribi/cta-banner {"heading":"Ready to Get Started?","text":"Contact us to find the right plan for your business, or request a demo to see the platform in action.","btnText":"Get in Touch","btnUrl":"/contact"} /-->
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<!-- wp:oribi/page-hero-animated {"label":"Industry Solutions","title":"Solutions for Every Industry","description":"From hospitality to education, our digital signage platform adapts to the unique needs of your industry. Discover how we can transform your customer experience."} /-->
|
||||
|
||||
<!-- wp:oribi/platform-section {"label":"Industries We Serve","heading":"Tailored Solutions for Your Sector","lead":"Every industry has unique communication challenges. Our platform is built to address them all."} -->
|
||||
<!-- wp:oribi/platform-row {"heading":"Hospitality","description":"Showcase menus, promotions, and special events while guiding guests through lobbies, restaurants, and bars. Digital signage creates a premium guest experience, drives upsells, and keeps your visitors informed — from check-in to checkout. Integrate with your POS for real-time menu updates and pricing changes.","btnText":"Get Started","btnUrl":"/contact"} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Hospitality","description":"Showcase menus, promotions, and special events while guiding guests through lobbies, restaurants, and bars. Digital signage creates a premium guest experience, drives upsells, and keeps your visitors informed, from check-in to checkout. Integrate with your POS for real-time menu updates and pricing changes.","btnText":"Get Started","btnUrl":"/contact"} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Retail","description":"Drive product upsells, announce flash-sales, and offer in-store navigation with fresh, eye-catching displays. Digital signage in retail has been shown to increase sales by up to 30%. Our platform makes it easy to update promotions across all locations instantly with targeted, data-driven content.","btnText":"See Pricing","btnUrl":"/pricing","reversed":true} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Corporate Office","description":"Enhance your meeting experience with Microsoft Teams room integration. Communicate meeting schedules, company news, KPIs, and employee alerts with interactive dashboards. Transform your lobby and common areas into dynamic communication hubs that keep your workforce informed and engaged.","btnText":"Learn More","btnUrl":"/features"} /-->
|
||||
<!-- wp:oribi/platform-row {"heading":"Education","description":"Broadcast class schedules, announcements, campus wayfinding, and interactive learning content in campuses and auditoriums. Digital signage helps educational institutions communicate effectively with students, faculty, and visitors across multiple buildings and campuses.","btnText":"Contact Us","btnUrl":"/contact","reversed":true} /-->
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* OTS Theme — Main JS
|
||||
* OTS Theme - Main JS
|
||||
*/
|
||||
|
||||
/* ── Theme toggle (runs before DOMContentLoaded to prevent flash) ── */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* OTS Theme — Editor-specific overrides
|
||||
* OTS Theme - Editor-specific overrides
|
||||
* Loaded only inside the Gutenberg block editor.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* OTS Theme — Custom Block Editor Scripts (InnerBlocks Architecture)
|
||||
* OTS Theme - Custom Block Editor Scripts (InnerBlocks Architecture)
|
||||
*
|
||||
* 13 blocks: 5 standalone + 4 parent/child pairs.
|
||||
* Parent blocks use InnerBlocks for child items.
|
||||
@@ -231,8 +231,8 @@ function iconControls(a, s) {
|
||||
|
||||
/**
|
||||
* Return the element to render in the card preview for the current icon state.
|
||||
* cssClass — the wrapper class, e.g. 'feature-icon' or 'value-icon'
|
||||
* extraStyle — optional inline style object for the wrapper
|
||||
* cssClass - the wrapper class, e.g. 'feature-icon' or 'value-icon'
|
||||
* extraStyle - optional inline style object for the wrapper
|
||||
*/
|
||||
function iconPreview(a, cssClass, extraStyle) {
|
||||
var useFa = a.iconType === 'fontawesome';
|
||||
@@ -272,7 +272,7 @@ function cardImageControls(a, s) {
|
||||
a.imgUrl ? el(Frag, null,
|
||||
el(RC, { label: 'Width (px)', value: imgW, min: 20, max: 600, step: 4,
|
||||
onChange: function(v){ s({ imgWidth: v }); } }),
|
||||
el(RC, { label: 'Height (px) — 0 = auto', value: imgH, min: 0, max: 600, step: 4,
|
||||
el(RC, { label: 'Height (px) - 0 = auto', value: imgH, min: 0, max: 600, step: 4,
|
||||
onChange: function(v){ s({ imgHeight: v }); } }),
|
||||
el(TG, { label: 'Scale to fill (cover)', checked: imgFit === 'cover',
|
||||
onChange: function(v){ s({ imgFit: v ? 'cover' : 'contain' }); } }),
|
||||
@@ -1738,7 +1738,7 @@ reg('oribi/site-header', {
|
||||
supports: { html: false, multiple: false, reusable: false },
|
||||
edit: function () {
|
||||
return el('div', {
|
||||
style: { background: '#0D1321', color: '#fff', padding: '20px 24px', borderRadius: '8px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }
|
||||
style: { background: '#111111', color: '#fff', padding: '20px 24px', borderRadius: '8px', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }
|
||||
},
|
||||
el('div', { style: { display: 'flex', alignItems: 'center', gap: '8px' } },
|
||||
el('strong', { style: { fontSize: '1.2rem' } }, 'Oribi'),
|
||||
@@ -1762,9 +1762,9 @@ reg('oribi/site-footer', {
|
||||
supports: { html: false, multiple: false, reusable: false },
|
||||
edit: function () {
|
||||
return el('div', {
|
||||
style: { background: '#0D1321', color: '#fff', padding: '24px', borderRadius: '8px', textAlign: 'center' }
|
||||
style: { background: '#111111', color: '#fff', padding: '24px', borderRadius: '8px', textAlign: 'center' }
|
||||
},
|
||||
el('strong', { style: { fontSize: '1.1rem' } }, 'OTS Theme — Site Footer'),
|
||||
el('strong', { style: { fontSize: '1.1rem' } }, 'OTS Theme - Site Footer'),
|
||||
el('p', { style: { opacity: 0.5, margin: '8px 0 0', fontSize: '.85rem' } }, 'Brand · Service Links · Company Links · Connect · Copyright')
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* OTS Theme — Custom Gutenberg Blocks (InnerBlocks Architecture)
|
||||
* OTS Theme - Custom Gutenberg Blocks (InnerBlocks Architecture)
|
||||
*
|
||||
* Blocks:
|
||||
* Standalone: hero, page-hero, cta-banner, intro-section, contact-section
|
||||
@@ -118,7 +118,7 @@ function oribi_card_icon_attributes() {
|
||||
*
|
||||
* Accepts either:
|
||||
* - iconType = 'fontawesome' + faIcon = 'fas fa-cloud' → <i class="fas fa-cloud"></i>
|
||||
* - iconType = 'emoji' + icon = '☁️' → ☁️ (escaped)
|
||||
* - iconType = 'emoji' + icon = 'text' -> text (escaped)
|
||||
*
|
||||
* Legacy: if $icon_or_attrs is a plain string it behaves like before.
|
||||
*
|
||||
@@ -233,7 +233,7 @@ add_action( 'enqueue_block_editor_assets', function () {
|
||||
/* ── Register all blocks ───────────────────────────────────────────────────── */
|
||||
add_action( 'init', function () {
|
||||
|
||||
/* Shared supports — exposes color pickers and font-size selector in the
|
||||
/* Shared supports - exposes color pickers and font-size selector in the
|
||||
block inspector for every Oribi block. Individual blocks can override
|
||||
these by merging their own array if needed. */
|
||||
$block_supports = [
|
||||
@@ -618,7 +618,7 @@ add_action( 'init', function () {
|
||||
|
||||
/* ── ANIMATED HERO BLOCKS (OTS Signs) ─────────────────────────────────── */
|
||||
|
||||
/* Animated Hero — full homepage hero with particle background */
|
||||
/* Animated Hero - full homepage hero with particle background */
|
||||
register_block_type( 'oribi/hero-animated', [
|
||||
'attributes' => [
|
||||
'label' => [ 'type' => 'string', 'default' => '' ],
|
||||
@@ -640,7 +640,7 @@ add_action( 'init', function () {
|
||||
'render_callback' => 'oribi_render_hero_animated',
|
||||
] );
|
||||
|
||||
/* Animated Page Hero — inner pages with particle background */
|
||||
/* Animated Page Hero - inner pages with particle background */
|
||||
register_block_type( 'oribi/page-hero-animated', [
|
||||
'attributes' => [
|
||||
'label' => [ 'type' => 'string', 'default' => '' ],
|
||||
@@ -935,10 +935,10 @@ function oribi_render_contact_section( $a ) {
|
||||
<div class="contact-info">
|
||||
<h2><?php echo wp_kses_post( $a['heading'] ); ?></h2>
|
||||
<p class="lead"><?php echo wp_kses_post( $a['lead'] ); ?></p>
|
||||
<div class="contact-method"><div class="contact-method-icon">📧</div><div><div class="contact-method-label">Email Us</div><div class="contact-method-value"><a href="mailto:<?php echo esc_attr( $a['email'] ); ?>"><?php echo esc_html( $a['email'] ); ?></a></div></div></div>
|
||||
<div class="contact-method"><div class="contact-method-icon">🎫</div><div><div class="contact-method-label">Existing Customer Support</div><div class="contact-method-value"><a href="<?php echo esc_url( $a['supportUrl'] ); ?>" target="_blank" rel="noopener">Open a Support Ticket</a></div></div></div>
|
||||
<div class="contact-method"><div class="contact-method-icon">🌎</div><div><div class="contact-method-label">Client Portal</div><div class="contact-method-value"><a href="<?php echo esc_url( $a['portalUrl'] ); ?>" target="_blank" rel="noopener"><?php echo esc_html( wp_parse_url( $a['portalUrl'], PHP_URL_HOST ) ); ?></a></div></div></div>
|
||||
<div class="contact-method"><div class="contact-method-icon">📍</div><div><div class="contact-method-label">Location</div><div class="contact-method-value"><?php echo esc_html( $a['location'] ); ?></div></div></div>
|
||||
<div class="contact-method"><div class="contact-method-icon"><i class="fas fa-envelope" aria-hidden="true"></i></div><div><div class="contact-method-label">Email Us</div><div class="contact-method-value"><a href="mailto:<?php echo esc_attr( $a['email'] ); ?>"><?php echo esc_html( $a['email'] ); ?></a></div></div></div>
|
||||
<div class="contact-method"><div class="contact-method-icon"><i class="fas fa-headset" aria-hidden="true"></i></div><div><div class="contact-method-label">Existing Customer Support</div><div class="contact-method-value"><a href="<?php echo esc_url( $a['supportUrl'] ); ?>" target="_blank" rel="noopener">Open a Support Ticket</a></div></div></div>
|
||||
<div class="contact-method"><div class="contact-method-icon"><i class="fas fa-globe" aria-hidden="true"></i></div><div><div class="contact-method-label">Client Portal</div><div class="contact-method-value"><a href="<?php echo esc_url( $a['portalUrl'] ); ?>" target="_blank" rel="noopener"><?php echo esc_html( wp_parse_url( $a['portalUrl'], PHP_URL_HOST ) ); ?></a></div></div></div>
|
||||
<div class="contact-method"><div class="contact-method-icon"><i class="fas fa-map-marker-alt" aria-hidden="true"></i></div><div><div class="contact-method-label">Location</div><div class="contact-method-value"><?php echo esc_html( $a['location'] ); ?></div></div></div>
|
||||
</div>
|
||||
<div class="contact-form-wrap">
|
||||
<h3 style="margin-bottom:1.5rem;"><?php echo esc_html( $a['formHeading'] ); ?></h3>
|
||||
@@ -970,12 +970,12 @@ function oribi_render_contact_section( $a ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Feature Section (parent — wraps child feature-card blocks) ────────────── */
|
||||
/* ── Feature Section (parent - wraps child feature-card blocks) ────────────── */
|
||||
function oribi_render_feature_section( $a, $content ) {
|
||||
return oribi_render_card_section( $a, $content, 'grid', 3 );
|
||||
}
|
||||
|
||||
/* ── Feature Card (child — renders one card) ───────────────────────────────── */
|
||||
/* ── Feature Card (child - renders one card) ───────────────────────────────── */
|
||||
function oribi_render_feature_card( $a ) {
|
||||
$tag = ! empty( $a['url'] ) ? 'a' : 'div';
|
||||
$href = ! empty( $a['url'] ) ? ' href="' . esc_url( $a['url'] ) . '"' : '';
|
||||
@@ -1241,7 +1241,7 @@ function oribi_render_link_card( $a ) {
|
||||
return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Pricing Section (parent — wraps child pricing-card blocks) ────────────── */
|
||||
/* ── Pricing Section (parent - wraps child pricing-card blocks) ────────────── */
|
||||
function oribi_render_pricing_section( $a, $content, $block ) {
|
||||
$cls = $a['variant'] === 'alt' ? 'section section-alt' : 'section';
|
||||
$count = count( $block->inner_blocks );
|
||||
@@ -1261,7 +1261,7 @@ function oribi_render_pricing_section( $a, $content, $block ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Pricing Card (child — renders one pricing tier) ───────────────────────── */
|
||||
/* ── Pricing Card (child - renders one pricing tier) ───────────────────────── */
|
||||
function oribi_render_pricing_card( $a ) {
|
||||
$featured = ! empty( $a['featured'] );
|
||||
$img_id = ! empty( $a['imgId'] ) ? intval( $a['imgId'] ) : 0;
|
||||
@@ -1304,7 +1304,7 @@ function oribi_render_pricing_card( $a ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Platform Section (parent — wraps child platform-row blocks) ───────────── */
|
||||
/* ── Platform Section (parent - wraps child platform-row blocks) ───────────── */
|
||||
function oribi_render_platform_section( $a, $content ) {
|
||||
ob_start(); ?>
|
||||
<section class="section">
|
||||
@@ -1320,7 +1320,7 @@ function oribi_render_platform_section( $a, $content ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Platform Row (child — renders one service row) ────────────────────────── */
|
||||
/* ── Platform Row (child - renders one service row) ────────────────────────── */
|
||||
function oribi_render_platform_row( $a ) {
|
||||
$rev = ! empty( $a['reversed'] ) ? ' reverse' : '';
|
||||
$img_id = ! empty( $a['imgId'] ) ? intval( $a['imgId'] ) : 0;
|
||||
@@ -1355,7 +1355,7 @@ function oribi_render_platform_row( $a ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Trust Section (parent — wraps child trust-item blocks) ────────────────── */
|
||||
/* ── Trust Section (parent - wraps child trust-item blocks) ────────────────── */
|
||||
function oribi_render_trust_section( $a, $content ) {
|
||||
ob_start(); ?>
|
||||
<section class="section">
|
||||
@@ -1379,7 +1379,7 @@ function oribi_render_trust_section( $a, $content ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Trust Item (child — renders one heading + description pair) ────────────── */
|
||||
/* ── Trust Item (child - renders one heading + description pair) ────────────── */
|
||||
function oribi_render_trust_item( $a ) {
|
||||
ob_start(); ?>
|
||||
<div class="trust-item">
|
||||
@@ -1389,7 +1389,7 @@ function oribi_render_trust_item( $a ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── FAQ Section (parent — wraps child faq-item blocks) ────────────────────── */
|
||||
/* ── FAQ Section (parent - wraps child faq-item blocks) ────────────────────── */
|
||||
function oribi_render_faq_section( $a, $content ) {
|
||||
$cls = $a['variant'] === 'alt' ? 'section section-alt' : 'section';
|
||||
ob_start(); ?>
|
||||
@@ -1408,7 +1408,7 @@ function oribi_render_faq_section( $a, $content ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── FAQ Item (child — renders one accordion item) ─────────────────────────── */
|
||||
/* ── FAQ Item (child - renders one accordion item) ─────────────────────────── */
|
||||
function oribi_render_faq_item( $a ) {
|
||||
ob_start(); ?>
|
||||
<details class="faq-item">
|
||||
@@ -1418,7 +1418,7 @@ function oribi_render_faq_item( $a ) {
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
|
||||
/* ── Comparison Table (standalone — renders a feature matrix) ──────────────── */
|
||||
/* ── Comparison Table (standalone - renders a feature matrix) ──────────────── */
|
||||
function oribi_render_comparison_table( $a ) {
|
||||
$cls = $a['variant'] === 'alt' ? 'section section-alt' : 'section';
|
||||
$cols = $a['columns'] ?? [];
|
||||
@@ -1455,7 +1455,7 @@ function oribi_render_comparison_table( $a ) {
|
||||
<?php foreach ( ( $row['values'] ?? [] ) as $val ) : ?>
|
||||
<td class="comparison-cell"><?php
|
||||
if ( $val === true ) echo '<span class="comparison-yes">✓</span>';
|
||||
elseif ( $val === false ) echo '<span class="comparison-no">—</span>';
|
||||
elseif ( $val === false ) echo '<span class="comparison-no">✗</span>';
|
||||
else echo wp_kses_post( $val );
|
||||
?></td>
|
||||
<?php endforeach; ?>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Oribi Tech — Theme Bootstrap
|
||||
* Oribi Tech - Theme Bootstrap
|
||||
*
|
||||
* @package OTS_Theme
|
||||
* @since 1.0.0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Asset Enqueuing — frontend styles, scripts, and editor additions.
|
||||
* Asset Enqueuing - frontend styles, scripts, and editor additions.
|
||||
*
|
||||
* @package OTS_Theme
|
||||
*/
|
||||
@@ -20,7 +20,7 @@ add_action( 'wp_enqueue_scripts', function () {
|
||||
ORIBI_VERSION
|
||||
);
|
||||
|
||||
// Main JS — dark mode, sticky header, mobile nav, scroll animations
|
||||
// Main JS - dark mode, sticky header, mobile nav, scroll animations
|
||||
wp_enqueue_script(
|
||||
'oribi-main',
|
||||
ORIBI_URI . '/assets/js/main.js',
|
||||
@@ -60,7 +60,7 @@ add_action( 'enqueue_block_editor_assets', function () {
|
||||
);
|
||||
} );
|
||||
|
||||
/* ── Google Fonts — dynamic based on theme settings ────────── */
|
||||
/* ── Google Fonts - dynamic based on theme settings ────────── */
|
||||
add_action( 'wp_enqueue_scripts', 'oribi_enqueue_selected_fonts' );
|
||||
add_action( 'enqueue_block_editor_assets', 'oribi_enqueue_selected_fonts' );
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Font Manager — Bridges the WordPress Font Library with theme settings.
|
||||
* Font Manager - Bridges the WordPress Font Library with theme settings.
|
||||
*
|
||||
* Uses the built-in Font Library (WP 6.5+) for registration, discovery,
|
||||
* and @font-face generation. The admin settings page uses the helpers
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Theme Setup — registers supports, menus, patterns, and editor styles.
|
||||
* Theme Setup - registers supports, menus, patterns, and editor styles.
|
||||
*
|
||||
* @package OTS_Theme
|
||||
*/
|
||||
@@ -50,10 +50,10 @@ add_action( 'after_setup_theme', function () {
|
||||
/* ── Block pattern categories ──────────────────────────────── */
|
||||
add_action( 'init', function () {
|
||||
register_block_pattern_category( 'oribi-pages', [
|
||||
'label' => __( 'Oribi Tech — Pages', 'ots-theme' ),
|
||||
'label' => __( 'Oribi Tech - Pages', 'ots-theme' ),
|
||||
] );
|
||||
register_block_pattern_category( 'oribi-sections', [
|
||||
'label' => __( 'Oribi Tech — Sections', 'ots-theme' ),
|
||||
'label' => __( 'Oribi Tech - Sections', 'ots-theme' ),
|
||||
] );
|
||||
} );
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Theme Defaults — Provides default values for all customizable design tokens.
|
||||
* Theme Defaults - Provides default values for all customizable design tokens.
|
||||
*
|
||||
* These defaults match the original hardcoded values so existing sites
|
||||
* see no visual change when upgrading.
|
||||
@@ -24,37 +24,37 @@ function oribi_get_theme_defaults() {
|
||||
return [
|
||||
|
||||
/* ── Light-mode colour palette ──────────────────────── */
|
||||
'color_primary' => '#D83302',
|
||||
'color_primary_dk' => '#B52B02',
|
||||
'color_primary_lt' => '#FEF0EB',
|
||||
'color_accent' => '#00757c',
|
||||
'color_accent_dk' => '#005a60',
|
||||
'color_accent_lt' => '#E6F4F5',
|
||||
'color_dark' => '#0D1321',
|
||||
'color_dark_2' => '#1A2236',
|
||||
'color_text' => '#2D3748',
|
||||
'color_text_muted' => '#718096',
|
||||
'color_border' => '#E2E8F0',
|
||||
'color_primary' => '#004225',
|
||||
'color_primary_dk' => '#002E1A',
|
||||
'color_primary_lt' => '#E8F5E9',
|
||||
'color_accent' => '#4CAF50',
|
||||
'color_accent_dk' => '#388E3C',
|
||||
'color_accent_lt' => '#E8F5E9',
|
||||
'color_dark' => '#111111',
|
||||
'color_dark_2' => '#1A1A1A',
|
||||
'color_text' => '#333333',
|
||||
'color_text_muted' => '#666666',
|
||||
'color_border' => '#E0E0E0',
|
||||
'color_bg' => '#FFFFFF',
|
||||
'color_bg_alt' => '#FFF8F5',
|
||||
'color_bg_alt' => '#F5F5F5',
|
||||
|
||||
/* ── Dark-mode colour palette ───────────────────────── */
|
||||
'dark_primary' => '#FF6B3D',
|
||||
'dark_primary_dk' => '#D83302',
|
||||
'dark_primary_lt' => 'rgba(216,51,2,0.15)',
|
||||
'dark_accent' => '#00757c',
|
||||
'dark_accent_dk' => '#005a60',
|
||||
'dark_accent_lt' => 'rgba(0,117,124,0.15)',
|
||||
'dark_dark' => '#E2E8F0',
|
||||
'dark_dark_2' => '#CBD5E0',
|
||||
'dark_text' => '#CBD5E0',
|
||||
'dark_text_muted' => '#A0AEC0',
|
||||
'dark_border' => '#2D3748',
|
||||
'dark_bg' => '#0F1724',
|
||||
'dark_bg_alt' => '#151F30',
|
||||
'dark_bg_dark' => '#0A0F1A',
|
||||
'dark_heading' => '#F7FAFC',
|
||||
'dark_card_bg' => '#151F30',
|
||||
'dark_primary' => '#4CAF50',
|
||||
'dark_primary_dk' => '#004225',
|
||||
'dark_primary_lt' => 'rgba(0,66,37,0.15)',
|
||||
'dark_accent' => '#66BB6A',
|
||||
'dark_accent_dk' => '#4CAF50',
|
||||
'dark_accent_lt' => 'rgba(76,175,80,0.15)',
|
||||
'dark_dark' => '#E0E0E0',
|
||||
'dark_dark_2' => '#BDBDBD',
|
||||
'dark_text' => '#E0E0E0',
|
||||
'dark_text_muted' => '#9E9E9E',
|
||||
'dark_border' => '#333333',
|
||||
'dark_bg' => '#1A1A1A',
|
||||
'dark_bg_alt' => '#222222',
|
||||
'dark_bg_dark' => '#111111',
|
||||
'dark_heading' => '#F5F5F5',
|
||||
'dark_card_bg' => '#222222',
|
||||
|
||||
/* ── Typography ─────────────────────────────────────── */
|
||||
'font_family' => 'inter', // slug from WP Font Library
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Theme Generator — Builds and caches a CSS file from saved design tokens.
|
||||
* Theme Generator - Builds and caches a CSS file from saved design tokens.
|
||||
*
|
||||
* Reads theme-mods written by the admin settings page and produces a
|
||||
* static CSS file in the uploads directory. The file is enqueued after
|
||||
@@ -16,7 +16,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||
/**
|
||||
* Return the absolute filesystem path of the generated CSS file.
|
||||
*
|
||||
* Multi-site aware — each site gets its own file.
|
||||
* Multi-site aware - each site gets its own file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -38,10 +38,10 @@ function oribi_generated_css_url() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper: convert a hex colour like #D83302 to its "r,g,b" string.
|
||||
* Helper: convert a hex colour like #004225 to its "r,g,b" string.
|
||||
*
|
||||
* @param string $hex Hex colour with or without leading #.
|
||||
* @return string e.g. "216,51,2"
|
||||
* @return string e.g. "0,66,37"
|
||||
*/
|
||||
function oribi_hex_to_rgb( $hex ) {
|
||||
$hex = ltrim( $hex, '#' );
|
||||
@@ -124,7 +124,7 @@ function oribi_build_css() {
|
||||
// Build CSS.
|
||||
$css = <<<CSS
|
||||
/* ================================================================
|
||||
OTS Theme — Generated Theme Overrides
|
||||
OTS Theme - Generated Theme Overrides
|
||||
Generated: %s
|
||||
================================================================ */
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Theme Settings — Custom admin page for configuring colours, fonts,
|
||||
* Theme Settings - Custom admin page for configuring colours, fonts,
|
||||
* spacing, and border-radius design tokens.
|
||||
*
|
||||
* Appearance → Theme Design Settings
|
||||
@@ -63,7 +63,7 @@ add_action( 'admin_init', function () {
|
||||
|
||||
$defaults = oribi_get_theme_defaults();
|
||||
|
||||
// Determine action — save or reset.
|
||||
// Determine action - save or reset.
|
||||
$action = isset( $_POST['oribi_action'] ) ? sanitize_text_field( wp_unslash( $_POST['oribi_action'] ) ) : 'save';
|
||||
|
||||
if ( 'reset' === $action ) {
|
||||
@@ -314,7 +314,7 @@ function oribi_render_settings_page() {
|
||||
</th>
|
||||
<td>
|
||||
<select id="oribi_font_heading" name="oribi_font_heading" class="oribi-font-select">
|
||||
<option value=""><?php esc_html_e( '— Same as body font —', 'ots-theme' ); ?></option>
|
||||
<option value=""><?php esc_html_e( '- Same as body font -', 'ots-theme' ); ?></option>
|
||||
<?php foreach ( $fonts as $f ) : ?>
|
||||
<option
|
||||
value="<?php echo esc_attr( $f['slug'] ); ?>"
|
||||
@@ -631,31 +631,31 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
var heroText = document.getElementById('preview-hero-text');
|
||||
|
||||
if (hero) {
|
||||
hero.style.backgroundColor = get('oribi_color_dark') || '#0D1321';
|
||||
hero.style.backgroundColor = get('oribi_color_dark') || '#111111';
|
||||
if (heroTitle) heroTitle.style.color = '#fff';
|
||||
if (heroText) heroText.style.color = 'rgba(255,255,255,.8)';
|
||||
}
|
||||
if (btnP) {
|
||||
btnP.style.backgroundColor = get('oribi_color_primary') || '#D83302';
|
||||
btnP.style.backgroundColor = get('oribi_color_primary') || '#004225';
|
||||
btnP.style.borderRadius = (get('oribi_radius_sm') || '6') + 'px';
|
||||
}
|
||||
if (btnA) {
|
||||
btnA.style.backgroundColor = get('oribi_color_accent') || '#00757c';
|
||||
btnA.style.backgroundColor = get('oribi_color_accent') || '#4CAF50';
|
||||
btnA.style.borderRadius = (get('oribi_radius_sm') || '6') + 'px';
|
||||
}
|
||||
if (section) {
|
||||
section.style.backgroundColor = get('oribi_color_bg_alt') || '#FFF8F5';
|
||||
section.style.backgroundColor = get('oribi_color_bg_alt') || '#F5F5F5';
|
||||
}
|
||||
if (card) {
|
||||
card.style.backgroundColor = get('oribi_color_bg') || '#fff';
|
||||
card.style.borderColor = get('oribi_color_border') || '#E2E8F0';
|
||||
card.style.borderRadius = (get('oribi_radius_md') || '12') + 'px';
|
||||
card.style.borderColor = get('oribi_color_border') || '#E0E0E0';
|
||||
card.style.borderRadius = (get('oribi_radius_md') || '10') + 'px';
|
||||
var h4 = card.querySelector('h4');
|
||||
if (h4) h4.style.color = get('oribi_color_dark') || '#0D1321';
|
||||
if (h4) h4.style.color = get('oribi_color_dark') || '#111111';
|
||||
var p = card.querySelector('p');
|
||||
if (p) p.style.color = get('oribi_color_text') || '#2D3748';
|
||||
if (p) p.style.color = get('oribi_color_text') || '#333333';
|
||||
var sm = card.querySelector('small');
|
||||
if (sm) sm.style.color = get('oribi_color_text_muted') || '#718096';
|
||||
if (sm) sm.style.color = get('oribi_color_text_muted') || '#666666';
|
||||
}
|
||||
|
||||
// Radius previews.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Fallback template — required by WordPress for all themes.
|
||||
* Fallback template - required by WordPress for all themes.
|
||||
*
|
||||
* In a Full Site Editing (block) theme the actual rendering is handled
|
||||
* by the HTML templates in /templates/ and /parts/. This file exists
|
||||
|
||||
@@ -3,7 +3,7 @@ Theme Name: Oribi Tech
|
||||
Theme URI: https://oribi-tech.com
|
||||
Author: Oribi Technology Services
|
||||
Author URI: https://oribi-tech.com
|
||||
Description: Custom marketing theme for Oribi Technology Services — Managed IT, 365Care, EndpointCare, NetCare, ServerCare.
|
||||
Description: Custom marketing theme for Oribi Technology Services - Managed IT, 365Care, EndpointCare, NetCare, ServerCare.
|
||||
Version: 1.0.0
|
||||
Requires at least: 6.4
|
||||
Tested up to: 6.7
|
||||
|
||||
@@ -32,19 +32,19 @@
|
||||
"customDuotone": false,
|
||||
"customGradient": false,
|
||||
"palette": [
|
||||
{ "slug": "primary", "color": "#D83302", "name": "Primary" },
|
||||
{ "slug": "primary-dk", "color": "#B52B02", "name": "Primary Dark" },
|
||||
{ "slug": "primary-lt", "color": "#FEF0EB", "name": "Primary Light" },
|
||||
{ "slug": "accent", "color": "#00757c", "name": "Accent" },
|
||||
{ "slug": "accent-dk", "color": "#005a60", "name": "Accent Dark" },
|
||||
{ "slug": "accent-lt", "color": "#E6F4F5", "name": "Accent Light" },
|
||||
{ "slug": "dark", "color": "#0D1321", "name": "Dark" },
|
||||
{ "slug": "dark-2", "color": "#1A2236", "name": "Dark 2" },
|
||||
{ "slug": "text", "color": "#2D3748", "name": "Text" },
|
||||
{ "slug": "text-muted", "color": "#718096", "name": "Text Muted" },
|
||||
{ "slug": "border", "color": "#E2E8F0", "name": "Border" },
|
||||
{ "slug": "primary", "color": "#004225", "name": "Primary" },
|
||||
{ "slug": "primary-dk", "color": "#002E1A", "name": "Primary Dark" },
|
||||
{ "slug": "primary-lt", "color": "#E8F5E9", "name": "Primary Light" },
|
||||
{ "slug": "accent", "color": "#4CAF50", "name": "Accent" },
|
||||
{ "slug": "accent-dk", "color": "#388E3C", "name": "Accent Dark" },
|
||||
{ "slug": "accent-lt", "color": "#E8F5E9", "name": "Accent Light" },
|
||||
{ "slug": "dark", "color": "#111111", "name": "Dark" },
|
||||
{ "slug": "dark-2", "color": "#1A1A1A", "name": "Dark 2" },
|
||||
{ "slug": "text", "color": "#333333", "name": "Text" },
|
||||
{ "slug": "text-muted", "color": "#666666", "name": "Text Muted" },
|
||||
{ "slug": "border", "color": "#E0E0E0", "name": "Border" },
|
||||
{ "slug": "bg", "color": "#FFFFFF", "name": "Background" },
|
||||
{ "slug": "bg-alt", "color": "#FFF8F5", "name": "Background Alt" }
|
||||
{ "slug": "bg-alt", "color": "#F5F5F5", "name": "Background Alt" }
|
||||
]
|
||||
},
|
||||
"typography": {
|
||||
@@ -70,37 +70,37 @@
|
||||
}
|
||||
],
|
||||
"fontSizes": [
|
||||
{ "slug": "xs", "size": "0.75rem", "name": "XS — 12px" },
|
||||
{ "slug": "sm", "size": "0.875rem", "name": "SM — 14px" },
|
||||
{ "slug": "base", "size": "1rem", "name": "Base — 16px" },
|
||||
{ "slug": "md", "size": "1.125rem", "name": "MD — 18px" },
|
||||
{ "slug": "lg", "size": "1.25rem", "name": "LG — 20px" },
|
||||
{ "slug": "xl", "size": "1.5rem", "name": "XL — 24px" },
|
||||
{ "slug": "2xl", "size": "1.875rem", "name": "2XL — 30px" },
|
||||
{ "slug": "3xl", "size": "2.25rem", "name": "3XL — 36px" },
|
||||
{ "slug": "4xl", "size": "3rem", "name": "4XL — 48px" },
|
||||
{ "slug": "5xl", "size": "3.75rem", "name": "5XL — 60px" },
|
||||
{ "slug": "6xl", "size": "4.5rem", "name": "6XL — 72px" }
|
||||
{ "slug": "xs", "size": "0.75rem", "name": "XS - 12px" },
|
||||
{ "slug": "sm", "size": "0.875rem", "name": "SM - 14px" },
|
||||
{ "slug": "base", "size": "1rem", "name": "Base - 16px" },
|
||||
{ "slug": "md", "size": "1.125rem", "name": "MD - 18px" },
|
||||
{ "slug": "lg", "size": "1.25rem", "name": "LG - 20px" },
|
||||
{ "slug": "xl", "size": "1.5rem", "name": "XL - 24px" },
|
||||
{ "slug": "2xl", "size": "1.875rem", "name": "2XL - 30px" },
|
||||
{ "slug": "3xl", "size": "2.25rem", "name": "3XL - 36px" },
|
||||
{ "slug": "4xl", "size": "3rem", "name": "4XL - 48px" },
|
||||
{ "slug": "5xl", "size": "3.75rem", "name": "5XL - 60px" },
|
||||
{ "slug": "6xl", "size": "4.5rem", "name": "6XL - 72px" }
|
||||
]
|
||||
},
|
||||
"custom": {
|
||||
"dark": {
|
||||
"primary": "#FF6B3D",
|
||||
"primary-dk": "#D83302",
|
||||
"primary-lt": "rgba(216,51,2,0.15)",
|
||||
"accent": "#00757c",
|
||||
"accent-dk": "#005a60",
|
||||
"accent-lt": "rgba(0,117,124,0.15)",
|
||||
"dark": "#E2E8F0",
|
||||
"dark-2": "#CBD5E0",
|
||||
"text": "#CBD5E0",
|
||||
"text-muted": "#A0AEC0",
|
||||
"border": "#2D3748",
|
||||
"bg": "#0F1724",
|
||||
"bg-alt": "#151F30",
|
||||
"bg-dark": "#0A0F1A",
|
||||
"heading": "#F7FAFC",
|
||||
"card-bg": "#151F30"
|
||||
"primary": "#4CAF50",
|
||||
"primary-dk": "#004225",
|
||||
"primary-lt": "rgba(0,66,37,0.15)",
|
||||
"accent": "#66BB6A",
|
||||
"accent-dk": "#388E3C",
|
||||
"accent-lt": "rgba(76,175,80,0.12)",
|
||||
"dark": "#E0E0E0",
|
||||
"dark-2": "#BDBDBD",
|
||||
"text": "#E0E0E0",
|
||||
"text-muted": "#9E9E9E",
|
||||
"border": "#333333",
|
||||
"bg": "#1A1A1A",
|
||||
"bg-alt": "#222222",
|
||||
"bg-dark": "#111111",
|
||||
"heading": "#F5F5F5",
|
||||
"card-bg": "#222222"
|
||||
},
|
||||
"radius": {
|
||||
"sm": "6px",
|
||||
|
||||
Reference in New Issue
Block a user