6 Commits

Author SHA1 Message Date
5268289782 v1.0.0 - Release: widget area, documentation refresh
All checks were successful
Create Release Package / PHP Lint (push) Successful in 50s
Create Release Package / Build Release (push) Successful in 1m14s
- Register sidebar widget area via register_sidebar()
- Render WordPress widgets in Twig sidebar with fallback to built-in content
- Update README.md with accurate feature counts and descriptions
- Update translation files with widget area strings
- Bump version to 1.0.0

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-08 18:43:09 +01:00
4c808a992a v0.3.3 - Fix style variation bridge to read from theme palette origin
All checks were successful
Create Release Package / PHP Lint (push) Successful in 50s
Create Release Package / Build Release (push) Successful in 1m16s
WordPress puts active variation colors in the 'theme' palette origin,
not 'custom'. Detection now compares theme origin against base defaults.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-08 18:12:52 +01:00
d6731cca47 v0.3.2 - Fix dark mode conflicts with WordPress global styles
All checks were successful
Create Release Package / PHP Lint (push) Successful in 59s
Create Release Package / Build Release (push) Successful in 1m25s
Fix dark mode body colors overridden by WordPress theme.json styles.color,
add broad dark mode rules for plugin form elements, fix footer-columns
template, and add style variation bridge function.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-08 17:33:12 +01:00
edf053d7ea v0.3.1 - Add 11 new style variations (4 light, 4 dark + 3 earlier dark)
All checks were successful
Create Release Package / PHP Lint (push) Successful in 50s
Create Release Package / Build Release (push) Successful in 1m19s
Add Rose, Sand, Lavender, Mint (light) and Ember, Arctic, Amethyst,
Slate, Mocha, Nebula, Obsidian (dark) color palettes for the Design
Editor. Total of 15 style variations available (7 light, 7 dark).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-08 16:37:29 +01:00
eb5ac6f7ad v0.3.0 - Polish: accessibility, security, performance, RTL, French translation
All checks were successful
Create Release Package / PHP Lint (push) Successful in 52s
Create Release Package / Build Release (push) Successful in 1m21s
Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-08 16:27:13 +01:00
cc8dc9d357 v0.2.0 - Design Editor: templates, patterns, header/footer variations
All checks were successful
Create Release Package / PHP Lint (push) Successful in 57s
Create Release Package / Build Release (push) Successful in 1m23s
Full Design Editor compatibility with custom block categories, page templates,
header/footer variations, and navigation styles. Both FSE (admin) and Twig
(frontend) sides kept in sync.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-08 16:05:29 +01:00
77 changed files with 16565 additions and 109 deletions

View File

@@ -2,6 +2,107 @@
All notable changes to this project will be documented in this file.
## [1.0.0] - 2026-02-08
### Added
- Sidebar widget area (`primary-sidebar`) registered via `register_sidebar()` — manageable in Appearance > Widgets
- Widget area rendering in Twig sidebar with fallback to built-in content (recent posts, search, tags) when no widgets assigned
- Widget area description strings added to all translation files (en_US, de_CH, fr_FR)
### Changed
- Updated README.md with accurate feature counts (15 style variations, 41 patterns, 3 translations)
- Added documentation for style variation bridge, widget areas, RTL support, and accessibility features
## [0.3.3] - 2026-02-08
### Fixed
- Style variation colors not applied to Bootstrap frontend — bridge function checked wrong palette origin (`custom` instead of `theme`)
- Variation detection now compares `theme` origin against base theme.json defaults instead of looking for slugs in `custom` origin
## [0.3.2] - 2026-02-08
### Fixed
- Dark mode body colors overridden by WordPress global styles (`styles.color` in `theme.json` generated conflicting `body` CSS)
- Dark mode styling for plugin-generated form elements (`select`, `input`, `textarea`) that lack Bootstrap classes
- Footer columns template used hardcoded `bg-dark text-light` instead of semantic `bg-body-tertiary`
- Style variation bridge function ran with default palette when no variation was active, causing unnecessary CSS overrides
### Changed
- Removed `styles.color` from `theme.json` to prevent WordPress from generating body background/text CSS that conflicts with Bootstrap dark mode
- Added `!important` override in `_custom.scss` for `html[data-bs-theme="dark"] body` to ensure Bootstrap dark mode takes precedence
- Added broad dark mode rules for native form elements in `_custom.scss`
## [0.3.1] - 2026-02-08
### Added
- 4 new light style variations: Rose, Sand, Lavender, Mint
- 4 new dark style variations: Slate, Mocha, Nebula, Obsidian
- Total of 15 color palettes available in the Design Editor (7 light, 7 dark, plus default)
## [0.3.0] - 2026-02-08
### Added
- Skip-to-content link for keyboard navigation accessibility
- ARIA labels on all navigation landmarks (`<nav>`, `<aside>`)
- `aria-current="page"` on active dropdown menu items across all header variants
- Lazy loading (`loading="lazy"`) on all below-fold images (post thumbnails, cards, avatars)
- Screen reader announcement for dark mode toggle via `aria-live` status region
- Font preload hints for Inter and Lora variable fonts
- RTL language support: conditional RTL stylesheet, logical CSS properties for blockquote and list styles
- French (fr_FR) translation with all ~216 strings translated
- CSS classes for post thumbnails, card thumbnails, sidebar headings, and hero overlays (replacing inline styles)
### Fixed
- XSS vulnerability in search results template (`search_query` now escaped with `|e('html')`)
- Comment author URLs now explicitly escaped with `esc_url()` in Twig templates
### Changed
- Block style `blockquote-accent` uses `border-inline-start` instead of `border-left` for RTL compatibility
- Block style `list-unstyled` uses `padding-inline-start` instead of `padding-left` for RTL compatibility
- Inline styles in Twig templates replaced with CSS classes for maintainability
- Updated translation files (`.pot` and `de_CH.po`) with new accessibility strings
- Build pipeline includes RTL SCSS compilation step
## [0.2.0] - 2026-02-08
### Added
- Full Design Editor compatibility: Bootstrap JS in block editor, full Bootstrap SCSS in editor stylesheet
- 3 custom block categories: Bootstrap Layout, Bootstrap Components, Bootstrap Navigation
- 3 custom pattern categories: Layout, Components, Navigation
- 4 layout patterns: container, 2-column, 3-column, full-width section
- 2 component patterns: card group, accordion
- 3 full-page patterns: about, services, contact
- 4 custom page templates (FSE + Twig): landing (no header/footer), full-width, hero, sidebar
- 2 header variations (FSE + Twig): centered, transparent
- 2 footer variations (FSE + Twig): minimal, multi-column
- 2 navigation patterns: dark navbar, offcanvas mobile navigation
- Offcanvas navigation Twig partial with Bootstrap offcanvas component
- Editor SCSS overrides for alignment and spacing consistency
- Shadow presets (sm, md, lg), aspect ratio presets, and custom layout values in `theme.json`
- Header/footer variant support via `get_theme_mod()` in `ContextBuilder`
- Twig block inheritance in `base.html.twig` for header/footer variant overrides
- Custom page template routing via `get_page_template_slug()` in `TemplateController`
- Transparent header and offcanvas dark mode SCSS styles
### Changed
- Enhanced `editor-style.scss` to import full Bootstrap for WYSIWYG editor fidelity
- Enhanced `theme.json` with custom templates and template parts registration
- Enhanced `functions.php` with block editor assets, block categories, and pattern categories
- Enhanced `ContextBuilder` with header/footer variant methods
- Enhanced `TemplateController` with custom page template slug routing
- Updated translation files (`.pot` and `de_CH.po`) with all new translatable strings
## [0.1.1] - 2026-02-08
### Added

122
CLAUDE.md
View File

@@ -34,7 +34,7 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
**Note for AI Assistants:** Clean this section after the specific features are done or new releases are made. Effective changes are tracked in `CHANGELOG.md`. Do not add completed versions here - document them in the Session History section at the end of this file.
Current version is **v0.1.1** - Bootstrap Frontend Rendering. Next milestone is **v0.2.0 - Design Editor**. See `PLAN.md` for details.
Current version is **v1.0.0** - Release. See `PLAN.md` for details.
## Technical Stack
@@ -184,7 +184,7 @@ Build steps (in order):
- **Dark mode:** Uses Bootstrap 5.3 `data-bs-theme` attribute on `<html>`. An inline anti-flash script runs synchronously in `<head>` (via `wp_add_inline_script` with `'before'`), while the full `dark-mode.js` is deferred. Preference stored in `localStorage` key `wp-bootstrap-theme`.
- **Block styles:** Registered via `register_block_style()` with `inline_style` parameter in `functions.php`. Dark mode overrides for alert/card styles are in `src/scss/_custom.scss`.
- **Style variations:** JSON files in `styles/` directory. All 4 variations use the same 10 color slug names (base, contrast, primary, secondary, success, danger, warning, info, light, dark) to ensure patterns work across all schemes.
- **Style variations:** JSON files in `styles/` directory. All 15 variations (7 light, 7 dark, plus default) use the same 10 color slug names (base, contrast, primary, secondary, success, danger, warning, info, light, dark) to ensure patterns work across all schemes.
- **Fonts:** Inter (sans-serif) and Lora (serif) variable fonts bundled as `.woff2` in `assets/fonts/`. Declared via `fontFace` in `theme.json` with `font-display: swap`.
- **Patterns:** PHP files in `patterns/` with WordPress block markup and i18n. Hidden patterns (prefixed `hidden-`) are reusable components not shown in the pattern inserter.
- **Twig frontend rendering:** `TemplateController` hooks `template_redirect` to intercept frontend requests and render Bootstrap 5 HTML via Twig, bypassing FSE block markup. FSE templates remain for the Site Editor. WordPress functions that produce output (`wp_head`, `wp_footer`, `body_class`, `language_attributes`) are captured via `ob_start()`/`ob_get_clean()` and passed to Twig as safe HTML strings.
@@ -193,6 +193,124 @@ Build steps (in order):
## Session History
### Session 8 — v1.0.0 Release (2026-02-08)
**Completed:** Sidebar widget area registration, Twig widget rendering with fallback, documentation refresh, v1.0.0 release.
**What was built:**
- `register_sidebar()` for `primary-sidebar` widget area with Bootstrap-styled wrapper markup
- Widget area rendering in `ContextBuilder::getSidebarData()` via `ob_start()` + `dynamic_sidebar()` with fallback to built-in content
- Twig sidebar template conditional: renders WordPress widgets when assigned, falls back to recent posts/search/tags otherwise
- Updated README.md with accurate feature counts (15 variations, 41 patterns, 3 translations, accessibility, RTL, widget area)
- Updated all translation files (.pot, de_CH.po, fr_FR.po) with widget area strings
**Key learnings:**
- `is_active_sidebar()` returns true only when widgets are assigned to the area, making it the right condition for fallback logic
- `dynamic_sidebar()` outputs widget HTML directly, so `ob_start()`/`ob_get_clean()` is needed to capture it for Twig
- Widget area `before_widget`/`after_widget` markup should use Bootstrap utility classes (`widget mb-4`) for consistent spacing
- Widget title markup (`before_title`/`after_title`) should match existing sidebar heading styles (`sidebar-heading h6 text-uppercase fw-semibold`)
### Session 7 — v0.3.2/v0.3.3 Dark Mode & Style Variation Bridge (2026-02-08)
**Completed:** Fixed dark mode rendering conflicts between WordPress global styles and Bootstrap, fixed form element styling in dark mode, bridged style variation colors to Bootstrap CSS custom properties, fixed variation detection to read from correct palette origin.
**What was built:**
- Style variation bridge function (`wp_bootstrap_variation_colors`) that maps WordPress palette colors to Bootstrap CSS custom properties via `wp_enqueue_scripts`
- Helper functions for color manipulation: `wp_bootstrap_hex_to_rgb()`, `wp_bootstrap_build_surface_css()`, `wp_bootstrap_mix_hex()`, `wp_bootstrap_hex_to_rgb_array()`, `wp_bootstrap_relative_luminance()`
- Variation detection comparing `theme` origin palette against hardcoded base defaults (base, contrast, primary)
- Dark mode body override in `_custom.scss` using `!important` to defeat WordPress global styles specificity
- Broad dark mode rules for all native form elements (`select`, `input`, `textarea`) to catch plugin-generated controls
- Fixed `footer-columns.html.twig` to use semantic `bg-body-tertiary` instead of hardcoded `bg-dark text-light`
**Key learnings:**
- WordPress puts style variation colors in the `theme` palette origin, NOT `custom` -- `wp_get_global_settings(['color', 'palette', 'theme'])` returns the base theme.json merged with the active variation
- The `custom` palette origin contains user manual edits from the Site Editor, but its data structure may lack expected `slug`/`color` keys
- To detect an active variation, compare `theme` origin colors against known base theme.json defaults rather than checking for slugs in `custom`
- WordPress `theme.json` `styles.color` generates `body { background-color: var(--wp--preset--color--base) }` directly on `body`, which overrides inherited CSS variables from `html[data-bs-theme="dark"]` -- removing `styles.color` from theme.json is the cleanest fix
- CSS variables defined directly on `body` beat inherited values from `html` due to specificity, requiring `!important` on `html[data-bs-theme="dark"] body` to ensure Bootstrap dark mode works
- Plugin-generated form elements (e.g., `<select class="jr-search-form__filter-select">`) lack Bootstrap classes and need explicit dark mode styling via element selectors
### Session 6 — v0.3.1 Style Variations (2026-02-08)
**Completed:** Added 8 new style variations (4 light, 4 dark) to the Design Editor.
**What was built:**
- 4 new light palettes: Rose (pink/fuchsia), Sand (warm amber/beige), Lavender (soft purple), Mint (fresh teal)
- 4 new dark palettes: Slate (neutral blue-gray), Mocha (coffee/warm brown), Nebula (space teal-cyan), Obsidian (near-black with red)
- All variations follow the established 10-slug color pattern for cross-variation pattern compatibility
**Key learnings:**
- Dark style variations swap base/contrast (dark base, light contrast) and use darker shades for the `light` and `dark` slugs to maintain proper surface hierarchy
- Button and link hover states in dark palettes need explicit `color` and `text` overrides since the default theme.json assumes light base
### Session 5 — v0.3.0 Polish (2026-02-08)
**Completed:** Accessibility audit and fixes, security hardening, performance optimization, RTL language support, French translation, inline style cleanup.
**What was built:**
- Skip-to-content link in `base.html.twig` with visually-hidden CSS class (visible on focus)
- ARIA labels on all `<nav>` elements across 4 header variants, 2 footer variants, and sidebar
- `aria-current="page"` on active dropdown items in all header variants
- `loading="lazy"` on post thumbnails, card images, and comment avatars
- Screen reader announcement (`aria-live="polite"`) in `dark-mode.js` for theme toggle
- Font preload `<link>` tags for Inter and Lora `.woff2` files via `wp_head` priority 1
- RTL stylesheet (`src/scss/rtl.scss`) conditionally loaded when `is_rtl()` is true
- Logical CSS properties (`border-inline-start`, `padding-inline-start`) replacing physical directions in block styles
- French translation (`fr_FR.po`) covering all ~216 translatable strings
- CSS classes replacing inline styles: `.post-thumbnail`, `.card-thumbnail`, `.sidebar-heading`, `.hero-overlay`
- XSS fix in search template: `search_query|e('html')` before `|raw` output
- Explicit `esc_url()` on comment author URLs in Twig
- Updated `.pot` and `de_CH.po` with 4 new accessibility strings
- RTL build step added to npm scripts
**Key learnings:**
- WordPress `is_rtl()` detects RTL locales, allowing conditional stylesheet loading without doubling CSS bundle size
- CSS logical properties (`border-inline-start`, `padding-inline-start`) are the modern approach to RTL support, replacing physical left/right properties
- Twig `|e('html')` filter must be applied *before* concatenation with `|raw` HTML to prevent XSS -- `search_query|e('html')` inside a `|format()` call
- Font preloading via `wp_head` at priority 1 ensures preload hints appear before render-blocking stylesheets
- `aria-live="polite"` with `role="status"` announces dynamic changes to screen readers without interrupting current reading flow
### Session 4 — v0.2.0 Design Editor (2026-02-08)
**Completed:** Full Design Editor compatibility, custom block categories, page templates, header/footer/navigation variations.
**What was built:**
- Enhanced editor stylesheet importing full Bootstrap SCSS for WYSIWYG fidelity
- Editor overrides SCSS (`_editor-overrides.scss`) for alignment and spacing
- Bootstrap JS loaded in block editor via `enqueue_block_editor_assets`
- 3 custom block categories (`block_categories_all` filter): Bootstrap Layout, Components, Navigation
- 3 custom pattern categories: Layout, Components, Navigation
- 6 layout/component patterns: container, 2-col, 3-col, full-width section, card group, accordion
- 3 full-page patterns: about, services, contact
- 4 custom page templates (FSE + Twig): landing, full-width, hero, sidebar
- 2 header variations (FSE parts + patterns + Twig): centered, transparent
- 2 footer variations (FSE parts + patterns + Twig): minimal, multi-column
- 2 navigation patterns: dark navbar, offcanvas
- Offcanvas navigation Twig partial with Bootstrap offcanvas component
- Twig block inheritance in `base.html.twig` for header/footer variant overrides
- Header/footer variant support via `get_theme_mod()` in `ContextBuilder`
- Custom page template routing via `get_page_template_slug()` in `TemplateController`
- Shadow presets, aspect ratios, custom layout values in `theme.json`
- Transparent header and offcanvas dark mode SCSS styles
- Updated translations (`.pot` and `de_CH.po`) with ~70 new translatable strings
**Key learnings:**
- WordPress `block_categories_all` filter (block inserter categories) and `register_block_pattern_category()` (pattern inserter categories) are separate APIs serving different parts of the editor UI
- FSE template parts (`parts/`) use pattern references (`<!-- wp:pattern {"slug":"..."} /-->`) to keep markup in PHP pattern files for i18n support
- Twig blocks (`{% block header %}`) enable page-level templates to override header/footer without modifying `base.html.twig`
- `get_page_template_slug()` returns the custom template slug assigned in the page editor, used in `TemplateController` for routing to the correct Twig template
- Bootstrap SCSS deprecation warnings (Dart Sass 3.0 migration) are upstream issues, not blocking — the build succeeds
### Session 3 — v0.1.1 Bootstrap Frontend Rendering (2026-02-08)
**Completed:** Full Twig-based Bootstrap 5 frontend rendering, replacing FSE block markup on the public-facing site.

35
PLAN.md
View File

@@ -65,28 +65,29 @@ node_modules/bootstrap/dist/js/ → copyfiles → assets/js/bootstrap.bundle.min
- [x] Comment form Bootstrap styling
- [x] README.md project documentation
### v0.2.0 - Design Editor
### v0.2.0 - Design Editor (Complete)
- [ ] Full Design Editor compatibility
- [ ] Custom block categories
- [ ] Page-level patterns and templates
- [ ] Enhanced header/footer variations
- [ ] Custom navigation styles
- [x] Full Design Editor compatibility
- [x] Custom block categories
- [x] Page-level patterns and templates
- [x] Enhanced header/footer variations
- [x] Custom navigation styles
### v0.3.0 - Polish
### v0.3.0 - Polish (Complete)
- [ ] Performance optimization (selective Bootstrap imports)
- [ ] Accessibility audit and fixes
- [ ] RTL language support
- [ ] Additional translations
- [ ] Documentation
- [x] Performance optimization
- [x] Accessibility audit and fixes
- [x] Security audit and fixes
- [x] RTL language support
- [x] Additional translations
- [x] Documentation
### v1.0.0 - Release
### v1.0.0 - Release (Complete)
- [ ] All features complete and tested
- [ ] WordPress.org theme review compliance
- [ ] Comprehensive documentation
- [ ] Full test coverage
- [x] All features complete and tested
- [x] Widget area registration and Twig rendering with fallback
- [x] Comprehensive documentation (README refresh, updated translations)
- [x] Code quality audit passed (no TODO/FIXME, proper escaping, no security issues)
## Bootstrap 5 Integration Strategy

View File

@@ -7,11 +7,17 @@ A modern WordPress Block Theme built from scratch with Bootstrap 5. Features res
- **Bootstrap 5 Frontend** -- Proper Bootstrap 5 HTML (navbar, cards, pagination, grid) rendered via Twig templates
- **Dark Mode** -- Toggle with localStorage persistence and `prefers-color-scheme` support
- **Full Site Editing** -- Compatible with the WordPress Site Editor for admin editing
- **Block Patterns** -- 16 patterns across 7 categories (hero, features, CTA, testimonials, pricing, contact, text)
- **Style Variations** -- 15 color schemes (7 light, 7 dark, plus default) with live Design Editor customization
- **Block Patterns** -- 41 patterns across 11 categories (hero, features, CTA, testimonials, pricing, contact, text, layout, components, navigation, pages)
- **Block Styles** -- 17 custom styles mapping Bootstrap components to WordPress blocks
- **Style Variations** -- 4 color schemes: Ocean, Forest, Sunset, Midnight
- **Custom Templates** -- Landing (no header/footer), full-width, hero, sidebar page templates
- **Header/Footer Variations** -- Default, centered, transparent headers; default, minimal, multi-column footers
- **Navigation Styles** -- Dark navbar, offcanvas mobile navigation
- **Widget Area** -- Sidebar widget area manageable via WordPress admin, with built-in fallback
- **Accessibility** -- Skip-to-content link, ARIA labels, `aria-current` on active items, screen reader announcements
- **RTL Support** -- Right-to-left language support with logical CSS properties
- **Translation Ready** -- Full i18n support with `en_US`, `de_CH`, and `fr_FR` translations
- **Responsive** -- Mobile-first design with Bootstrap's responsive grid
- **Translation Ready** -- Full i18n support with `en_US` and `de_CH` translations
## Requirements
@@ -64,7 +70,8 @@ Activate the theme in **Appearance > Themes** in the WordPress admin.
1. `copy:js` -- Copy Bootstrap JS bundle from `node_modules` to `assets/js/`
2. `copy:theme-js` -- Copy theme JS (dark-mode.js) from `src/js/` to `assets/js/`
3. `scss` -- Compile SCSS (`src/scss/`) to CSS (`assets/css/`)
4. `postcss` -- Autoprefixer + cssnano minification to `assets/css/style.min.css`
4. `scss:rtl` -- Compile RTL stylesheet (`assets/css/rtl.css`)
5. `postcss` -- Autoprefixer + cssnano minification to `assets/css/style.min.css`
## Architecture
@@ -77,6 +84,10 @@ The theme uses a dual-rendering approach:
The `TemplateController` intercepts frontend requests and renders the appropriate Twig template with data gathered by `ContextBuilder`. FSE templates remain untouched for the WordPress admin editor.
### Style Variation Bridge
WordPress style variation colors are bridged to Bootstrap CSS custom properties at runtime. When a variation is selected in the Design Editor, the theme reads the active palette via `wp_get_global_settings()` and outputs inline CSS that overrides Bootstrap's compiled defaults. This works for both light and dark mode.
### Key PHP Classes
| Class | Purpose |
@@ -95,6 +106,10 @@ Register menus in **Appearance > Menus**:
If no menu is assigned, the primary location falls back to listing published pages.
### Widget Areas
The theme registers a **Sidebar** widget area. When widgets are assigned via **Appearance > Widgets**, they replace the default sidebar content. When no widgets are assigned, the sidebar displays recent posts, a search form, and a tag cloud.
### Project Structure
```txt
@@ -105,7 +120,7 @@ wp-bootstrap/
| +-- Twig/ TwigService singleton
+-- languages/ Translation files (.pot, .po)
+-- patterns/ Block patterns (PHP)
+-- parts/ FSE template parts (header, footer, sidebar)
+-- parts/ FSE template parts (header, footer, sidebar, variants)
+-- src/
| +-- js/ Source JavaScript
| +-- scss/ Source SCSS

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

4
assets/css/rtl.css Normal file
View File

@@ -0,0 +1,4 @@
/*!
* WP Bootstrap Theme - RTL Overrides
* Right-to-left language support
*/.is-style-blockquote-accent{border-left:none;border-right:4px solid var(--wp--preset--color--primary);border-radius:.375rem 0 0 .375rem}

View File

@@ -11911,6 +11911,31 @@ h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6, blockquote, caption, figca
border-radius: 0.25rem;
}
.header-transparent {
position: absolute;
width: 100%;
z-index: 1030;
}
.header-transparent .navbar {
background: transparent !important;
}
html[data-bs-theme=dark] body {
background-color: var(--bs-body-bg) !important;
color: var(--bs-body-color) !important;
}
[data-bs-theme=dark] select,
[data-bs-theme=dark] input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=reset]),
[data-bs-theme=dark] textarea {
background-color: var(--bs-body-bg);
color: var(--bs-body-color);
border-color: var(--bs-border-color);
}
[data-bs-theme=dark] .offcanvas {
--bs-offcanvas-bg: var(--bs-body-bg);
}
[data-bs-theme=dark] .is-style-alert-info {
background-color: #032830;
border-color: #055160;
@@ -11937,4 +11962,41 @@ h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6, blockquote, caption, figca
background: var(--bs-body-bg);
}
.wp-bootstrap-skip-link {
position: absolute;
top: -100%;
left: 0;
z-index: 1040;
padding: 0.5rem 1rem;
background: var(--bs-primary);
color: #fff;
text-decoration: none;
font-weight: 600;
}
.wp-bootstrap-skip-link:focus {
top: 0;
}
.post-thumbnail {
aspect-ratio: 16/9;
object-fit: cover;
width: 100%;
}
.card-thumbnail {
aspect-ratio: 3/2;
object-fit: cover;
}
.sidebar-heading {
letter-spacing: 1.6px;
}
.hero-overlay {
background-position: center;
background-size: cover;
background-repeat: no-repeat;
opacity: 0.3;
}
/*# sourceMappingURL=style.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -61,6 +61,7 @@
var newTheme = currentTheme === 'dark' ? 'light' : 'dark';
localStorage.setItem(STORAGE_KEY, newTheme);
setTheme(newTheme);
announceTheme(newTheme);
});
});
});
@@ -71,4 +72,23 @@
setTheme(e.matches ? 'dark' : 'light');
}
});
/**
* Announce theme change to screen readers via a live region.
*
* @param {string} theme - 'dark' or 'light'
*/
function announceTheme(theme) {
var msg = theme === 'dark' ? 'Dark mode enabled' : 'Light mode enabled';
var el = document.getElementById('wp-bootstrap-theme-status');
if (!el) {
el = document.createElement('div');
el.id = 'wp-bootstrap-theme-status';
el.setAttribute('role', 'status');
el.setAttribute('aria-live', 'polite');
el.className = 'visually-hidden';
document.body.appendChild(el);
}
el.textContent = msg;
}
})();

View File

@@ -44,6 +44,26 @@ if ( ! function_exists( 'wp_bootstrap_setup' ) ) :
endif;
add_action( 'after_setup_theme', 'wp_bootstrap_setup' );
/**
* Register widget areas.
*
* @since 1.0.0
*/
if ( ! function_exists( 'wp_bootstrap_register_sidebars' ) ) :
function wp_bootstrap_register_sidebars() {
register_sidebar( array(
'name' => __( 'Sidebar', 'wp-bootstrap' ),
'id' => 'primary-sidebar',
'description' => __( 'Add widgets here to appear in the sidebar.', 'wp-bootstrap' ),
'before_widget' => '<div id="%1$s" class="widget mb-4 %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3 class="sidebar-heading h6 text-uppercase fw-semibold">',
'after_title' => '</h3>',
) );
}
endif;
add_action( 'widgets_init', 'wp_bootstrap_register_sidebars' );
/**
* Enqueue theme scripts and styles.
*/
@@ -91,6 +111,377 @@ if ( ! function_exists( 'wp_bootstrap_enqueue_scripts' ) ) :
endif;
add_action( 'wp_enqueue_scripts', 'wp_bootstrap_enqueue_scripts' );
/**
* Preload critical fonts for performance.
*
* @since 0.3.0
*/
if ( ! function_exists( 'wp_bootstrap_preload_fonts' ) ) :
function wp_bootstrap_preload_fonts() {
$fonts = array(
'inter/InterVariable.woff2',
'lora/Lora-VariableFont.woff2',
);
$base = get_template_directory_uri() . '/assets/fonts/';
foreach ( $fonts as $font ) {
printf(
'<link rel="preload" href="%s" as="font" type="font/woff2" crossorigin>' . "\n",
esc_url( $base . $font )
);
}
}
endif;
add_action( 'wp_head', 'wp_bootstrap_preload_fonts', 1 );
/**
* Enqueue RTL stylesheet for right-to-left languages.
*
* @since 0.3.0
*/
if ( ! function_exists( 'wp_bootstrap_rtl_styles' ) ) :
function wp_bootstrap_rtl_styles() {
if ( ! is_rtl() ) {
return;
}
$theme_version = wp_get_theme()->get( 'Version' );
wp_enqueue_style(
'wp-bootstrap-rtl',
get_template_directory_uri() . '/assets/css/rtl.css',
array( 'wp-bootstrap-style' ),
$theme_version
);
}
endif;
add_action( 'wp_enqueue_scripts', 'wp_bootstrap_rtl_styles', 20 );
/**
* Bridge WordPress style variation colors to Bootstrap CSS custom properties.
*
* Reads the active color palette (theme.json + variation + user overrides)
* and outputs inline CSS for both light and dark modes so the dark-mode toggle
* switches between two variation-aware color schemes.
*
* Theme colors (primaryinfo) go into :root and apply in both modes.
* Surface colors (body-bg, tertiary-bg, etc.) are computed separately for
* [data-bs-theme=light] and [data-bs-theme=dark].
*
* For light palettes: light mode uses base/contrast; dark mode uses dark/light slugs.
* For dark palettes: dark mode uses base/contrast; light mode swaps them.
*
* @since 0.3.2
*/
if ( ! function_exists( 'wp_bootstrap_variation_colors' ) ) :
function wp_bootstrap_variation_colors() {
// Read the theme origin palette — this contains the base theme.json
// colors merged with the active style variation (if any).
$theme_palette = wp_get_global_settings( array( 'color', 'palette', 'theme' ) );
$colors = array();
if ( ! empty( $theme_palette ) && is_array( $theme_palette ) ) {
foreach ( $theme_palette as $entry ) {
if ( ! empty( $entry['slug'] ) && ! empty( $entry['color'] ) ) {
$colors[ $entry['slug'] ] = $entry['color'];
}
}
}
// Compare against base theme.json defaults to detect an active variation.
// WordPress puts variation colors in the 'theme' origin, not 'custom'.
$base_defaults = array(
'base' => '#ffffff',
'contrast' => '#212529',
'primary' => '#0d6efd',
);
$is_default = true;
foreach ( $base_defaults as $slug => $default_color ) {
if ( ! empty( $colors[ $slug ] ) && strtolower( $colors[ $slug ] ) !== $default_color ) {
$is_default = false;
break;
}
}
// No variation active — let Bootstrap's compiled CSS handle both modes.
if ( $is_default ) {
return;
}
if ( empty( $colors['base'] ) || empty( $colors['contrast'] ) ) {
return;
}
// Theme colors apply in both modes via :root.
$theme_slugs = array(
'primary' => '--bs-primary',
'secondary' => '--bs-secondary',
'success' => '--bs-success',
'danger' => '--bs-danger',
'warning' => '--bs-warning',
'info' => '--bs-info',
);
$root_css = '';
foreach ( $theme_slugs as $slug => $var ) {
if ( ! empty( $colors[ $slug ] ) ) {
$hex = esc_attr( $colors[ $slug ] );
$rgb = wp_bootstrap_hex_to_rgb( $colors[ $slug ] );
$root_css .= "{$var}:{$hex};";
if ( $rgb ) {
$root_css .= "{$var}-rgb:{$rgb};";
}
}
}
// Link colors from primary (both modes).
if ( ! empty( $colors['primary'] ) ) {
$primary_rgb = wp_bootstrap_hex_to_rgb( $colors['primary'] );
$root_css .= '--bs-link-color:' . esc_attr( $colors['primary'] ) . ';';
$root_css .= '--bs-link-color-rgb:' . $primary_rgb . ';';
$root_css .= '--bs-link-hover-color:' . esc_attr( $colors['primary'] ) . ';';
$root_css .= '--bs-link-hover-color-rgb:' . $primary_rgb . ';';
}
// Determine if this is a dark palette (base luminance < contrast luminance).
$is_dark = wp_bootstrap_relative_luminance( $colors['base'] )
< wp_bootstrap_relative_luminance( $colors['contrast'] );
// Resolve light-mode and dark-mode base colors.
if ( $is_dark ) {
// Dark palette: dark mode is native, light mode swaps base↔contrast.
$light_bg = $colors['contrast'];
$light_fg = $colors['base'];
$dark_bg = $colors['base'];
$dark_fg = $colors['contrast'];
} else {
// Light palette: light mode is native, dark mode uses dark/light slugs.
$light_bg = $colors['base'];
$light_fg = $colors['contrast'];
$dark_bg = $colors['dark'] ?? '#212529';
$dark_fg = $colors['light'] ?? '#f8f9fa';
}
// Also set light/dark slug variables for utilities like bg-light, bg-dark.
if ( ! empty( $colors['light'] ) ) {
$root_css .= '--bs-light:' . esc_attr( $colors['light'] ) . ';';
$root_css .= '--bs-light-rgb:' . wp_bootstrap_hex_to_rgb( $colors['light'] ) . ';';
}
if ( ! empty( $colors['dark'] ) ) {
$root_css .= '--bs-dark:' . esc_attr( $colors['dark'] ) . ';';
$root_css .= '--bs-dark-rgb:' . wp_bootstrap_hex_to_rgb( $colors['dark'] ) . ';';
}
// Build surface CSS for a given bg/fg pair.
$light_css = wp_bootstrap_build_surface_css( $light_bg, $light_fg, false );
$dark_css = wp_bootstrap_build_surface_css( $dark_bg, $dark_fg, true );
$css = ':root{' . $root_css . '}'
. '[data-bs-theme=light]{' . $light_css . '}'
. '[data-bs-theme=dark]{' . $dark_css . '}';
// Attach after the compiled stylesheet so variation values override
// Bootstrap's hardcoded dark-mode defaults via source order.
wp_add_inline_style( 'wp-bootstrap-style', $css );
}
endif;
add_action( 'wp_enqueue_scripts', 'wp_bootstrap_variation_colors', 30 );
/**
* Build Bootstrap surface CSS variables for a given background/foreground pair.
*
* Computes body-bg, body-color, tertiary-bg, secondary-bg, secondary-color,
* emphasis-color, and border-color — mirroring how Bootstrap derives them.
*
* @since 0.3.2
*
* @param string $bg Background hex color.
* @param string $fg Foreground (text) hex color.
* @param bool $is_dark Whether this is for dark mode.
* @return string CSS declarations (no selector).
*/
if ( ! function_exists( 'wp_bootstrap_build_surface_css' ) ) :
function wp_bootstrap_build_surface_css( $bg, $fg, $is_dark ) {
$bg_rgb = wp_bootstrap_hex_to_rgb( $bg );
$fg_rgb = wp_bootstrap_hex_to_rgb( $fg );
$css = '--bs-body-bg:' . esc_attr( $bg ) . ';';
$css .= '--bs-body-bg-rgb:' . $bg_rgb . ';';
$css .= '--bs-body-color:' . esc_attr( $fg ) . ';';
$css .= '--bs-body-color-rgb:' . $fg_rgb . ';';
if ( $is_dark ) {
$secondary_bg = wp_bootstrap_mix_hex( $fg, $bg, 0.16 );
$tertiary_bg = wp_bootstrap_mix_hex( $fg, $bg, 0.08 );
$border_color = wp_bootstrap_mix_hex( $fg, $bg, 0.24 );
$emphasis = '#FFFFFF';
} else {
$secondary_bg = wp_bootstrap_mix_hex( $fg, $bg, 0.08 );
$tertiary_bg = wp_bootstrap_mix_hex( $fg, $bg, 0.04 );
$border_color = wp_bootstrap_mix_hex( $fg, $bg, 0.16 );
$emphasis = '#000000';
}
$css .= '--bs-secondary-color:rgba(' . $fg_rgb . ',0.75);';
$css .= '--bs-secondary-bg:' . $secondary_bg . ';';
$css .= '--bs-secondary-bg-rgb:' . wp_bootstrap_hex_to_rgb( $secondary_bg ) . ';';
$css .= '--bs-tertiary-color:rgba(' . $fg_rgb . ',0.5);';
$css .= '--bs-tertiary-bg:' . $tertiary_bg . ';';
$css .= '--bs-tertiary-bg-rgb:' . wp_bootstrap_hex_to_rgb( $tertiary_bg ) . ';';
$css .= '--bs-emphasis-color:' . $emphasis . ';';
$css .= '--bs-emphasis-color-rgb:' . wp_bootstrap_hex_to_rgb( $emphasis ) . ';';
$css .= '--bs-border-color:' . $border_color . ';';
return $css;
}
endif;
/**
* Convert a hex color string to an RGB triplet string.
*
* @since 0.3.2
*
* @param string $hex Hex color (e.g. "#0d6efd" or "0d6efd").
* @return string RGB triplet (e.g. "13,110,253") or empty string on failure.
*/
if ( ! function_exists( 'wp_bootstrap_hex_to_rgb' ) ) :
function wp_bootstrap_hex_to_rgb( $hex ) {
$hex = ltrim( $hex, '#' );
if ( strlen( $hex ) === 3 ) {
$hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
}
if ( strlen( $hex ) !== 6 ) {
return '';
}
return hexdec( substr( $hex, 0, 2 ) ) . ','
. hexdec( substr( $hex, 2, 2 ) ) . ','
. hexdec( substr( $hex, 4, 2 ) );
}
endif;
/**
* Mix two hex colors by a given weight.
*
* @since 0.3.2
*
* @param string $color1 Hex color to mix in.
* @param string $color2 Base hex color.
* @param float $weight Weight of color1 (0.0 to 1.0).
* @return string Resulting hex color.
*/
if ( ! function_exists( 'wp_bootstrap_mix_hex' ) ) :
function wp_bootstrap_mix_hex( $color1, $color2, $weight ) {
$c1 = wp_bootstrap_hex_to_rgb_array( $color1 );
$c2 = wp_bootstrap_hex_to_rgb_array( $color2 );
if ( ! $c1 || ! $c2 ) {
return $color2;
}
$r = (int) round( $c1[0] * $weight + $c2[0] * ( 1 - $weight ) );
$g = (int) round( $c1[1] * $weight + $c2[1] * ( 1 - $weight ) );
$b = (int) round( $c1[2] * $weight + $c2[2] * ( 1 - $weight ) );
return sprintf( '#%02x%02x%02x', max( 0, min( 255, $r ) ), max( 0, min( 255, $g ) ), max( 0, min( 255, $b ) ) );
}
endif;
/**
* Convert a hex color to an array of [r, g, b] integers.
*
* @since 0.3.2
*
* @param string $hex Hex color.
* @return array|false Array of [r, g, b] or false on failure.
*/
if ( ! function_exists( 'wp_bootstrap_hex_to_rgb_array' ) ) :
function wp_bootstrap_hex_to_rgb_array( $hex ) {
$hex = ltrim( $hex, '#' );
if ( strlen( $hex ) === 3 ) {
$hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
}
if ( strlen( $hex ) !== 6 ) {
return false;
}
return array(
hexdec( substr( $hex, 0, 2 ) ),
hexdec( substr( $hex, 2, 2 ) ),
hexdec( substr( $hex, 4, 2 ) ),
);
}
endif;
/**
* Compute relative luminance of a hex color (0.0 = black, 1.0 = white).
*
* @since 0.3.2
*
* @param string $hex Hex color.
* @return float Relative luminance.
*/
if ( ! function_exists( 'wp_bootstrap_relative_luminance' ) ) :
function wp_bootstrap_relative_luminance( $hex ) {
$rgb = wp_bootstrap_hex_to_rgb_array( $hex );
if ( ! $rgb ) {
return 0.0;
}
$channels = array();
foreach ( $rgb as $val ) {
$val /= 255;
$channels[] = ( $val <= 0.03928 ) ? $val / 12.92 : pow( ( $val + 0.055 ) / 1.055, 2.4 );
}
return 0.2126 * $channels[0] + 0.7152 * $channels[1] + 0.0722 * $channels[2];
}
endif;
/**
* Enqueue Bootstrap JS in the block editor for interactive previews.
*
* @since 0.2.0
*/
if ( ! function_exists( 'wp_bootstrap_enqueue_editor_assets' ) ) :
function wp_bootstrap_enqueue_editor_assets() {
$theme_version = wp_get_theme()->get( 'Version' );
wp_enqueue_script(
'wp-bootstrap-editor-js',
get_template_directory_uri() . '/assets/js/bootstrap.bundle.min.js',
array(),
$theme_version,
true
);
}
endif;
add_action( 'enqueue_block_editor_assets', 'wp_bootstrap_enqueue_editor_assets' );
/**
* Register custom block categories for Bootstrap components.
*
* @since 0.2.0
*
* @param array $categories Existing block categories.
* @param WP_Block_Editor_Context $context Block editor context.
* @return array Modified categories.
*/
if ( ! function_exists( 'wp_bootstrap_block_categories' ) ) :
function wp_bootstrap_block_categories( array $categories, $context ): array {
$bootstrap_categories = array(
array(
'slug' => 'wp-bootstrap-layout',
'title' => __( 'Bootstrap Layout', 'wp-bootstrap' ),
'icon' => 'layout',
),
array(
'slug' => 'wp-bootstrap-components',
'title' => __( 'Bootstrap Components', 'wp-bootstrap' ),
'icon' => 'grid-view',
),
array(
'slug' => 'wp-bootstrap-navigation',
'title' => __( 'Bootstrap Navigation', 'wp-bootstrap' ),
'icon' => 'menu',
),
);
return array_merge( $bootstrap_categories, $categories );
}
endif;
add_filter( 'block_categories_all', 'wp_bootstrap_block_categories', 10, 2 );
/**
* Register block pattern categories.
*/
@@ -159,6 +550,30 @@ if ( ! function_exists( 'wp_bootstrap_pattern_categories' ) ) :
'description' => __( 'Text-focused content sections.', 'wp-bootstrap' ),
)
);
register_block_pattern_category(
'wp-bootstrap-layout',
array(
'label' => __( 'Layout', 'wp-bootstrap' ),
'description' => __( 'Layout building blocks for page structure.', 'wp-bootstrap' ),
)
);
register_block_pattern_category(
'wp-bootstrap-components',
array(
'label' => __( 'Components', 'wp-bootstrap' ),
'description' => __( 'Reusable Bootstrap component patterns.', 'wp-bootstrap' ),
)
);
register_block_pattern_category(
'wp-bootstrap-navigation',
array(
'label' => __( 'Navigation', 'wp-bootstrap' ),
'description' => __( 'Navigation and header patterns.', 'wp-bootstrap' ),
)
);
}
endif;
add_action( 'init', 'wp_bootstrap_pattern_categories' );
@@ -184,7 +599,7 @@ if ( ! function_exists( 'wp_bootstrap_block_styles' ) ) :
'name' => 'list-unstyled',
'label' => __( 'Unstyled', 'wp-bootstrap' ),
'inline_style' => '
ul.is-style-list-unstyled, ol.is-style-list-unstyled { list-style: none; padding-left: 0; }',
ul.is-style-list-unstyled, ol.is-style-list-unstyled { list-style: none; padding-inline-start: 0; }',
) );
// core/group - Card.
@@ -264,7 +679,7 @@ if ( ! function_exists( 'wp_bootstrap_block_styles' ) ) :
'name' => 'blockquote-accent',
'label' => __( 'Accent Border', 'wp-bootstrap' ),
'inline_style' => '
.is-style-blockquote-accent { border-left: 4px solid var(--wp--preset--color--primary); background: var(--wp--preset--color--light); padding: var(--wp--preset--spacing--30); border-radius: 0 0.375rem 0.375rem 0; }',
.is-style-blockquote-accent { border-inline-start: 4px solid var(--wp--preset--color--primary); background: var(--wp--preset--color--light); padding: var(--wp--preset--spacing--30); border-start-start-radius: 0; border-start-end-radius: 0.375rem; border-end-end-radius: 0.375rem; border-end-start-radius: 0; }',
) );
// core/image - Shadow.

View File

@@ -30,6 +30,8 @@ class ContextBuilder
'footer_menu' => $this->getMenuData('footer'),
'dark_mode' => true,
'layout' => 'default',
'header_variant' => $this->getHeaderVariant(),
'footer_variant' => $this->getFooterVariant(),
];
if (is_singular()) {
@@ -385,10 +387,24 @@ class ContextBuilder
/**
* Get sidebar widget data.
*
* If the 'primary-sidebar' widget area has widgets assigned,
* their rendered HTML is returned. Otherwise, fallback data
* (recent posts, tags) is provided for the default Twig sidebar.
*/
private function getSidebarData(): array
{
$widgets_active = is_active_sidebar( 'primary-sidebar' );
$widgets_html = '';
if ( $widgets_active ) {
ob_start();
dynamic_sidebar( 'primary-sidebar' );
$widgets_html = ob_get_clean();
}
return [
'widgets_active' => $widgets_active,
'widgets_html' => $widgets_html,
'recent_posts' => $this->getSidebarRecentPosts(),
'tags' => $this->getSidebarTags(),
];
@@ -448,6 +464,26 @@ class ContextBuilder
return $items;
}
/**
* Get the active header variant.
*
* @since 0.2.0
*/
private function getHeaderVariant(): string
{
return get_theme_mod('wp_bootstrap_header_variant', 'default');
}
/**
* Get the active footer variant.
*
* @since 0.2.0
*/
private function getFooterVariant(): string
{
return get_theme_mod('wp_bootstrap_footer_variant', 'default');
}
/**
* Get terms list for a taxonomy.
*/

View File

@@ -82,7 +82,14 @@ class TemplateController
}
if (is_page()) {
return 'pages/page.html.twig';
$slug = get_page_template_slug();
return match ($slug) {
'page-landing' => 'pages/landing.html.twig',
'page-full-width' => 'pages/full-width.html.twig',
'page-hero' => 'pages/hero.html.twig',
'page-sidebar' => 'pages/page-sidebar.html.twig',
default => 'pages/page.html.twig',
};
}
if (is_archive()) {

View File

@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: WP Bootstrap 0.1.0\n"
"Project-Id-Version: WP Bootstrap 0.3.0\n"
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/magdev/wp-bootstrap/issues\n"
"POT-Creation-Date: 2026-02-08 00:00+0000\n"
"PO-Revision-Date: 2026-02-08 00:00+0000\n"
@@ -27,10 +27,12 @@ msgid "A modern WordPress Block Theme built from scratch with Bootstrap 5. Featu
msgstr "Ein modernes WordPress Block-Theme, erstellt mit Bootstrap 5. Mit responsivem Design, Darkmode-Unterstützung und voller Kompatibilität mit dem WordPress Site-Editor."
#: patterns/footer.php
#: patterns/footer-columns.php
msgid "Powered by %s"
msgstr "Betrieben mit %s"
#: patterns/footer.php
#: patterns/footer-columns.php
msgid "https://wordpress.org"
msgstr "https://de.wordpress.org"
@@ -91,6 +93,7 @@ msgstr "Erstellen Sie moderne, responsive Websites mit der Leistung von Bootstra
#: patterns/hero-cover.php
#: patterns/hero-centered.php
#: patterns/pricing-3-col.php
#: patterns/page-services.php
msgid "Get Started"
msgstr "Jetzt starten"
@@ -339,6 +342,8 @@ msgid "Custom Development"
msgstr "Individuelle Entwicklung"
#: patterns/pricing-3-col.php
#: patterns/page-services.php
#: patterns/page-contact.php
msgid "Contact Us"
msgstr "Kontaktieren Sie uns"
@@ -351,6 +356,7 @@ msgid "We would love to hear from you. Reach out through any of the channels bel
msgstr "Wir freuen uns von Ihnen zu hören. Kontaktieren Sie uns über einen der folgenden Kanäle."
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "Address"
msgstr "Adresse"
@@ -363,6 +369,7 @@ msgid "8000 Zurich, Switzerland"
msgstr "8000 Zürich, Schweiz"
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "Phone"
msgstr "Telefon"
@@ -372,10 +379,12 @@ msgstr "+41 44 123 45 67"
#: patterns/contact-info.php
#: patterns/cta-newsletter.php
#: patterns/page-contact.php
msgid "Email"
msgstr "E-Mail"
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "info@example.com"
msgstr "info@example.com"
@@ -428,6 +437,7 @@ msgid "With years of experience in web development and design, we understand wha
msgstr "Mit jahrelanger Erfahrung in Webentwicklung und Design verstehen wir, was nötig ist, um ein Theme zu erstellen, das sowohl leistungsstark als auch einfach zu bedienen ist."
#: patterns/text-about.php
#: patterns/page-about.php
msgid "About us image"
msgstr "Über-uns-Bild"
@@ -447,6 +457,14 @@ msgstr "Zum Darkmode wechseln"
msgid "Switch to light mode"
msgstr "Zum hellen Modus wechseln"
#: functions.php
msgid "Primary Navigation"
msgstr "Primäre Navigation"
#: functions.php
msgid "Footer Navigation"
msgstr "Fusszeilen-Navigation"
#: functions.php
msgid "Pages"
msgstr "Seiten"
@@ -570,3 +588,332 @@ msgstr "Klein"
#: functions.php
msgid "Wide"
msgstr "Breit"
#: functions.php
msgid "Name"
msgstr "Name"
#: functions.php
msgid "Website"
msgstr "Website"
#: functions.php
msgid "Save my name, email, and website in this browser for the next time I comment."
msgstr "Meinen Namen, meine E-Mail-Adresse und meine Website in diesem Browser für meinen nächsten Kommentar speichern."
#: functions.php
msgid "Bootstrap Layout"
msgstr "Bootstrap-Layout"
#: functions.php
msgid "Bootstrap Components"
msgstr "Bootstrap-Komponenten"
#: functions.php
msgid "Bootstrap Navigation"
msgstr "Bootstrap-Navigation"
#: functions.php
msgid "Layout"
msgstr "Layout"
#: functions.php
msgid "Layout building blocks for page structure."
msgstr "Layout-Bausteine für die Seitenstruktur."
#: functions.php
msgid "Components"
msgstr "Komponenten"
#: functions.php
msgid "Reusable Bootstrap component patterns."
msgstr "Wiederverwendbare Bootstrap-Komponentenvorlagen."
#: functions.php
#: patterns/footer-columns.php
msgid "Navigation"
msgstr "Navigation"
#: functions.php
msgid "Navigation and header patterns."
msgstr "Navigations- und Kopfzeilenvorlagen."
#: patterns/layout-container.php
msgid "Heading goes here"
msgstr "Überschrift hier eingeben"
#: patterns/layout-container.php
msgid "This is a content container with constrained width and comfortable padding. Replace this text with your own content."
msgstr "Dies ist ein Inhaltscontainer mit begrenzter Breite und komfortablem Innenabstand. Ersetzen Sie diesen Text durch Ihren eigenen Inhalt."
#: patterns/layout-2-col.php
#: patterns/layout-3-col.php
msgid "Column One"
msgstr "Spalte Eins"
#: patterns/layout-2-col.php
msgid "Add your content here. This column takes up half the available width on larger screens and stacks on mobile devices."
msgstr "Fügen Sie hier Ihren Inhalt ein. Diese Spalte nimmt auf grösseren Bildschirmen die Hälfte der verfügbaren Breite ein und wird auf Mobilgeräten gestapelt."
#: patterns/layout-2-col.php
#: patterns/layout-3-col.php
msgid "Column Two"
msgstr "Spalte Zwei"
#: patterns/layout-3-col.php
msgid "Column Three"
msgstr "Spalte Drei"
#: patterns/layout-3-col.php
msgid "Add your content here. This column takes up one third of the available width on larger screens."
msgstr "Fügen Sie hier Ihren Inhalt ein. Diese Spalte nimmt auf grösseren Bildschirmen ein Drittel der verfügbaren Breite ein."
#: patterns/layout-full-width-section.php
msgid "Full Width Section Heading"
msgstr "Überschrift des Vollbreiten-Abschnitts"
#: patterns/layout-full-width-section.php
msgid "This full-width section stands out with a colored background. Use it to highlight important content, announcements, or calls to action."
msgstr "Dieser Vollbreiten-Abschnitt fällt durch einen farbigen Hintergrund auf. Verwenden Sie ihn, um wichtige Inhalte, Ankündigungen oder Handlungsaufforderungen hervorzuheben."
#: patterns/component-card-group.php
msgid "Card One"
msgstr "Karte Eins"
#: patterns/component-card-group.php
msgid "Card Two"
msgstr "Karte Zwei"
#: patterns/component-card-group.php
msgid "Card Three"
msgstr "Karte Drei"
#: patterns/component-card-group.php
msgid "Add a short description for this card. Cards are a great way to organize and present related content."
msgstr "Fügen Sie eine kurze Beschreibung für diese Karte hinzu. Karten sind eine hervorragende Möglichkeit, zusammengehörige Inhalte zu organisieren und zu präsentieren."
#: patterns/component-accordion.php
msgid "Accordion"
msgstr "Akkordeon"
#: patterns/component-accordion.php
msgid "Click on each item to expand and reveal its content."
msgstr "Klicken Sie auf jedes Element, um es aufzuklappen und den Inhalt anzuzeigen."
#: patterns/component-accordion.php
msgid "Accordion Item One"
msgstr "Akkordeon-Element Eins"
#: patterns/component-accordion.php
msgid "This is the content for the first accordion item. You can add any blocks inside this details element to create rich, expandable content sections."
msgstr "Dies ist der Inhalt des ersten Akkordeon-Elements. Sie können beliebige Blöcke in dieses Details-Element einfügen, um reichhaltige, aufklappbare Inhaltsabschnitte zu erstellen."
#: patterns/component-accordion.php
msgid "Accordion Item Two"
msgstr "Akkordeon-Element Zwei"
#: patterns/component-accordion.php
msgid "This is the content for the second accordion item. Details blocks are a native HTML element that provide toggle functionality without JavaScript."
msgstr "Dies ist der Inhalt des zweiten Akkordeon-Elements. Details-Blöcke sind native HTML-Elemente, die Aufklappfunktionalität ohne JavaScript bieten."
#: patterns/component-accordion.php
msgid "Accordion Item Three"
msgstr "Akkordeon-Element Drei"
#: patterns/component-accordion.php
msgid "This is the content for the third accordion item. Use accordions to organize frequently asked questions, feature lists, or any content that benefits from progressive disclosure."
msgstr "Dies ist der Inhalt des dritten Akkordeon-Elements. Verwenden Sie Akkordeons, um häufig gestellte Fragen, Funktionslisten oder andere Inhalte zu organisieren, die von schrittweiser Offenlegung profitieren."
#: patterns/page-about.php
msgid "About Us"
msgstr "Über uns"
#: patterns/page-about.php
msgid "Learn more about who we are, what we do, and the people behind our mission."
msgstr "Erfahren Sie mehr darüber, wer wir sind, was wir tun und wer hinter unserer Mission steht."
#: patterns/page-about.php
msgid "Our Story"
msgstr "Unsere Geschichte"
#: patterns/page-about.php
msgid "Founded with a passion for innovation and excellence, our journey began with a simple idea: to create meaningful solutions that make a real difference. Over the years, we have grown from a small team into a dedicated group of professionals committed to delivering outstanding results."
msgstr "Gegründet mit einer Leidenschaft für Innovation und Exzellenz, begann unsere Reise mit einer einfachen Idee: bedeutungsvolle Lösungen zu schaffen, die einen echten Unterschied machen. Im Laufe der Jahre sind wir von einem kleinen Team zu einer engagierten Gruppe von Fachleuten gewachsen, die sich der Erbringung herausragender Ergebnisse verschrieben haben."
#: patterns/page-about.php
msgid "Today, we continue to push boundaries and challenge conventions. Our approach combines creative thinking with proven methodologies, ensuring that every project we undertake meets the highest standards of quality and craftsmanship."
msgstr "Heute stossen wir weiterhin Grenzen und hinterfragen Konventionen. Unser Ansatz verbindet kreatives Denken mit bewährten Methoden und stellt sicher, dass jedes Projekt, das wir übernehmen, den höchsten Qualitäts- und Handwerksstandards entspricht."
#: patterns/page-about.php
msgid "Our Team"
msgstr "Unser Team"
#: patterns/page-about.php
msgid "Meet the people who make it all happen."
msgstr "Lernen Sie die Menschen kennen, die alles möglich machen."
#: patterns/page-about.php
msgid "Jane Doe"
msgstr "Jane Doe"
#: patterns/page-about.php
msgid "Founder & CEO"
msgstr "Gründerin & CEO"
#: patterns/page-about.php
msgid "John Smith"
msgstr "John Smith"
#: patterns/page-about.php
msgid "Lead Developer"
msgstr "Leitender Entwickler"
#: patterns/page-about.php
msgid "Emily Johnson"
msgstr "Emily Johnson"
#: patterns/page-about.php
msgid "Creative Director"
msgstr "Kreativdirektorin"
#: patterns/page-services.php
msgid "Our Services"
msgstr "Unsere Dienstleistungen"
#: patterns/page-services.php
msgid "Professional solutions tailored to your needs."
msgstr "Professionelle Lösungen, massgeschneidert auf Ihre Bedürfnisse."
#: patterns/page-services.php
msgid "What We Offer"
msgstr "Was wir anbieten"
#: patterns/page-services.php
msgid "We provide a wide range of services to help your business grow and succeed."
msgstr "Wir bieten ein breites Spektrum an Dienstleistungen, um Ihr Unternehmen beim Wachstum und Erfolg zu unterstützen."
#: patterns/page-services.php
msgid "Design"
msgstr "Design"
#: patterns/page-services.php
msgid "Beautiful, user-centered designs that capture your brand identity and engage your audience across all platforms and devices."
msgstr "Schöne, benutzerzentrierte Designs, die Ihre Markenidentität einfangen und Ihr Publikum auf allen Plattformen und Geräten ansprechen."
#: patterns/page-services.php
msgid "Development"
msgstr "Entwicklung"
#: patterns/page-services.php
msgid "Robust, scalable web applications built with modern technologies and best practices to ensure performance and reliability."
msgstr "Robuste, skalierbare Webanwendungen, erstellt mit modernen Technologien und bewährten Methoden, um Leistung und Zuverlässigkeit zu gewährleisten."
#: patterns/page-services.php
msgid "Strategy"
msgstr "Strategie"
#: patterns/page-services.php
msgid "Data-driven strategies and consulting to help you achieve your business goals and stay ahead of the competition."
msgstr "Datengetriebene Strategien und Beratung, um Ihnen zu helfen, Ihre Geschäftsziele zu erreichen und der Konkurrenz voraus zu sein."
#: patterns/page-services.php
msgid "Ready to take your project to the next level? Let us help you build something great."
msgstr "Bereit, Ihr Projekt auf die nächste Stufe zu heben? Lassen Sie uns Ihnen helfen, etwas Grossartiges zu bauen."
#: patterns/page-services.php
msgid "View Portfolio"
msgstr "Portfolio ansehen"
#: patterns/page-contact.php
msgid "We would love to hear from you. Reach out to us anytime."
msgstr "Wir freuen uns von Ihnen zu hören. Kontaktieren Sie uns jederzeit."
#: patterns/page-contact.php
msgid "Get in Touch"
msgstr "Kontakt aufnehmen"
#: patterns/page-contact.php
msgid "123 Main Street, Suite 100, Anytown, ST 12345"
msgstr "Hauptstrasse 123, Suite 100, 8000 Zürich"
#: patterns/page-contact.php
msgid "+1 (555) 123-4567"
msgstr "+41 44 123 45 67"
#: patterns/page-contact.php
msgid "Business Hours"
msgstr "Öffnungszeiten"
#: patterns/page-contact.php
msgid "Monday - Friday:"
msgstr "Montag - Freitag:"
#: patterns/page-contact.php
msgid "9:00 AM - 6:00 PM"
msgstr "09:00 - 18:00 Uhr"
#: patterns/page-contact.php
msgid "Saturday:"
msgstr "Samstag:"
#: patterns/page-contact.php
msgid "10:00 AM - 4:00 PM"
msgstr "10:00 - 16:00 Uhr"
#: patterns/page-contact.php
msgid "Sunday:"
msgstr "Sonntag:"
#: patterns/page-contact.php
msgid "Closed"
msgstr "Geschlossen"
#. translators: Copyright notice. %1$s: Year, %2$s: Site title.
#: patterns/footer-minimal.php
msgid "&copy; %1$s %2$s. All rights reserved."
msgstr "&copy; %1$s %2$s. Alle Rechte vorbehalten."
#: patterns/footer-columns.php
msgid "A modern WordPress theme built with Bootstrap 5."
msgstr "Ein modernes WordPress-Theme, erstellt mit Bootstrap 5."
#: patterns/footer-columns.php
msgid "About"
msgstr "Über"
#: patterns/footer-columns.php
msgid "This theme is proudly built with Bootstrap 5 and WordPress Full Site Editing."
msgstr "Dieses Theme wurde mit Stolz mit Bootstrap 5 und WordPress Full Site Editing erstellt."
#. translators: Copyright notice. %1$s: Year, %2$s: Site title.
#: patterns/footer-columns.php
msgid "&copy; %1$s %2$s"
msgstr "&copy; %1$s %2$s"
#: views/base.html.twig
msgid "Skip to main content"
msgstr "Zum Hauptinhalt springen"
#: views/partials/header.html.twig
#: views/partials/header-centered.html.twig
#: views/partials/header-transparent.html.twig
#: views/partials/header-offcanvas.html.twig
msgid "Primary navigation"
msgstr "Hauptnavigation"
#: views/partials/footer.html.twig
#: views/partials/footer-columns.html.twig
msgid "Footer navigation"
msgstr "Fussnavigation"
#: functions.php
msgid "Sidebar"
msgstr "Seitenleiste"
#: functions.php
msgid "Add widgets here to appear in the sidebar."
msgstr "Widgets hier hinzufuegen, um sie in der Seitenleiste anzuzeigen."
#: views/partials/sidebar.html.twig
msgid "Blog sidebar"
msgstr "Blog-Seitenleiste"

917
languages/fr_FR.po Normal file
View File

@@ -0,0 +1,917 @@
# French translation for WP Bootstrap theme.
# Copyright (C) 2026 Marco Graetsch
# This file is distributed under the same license as the WP Bootstrap theme.
msgid ""
msgstr ""
"Project-Id-Version: WP Bootstrap 0.3.0\n"
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/magdev/wp-bootstrap/issues\n"
"POT-Creation-Date: 2026-02-08 00:00+0000\n"
"PO-Revision-Date: 2026-02-08 00:00+0000\n"
"Last-Translator: Claude AI <noreply@anthropic.com>\n"
"Language-Team: French\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Domain: wp-bootstrap\n"
#. Theme Name of the theme
#: patterns/footer.php
msgid "WP Bootstrap"
msgstr "WP Bootstrap"
#. Description of the theme
msgid "A modern WordPress Block Theme built from scratch with Bootstrap 5. Features responsive design, dark mode support, and full compatibility with the WordPress Site Editor."
msgstr "Un theme WordPress Block moderne construit de zéro avec Bootstrap 5. Design réactif, prise en charge du mode sombre et compatibilité totale avec l'éditeur de site WordPress."
#: patterns/footer.php
#: patterns/footer-columns.php
msgid "Powered by %s"
msgstr "Propulsé par %s"
#: patterns/footer.php
#: patterns/footer-columns.php
msgid "https://wordpress.org"
msgstr "https://fr.wordpress.org"
#: patterns/hidden-404.php
msgid "Page not found"
msgstr "Page non trouvée"
#: patterns/hidden-404.php
msgid "The page you are looking for does not exist, or it has been moved. Please try searching using the form below."
msgstr "La page que vous recherchez n'existe pas ou a été déplacée. Veuillez essayer de rechercher en utilisant le formulaire ci-dessous."
#: patterns/hidden-search.php
#: patterns/hidden-sidebar.php
msgid "Search"
msgstr "Rechercher"
#: patterns/hidden-search.php
#: patterns/hidden-sidebar.php
msgid "Search..."
msgstr "Rechercher..."
#: patterns/hidden-blog-heading.php
msgid "Blog"
msgstr "Blog"
#: patterns/comments.php
msgid "Comments"
msgstr "Commentaires"
#: patterns/post-navigation.php
msgid "Previous"
msgstr "Précédent"
#: patterns/post-navigation.php
msgid "Next"
msgstr "Suivant"
#: patterns/more-posts.php
msgid "More posts"
msgstr "Plus d'articles"
#: patterns/template-query-loop.php
msgid "Read more"
msgstr "Lire la suite"
#: patterns/template-query-loop.php
msgid "No posts were found."
msgstr "Aucun article n'a été trouvé."
#: patterns/hero-cover.php
msgid "Build something amazing"
msgstr "Créez quelque chose d'incroyable"
#: patterns/hero-cover.php
msgid "Create modern, responsive websites with the power of Bootstrap 5 and the WordPress Site Editor."
msgstr "Créez des sites web modernes et réactifs grâce à la puissance de Bootstrap 5 et de l'éditeur de site WordPress."
#: patterns/hero-cover.php
#: patterns/hero-centered.php
#: patterns/pricing-3-col.php
#: patterns/page-services.php
msgid "Get Started"
msgstr "Commencer"
#: patterns/hero-split.php
msgid "Modern design meets powerful features"
msgstr "Un design moderne allié à des fonctionnalités puissantes"
#: patterns/hero-split.php
msgid "A WordPress theme built from the ground up with Bootstrap 5 for a seamless editing and browsing experience."
msgstr "Un thème WordPress construit de zéro avec Bootstrap 5 pour une expérience d'édition et de navigation fluide."
#: patterns/hero-split.php
#: patterns/hero-centered.php
#: patterns/text-about.php
msgid "Learn More"
msgstr "En savoir plus"
#: patterns/hero-split.php
msgid "View Demo"
msgstr "Voir la démo"
#: patterns/hero-split.php
msgid "Hero image"
msgstr "Image héros"
#: patterns/hero-centered.php
msgid "Welcome to your new website"
msgstr "Bienvenue sur votre nouveau site web"
#: patterns/hero-centered.php
msgid "Start building beautiful, responsive pages with the full power of Bootstrap 5 and the WordPress block editor."
msgstr "Commencez à créer de belles pages réactives avec toute la puissance de Bootstrap 5 et de l'éditeur de blocs WordPress."
#: patterns/features-3-col.php
#: functions.php
msgid "Features"
msgstr "Fonctionnalités"
#: patterns/features-3-col.php
msgid "Everything you need to build a modern website."
msgstr "Tout ce dont vous avez besoin pour créer un site web moderne."
#: patterns/features-3-col.php
msgid "Responsive Design"
msgstr "Design réactif"
#: patterns/features-3-col.php
msgid "Your website looks great on every device, from mobile phones to large desktop screens."
msgstr "Votre site web est superbe sur tous les appareils, des téléphones mobiles aux grands écrans de bureau."
#: patterns/features-3-col.php
msgid "Easy Customization"
msgstr "Personnalisation facile"
#: patterns/features-3-col.php
msgid "Customize colors, fonts, and layouts using the WordPress Site Editor with no code required."
msgstr "Personnalisez les couleurs, les polices et les mises en page avec l'éditeur de site WordPress, sans aucun code requis."
#: patterns/features-3-col.php
msgid "Performance First"
msgstr "La performance avant tout"
#: patterns/features-3-col.php
msgid "Built with speed in mind. Optimized assets and clean code for lightning-fast page loads."
msgstr "Conçu pour la vitesse. Ressources optimisées et code propre pour des chargements de pages ultra-rapides."
#: patterns/features-icon-list.php
msgid "Why choose us"
msgstr "Pourquoi nous choisir"
#: patterns/features-icon-list.php
msgid "Bootstrap 5 Framework"
msgstr "Framework Bootstrap 5"
#: patterns/features-icon-list.php
msgid "Built on the most popular CSS framework. Leverage a proven, well-documented design system."
msgstr "Construit sur le framework CSS le plus populaire. Tirez parti d'un système de design éprouvé et bien documenté."
#: patterns/features-icon-list.php
msgid "Full Site Editing"
msgstr "Édition complète du site"
#: patterns/features-icon-list.php
msgid "Edit every part of your site visually. Headers, footers, templates, and content are all customizable."
msgstr "Modifiez chaque partie de votre site visuellement. En-têtes, pieds de page, modèles et contenu sont tous personnalisables."
#: patterns/features-icon-list.php
msgid "Dark Mode Support"
msgstr "Prise en charge du mode sombre"
#: patterns/features-icon-list.php
msgid "Built-in dark mode toggle that respects user preferences and persists across visits."
msgstr "Bouton de mode sombre intégré qui respecte les préférences de l'utilisateur et persiste entre les visites."
#: patterns/features-2-col-offset.php
msgid "Feature illustration"
msgstr "Illustration de fonctionnalité"
#: patterns/features-2-col-offset.php
msgid "Designed for modern workflows"
msgstr "Conçu pour les flux de travail modernes"
#: patterns/features-2-col-offset.php
msgid "Streamline your development process with a theme that works the way you do."
msgstr "Optimisez votre processus de développement avec un thème qui fonctionne comme vous."
#: patterns/features-2-col-offset.php
msgid "Block Patterns"
msgstr "Modèles de blocs"
#: patterns/features-2-col-offset.php
msgid "Pre-built patterns for common page sections. Drop them in and customize to fit your needs."
msgstr "Modèles préconçus pour les sections de page courantes. Insérez-les et personnalisez-les selon vos besoins."
#: patterns/features-2-col-offset.php
msgid "Style Variations"
msgstr "Variations de style"
#: patterns/features-2-col-offset.php
msgid "Switch between color schemes with a single click. Choose from multiple professionally designed palettes."
msgstr "Basculez entre les palettes de couleurs en un seul clic. Choisissez parmi plusieurs palettes conçues professionnellement."
#: patterns/cta-banner.php
msgid "Ready to get started?"
msgstr "Prêt à commencer ?"
#: patterns/cta-banner.php
msgid "Start building your website today with our powerful and flexible theme."
msgstr "Commencez à créer votre site web dès aujourd'hui avec notre thème puissant et flexible."
#: patterns/cta-banner.php
msgid "Start Now"
msgstr "Commencer maintenant"
#: patterns/cta-newsletter.php
msgid "Stay in the loop"
msgstr "Restez informé"
#: patterns/cta-newsletter.php
msgid "Subscribe to our newsletter for updates, tips, and exclusive content."
msgstr "Abonnez-vous à notre newsletter pour des mises à jour, des conseils et du contenu exclusif."
#: patterns/cta-newsletter.php
msgid "Enter your email address"
msgstr "Entrez votre adresse courriel"
#: patterns/cta-newsletter.php
msgid "Subscribe"
msgstr "S'abonner"
#: patterns/testimonials-2-col.php
msgid "What our clients say"
msgstr "Ce que disent nos clients"
#: patterns/testimonials-2-col.php
msgid "This theme completely transformed our website. The Bootstrap integration makes it incredibly easy to create professional-looking pages without any custom code."
msgstr "Ce thème a complètement transformé notre site web. L'intégration de Bootstrap rend incroyablement facile la création de pages d'aspect professionnel sans aucun code personnalisé."
#: patterns/testimonials-2-col.php
msgid "Jane Doe, Web Designer"
msgstr "Jane Doe, Webdesigneuse"
#: patterns/testimonials-2-col.php
msgid "The dark mode support and style variations give us the flexibility we need. Our clients love being able to switch between color schemes effortlessly."
msgstr "La prise en charge du mode sombre et les variations de style nous donnent la flexibilité dont nous avons besoin. Nos clients adorent pouvoir basculer entre les palettes de couleurs sans effort."
#: patterns/testimonials-2-col.php
msgid "John Smith, Developer"
msgstr "John Smith, Développeur"
#: patterns/testimonials-centered.php
msgid "The best WordPress theme we have ever used. Clean code, beautiful design, and incredible flexibility."
msgstr "Le meilleur thème WordPress que nous ayons jamais utilisé. Code propre, beau design et flexibilité incroyable."
#: patterns/testimonials-centered.php
msgid "Alex Johnson, Creative Director"
msgstr "Alex Johnson, Directeur créatif"
#: patterns/pricing-3-col.php
#: functions.php
msgid "Pricing"
msgstr "Tarifs"
#: patterns/pricing-3-col.php
msgid "Choose the plan that works best for you."
msgstr "Choisissez le forfait qui vous convient le mieux."
#: patterns/pricing-3-col.php
msgid "Basic"
msgstr "Basique"
#: patterns/pricing-3-col.php
msgid "Free"
msgstr "Gratuit"
#: patterns/pricing-3-col.php
msgid "1 Website"
msgstr "1 site web"
#: patterns/pricing-3-col.php
msgid "Community Support"
msgstr "Support communautaire"
#: patterns/pricing-3-col.php
msgid "Core Features"
msgstr "Fonctionnalités de base"
#: patterns/pricing-3-col.php
msgid "Professional"
msgstr "Professionnel"
#: patterns/pricing-3-col.php
msgid "$49"
msgstr "49 $"
#: patterns/pricing-3-col.php
msgid "5 Websites"
msgstr "5 sites web"
#: patterns/pricing-3-col.php
msgid "Priority Support"
msgstr "Support prioritaire"
#: patterns/pricing-3-col.php
msgid "All Features"
msgstr "Toutes les fonctionnalités"
#: patterns/pricing-3-col.php
msgid "Enterprise"
msgstr "Entreprise"
#: patterns/pricing-3-col.php
msgid "$199"
msgstr "199 $"
#: patterns/pricing-3-col.php
msgid "Unlimited Websites"
msgstr "Sites web illimités"
#: patterns/pricing-3-col.php
msgid "Dedicated Support"
msgstr "Support dédié"
#: patterns/pricing-3-col.php
msgid "Custom Development"
msgstr "Développement sur mesure"
#: patterns/pricing-3-col.php
#: patterns/page-services.php
#: patterns/page-contact.php
msgid "Contact Us"
msgstr "Contactez-nous"
#: patterns/contact-info.php
msgid "Get in touch"
msgstr "Prenez contact"
#: patterns/contact-info.php
msgid "We would love to hear from you. Reach out through any of the channels below."
msgstr "Nous serions ravis d'avoir de vos nouvelles. Contactez-nous via l'un des canaux ci-dessous."
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "Address"
msgstr "Adresse"
#: patterns/contact-info.php
msgid "123 Example Street"
msgstr "123, rue de l'Exemple"
#: patterns/contact-info.php
msgid "8000 Zurich, Switzerland"
msgstr "8000 Zurich, Suisse"
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "Phone"
msgstr "Téléphone"
#: patterns/contact-info.php
msgid "+41 44 123 45 67"
msgstr "+41 44 123 45 67"
#: patterns/contact-info.php
#: patterns/cta-newsletter.php
#: patterns/page-contact.php
msgid "Email"
msgstr "Courriel"
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "info@example.com"
msgstr "info@example.com"
#: patterns/text-faq.php
msgid "Frequently Asked Questions"
msgstr "Foire aux questions"
#: patterns/text-faq.php
msgid "How do I install the theme?"
msgstr "Comment installer le thème ?"
#: patterns/text-faq.php
msgid "Download the ZIP file from the releases page, then upload it via WordPress Admin > Appearance > Themes > Add New > Upload Theme."
msgstr "Téléchargez le fichier ZIP depuis la page des versions, puis importez-le via Administration WordPress > Apparence > Thèmes > Ajouter > Téléverser un thème."
#: patterns/text-faq.php
msgid "Does it work with the Site Editor?"
msgstr "Fonctionne-t-il avec l'éditeur de site ?"
#: patterns/text-faq.php
msgid "Yes, this is a Full Site Editing block theme. You can customize templates, headers, footers, and all block patterns using the WordPress Site Editor."
msgstr "Oui, c'est un thème bloc d'édition complète du site. Vous pouvez personnaliser les modèles, en-têtes, pieds de page et tous les modèles de blocs avec l'éditeur de site WordPress."
#: patterns/text-faq.php
msgid "Can I use my own fonts?"
msgstr "Puis-je utiliser mes propres polices ?"
#: patterns/text-faq.php
msgid "The theme comes with Inter, Lora, and system font stacks. You can add custom fonts through the Site Editor or by modifying theme.json."
msgstr "Le thème est livré avec Inter, Lora et des polices système. Vous pouvez ajouter des polices personnalisées via l'éditeur de site ou en modifiant theme.json."
#: patterns/text-faq.php
msgid "Is dark mode supported?"
msgstr "Le mode sombre est-il pris en charge ?"
#: patterns/text-faq.php
msgid "Yes, the theme includes a dark mode toggle that uses Bootstrap 5.3 built-in dark mode. It respects system preferences and remembers your choice."
msgstr "Oui, le thème inclut un bouton de mode sombre qui utilise le mode sombre intégré de Bootstrap 5.3. Il respecte les préférences système et mémorise votre choix."
#: patterns/text-about.php
msgid "About us"
msgstr "À propos de nous"
#: patterns/text-about.php
msgid "We are passionate about creating tools that empower people to build beautiful websites. Our theme combines the reliability of Bootstrap with the flexibility of WordPress."
msgstr "Nous sommes passionnés par la création d'outils qui permettent aux gens de construire de beaux sites web. Notre thème combine la fiabilité de Bootstrap avec la flexibilité de WordPress."
#: patterns/text-about.php
msgid "With years of experience in web development and design, we understand what it takes to create a theme that is both powerful and easy to use."
msgstr "Avec des années d'expérience en développement web et en design, nous comprenons ce qu'il faut pour créer un thème à la fois puissant et facile à utiliser."
#: patterns/text-about.php
#: patterns/page-about.php
msgid "About us image"
msgstr "Image à propos de nous"
#: patterns/hidden-sidebar.php
msgid "Recent Posts"
msgstr "Articles récents"
#: patterns/hidden-sidebar.php
msgid "Tags"
msgstr "Étiquettes"
#: patterns/dark-mode-toggle.php
msgid "Switch to dark mode"
msgstr "Passer en mode sombre"
#: patterns/dark-mode-toggle.php
msgid "Switch to light mode"
msgstr "Passer en mode clair"
#: functions.php
msgid "Primary Navigation"
msgstr "Navigation principale"
#: functions.php
msgid "Footer Navigation"
msgstr "Navigation du pied de page"
#: functions.php
msgid "Pages"
msgstr "Pages"
#: functions.php
msgid "A collection of full page layouts."
msgstr "Une collection de mises en page pleine page."
#: functions.php
msgid "Hero Sections"
msgstr "Sections héros"
#: functions.php
msgid "Large hero and banner sections."
msgstr "Grandes sections héros et bannières."
#: functions.php
msgid "Call to Action"
msgstr "Appel à l'action"
#: functions.php
msgid "Call to action sections."
msgstr "Sections d'appel à l'action."
#: functions.php
msgid "Feature and service showcase sections."
msgstr "Sections de présentation des fonctionnalités et services."
#: functions.php
msgid "Testimonials"
msgstr "Témoignages"
#: functions.php
msgid "Testimonial and review sections."
msgstr "Sections de témoignages et d'avis."
#: functions.php
msgid "Pricing table sections."
msgstr "Sections de tableaux de tarifs."
#: functions.php
msgid "Contact"
msgstr "Contact"
#: functions.php
msgid "Contact information sections."
msgstr "Sections d'informations de contact."
#: functions.php
msgid "Text & Content"
msgstr "Texte et contenu"
#: functions.php
msgid "Text-focused content sections."
msgstr "Sections de contenu axées sur le texte."
#: functions.php
msgid "Checkmark"
msgstr "Coche"
#: functions.php
msgid "Unstyled"
msgstr "Sans style"
#: functions.php
msgid "Card"
msgstr "Carte"
#: functions.php
msgid "Card with Shadow"
msgstr "Carte avec ombre"
#: functions.php
msgid "Alert - Info"
msgstr "Alerte - Info"
#: functions.php
msgid "Alert - Success"
msgstr "Alerte - Succès"
#: functions.php
msgid "Alert - Warning"
msgstr "Alerte - Avertissement"
#: functions.php
msgid "Alert - Danger"
msgstr "Alerte - Danger"
#: functions.php
msgid "Striped Rows"
msgstr "Lignes rayées"
#: functions.php
msgid "Hover Rows"
msgstr "Lignes survolées"
#: functions.php
msgid "Bordered"
msgstr "Avec bordure"
#: functions.php
msgid "Accent Border"
msgstr "Bordure d'accent"
#: functions.php
msgid "Shadow"
msgstr "Ombre"
#: functions.php
msgid "Large Rounded"
msgstr "Grand arrondi"
#: functions.php
msgid "Large"
msgstr "Grand"
#: functions.php
msgid "Small"
msgstr "Petit"
#: functions.php
msgid "Wide"
msgstr "Large"
#: functions.php
msgid "Name"
msgstr "Nom"
#: functions.php
msgid "Website"
msgstr "Site web"
#: functions.php
msgid "Save my name, email, and website in this browser for the next time I comment."
msgstr "Enregistrer mon nom, mon courriel et mon site web dans ce navigateur pour la prochaine fois que je commenterai."
#: functions.php
msgid "Bootstrap Layout"
msgstr "Mise en page Bootstrap"
#: functions.php
msgid "Bootstrap Components"
msgstr "Composants Bootstrap"
#: functions.php
msgid "Bootstrap Navigation"
msgstr "Navigation Bootstrap"
#: functions.php
msgid "Layout"
msgstr "Mise en page"
#: functions.php
msgid "Layout building blocks for page structure."
msgstr "Blocs de construction de mise en page pour la structure des pages."
#: functions.php
msgid "Components"
msgstr "Composants"
#: functions.php
msgid "Reusable Bootstrap component patterns."
msgstr "Modèles de composants Bootstrap réutilisables."
#: functions.php
#: patterns/footer-columns.php
msgid "Navigation"
msgstr "Navigation"
#: functions.php
msgid "Navigation and header patterns."
msgstr "Modèles de navigation et d'en-tête."
#: patterns/layout-container.php
msgid "Heading goes here"
msgstr "Le titre va ici"
#: patterns/layout-container.php
msgid "This is a content container with constrained width and comfortable padding. Replace this text with your own content."
msgstr "Ceci est un conteneur de contenu avec une largeur limitée et un espacement confortable. Remplacez ce texte par votre propre contenu."
#: patterns/layout-2-col.php
#: patterns/layout-3-col.php
msgid "Column One"
msgstr "Colonne un"
#: patterns/layout-2-col.php
msgid "Add your content here. This column takes up half the available width on larger screens and stacks on mobile devices."
msgstr "Ajoutez votre contenu ici. Cette colonne occupe la moitié de la largeur disponible sur les grands écrans et s'empile sur les appareils mobiles."
#: patterns/layout-2-col.php
#: patterns/layout-3-col.php
msgid "Column Two"
msgstr "Colonne deux"
#: patterns/layout-3-col.php
msgid "Column Three"
msgstr "Colonne trois"
#: patterns/layout-3-col.php
msgid "Add your content here. This column takes up one third of the available width on larger screens."
msgstr "Ajoutez votre contenu ici. Cette colonne occupe un tiers de la largeur disponible sur les grands écrans."
#: patterns/layout-full-width-section.php
msgid "Full Width Section Heading"
msgstr "Titre de la section pleine largeur"
#: patterns/layout-full-width-section.php
msgid "This full-width section stands out with a colored background. Use it to highlight important content, announcements, or calls to action."
msgstr "Cette section pleine largeur se distingue par un arrière-plan coloré. Utilisez-la pour mettre en valeur du contenu important, des annonces ou des appels à l'action."
#: patterns/component-card-group.php
msgid "Card One"
msgstr "Carte un"
#: patterns/component-card-group.php
msgid "Card Two"
msgstr "Carte deux"
#: patterns/component-card-group.php
msgid "Card Three"
msgstr "Carte trois"
#: patterns/component-card-group.php
msgid "Add a short description for this card. Cards are a great way to organize and present related content."
msgstr "Ajoutez une courte description pour cette carte. Les cartes sont un excellent moyen d'organiser et de présenter du contenu connexe."
#: patterns/component-accordion.php
msgid "Accordion"
msgstr "Accordéon"
#: patterns/component-accordion.php
msgid "Click on each item to expand and reveal its content."
msgstr "Cliquez sur chaque élément pour le développer et révéler son contenu."
#: patterns/component-accordion.php
msgid "Accordion Item One"
msgstr "Élément d'accordéon un"
#: patterns/component-accordion.php
msgid "This is the content for the first accordion item. You can add any blocks inside this details element to create rich, expandable content sections."
msgstr "Ceci est le contenu du premier élément d'accordéon. Vous pouvez ajouter n'importe quels blocs à l'intérieur de cet élément details pour créer des sections de contenu riches et dépliables."
#: patterns/component-accordion.php
msgid "Accordion Item Two"
msgstr "Élément d'accordéon deux"
#: patterns/component-accordion.php
msgid "This is the content for the second accordion item. Details blocks are a native HTML element that provide toggle functionality without JavaScript."
msgstr "Ceci est le contenu du deuxième élément d'accordéon. Les blocs details sont un élément HTML natif qui offre une fonctionnalité de basculement sans JavaScript."
#: patterns/component-accordion.php
msgid "Accordion Item Three"
msgstr "Élément d'accordéon trois"
#: patterns/component-accordion.php
msgid "This is the content for the third accordion item. Use accordions to organize frequently asked questions, feature lists, or any content that benefits from progressive disclosure."
msgstr "Ceci est le contenu du troisième élément d'accordéon. Utilisez les accordéons pour organiser les questions fréquentes, les listes de fonctionnalités ou tout contenu qui bénéficie d'une divulgation progressive."
#: patterns/page-about.php
msgid "About Us"
msgstr "À propos"
#: patterns/page-about.php
msgid "Learn more about who we are, what we do, and the people behind our mission."
msgstr "Apprenez-en plus sur qui nous sommes, ce que nous faisons et les personnes derrière notre mission."
#: patterns/page-about.php
msgid "Our Story"
msgstr "Notre histoire"
#: patterns/page-about.php
msgid "Founded with a passion for innovation and excellence, our journey began with a simple idea: to create meaningful solutions that make a real difference. Over the years, we have grown from a small team into a dedicated group of professionals committed to delivering outstanding results."
msgstr "Fondée avec une passion pour l'innovation et l'excellence, notre aventure a commencé avec une idée simple : créer des solutions significatives qui font une vraie différence. Au fil des années, nous sommes passés d'une petite équipe à un groupe dédié de professionnels engagés à fournir des résultats exceptionnels."
#: patterns/page-about.php
msgid "Today, we continue to push boundaries and challenge conventions. Our approach combines creative thinking with proven methodologies, ensuring that every project we undertake meets the highest standards of quality and craftsmanship."
msgstr "Aujourd'hui, nous continuons à repousser les limites et à remettre en question les conventions. Notre approche combine la pensée créative avec des méthodologies éprouvées, garantissant que chaque projet que nous entreprenons répond aux plus hauts standards de qualité et de savoir-faire."
#: patterns/page-about.php
msgid "Our Team"
msgstr "Notre équipe"
#: patterns/page-about.php
msgid "Meet the people who make it all happen."
msgstr "Rencontrez les personnes qui rendent tout cela possible."
#: patterns/page-about.php
msgid "Jane Doe"
msgstr "Jane Doe"
#: patterns/page-about.php
msgid "Founder & CEO"
msgstr "Fondatrice et PDG"
#: patterns/page-about.php
msgid "John Smith"
msgstr "John Smith"
#: patterns/page-about.php
msgid "Lead Developer"
msgstr "Développeur principal"
#: patterns/page-about.php
msgid "Emily Johnson"
msgstr "Emily Johnson"
#: patterns/page-about.php
msgid "Creative Director"
msgstr "Directrice créative"
#: patterns/page-services.php
msgid "Our Services"
msgstr "Nos services"
#: patterns/page-services.php
msgid "Professional solutions tailored to your needs."
msgstr "Des solutions professionnelles adaptées à vos besoins."
#: patterns/page-services.php
msgid "What We Offer"
msgstr "Ce que nous offrons"
#: patterns/page-services.php
msgid "We provide a wide range of services to help your business grow and succeed."
msgstr "Nous fournissons une large gamme de services pour aider votre entreprise à croître et réussir."
#: patterns/page-services.php
msgid "Design"
msgstr "Design"
#: patterns/page-services.php
msgid "Beautiful, user-centered designs that capture your brand identity and engage your audience across all platforms and devices."
msgstr "De beaux designs centrés sur l'utilisateur qui capturent l'identité de votre marque et engagent votre public sur toutes les plateformes et appareils."
#: patterns/page-services.php
msgid "Development"
msgstr "Développement"
#: patterns/page-services.php
msgid "Robust, scalable web applications built with modern technologies and best practices to ensure performance and reliability."
msgstr "Des applications web robustes et évolutives construites avec des technologies modernes et les meilleures pratiques pour garantir performance et fiabilité."
#: patterns/page-services.php
msgid "Strategy"
msgstr "Stratégie"
#: patterns/page-services.php
msgid "Data-driven strategies and consulting to help you achieve your business goals and stay ahead of the competition."
msgstr "Des stratégies basées sur les données et du conseil pour vous aider à atteindre vos objectifs commerciaux et garder une longueur d'avance sur la concurrence."
#: patterns/page-services.php
msgid "Ready to take your project to the next level? Let us help you build something great."
msgstr "Prêt à faire passer votre projet au niveau supérieur ? Laissez-nous vous aider à construire quelque chose de formidable."
#: patterns/page-services.php
msgid "View Portfolio"
msgstr "Voir le portfolio"
#: patterns/page-contact.php
msgid "We would love to hear from you. Reach out to us anytime."
msgstr "Nous serions ravis d'avoir de vos nouvelles. Contactez-nous à tout moment."
#: patterns/page-contact.php
msgid "Get in Touch"
msgstr "Prenez contact"
#: patterns/page-contact.php
msgid "123 Main Street, Suite 100, Anytown, ST 12345"
msgstr "123, rue Principale, Bureau 100, 75001 Paris"
#: patterns/page-contact.php
msgid "+1 (555) 123-4567"
msgstr "+33 1 23 45 67 89"
#: patterns/page-contact.php
msgid "Business Hours"
msgstr "Heures d'ouverture"
#: patterns/page-contact.php
msgid "Monday - Friday:"
msgstr "Lundi - Vendredi :"
#: patterns/page-contact.php
msgid "9:00 AM - 6:00 PM"
msgstr "9h00 - 18h00"
#: patterns/page-contact.php
msgid "Saturday:"
msgstr "Samedi :"
#: patterns/page-contact.php
msgid "10:00 AM - 4:00 PM"
msgstr "10h00 - 16h00"
#: patterns/page-contact.php
msgid "Sunday:"
msgstr "Dimanche :"
#: patterns/page-contact.php
msgid "Closed"
msgstr "Fermé"
#. translators: Copyright notice. %1$s: Year, %2$s: Site title.
#: patterns/footer-minimal.php
msgid "&copy; %1$s %2$s. All rights reserved."
msgstr "&copy; %1$s %2$s. Tous droits réservés."
#: patterns/footer-columns.php
msgid "A modern WordPress theme built with Bootstrap 5."
msgstr "Un thème WordPress moderne construit avec Bootstrap 5."
#: patterns/footer-columns.php
msgid "About"
msgstr "À propos"
#: patterns/footer-columns.php
msgid "This theme is proudly built with Bootstrap 5 and WordPress Full Site Editing."
msgstr "Ce thème est fièrement construit avec Bootstrap 5 et l'éditeur de site complet WordPress."
#. translators: Copyright notice. %1$s: Year, %2$s: Site title.
#: patterns/footer-columns.php
msgid "&copy; %1$s %2$s"
msgstr "&copy; %1$s %2$s"
#: views/base.html.twig
msgid "Skip to main content"
msgstr "Aller au contenu principal"
#: views/partials/header.html.twig
#: views/partials/header-centered.html.twig
#: views/partials/header-transparent.html.twig
#: views/partials/header-offcanvas.html.twig
msgid "Primary navigation"
msgstr "Navigation principale"
#: views/partials/footer.html.twig
#: views/partials/footer-columns.html.twig
msgid "Footer navigation"
msgstr "Navigation du pied de page"
#: functions.php
msgid "Sidebar"
msgstr "Barre latérale"
#: functions.php
msgid "Add widgets here to appear in the sidebar."
msgstr "Ajoutez des widgets ici pour les afficher dans la barre latérale."
#: views/partials/sidebar.html.twig
msgid "Blog sidebar"
msgstr "Barre latérale du blog"

View File

@@ -2,7 +2,7 @@
# This file is distributed under the same license as the WP Bootstrap theme.
msgid ""
msgstr ""
"Project-Id-Version: WP Bootstrap 0.1.0\n"
"Project-Id-Version: WP Bootstrap 1.0.0\n"
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/magdev/wp-bootstrap/issues\n"
"POT-Creation-Date: 2026-02-08 00:00+0000\n"
"MIME-Version: 1.0\n"
@@ -24,10 +24,12 @@ msgid "A modern WordPress Block Theme built from scratch with Bootstrap 5. Featu
msgstr ""
#: patterns/footer.php
#: patterns/footer-columns.php
msgid "Powered by %s"
msgstr ""
#: patterns/footer.php
#: patterns/footer-columns.php
msgid "https://wordpress.org"
msgstr ""
@@ -88,6 +90,7 @@ msgstr ""
#: patterns/hero-cover.php
#: patterns/hero-centered.php
#: patterns/pricing-3-col.php
#: patterns/page-services.php
msgid "Get Started"
msgstr ""
@@ -336,6 +339,8 @@ msgid "Custom Development"
msgstr ""
#: patterns/pricing-3-col.php
#: patterns/page-services.php
#: patterns/page-contact.php
msgid "Contact Us"
msgstr ""
@@ -348,6 +353,7 @@ msgid "We would love to hear from you. Reach out through any of the channels bel
msgstr ""
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "Address"
msgstr ""
@@ -360,6 +366,7 @@ msgid "8000 Zurich, Switzerland"
msgstr ""
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "Phone"
msgstr ""
@@ -369,10 +376,12 @@ msgstr ""
#: patterns/contact-info.php
#: patterns/cta-newsletter.php
#: patterns/page-contact.php
msgid "Email"
msgstr ""
#: patterns/contact-info.php
#: patterns/page-contact.php
msgid "info@example.com"
msgstr ""
@@ -425,6 +434,7 @@ msgid "With years of experience in web development and design, we understand wha
msgstr ""
#: patterns/text-about.php
#: patterns/page-about.php
msgid "About us image"
msgstr ""
@@ -444,6 +454,14 @@ msgstr ""
msgid "Switch to light mode"
msgstr ""
#: functions.php
msgid "Primary Navigation"
msgstr ""
#: functions.php
msgid "Footer Navigation"
msgstr ""
#: functions.php
msgid "Pages"
msgstr ""
@@ -567,3 +585,332 @@ msgstr ""
#: functions.php
msgid "Wide"
msgstr ""
#: functions.php
msgid "Name"
msgstr ""
#: functions.php
msgid "Website"
msgstr ""
#: functions.php
msgid "Save my name, email, and website in this browser for the next time I comment."
msgstr ""
#: functions.php
msgid "Bootstrap Layout"
msgstr ""
#: functions.php
msgid "Bootstrap Components"
msgstr ""
#: functions.php
msgid "Bootstrap Navigation"
msgstr ""
#: functions.php
msgid "Layout"
msgstr ""
#: functions.php
msgid "Layout building blocks for page structure."
msgstr ""
#: functions.php
msgid "Components"
msgstr ""
#: functions.php
msgid "Reusable Bootstrap component patterns."
msgstr ""
#: functions.php
#: patterns/footer-columns.php
msgid "Navigation"
msgstr ""
#: functions.php
msgid "Navigation and header patterns."
msgstr ""
#: patterns/layout-container.php
msgid "Heading goes here"
msgstr ""
#: patterns/layout-container.php
msgid "This is a content container with constrained width and comfortable padding. Replace this text with your own content."
msgstr ""
#: patterns/layout-2-col.php
#: patterns/layout-3-col.php
msgid "Column One"
msgstr ""
#: patterns/layout-2-col.php
msgid "Add your content here. This column takes up half the available width on larger screens and stacks on mobile devices."
msgstr ""
#: patterns/layout-2-col.php
#: patterns/layout-3-col.php
msgid "Column Two"
msgstr ""
#: patterns/layout-3-col.php
msgid "Column Three"
msgstr ""
#: patterns/layout-3-col.php
msgid "Add your content here. This column takes up one third of the available width on larger screens."
msgstr ""
#: patterns/layout-full-width-section.php
msgid "Full Width Section Heading"
msgstr ""
#: patterns/layout-full-width-section.php
msgid "This full-width section stands out with a colored background. Use it to highlight important content, announcements, or calls to action."
msgstr ""
#: patterns/component-card-group.php
msgid "Card One"
msgstr ""
#: patterns/component-card-group.php
msgid "Card Two"
msgstr ""
#: patterns/component-card-group.php
msgid "Card Three"
msgstr ""
#: patterns/component-card-group.php
msgid "Add a short description for this card. Cards are a great way to organize and present related content."
msgstr ""
#: patterns/component-accordion.php
msgid "Accordion"
msgstr ""
#: patterns/component-accordion.php
msgid "Click on each item to expand and reveal its content."
msgstr ""
#: patterns/component-accordion.php
msgid "Accordion Item One"
msgstr ""
#: patterns/component-accordion.php
msgid "This is the content for the first accordion item. You can add any blocks inside this details element to create rich, expandable content sections."
msgstr ""
#: patterns/component-accordion.php
msgid "Accordion Item Two"
msgstr ""
#: patterns/component-accordion.php
msgid "This is the content for the second accordion item. Details blocks are a native HTML element that provide toggle functionality without JavaScript."
msgstr ""
#: patterns/component-accordion.php
msgid "Accordion Item Three"
msgstr ""
#: patterns/component-accordion.php
msgid "This is the content for the third accordion item. Use accordions to organize frequently asked questions, feature lists, or any content that benefits from progressive disclosure."
msgstr ""
#: patterns/page-about.php
msgid "About Us"
msgstr ""
#: patterns/page-about.php
msgid "Learn more about who we are, what we do, and the people behind our mission."
msgstr ""
#: patterns/page-about.php
msgid "Our Story"
msgstr ""
#: patterns/page-about.php
msgid "Founded with a passion for innovation and excellence, our journey began with a simple idea: to create meaningful solutions that make a real difference. Over the years, we have grown from a small team into a dedicated group of professionals committed to delivering outstanding results."
msgstr ""
#: patterns/page-about.php
msgid "Today, we continue to push boundaries and challenge conventions. Our approach combines creative thinking with proven methodologies, ensuring that every project we undertake meets the highest standards of quality and craftsmanship."
msgstr ""
#: patterns/page-about.php
msgid "Our Team"
msgstr ""
#: patterns/page-about.php
msgid "Meet the people who make it all happen."
msgstr ""
#: patterns/page-about.php
msgid "Jane Doe"
msgstr ""
#: patterns/page-about.php
msgid "Founder & CEO"
msgstr ""
#: patterns/page-about.php
msgid "John Smith"
msgstr ""
#: patterns/page-about.php
msgid "Lead Developer"
msgstr ""
#: patterns/page-about.php
msgid "Emily Johnson"
msgstr ""
#: patterns/page-about.php
msgid "Creative Director"
msgstr ""
#: patterns/page-services.php
msgid "Our Services"
msgstr ""
#: patterns/page-services.php
msgid "Professional solutions tailored to your needs."
msgstr ""
#: patterns/page-services.php
msgid "What We Offer"
msgstr ""
#: patterns/page-services.php
msgid "We provide a wide range of services to help your business grow and succeed."
msgstr ""
#: patterns/page-services.php
msgid "Design"
msgstr ""
#: patterns/page-services.php
msgid "Beautiful, user-centered designs that capture your brand identity and engage your audience across all platforms and devices."
msgstr ""
#: patterns/page-services.php
msgid "Development"
msgstr ""
#: patterns/page-services.php
msgid "Robust, scalable web applications built with modern technologies and best practices to ensure performance and reliability."
msgstr ""
#: patterns/page-services.php
msgid "Strategy"
msgstr ""
#: patterns/page-services.php
msgid "Data-driven strategies and consulting to help you achieve your business goals and stay ahead of the competition."
msgstr ""
#: patterns/page-services.php
msgid "Ready to take your project to the next level? Let us help you build something great."
msgstr ""
#: patterns/page-services.php
msgid "View Portfolio"
msgstr ""
#: patterns/page-contact.php
msgid "We would love to hear from you. Reach out to us anytime."
msgstr ""
#: patterns/page-contact.php
msgid "Get in Touch"
msgstr ""
#: patterns/page-contact.php
msgid "123 Main Street, Suite 100, Anytown, ST 12345"
msgstr ""
#: patterns/page-contact.php
msgid "+1 (555) 123-4567"
msgstr ""
#: patterns/page-contact.php
msgid "Business Hours"
msgstr ""
#: patterns/page-contact.php
msgid "Monday - Friday:"
msgstr ""
#: patterns/page-contact.php
msgid "9:00 AM - 6:00 PM"
msgstr ""
#: patterns/page-contact.php
msgid "Saturday:"
msgstr ""
#: patterns/page-contact.php
msgid "10:00 AM - 4:00 PM"
msgstr ""
#: patterns/page-contact.php
msgid "Sunday:"
msgstr ""
#: patterns/page-contact.php
msgid "Closed"
msgstr ""
#. translators: Copyright notice. %1$s: Year, %2$s: Site title.
#: patterns/footer-minimal.php
msgid "&copy; %1$s %2$s. All rights reserved."
msgstr ""
#: patterns/footer-columns.php
msgid "A modern WordPress theme built with Bootstrap 5."
msgstr ""
#: patterns/footer-columns.php
msgid "About"
msgstr ""
#: patterns/footer-columns.php
msgid "This theme is proudly built with Bootstrap 5 and WordPress Full Site Editing."
msgstr ""
#. translators: Copyright notice. %1$s: Year, %2$s: Site title.
#: patterns/footer-columns.php
msgid "&copy; %1$s %2$s"
msgstr ""
#: views/base.html.twig
msgid "Skip to main content"
msgstr ""
#: views/partials/header.html.twig
#: views/partials/header-centered.html.twig
#: views/partials/header-transparent.html.twig
#: views/partials/header-offcanvas.html.twig
msgid "Primary navigation"
msgstr ""
#: views/partials/footer.html.twig
#: views/partials/footer-columns.html.twig
msgid "Footer navigation"
msgstr ""
#: functions.php
msgid "Sidebar"
msgstr ""
#: functions.php
msgid "Add widgets here to appear in the sidebar."
msgstr ""
#: views/partials/sidebar.html.twig
msgid "Blog sidebar"
msgstr ""

View File

@@ -1,6 +1,6 @@
{
"name": "wp-bootstrap",
"version": "0.1.1",
"version": "1.0.0",
"description": "WordPress Theme built with Bootstrap 5",
"author": "Marco Graetsch <magdev3.0@gmail.com>",
"license": "GPL-2.0-or-later",
@@ -26,11 +26,12 @@
},
"scripts": {
"scss": "sass src/scss/style.scss:assets/css/style.css src/scss/editor-style.scss:assets/css/editor-style.css --load-path=node_modules",
"scss:rtl": "sass src/scss/rtl.scss:assets/css/rtl.css --style=compressed --no-source-map",
"scss:watch": "sass --watch src/scss/style.scss:assets/css/style.css src/scss/editor-style.scss:assets/css/editor-style.css --load-path=node_modules",
"postcss": "postcss assets/css/style.css --use autoprefixer cssnano -o assets/css/style.min.css --no-map",
"copy:js": "copyfiles -f node_modules/bootstrap/dist/js/bootstrap.bundle.min.js node_modules/bootstrap/dist/js/bootstrap.bundle.min.js.map assets/js/",
"copy:theme-js": "copyfiles -f src/js/dark-mode.js assets/js/",
"build": "npm run copy:js && npm run copy:theme-js && npm run scss && npm run postcss",
"build": "npm run copy:js && npm run copy:theme-js && npm run scss && npm run scss:rtl && npm run postcss",
"watch": "npm run copy:js && npm run scss:watch",
"dev": "npm run watch"
}

View File

@@ -0,0 +1 @@
<!-- wp:pattern {"slug":"wp-bootstrap/footer-columns"} /-->

View File

@@ -0,0 +1 @@
<!-- wp:pattern {"slug":"wp-bootstrap/footer-minimal"} /-->

View File

@@ -0,0 +1 @@
<!-- wp:pattern {"slug":"wp-bootstrap/header-centered"} /-->

View File

@@ -0,0 +1 @@
<!-- wp:pattern {"slug":"wp-bootstrap/header-transparent"} /-->

View File

@@ -0,0 +1,38 @@
<?php
/**
* Title: Accordion
* Slug: wp-bootstrap/component-accordion
* Categories: wp-bootstrap-components, text
* Description: An accordion section using details blocks with summary and content paragraphs.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"layout":{"type":"constrained","contentSize":"720px"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)"><!-- wp:heading {"textAlign":"center","fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-text-align-center has-xx-large-font-size"><?php esc_html_e( 'Accordion', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Click on each item to expand and reveal its content.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:details -->
<details class="wp-block-details"><summary><?php esc_html_e( 'Accordion Item One', 'wp-bootstrap' ); ?></summary><!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'This is the content for the first accordion item. You can add any blocks inside this details element to create rich, expandable content sections.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->
<!-- wp:details -->
<details class="wp-block-details"><summary><?php esc_html_e( 'Accordion Item Two', 'wp-bootstrap' ); ?></summary><!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'This is the content for the second accordion item. Details blocks are a native HTML element that provide toggle functionality without JavaScript.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->
<!-- wp:details -->
<details class="wp-block-details"><summary><?php esc_html_e( 'Accordion Item Three', 'wp-bootstrap' ); ?></summary><!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'This is the content for the third accordion item. Use accordions to organize frequently asked questions, feature lists, or any content that benefits from progressive disclosure.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details --></div>
<!-- /wp:group -->

View File

@@ -0,0 +1,50 @@
<?php
/**
* Title: Card Group
* Slug: wp-bootstrap/component-card-group
* Categories: wp-bootstrap-components
* Description: A three-column card group with shadow-styled cards, each containing a heading and paragraph.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|40"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:group {"className":"is-style-card-shadow","style":{"spacing":{"padding":{"top":"var:preset|spacing|50","bottom":"var:preset|spacing|50","left":"var:preset|spacing|40","right":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group is-style-card-shadow" style="padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)"><!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading"><?php esc_html_e( 'Card One', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add a short description for this card. Cards are a great way to organize and present related content.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:group {"className":"is-style-card-shadow","style":{"spacing":{"padding":{"top":"var:preset|spacing|50","bottom":"var:preset|spacing|50","left":"var:preset|spacing|40","right":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group is-style-card-shadow" style="padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)"><!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading"><?php esc_html_e( 'Card Two', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add a short description for this card. Cards are a great way to organize and present related content.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:group {"className":"is-style-card-shadow","style":{"spacing":{"padding":{"top":"var:preset|spacing|50","bottom":"var:preset|spacing|50","left":"var:preset|spacing|40","right":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group is-style-card-shadow" style="padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)"><!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading"><?php esc_html_e( 'Card Three', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add a short description for this card. Cards are a great way to organize and present related content.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:group -->

View File

@@ -0,0 +1,85 @@
<?php
/**
* Title: Footer - Multi-Column
* Slug: wp-bootstrap/footer-columns
* Categories: footer
* Block Types: core/template-part/footer
* Description: Multi-column footer with site info, navigation, and credits.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"style":{"spacing":{"padding":{"top":"var:preset|spacing|60","bottom":"var:preset|spacing|50"}}},"backgroundColor":"dark","textColor":"base","layout":{"type":"constrained"}} -->
<div class="wp-block-group has-base-color has-dark-background-color has-text-color has-background" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--50)">
<!-- wp:columns {"align":"wide"} -->
<div class="wp-block-columns alignwide">
<!-- wp:column -->
<div class="wp-block-column">
<!-- wp:site-title {"level":3} /-->
<!-- wp:site-tagline {"fontSize":"small"} /-->
<!-- wp:paragraph {"fontSize":"small"} -->
<p class="has-small-font-size"><?php esc_html_e( 'A modern WordPress theme built with Bootstrap 5.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
</div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column">
<!-- wp:heading {"level":4,"fontSize":"medium"} -->
<h4 class="wp-block-heading has-medium-font-size"><?php esc_html_e( 'Navigation', 'wp-bootstrap' ); ?></h4>
<!-- /wp:heading -->
<!-- wp:navigation {"overlayMenu":"never","layout":{"type":"flex","orientation":"vertical"},"style":{"spacing":{"blockGap":"var:preset|spacing|10"}}} /-->
</div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column">
<!-- wp:heading {"level":4,"fontSize":"medium"} -->
<h4 class="wp-block-heading has-medium-font-size"><?php esc_html_e( 'About', 'wp-bootstrap' ); ?></h4>
<!-- /wp:heading -->
<!-- wp:paragraph {"fontSize":"small"} -->
<p class="has-small-font-size"><?php esc_html_e( 'This theme is proudly built with Bootstrap 5 and WordPress Full Site Editing.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
</div>
<!-- /wp:column -->
</div>
<!-- /wp:columns -->
<!-- wp:spacer {"height":"var:preset|spacing|40"} -->
<div style="height:var(--wp--preset--spacing--40)" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->
<!-- wp:separator {"align":"wide","className":"is-style-separator-wide"} -->
<hr class="wp-block-separator alignwide has-alpha-channel-opacity is-style-separator-wide"/>
<!-- /wp:separator -->
<!-- wp:group {"align":"wide","layout":{"type":"flex","flexWrap":"wrap","justifyContent":"space-between"}} -->
<div class="wp-block-group alignwide">
<!-- wp:paragraph {"fontSize":"small"} -->
<p class="has-small-font-size">
<?php
printf(
/* translators: Copyright notice. %1$s: Year, %2$s: Site title. */
esc_html__( '&copy; %1$s %2$s', 'wp-bootstrap' ),
esc_html( gmdate( 'Y' ) ),
esc_html( get_bloginfo( 'name' ) )
);
?>
</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph {"fontSize":"small"} -->
<p class="has-small-font-size">
<?php
printf(
/* translators: Powered by WordPress. %s: WordPress link. */
esc_html__( 'Powered by %s', 'wp-bootstrap' ),
'<a href="' . esc_url( __( 'https://wordpress.org', 'wp-bootstrap' ) ) . '" rel="nofollow">WordPress</a>'
);
?>
</p>
<!-- /wp:paragraph -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->

View File

@@ -0,0 +1,35 @@
<?php
/**
* Title: Footer - Minimal
* Slug: wp-bootstrap/footer-minimal
* Categories: footer
* Block Types: core/template-part/footer
* Description: Minimal single-line footer with copyright.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"style":{"spacing":{"padding":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)">
<!-- wp:separator {"className":"is-style-separator-wide","style":{"spacing":{"margin":{"bottom":"var:preset|spacing|40"}}}} -->
<hr class="wp-block-separator has-alpha-channel-opacity is-style-separator-wide" style="margin-bottom:var(--wp--preset--spacing--40)"/>
<!-- /wp:separator -->
<!-- wp:group {"align":"wide","layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"center"}} -->
<div class="wp-block-group alignwide">
<!-- wp:paragraph {"fontSize":"small"} -->
<p class="has-small-font-size">
<?php
printf(
/* translators: Copyright notice. %1$s: Year, %2$s: Site title. */
esc_html__( '&copy; %1$s %2$s. All rights reserved.', 'wp-bootstrap' ),
esc_html( gmdate( 'Y' ) ),
esc_html( get_bloginfo( 'name' ) )
);
?>
</p>
<!-- /wp:paragraph -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->

View File

@@ -0,0 +1,32 @@
<?php
/**
* Title: Header - Centered
* Slug: wp-bootstrap/header-centered
* Categories: header
* Block Types: core/template-part/header
* Description: Centered header with site title above navigation.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","layout":{"type":"default"}} -->
<div class="wp-block-group alignfull">
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group">
<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|20"}}},"layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} -->
<div class="wp-block-group alignwide" style="padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--20)">
<!-- wp:site-title {"level":0,"textAlign":"center"} /-->
<!-- wp:site-tagline {"textAlign":"center","fontSize":"small"} /-->
</div>
<!-- /wp:group -->
<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|20","bottom":"var:preset|spacing|30"}}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"center"}} -->
<div class="wp-block-group alignwide" style="padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--30)">
<!-- wp:navigation {"overlayBackgroundColor":"base","overlayTextColor":"contrast","layout":{"type":"flex","justifyContent":"center","flexWrap":"wrap"}} /-->
<!-- wp:pattern {"slug":"wp-bootstrap/dark-mode-toggle"} /-->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->

View File

@@ -0,0 +1,31 @@
<?php
/**
* Title: Header - Transparent
* Slug: wp-bootstrap/header-transparent
* Categories: header
* Block Types: core/template-part/header
* Description: Transparent header that overlays page content, ideal for hero sections.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"0","bottom":"0"}}},"layout":{"type":"default"}} -->
<div class="wp-block-group alignfull" style="padding-top:0;padding-bottom:0">
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group">
<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|30","bottom":"var:preset|spacing|30"}}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"space-between"}} -->
<div class="wp-block-group alignwide" style="padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
<!-- wp:site-title {"level":0,"style":{"elements":{"link":{"color":{"text":"var:preset|color|base"}}}}} /-->
<!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|20"}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"right","verticalAlignment":"center"}} -->
<div class="wp-block-group">
<!-- wp:navigation {"overlayBackgroundColor":"base","overlayTextColor":"contrast","style":{"elements":{"link":{"color":{"text":"var:preset|color|base"}}}},"layout":{"type":"flex","justifyContent":"right","flexWrap":"wrap"}} /-->
<!-- wp:pattern {"slug":"wp-bootstrap/dark-mode-toggle"} /-->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->

34
patterns/layout-2-col.php Normal file
View File

@@ -0,0 +1,34 @@
<?php
/**
* Title: Two Columns
* Slug: wp-bootstrap/layout-2-col
* Categories: wp-bootstrap-layout, columns
* Description: A two-column layout with equal width columns, each containing a heading and paragraph.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|60","bottom":"var:preset|spacing|60"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|50"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"level":3,"fontSize":"x-large"} -->
<h3 class="wp-block-heading has-x-large-font-size"><?php esc_html_e( 'Column One', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add your content here. This column takes up half the available width on larger screens and stacks on mobile devices.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"level":3,"fontSize":"x-large"} -->
<h3 class="wp-block-heading has-x-large-font-size"><?php esc_html_e( 'Column Two', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add your content here. This column takes up half the available width on larger screens and stacks on mobile devices.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:group -->

44
patterns/layout-3-col.php Normal file
View File

@@ -0,0 +1,44 @@
<?php
/**
* Title: Three Columns
* Slug: wp-bootstrap/layout-3-col
* Categories: wp-bootstrap-layout, columns
* Description: A three-column layout with equal width columns, each containing a heading and paragraph.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|60","bottom":"var:preset|spacing|60"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|50"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"level":3,"fontSize":"x-large"} -->
<h3 class="wp-block-heading has-x-large-font-size"><?php esc_html_e( 'Column One', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add your content here. This column takes up one third of the available width on larger screens.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"level":3,"fontSize":"x-large"} -->
<h3 class="wp-block-heading has-x-large-font-size"><?php esc_html_e( 'Column Two', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add your content here. This column takes up one third of the available width on larger screens.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"level":3,"fontSize":"x-large"} -->
<h3 class="wp-block-heading has-x-large-font-size"><?php esc_html_e( 'Column Three', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Add your content here. This column takes up one third of the available width on larger screens.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:group -->

View File

@@ -0,0 +1,20 @@
<?php
/**
* Title: Bootstrap Container
* Slug: wp-bootstrap/layout-container
* Categories: wp-bootstrap-layout
* Description: A constrained container with padding, containing a heading and paragraph placeholder.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|60","bottom":"var:preset|spacing|60","left":"var:preset|spacing|40","right":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--40)"><!-- wp:heading {"fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-xx-large-font-size"><?php esc_html_e( 'Heading goes here', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p><?php esc_html_e( 'This is a content container with constrained width and comfortable padding. Replace this text with your own content.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

View File

@@ -0,0 +1,20 @@
<?php
/**
* Title: Full Width Section
* Slug: wp-bootstrap/layout-full-width-section
* Categories: wp-bootstrap-layout, banner
* Description: A full-width section with a primary background color, centered white heading and paragraph.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|80","bottom":"var:preset|spacing|80"}}},"backgroundColor":"primary","textColor":"base","layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull has-base-color has-primary-background-color has-text-color has-background" style="padding-top:var(--wp--preset--spacing--80);padding-bottom:var(--wp--preset--spacing--80)"><!-- wp:heading {"textAlign":"center","fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-text-align-center has-xx-large-font-size"><?php esc_html_e( 'Full Width Section Heading', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","fontSize":"large"} -->
<p class="has-text-align-center has-large-font-size"><?php esc_html_e( 'This full-width section stands out with a colored background. Use it to highlight important content, announcements, or calls to action.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

31
patterns/nav-dark.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
/**
* Title: Navigation - Dark
* Slug: wp-bootstrap/nav-dark
* Categories: wp-bootstrap-navigation, header
* Block Types: core/template-part/header
* Description: Dark-themed navigation header with dark background.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","backgroundColor":"dark","textColor":"base","layout":{"type":"default"}} -->
<div class="wp-block-group alignfull has-base-color has-dark-background-color has-text-color has-background">
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group">
<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|30","bottom":"var:preset|spacing|30"}}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"space-between"}} -->
<div class="wp-block-group alignwide" style="padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
<!-- wp:site-title {"level":0,"style":{"elements":{"link":{"color":{"text":"var:preset|color|base"}}}}} /-->
<!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|20"}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"right","verticalAlignment":"center"}} -->
<div class="wp-block-group">
<!-- wp:navigation {"overlayBackgroundColor":"dark","overlayTextColor":"base","style":{"elements":{"link":{"color":{"text":"var:preset|color|base"}}}},"layout":{"type":"flex","justifyContent":"right","flexWrap":"wrap"}} /-->
<!-- wp:pattern {"slug":"wp-bootstrap/dark-mode-toggle"} /-->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->

View File

@@ -0,0 +1,31 @@
<?php
/**
* Title: Navigation - Offcanvas
* Slug: wp-bootstrap/nav-offcanvas
* Categories: wp-bootstrap-navigation, header
* Block Types: core/template-part/header
* Description: Header with offcanvas mobile navigation using Bootstrap offcanvas component.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","layout":{"type":"default"}} -->
<div class="wp-block-group alignfull">
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group">
<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var:preset|spacing|30","bottom":"var:preset|spacing|30"}}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"space-between"}} -->
<div class="wp-block-group alignwide" style="padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
<!-- wp:site-title {"level":0} /-->
<!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|20"}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"right","verticalAlignment":"center"}} -->
<div class="wp-block-group">
<!-- wp:navigation {"overlayMenu":"always","overlayBackgroundColor":"base","overlayTextColor":"contrast","layout":{"type":"flex","justifyContent":"right","flexWrap":"wrap"}} /-->
<!-- wp:pattern {"slug":"wp-bootstrap/dark-mode-toggle"} /-->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->
</div>
<!-- /wp:group -->

92
patterns/page-about.php Normal file
View File

@@ -0,0 +1,92 @@
<?php
/**
* Title: About Page
* Slug: wp-bootstrap/page-about
* Categories: wp-bootstrap_page
* Description: A full about page layout with hero, story section, and team members.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|80","bottom":"var:preset|spacing|80"}}},"backgroundColor":"primary","textColor":"base","layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull has-base-color has-primary-background-color has-text-color has-background" style="padding-top:var(--wp--preset--spacing--80);padding-bottom:var(--wp--preset--spacing--80)"><!-- wp:heading {"textAlign":"center","level":1,"fontSize":"display"} -->
<h1 class="wp-block-heading has-text-align-center has-display-font-size"><?php esc_html_e( 'About Us', 'wp-bootstrap' ); ?></h1>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","fontSize":"large"} -->
<p class="has-text-align-center has-large-font-size"><?php esc_html_e( 'Learn more about who we are, what we do, and the people behind our mission.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|60"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column {"verticalAlignment":"center"} -->
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:heading {"fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-xx-large-font-size"><?php esc_html_e( 'Our Story', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p><?php esc_html_e( 'Founded with a passion for innovation and excellence, our journey began with a simple idea: to create meaningful solutions that make a real difference. Over the years, we have grown from a small team into a dedicated group of professionals committed to delivering outstanding results.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph {"textColor":"secondary"} -->
<p class="has-secondary-color has-text-color"><?php esc_html_e( 'Today, we continue to push boundaries and challenge conventions. Our approach combines creative thinking with proven methodologies, ensuring that every project we undertake meets the highest standards of quality and craftsmanship.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->
<!-- wp:column {"verticalAlignment":"center"} -->
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"sizeSlug":"large","style":{"border":{"radius":"0.5rem"}}} -->
<figure class="wp-block-image size-large" style="border-radius:0.5rem"><img src="" alt="<?php esc_attr_e( 'About us image', 'wp-bootstrap' ); ?>"/></figure>
<!-- /wp:image --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:group -->
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"backgroundColor":"light","layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull has-light-background-color has-background" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)"><!-- wp:heading {"textAlign":"center","fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-text-align-center has-xx-large-font-size"><?php esc_html_e( 'Our Team', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Meet the people who make it all happen.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|40"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:group {"className":"is-style-card","style":{"spacing":{"padding":{"top":"var:preset|spacing|50","bottom":"var:preset|spacing|50","left":"var:preset|spacing|40","right":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group is-style-card" style="padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)"><!-- wp:heading {"textAlign":"center","level":3} -->
<h3 class="wp-block-heading has-text-align-center"><?php esc_html_e( 'Jane Doe', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Founder & CEO', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:group {"className":"is-style-card","style":{"spacing":{"padding":{"top":"var:preset|spacing|50","bottom":"var:preset|spacing|50","left":"var:preset|spacing|40","right":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group is-style-card" style="padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)"><!-- wp:heading {"textAlign":"center","level":3} -->
<h3 class="wp-block-heading has-text-align-center"><?php esc_html_e( 'John Smith', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Lead Developer', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:group {"className":"is-style-card","style":{"spacing":{"padding":{"top":"var:preset|spacing|50","bottom":"var:preset|spacing|50","left":"var:preset|spacing|40","right":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group is-style-card" style="padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)"><!-- wp:heading {"textAlign":"center","level":3} -->
<h3 class="wp-block-heading has-text-align-center"><?php esc_html_e( 'Emily Johnson', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Creative Director', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:group -->

66
patterns/page-contact.php Normal file
View File

@@ -0,0 +1,66 @@
<?php
/**
* Title: Contact Page
* Slug: wp-bootstrap/page-contact
* Categories: wp-bootstrap_page
* Description: A full contact page layout with hero, contact details, business hours, and spacer.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|80","bottom":"var:preset|spacing|80"}}},"backgroundColor":"primary","textColor":"base","layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull has-base-color has-primary-background-color has-text-color has-background" style="padding-top:var(--wp--preset--spacing--80);padding-bottom:var(--wp--preset--spacing--80)"><!-- wp:heading {"textAlign":"center","level":1,"fontSize":"display"} -->
<h1 class="wp-block-heading has-text-align-center has-display-font-size"><?php esc_html_e( 'Contact Us', 'wp-bootstrap' ); ?></h1>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","fontSize":"large"} -->
<p class="has-text-align-center has-large-font-size"><?php esc_html_e( 'We would love to hear from you. Reach out to us anytime.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|60"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column {"verticalAlignment":"top"} -->
<div class="wp-block-column is-vertically-aligned-top"><!-- wp:heading {"fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-xx-large-font-size"><?php esc_html_e( 'Get in Touch', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p><strong><?php esc_html_e( 'Address', 'wp-bootstrap' ); ?></strong><br><?php esc_html_e( '123 Main Street, Suite 100, Anytown, ST 12345', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong><?php esc_html_e( 'Email', 'wp-bootstrap' ); ?></strong><br><?php esc_html_e( 'info@example.com', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong><?php esc_html_e( 'Phone', 'wp-bootstrap' ); ?></strong><br><?php esc_html_e( '+1 (555) 123-4567', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->
<!-- wp:column {"verticalAlignment":"top"} -->
<div class="wp-block-column is-vertically-aligned-top"><!-- wp:heading {"fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-xx-large-font-size"><?php esc_html_e( 'Business Hours', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:list {"className":"is-style-list-unstyled","style":{"spacing":{"blockGap":"var:preset|spacing|20"}}} -->
<ul class="is-style-list-unstyled"><!-- wp:list-item -->
<li><strong><?php esc_html_e( 'Monday - Friday:', 'wp-bootstrap' ); ?></strong> <?php esc_html_e( '9:00 AM - 6:00 PM', 'wp-bootstrap' ); ?></li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li><strong><?php esc_html_e( 'Saturday:', 'wp-bootstrap' ); ?></strong> <?php esc_html_e( '10:00 AM - 4:00 PM', 'wp-bootstrap' ); ?></li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li><strong><?php esc_html_e( 'Sunday:', 'wp-bootstrap' ); ?></strong> <?php esc_html_e( 'Closed', 'wp-bootstrap' ); ?></li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:group -->
<!-- wp:spacer {"height":"var:preset|spacing|70"} -->
<div style="height:var(--wp--preset--spacing--70)" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

View File

@@ -0,0 +1,94 @@
<?php
/**
* Title: Services Page
* Slug: wp-bootstrap/page-services
* Categories: wp-bootstrap_page
* Description: A full services page layout with hero, service offerings, and call to action.
*
* @package WPBootstrap
* @since 0.2.0
*/
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|80","bottom":"var:preset|spacing|80"}}},"backgroundColor":"dark","textColor":"base","layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull has-base-color has-dark-background-color has-text-color has-background" style="padding-top:var(--wp--preset--spacing--80);padding-bottom:var(--wp--preset--spacing--80)"><!-- wp:heading {"textAlign":"center","level":1,"fontSize":"display"} -->
<h1 class="wp-block-heading has-text-align-center has-display-font-size"><?php esc_html_e( 'Our Services', 'wp-bootstrap' ); ?></h1>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","fontSize":"large"} -->
<p class="has-text-align-center has-large-font-size"><?php esc_html_e( 'Professional solutions tailored to your needs.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)"><!-- wp:heading {"textAlign":"center","fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-text-align-center has-xx-large-font-size"><?php esc_html_e( 'What We Offer', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'We provide a wide range of services to help your business grow and succeed.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|50"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"textAlign":"center","level":3,"fontSize":"display"} -->
<h3 class="wp-block-heading has-text-align-center has-display-font-size"><?php esc_html_e( "\xF0\x9F\x8E\xA8", 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:heading {"textAlign":"center","level":3} -->
<h3 class="wp-block-heading has-text-align-center"><?php esc_html_e( 'Design', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Beautiful, user-centered designs that capture your brand identity and engage your audience across all platforms and devices.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"textAlign":"center","level":3,"fontSize":"display"} -->
<h3 class="wp-block-heading has-text-align-center has-display-font-size"><?php esc_html_e( "\xE2\x9A\x99\xEF\xB8\x8F", 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:heading {"textAlign":"center","level":3} -->
<h3 class="wp-block-heading has-text-align-center"><?php esc_html_e( 'Development', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Robust, scalable web applications built with modern technologies and best practices to ensure performance and reliability.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"textAlign":"center","level":3,"fontSize":"display"} -->
<h3 class="wp-block-heading has-text-align-center has-display-font-size"><?php esc_html_e( "\xF0\x9F\x93\x88", 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:heading {"textAlign":"center","level":3} -->
<h3 class="wp-block-heading has-text-align-center"><?php esc_html_e( 'Strategy', 'wp-bootstrap' ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","textColor":"secondary"} -->
<p class="has-text-align-center has-secondary-color has-text-color"><?php esc_html_e( 'Data-driven strategies and consulting to help you achieve your business goals and stay ahead of the competition.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:group -->
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"backgroundColor":"primary","textColor":"base","layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull has-base-color has-primary-background-color has-text-color has-background" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)"><!-- wp:heading {"textAlign":"center","fontSize":"xx-large"} -->
<h2 class="wp-block-heading has-text-align-center has-xx-large-font-size"><?php esc_html_e( 'Get Started', 'wp-bootstrap' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph {"align":"center","fontSize":"medium"} -->
<p class="has-text-align-center has-medium-font-size"><?php esc_html_e( 'Ready to take your project to the next level? Let us help you build something great.', 'wp-bootstrap' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:buttons {"layout":{"type":"flex","justifyContent":"center"}} -->
<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"base","textColor":"primary"} -->
<div class="wp-block-button"><a class="wp-block-button__link has-primary-color has-base-background-color has-text-color has-background wp-element-button"><?php esc_html_e( 'Contact Us', 'wp-bootstrap' ); ?></a></div>
<!-- /wp:button -->
<!-- wp:button {"className":"is-style-outline","style":{"elements":{"link":{"color":{"text":"var:preset|color|base"}}}},"textColor":"base"} -->
<div class="wp-block-button is-style-outline"><a class="wp-block-button__link has-base-color has-text-color has-link-color wp-element-button"><?php esc_html_e( 'View Portfolio', 'wp-bootstrap' ); ?></a></div>
<!-- /wp:button --></div>
<!-- /wp:buttons --></div>
<!-- /wp:group -->

View File

@@ -61,6 +61,7 @@
var newTheme = currentTheme === 'dark' ? 'light' : 'dark';
localStorage.setItem(STORAGE_KEY, newTheme);
setTheme(newTheme);
announceTheme(newTheme);
});
});
});
@@ -71,4 +72,23 @@
setTheme(e.matches ? 'dark' : 'light');
}
});
/**
* Announce theme change to screen readers via a live region.
*
* @param {string} theme - 'dark' or 'light'
*/
function announceTheme(theme) {
var msg = theme === 'dark' ? 'Dark mode enabled' : 'Light mode enabled';
var el = document.getElementById('wp-bootstrap-theme-status');
if (!el) {
el = document.createElement('div');
el.id = 'wp-bootstrap-theme-status';
el.setAttribute('role', 'status');
el.setAttribute('aria-live', 'polite');
el.className = 'visually-hidden';
document.body.appendChild(el);
}
el.textContent = msg;
}
})();

View File

@@ -25,6 +25,41 @@
}
}
// Transparent header variant
.header-transparent {
position: absolute;
width: 100%;
z-index: $zindex-fixed;
.navbar {
background: transparent !important;
}
}
// Force Bootstrap dark mode body colors past any WordPress global styles.
// WordPress may output body { background-color: ...; color: ...; } via
// global-styles that overrides Bootstrap's variable-based body styling.
html[data-bs-theme="dark"] body {
background-color: var(--bs-body-bg) !important;
color: var(--bs-body-color) !important;
}
// Dark mode for all form elements — catches plugin-generated controls
// that lack Bootstrap's .form-select / .form-control classes.
[data-bs-theme="dark"] {
select,
input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]):not([type="reset"]),
textarea {
background-color: var(--bs-body-bg);
color: var(--bs-body-color);
border-color: var(--bs-border-color);
}
.offcanvas {
--bs-offcanvas-bg: var(--bs-body-bg);
}
}
// Dark mode overrides for block styles with hardcoded colors
[data-bs-theme="dark"] {
.is-style-alert-info {
@@ -57,3 +92,46 @@
background: var(--bs-body-bg);
}
}
// Skip link (accessibility)
.wp-bootstrap-skip-link {
position: absolute;
top: -100%;
left: 0;
z-index: $zindex-fixed + 10;
padding: 0.5rem 1rem;
background: var(--bs-primary);
color: #fff;
text-decoration: none;
font-weight: 600;
&:focus {
top: 0;
}
}
// Post featured image
.post-thumbnail {
aspect-ratio: 16 / 9;
object-fit: cover;
width: 100%;
}
// Card thumbnail
.card-thumbnail {
aspect-ratio: 3 / 2;
object-fit: cover;
}
// Sidebar heading
.sidebar-heading {
letter-spacing: 1.6px;
}
// Hero overlay
.hero-overlay {
background-position: center;
background-size: cover;
background-repeat: no-repeat;
opacity: 0.3;
}

View File

@@ -0,0 +1,29 @@
// Editor-specific overrides
// Adjustments for the block editor iframe to match frontend appearance
.editor-styles-wrapper {
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
line-height: 1.5;
a {
text-decoration-thickness: 1px !important;
text-underline-offset: 0.1em;
}
// Alignment overrides matching Bootstrap container widths
.alignfull {
margin-left: 0;
margin-right: 0;
}
.alignwide {
max-width: 1140px;
margin-left: auto;
margin-right: auto;
}
// Block gap matching theme.json blockGap
> * + * {
margin-block-start: 1.5rem;
}
}

View File

@@ -1,23 +1,22 @@
/*!
* WP Bootstrap Theme - Editor Styles
* Imports full Bootstrap so WYSIWYG matches the frontend.
*/
// Import Bootstrap functions and variables for consistency
// 1. Import Bootstrap functions first (needed for variable manipulation)
@import "bootstrap/scss/functions";
// 2. Override Bootstrap variables BEFORE they're set
@import "variables";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/root";
// Editor-specific adjustments
.editor-styles-wrapper {
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
line-height: 1.5;
// 3. Import all of Bootstrap
@import "bootstrap/scss/bootstrap";
a {
text-decoration-thickness: 1px !important;
text-underline-offset: 0.1em;
}
}
// 4. WordPress block compatibility
@import "wordpress";
// 5. Custom styles (dark mode overrides, block styles, etc.)
@import "custom";
// 6. Editor-specific overrides
@import "editor-overrides";

11
src/scss/rtl.scss Normal file
View File

@@ -0,0 +1,11 @@
/*!
* WP Bootstrap Theme - RTL Overrides
* Right-to-left language support
*/
// Blockquote accent border (LTR uses border-left, RTL needs border-right)
.is-style-blockquote-accent {
border-left: none;
border-right: 4px solid var(--wp--preset--color--primary);
border-radius: 0.375rem 0 0 0.375rem;
}

View File

@@ -7,7 +7,7 @@ Description: A modern WordPress Block Theme built from scratch with Bootstrap 5.
Requires at least: 6.7
Tested up to: 6.7
Requires PHP: 8.3
Version: 0.1.1
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: wp-bootstrap

86
styles/05-ember.json Normal file
View File

@@ -0,0 +1,86 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Ember",
"settings": {
"color": {
"palette": [
{
"color": "#1c1210",
"name": "Base",
"slug": "base"
},
{
"color": "#f0e6e0",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#e85d26",
"name": "Primary",
"slug": "primary"
},
{
"color": "#a8a09c",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#4ade80",
"name": "Success",
"slug": "success"
},
{
"color": "#f87171",
"name": "Danger",
"slug": "danger"
},
{
"color": "#fbbf24",
"name": "Warning",
"slug": "warning"
},
{
"color": "#fb923c",
"name": "Info",
"slug": "info"
},
{
"color": "#2a1f1b",
"name": "Light",
"slug": "light"
},
{
"color": "#3d2117",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
"color": {
"background": "var:preset|color|primary",
"text": "var:preset|color|base"
},
":hover": {
"color": {
"background": "#c44b1b"
}
}
},
"link": {
"color": {
"text": "var:preset|color|primary"
},
":hover": {
"color": {
"text": "#c44b1b"
}
}
}
}
}
}

86
styles/06-arctic.json Normal file
View File

@@ -0,0 +1,86 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Arctic",
"settings": {
"color": {
"palette": [
{
"color": "#0d1b2a",
"name": "Base",
"slug": "base"
},
{
"color": "#e0e8f0",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#38bdf8",
"name": "Primary",
"slug": "primary"
},
{
"color": "#94a3b8",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#34d399",
"name": "Success",
"slug": "success"
},
{
"color": "#fb7185",
"name": "Danger",
"slug": "danger"
},
{
"color": "#facc15",
"name": "Warning",
"slug": "warning"
},
{
"color": "#22d3ee",
"name": "Info",
"slug": "info"
},
{
"color": "#1b2838",
"name": "Light",
"slug": "light"
},
{
"color": "#0f4c75",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
"color": {
"background": "var:preset|color|primary",
"text": "var:preset|color|base"
},
":hover": {
"color": {
"background": "#0ea5e9"
}
}
},
"link": {
"color": {
"text": "var:preset|color|primary"
},
":hover": {
"color": {
"text": "#0ea5e9"
}
}
}
}
}
}

86
styles/07-amethyst.json Normal file
View File

@@ -0,0 +1,86 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Amethyst",
"settings": {
"color": {
"palette": [
{
"color": "#1a1028",
"name": "Base",
"slug": "base"
},
{
"color": "#e8e0f0",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#a78bfa",
"name": "Primary",
"slug": "primary"
},
{
"color": "#9ca3af",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#6ee7b7",
"name": "Success",
"slug": "success"
},
{
"color": "#fca5a5",
"name": "Danger",
"slug": "danger"
},
{
"color": "#fde68a",
"name": "Warning",
"slug": "warning"
},
{
"color": "#c084fc",
"name": "Info",
"slug": "info"
},
{
"color": "#221538",
"name": "Light",
"slug": "light"
},
{
"color": "#3b1f6e",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
"color": {
"background": "var:preset|color|primary",
"text": "var:preset|color|base"
},
":hover": {
"color": {
"background": "#8b5cf6"
}
}
},
"link": {
"color": {
"text": "var:preset|color|primary"
},
":hover": {
"color": {
"text": "#8b5cf6"
}
}
}
}
}
}

79
styles/08-rose.json Normal file
View File

@@ -0,0 +1,79 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Rose",
"settings": {
"color": {
"palette": [
{
"color": "#FFFBFC",
"name": "Base",
"slug": "base"
},
{
"color": "#2e1a21",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#be185d",
"name": "Primary",
"slug": "primary"
},
{
"color": "#78716c",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#16a34a",
"name": "Success",
"slug": "success"
},
{
"color": "#dc2626",
"name": "Danger",
"slug": "danger"
},
{
"color": "#eab308",
"name": "Warning",
"slug": "warning"
},
{
"color": "#ec4899",
"name": "Info",
"slug": "info"
},
{
"color": "#fdf2f8",
"name": "Light",
"slug": "light"
},
{
"color": "#4a1030",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
":hover": {
"color": {
"background": "#9d174d"
}
}
},
"link": {
":hover": {
"color": {
"text": "#9d174d"
}
}
}
}
}
}

79
styles/09-sand.json Normal file
View File

@@ -0,0 +1,79 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Sand",
"settings": {
"color": {
"palette": [
{
"color": "#FEFCF8",
"name": "Base",
"slug": "base"
},
{
"color": "#292017",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#b45309",
"name": "Primary",
"slug": "primary"
},
{
"color": "#78716c",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#15803d",
"name": "Success",
"slug": "success"
},
{
"color": "#b91c1c",
"name": "Danger",
"slug": "danger"
},
{
"color": "#d97706",
"name": "Warning",
"slug": "warning"
},
{
"color": "#d4956b",
"name": "Info",
"slug": "info"
},
{
"color": "#f5f0e8",
"name": "Light",
"slug": "light"
},
{
"color": "#3d2c14",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
":hover": {
"color": {
"background": "#92400e"
}
}
},
"link": {
":hover": {
"color": {
"text": "#92400e"
}
}
}
}
}
}

79
styles/10-lavender.json Normal file
View File

@@ -0,0 +1,79 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Lavender",
"settings": {
"color": {
"palette": [
{
"color": "#FCFBFF",
"name": "Base",
"slug": "base"
},
{
"color": "#1e1b2e",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#7c3aed",
"name": "Primary",
"slug": "primary"
},
{
"color": "#71717a",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#059669",
"name": "Success",
"slug": "success"
},
{
"color": "#dc2626",
"name": "Danger",
"slug": "danger"
},
{
"color": "#eab308",
"name": "Warning",
"slug": "warning"
},
{
"color": "#8b5cf6",
"name": "Info",
"slug": "info"
},
{
"color": "#f3f0ff",
"name": "Light",
"slug": "light"
},
{
"color": "#3b1f8e",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
":hover": {
"color": {
"background": "#6d28d9"
}
}
},
"link": {
":hover": {
"color": {
"text": "#6d28d9"
}
}
}
}
}
}

79
styles/11-mint.json Normal file
View File

@@ -0,0 +1,79 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Mint",
"settings": {
"color": {
"palette": [
{
"color": "#F8FFFE",
"name": "Base",
"slug": "base"
},
{
"color": "#14291f",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#0d9488",
"name": "Primary",
"slug": "primary"
},
{
"color": "#6b7280",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#16a34a",
"name": "Success",
"slug": "success"
},
{
"color": "#dc2626",
"name": "Danger",
"slug": "danger"
},
{
"color": "#ca8a04",
"name": "Warning",
"slug": "warning"
},
{
"color": "#2dd4bf",
"name": "Info",
"slug": "info"
},
{
"color": "#ecfdf5",
"name": "Light",
"slug": "light"
},
{
"color": "#134e4a",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
":hover": {
"color": {
"background": "#0f766e"
}
}
},
"link": {
":hover": {
"color": {
"text": "#0f766e"
}
}
}
}
}
}

86
styles/12-slate.json Normal file
View File

@@ -0,0 +1,86 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Slate",
"settings": {
"color": {
"palette": [
{
"color": "#0f172a",
"name": "Base",
"slug": "base"
},
{
"color": "#e2e8f0",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#3b82f6",
"name": "Primary",
"slug": "primary"
},
{
"color": "#94a3b8",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#22c55e",
"name": "Success",
"slug": "success"
},
{
"color": "#ef4444",
"name": "Danger",
"slug": "danger"
},
{
"color": "#eab308",
"name": "Warning",
"slug": "warning"
},
{
"color": "#06b6d4",
"name": "Info",
"slug": "info"
},
{
"color": "#1e293b",
"name": "Light",
"slug": "light"
},
{
"color": "#334155",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
"color": {
"background": "var:preset|color|primary",
"text": "var:preset|color|base"
},
":hover": {
"color": {
"background": "#2563eb"
}
}
},
"link": {
"color": {
"text": "var:preset|color|primary"
},
":hover": {
"color": {
"text": "#2563eb"
}
}
}
}
}
}

86
styles/13-mocha.json Normal file
View File

@@ -0,0 +1,86 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Mocha",
"settings": {
"color": {
"palette": [
{
"color": "#1c1412",
"name": "Base",
"slug": "base"
},
{
"color": "#e7ddd4",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#c49a6c",
"name": "Primary",
"slug": "primary"
},
{
"color": "#a8998a",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#6ec98f",
"name": "Success",
"slug": "success"
},
{
"color": "#e87e7e",
"name": "Danger",
"slug": "danger"
},
{
"color": "#e5c07b",
"name": "Warning",
"slug": "warning"
},
{
"color": "#d19a66",
"name": "Info",
"slug": "info"
},
{
"color": "#2a201a",
"name": "Light",
"slug": "light"
},
{
"color": "#45342a",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
"color": {
"background": "var:preset|color|primary",
"text": "var:preset|color|base"
},
":hover": {
"color": {
"background": "#a8804f"
}
}
},
"link": {
"color": {
"text": "var:preset|color|primary"
},
":hover": {
"color": {
"text": "#a8804f"
}
}
}
}
}
}

86
styles/14-nebula.json Normal file
View File

@@ -0,0 +1,86 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Nebula",
"settings": {
"color": {
"palette": [
{
"color": "#0a1628",
"name": "Base",
"slug": "base"
},
{
"color": "#d4e4f0",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#2dd4bf",
"name": "Primary",
"slug": "primary"
},
{
"color": "#7e9bb0",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#4ade80",
"name": "Success",
"slug": "success"
},
{
"color": "#f472b6",
"name": "Danger",
"slug": "danger"
},
{
"color": "#fbbf24",
"name": "Warning",
"slug": "warning"
},
{
"color": "#67e8f9",
"name": "Info",
"slug": "info"
},
{
"color": "#112240",
"name": "Light",
"slug": "light"
},
{
"color": "#1a365d",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
"color": {
"background": "var:preset|color|primary",
"text": "var:preset|color|base"
},
":hover": {
"color": {
"background": "#14b8a6"
}
}
},
"link": {
"color": {
"text": "var:preset|color|primary"
},
":hover": {
"color": {
"text": "#14b8a6"
}
}
}
}
}
}

86
styles/15-obsidian.json Normal file
View File

@@ -0,0 +1,86 @@
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"title": "Obsidian",
"settings": {
"color": {
"palette": [
{
"color": "#121212",
"name": "Base",
"slug": "base"
},
{
"color": "#e0e0e0",
"name": "Contrast",
"slug": "contrast"
},
{
"color": "#ef4444",
"name": "Primary",
"slug": "primary"
},
{
"color": "#a3a3a3",
"name": "Secondary",
"slug": "secondary"
},
{
"color": "#4ade80",
"name": "Success",
"slug": "success"
},
{
"color": "#fb7185",
"name": "Danger",
"slug": "danger"
},
{
"color": "#fbbf24",
"name": "Warning",
"slug": "warning"
},
{
"color": "#f97316",
"name": "Info",
"slug": "info"
},
{
"color": "#1a1a1a",
"name": "Light",
"slug": "light"
},
{
"color": "#2a2a2a",
"name": "Dark",
"slug": "dark"
}
]
}
},
"styles": {
"elements": {
"button": {
"color": {
"background": "var:preset|color|primary",
"text": "var:preset|color|base"
},
":hover": {
"color": {
"background": "#dc2626"
}
}
},
"link": {
"color": {
"text": "var:preset|color|primary"
},
":hover": {
"color": {
"text": "#dc2626"
}
}
}
}
}
}

View File

@@ -0,0 +1,9 @@
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:group {"tagName":"main","layout":{"type":"default"}} -->
<main class="wp-block-group">
<!-- wp:post-content {"align":"full","layout":{"type":"default"}} /-->
</main>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer"} /-->

14
templates/page-hero.html Normal file
View File

@@ -0,0 +1,14 @@
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:group {"tagName":"main","layout":{"type":"default"}} -->
<main class="wp-block-group">
<!-- wp:pattern {"slug":"wp-bootstrap/hero-cover"} /-->
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group">
<!-- wp:post-content {"layout":{"type":"constrained"}} /-->
</div>
<!-- /wp:group -->
</main>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer"} /-->

View File

@@ -0,0 +1,5 @@
<!-- wp:group {"tagName":"main","layout":{"type":"default"}} -->
<main class="wp-block-group">
<!-- wp:post-content {"align":"full","layout":{"type":"default"}} /-->
</main>
<!-- /wp:group -->

View File

@@ -0,0 +1,25 @@
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:group {"tagName":"main","style":{"spacing":{"margin":{"top":"var:preset|spacing|60"}}},"layout":{"type":"constrained"}} -->
<main class="wp-block-group" style="margin-top:var(--wp--preset--spacing--60)">
<!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|60"}}}} -->
<div class="wp-block-columns alignwide">
<!-- wp:column {"width":"66.66%"} -->
<div class="wp-block-column" style="flex-basis:66.66%">
<!-- wp:post-featured-image {"style":{"spacing":{"margin":{"bottom":"var:preset|spacing|60"}}}} /-->
<!-- wp:post-title {"level":1} /-->
<!-- wp:post-content {"align":"full","layout":{"type":"constrained"}} /-->
</div>
<!-- /wp:column -->
<!-- wp:column {"width":"33.33%"} -->
<div class="wp-block-column" style="flex-basis:33.33%">
<!-- wp:template-part {"slug":"sidebar"} /-->
</div>
<!-- /wp:column -->
</div>
<!-- /wp:columns -->
</main>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer"} /-->

View File

@@ -215,13 +215,62 @@
}
]
},
"shadow": {
"defaultPresets": false,
"presets": [
{
"name": "Small",
"slug": "sm",
"shadow": "0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)"
},
{
"name": "Regular",
"slug": "md",
"shadow": "0 0.5rem 1rem rgba(0, 0, 0, 0.15)"
},
{
"name": "Large",
"slug": "lg",
"shadow": "0 1rem 3rem rgba(0, 0, 0, 0.175)"
}
]
},
"dimensions": {
"aspectRatios": [
{
"name": "16:9",
"slug": "16-9",
"ratio": "16/9"
},
{
"name": "4:3",
"slug": "4-3",
"ratio": "4/3"
},
{
"name": "1:1",
"slug": "1-1",
"ratio": "1/1"
},
{
"name": "3:4",
"slug": "3-4",
"ratio": "3/4"
}
]
},
"custom": {
"layout": {
"contentSize": "720px",
"wideSize": "1140px"
},
"spacing": {
"baseline": "1.5rem"
}
},
"useRootPaddingAwareAlignments": true
},
"styles": {
"color": {
"background": "var:preset|color|base",
"text": "var:preset|color|contrast"
},
"spacing": {
"blockGap": "1.5rem",
"padding": {
@@ -450,6 +499,26 @@
"name": "home-sidebar",
"postTypes": ["page"],
"title": "Blog with Sidebar"
},
{
"name": "page-landing",
"postTypes": ["page"],
"title": "Landing Page (No Header/Footer)"
},
{
"name": "page-full-width",
"postTypes": ["page"],
"title": "Full Width"
},
{
"name": "page-hero",
"postTypes": ["page"],
"title": "Page with Hero"
},
{
"name": "page-sidebar",
"postTypes": ["page", "post"],
"title": "Page with Sidebar"
}
],
"templateParts": [
@@ -458,11 +527,31 @@
"name": "header",
"title": "Header"
},
{
"area": "header",
"name": "header-centered",
"title": "Header - Centered"
},
{
"area": "header",
"name": "header-transparent",
"title": "Header - Transparent"
},
{
"area": "footer",
"name": "footer",
"title": "Footer"
},
{
"area": "footer",
"name": "footer-minimal",
"title": "Footer - Minimal"
},
{
"area": "footer",
"name": "footer-columns",
"title": "Footer - Multi-Column"
},
{
"area": "uncategorized",
"name": "sidebar",

View File

@@ -8,13 +8,19 @@
<body {{ body_class() }}>
{{ wp_body_open() }}
<a class="wp-bootstrap-skip-link" href="#main-content">{{ __('Skip to main content') }}</a>
{% block header %}
{% include 'partials/header.html.twig' %}
{% endblock %}
<main id="main-content" class="{% block main_class %}py-4{% endblock %}">
{% block content %}{% endblock %}
</main>
{% block footer %}
{% include 'partials/footer.html.twig' %}
{% endblock %}
{{ wp_footer() }}
</body>

View File

@@ -1,9 +1,9 @@
<article class="card h-100">
{% if post.thumbnail %}
<a href="{{ post.url }}">
<img src="{{ post.thumbnail }}" class="card-img-top"
<img src="{{ post.thumbnail }}" class="card-img-top card-thumbnail"
alt="{{ post.title|e('html_attr') }}"
style="aspect-ratio: 3/2; object-fit: cover;">
loading="lazy">
</a>
{% endif %}
<div class="card-body">

View File

@@ -1,7 +1,7 @@
<article class="card mb-4 border-0 border-bottom rounded-0 pb-4">
{% if post.thumbnail %}
<a href="{{ post.url }}">
<img src="{{ post.thumbnail }}" class="card-img-top rounded" alt="{{ post.title|e('html_attr') }}">
<img src="{{ post.thumbnail }}" class="card-img-top rounded" alt="{{ post.title|e('html_attr') }}" loading="lazy">
</a>
{% endif %}
<div class="card-body px-0">

View File

@@ -0,0 +1,18 @@
{% extends 'base.html.twig' %}
{% block content %}
<div class="container-fluid px-0">
<article>
{% if post.thumbnail %}
<img src="{{ post.thumbnail }}" class="w-100 mb-4" alt="{{ post.title|e('html_attr') }}">
{% endif %}
<div class="container">
<h1 class="mb-4">{{ post.title }}</h1>
<div class="post-content">
{{ post.content|raw }}
</div>
</div>
</article>
</div>
{% endblock %}

View File

@@ -0,0 +1,21 @@
{% extends 'base.html.twig' %}
{% block main_class %}{% endblock %}
{% block content %}
<section class="bg-primary text-white py-5 mb-5{% if post.thumbnail %} position-relative overflow-hidden{% endif %}">
{% if post.thumbnail %}
<div class="hero-overlay position-absolute top-0 start-0 w-100 h-100" style="background-image: url('{{ post.thumbnail|e('html_attr') }}');"></div>
{% endif %}
<div class="container position-relative py-5 text-center">
<h1 class="display-4 fw-bold">{{ post.title }}</h1>
</div>
</section>
<div class="container">
<article>
<div class="post-content">
{{ post.content|raw }}
</div>
</article>
</div>
{% endblock %}

View File

@@ -0,0 +1,18 @@
{% extends 'base.html.twig' %}
{% block header %}{% endblock %}
{% block footer %}{% endblock %}
{% block main_class %}{% endblock %}
{% block content %}
<div class="container py-5">
<article>
<h1>{{ post.title }}</h1>
<div class="post-content">
{{ post.content|raw }}
</div>
</article>
</div>
{% endblock %}

View File

@@ -0,0 +1,24 @@
{% extends 'base.html.twig' %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-lg-8">
<article>
<h1 class="mb-4">{{ post.title }}</h1>
{% if post.thumbnail %}
<img src="{{ post.thumbnail }}" class="img-fluid rounded mb-4"
alt="{{ post.title|e('html_attr') }}">
{% endif %}
<div class="post-content">
{{ post.content|raw }}
</div>
</article>
</div>
<div class="col-lg-4">
{% include 'partials/sidebar.html.twig' %}
</div>
</div>
</div>
{% endblock %}

View File

@@ -3,7 +3,7 @@
{% block content %}
<div class="container">
<h1 class="mb-4">
{{ __('Search results for: %s')|format('<em>' ~ search_query ~ '</em>')|raw }}
{{ __('Search results for: %s')|format('<em>' ~ search_query|e('html') ~ '</em>')|raw }}
</h1>
{% include 'partials/search-form.html.twig' %}

View File

@@ -10,9 +10,9 @@
{% if post.thumbnail %}
<figure class="mb-4">
<img src="{{ post.thumbnail }}" class="img-fluid rounded"
<img src="{{ post.thumbnail }}" class="img-fluid rounded post-thumbnail"
alt="{{ post.title|e('html_attr') }}"
style="aspect-ratio: 16/9; object-fit: cover; width: 100%;">
loading="lazy">
</figure>
{% endif %}

View File

@@ -1,13 +1,13 @@
<div class="comment d-flex gap-3 mb-4{% if depth > 0 %} ms-5{% endif %}" id="comment-{{ comment.id }}">
<div class="flex-shrink-0">
<img src="{{ comment.avatar_url }}" alt="{{ comment.author }}"
class="rounded-circle" width="40" height="40">
class="rounded-circle" width="40" height="40" loading="lazy">
</div>
<div class="flex-grow-1">
<div class="d-flex align-items-center gap-2 mb-1">
<strong class="small">
{% if comment.author_url %}
<a href="{{ comment.author_url }}" class="text-decoration-none text-body" rel="nofollow">
<a href="{{ esc_url(comment.author_url) }}" class="text-decoration-none text-body" rel="nofollow">
{{ comment.author }}
</a>
{% else %}

View File

@@ -0,0 +1,44 @@
<footer class="bg-body-tertiary mt-auto">
<div class="container py-5">
<div class="row">
<div class="col-lg-4 mb-4 mb-lg-0">
<h5 class="fw-bold">{{ site.name }}</h5>
<p class="text-body-secondary">{{ site.description }}</p>
<p class="text-body-secondary small">{{ __('A modern WordPress theme built with Bootstrap 5.') }}</p>
</div>
<div class="col-lg-4 mb-4 mb-lg-0">
<h5 class="fw-bold">{{ __('Navigation') }}</h5>
{% if footer_menu|length > 0 %}
<nav aria-label="{{ __('Footer navigation') }}">
<ul class="list-unstyled">
{% for item in footer_menu %}
<li class="mb-1">
<a href="{{ item.url }}" class="text-body-secondary text-decoration-none">
{{ item.title }}
</a>
</li>
{% endfor %}
</ul>
</nav>
{% endif %}
</div>
<div class="col-lg-4">
<h5 class="fw-bold">{{ __('About') }}</h5>
<p class="text-body-secondary small">
{{ __('This theme is proudly built with Bootstrap 5 and WordPress Full Site Editing.') }}
</p>
</div>
</div>
<hr class="my-4">
<div class="row align-items-center">
<div class="col-md-6">
<p class="text-body-secondary small mb-0">&copy; {{ current_year }} {{ site.name }}</p>
</div>
<div class="col-md-6 text-md-end">
<p class="text-body-secondary small mb-0">
{{ __('Powered by %s')|format('<a href="https://wordpress.org" rel="nofollow" class="text-body-secondary">WordPress</a>')|raw }}
</p>
</div>
</div>
</div>
</footer>

View File

@@ -0,0 +1,8 @@
<footer class="bg-body-tertiary mt-auto">
<div class="container py-4">
<hr class="mb-4">
<p class="text-body-secondary text-center small mb-0">
&copy; {{ current_year }} {{ site.name }}. {{ __('All rights reserved.') }}
</p>
</div>
</footer>

View File

@@ -7,6 +7,7 @@
</div>
<div class="col-md-6 text-md-end">
{% if footer_menu|length > 0 %}
<nav aria-label="{{ __('Footer navigation') }}">
<ul class="list-unstyled">
{% for item in footer_menu %}
<li>
@@ -16,6 +17,7 @@
</li>
{% endfor %}
</ul>
</nav>
{% endif %}
</div>
</div>

View File

@@ -0,0 +1,60 @@
<header>
<nav class="navbar navbar-expand-lg bg-body-tertiary" aria-label="{{ __('Primary navigation') }}">
<div class="container flex-column">
<a class="navbar-brand fw-bold mb-2" href="{{ site.url }}">
{{ site.name }}
</a>
{% if site.description %}
<p class="text-body-secondary small mb-2">{{ site.description }}</p>
{% endif %}
<button class="navbar-toggler" type="button"
data-bs-toggle="collapse" data-bs-target="#navbarMain"
aria-controls="navbarMain" aria-expanded="false"
aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse justify-content-center" id="navbarMain">
<ul class="navbar-nav mb-2 mb-lg-0">
{% for item in menu %}
{% if item.children|length > 0 %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle{{ item.active ? ' active' : '' }}"
href="{{ item.url }}" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
{{ item.title }}
</a>
<ul class="dropdown-menu">
{% for child in item.children %}
<li>
<a class="dropdown-item{{ child.active ? ' active' : '' }}"
href="{{ child.url }}"
{% if child.active %}aria-current="page"{% endif %}
{% if child.target %}target="{{ child.target }}"{% endif %}>
{{ child.title }}
</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link{{ item.active ? ' active' : '' }}"
href="{{ item.url }}"
{% if item.active %}aria-current="page"{% endif %}
{% if item.target %}target="{{ item.target }}"{% endif %}>
{{ item.title }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
{% if dark_mode %}
{% include 'partials/dark-mode-toggle.html.twig' %}
{% endif %}
</div>
</div>
</nav>
</header>

View File

@@ -0,0 +1,65 @@
<header>
<nav class="navbar navbar-expand-lg bg-body-tertiary" aria-label="{{ __('Primary navigation') }}">
<div class="container">
<a class="navbar-brand fw-bold" href="{{ site.url }}">
{{ site.name }}
</a>
<button class="navbar-toggler" type="button"
data-bs-toggle="offcanvas" data-bs-target="#navbarOffcanvas"
aria-controls="navbarOffcanvas"
aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="offcanvas offcanvas-end" tabindex="-1" id="navbarOffcanvas"
aria-labelledby="navbarOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="navbarOffcanvasLabel">{{ site.name }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas"
aria-label="{{ __('Close') }}"></button>
</div>
<div class="offcanvas-body">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
{% for item in menu %}
{% if item.children|length > 0 %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle{{ item.active ? ' active' : '' }}"
href="{{ item.url }}" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
{{ item.title }}
</a>
<ul class="dropdown-menu">
{% for child in item.children %}
<li>
<a class="dropdown-item{{ child.active ? ' active' : '' }}"
href="{{ child.url }}"
{% if child.active %}aria-current="page"{% endif %}
{% if child.target %}target="{{ child.target }}"{% endif %}>
{{ child.title }}
</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link{{ item.active ? ' active' : '' }}"
href="{{ item.url }}"
{% if item.active %}aria-current="page"{% endif %}
{% if item.target %}target="{{ item.target }}"{% endif %}>
{{ item.title }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
{% if dark_mode %}
{% include 'partials/dark-mode-toggle.html.twig' %}
{% endif %}
</div>
</div>
</div>
</nav>
</header>

View File

@@ -0,0 +1,57 @@
<header class="position-absolute w-100" style="z-index: 1030;">
<nav class="navbar navbar-expand-lg navbar-dark" aria-label="{{ __('Primary navigation') }}">
<div class="container">
<a class="navbar-brand fw-bold" href="{{ site.url }}">
{{ site.name }}
</a>
<button class="navbar-toggler" type="button"
data-bs-toggle="collapse" data-bs-target="#navbarMain"
aria-controls="navbarMain" aria-expanded="false"
aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
{% for item in menu %}
{% if item.children|length > 0 %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle{{ item.active ? ' active' : '' }}"
href="{{ item.url }}" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
{{ item.title }}
</a>
<ul class="dropdown-menu">
{% for child in item.children %}
<li>
<a class="dropdown-item{{ child.active ? ' active' : '' }}"
href="{{ child.url }}"
{% if child.active %}aria-current="page"{% endif %}
{% if child.target %}target="{{ child.target }}"{% endif %}>
{{ child.title }}
</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link{{ item.active ? ' active' : '' }}"
href="{{ item.url }}"
{% if item.active %}aria-current="page"{% endif %}
{% if item.target %}target="{{ item.target }}"{% endif %}>
{{ item.title }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
{% if dark_mode %}
{% include 'partials/dark-mode-toggle.html.twig' %}
{% endif %}
</div>
</div>
</nav>
</header>

View File

@@ -1,5 +1,5 @@
<header>
<nav class="navbar navbar-expand-lg bg-body-tertiary">
<nav class="navbar navbar-expand-lg bg-body-tertiary" aria-label="{{ __('Primary navigation') }}">
<div class="container">
<a class="navbar-brand fw-bold" href="{{ site.url }}">
{{ site.name }}
@@ -27,6 +27,7 @@
<li>
<a class="dropdown-item{{ child.active ? ' active' : '' }}"
href="{{ child.url }}"
{% if child.active %}aria-current="page"{% endif %}
{% if child.target %}target="{{ child.target }}"{% endif %}>
{{ child.title }}
</a>

View File

@@ -1,7 +1,10 @@
<aside>
<aside aria-label="{{ __('Blog sidebar') }}">
{% if sidebar.widgets_active %}
{{ sidebar.widgets_html|raw }}
{% else %}
{% if sidebar.recent_posts is defined and sidebar.recent_posts|length > 0 %}
<div class="mb-4">
<h3 class="h6 text-uppercase fw-semibold" style="letter-spacing: 1.6px">
<h3 class="sidebar-heading h6 text-uppercase fw-semibold">
{{ __('Recent Posts') }}
</h3>
<ul class="list-unstyled">
@@ -19,7 +22,7 @@
{% endif %}
<div class="mb-4">
<h3 class="h6 text-uppercase fw-semibold" style="letter-spacing: 1.6px">
<h3 class="sidebar-heading h6 text-uppercase fw-semibold">
{{ __('Search') }}
</h3>
{% include 'partials/search-form.html.twig' %}
@@ -29,7 +32,7 @@
{% if sidebar.tags is defined and sidebar.tags|length > 0 %}
<div class="mb-4">
<h3 class="h6 text-uppercase fw-semibold" style="letter-spacing: 1.6px">
<h3 class="sidebar-heading h6 text-uppercase fw-semibold">
{{ __('Tags') }}
</h3>
<div>
@@ -41,4 +44,5 @@
</div>
</div>
{% endif %}
{% endif %}
</aside>