commit 2e5bfaba89ff6a24959e09da44e5fd6db08cf7aa Author: Keith Solomon Date: Mon May 25 12:04:18 2026 -0500 ✨feature: Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c1e2c64 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..093a2de --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +LOCALHOST_URL=http://domain.local +BROWSERSYNC_PORT=5000 diff --git a/.github/workflows/phpcs.yml b/.github/workflows/phpcs.yml new file mode 100644 index 0000000..2f0019e --- /dev/null +++ b/.github/workflows/phpcs.yml @@ -0,0 +1,33 @@ +name: PHPCS check +on: + # push: + pull_request: + # Allow manually triggering the workflow. + workflow_dispatch: + +# Cancel all previous workflow runs for the same branch that have not yet completed. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + phpcs: + name: PHPCS + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup PHP + uses: "shivammathur/setup-php@v2" + with: + php-version: "8.2" + ini-values: "memory_limit=1G" + coverage: none + tools: cs2pr + - name: Install Composer dependencies + uses: "ramsey/composer-install@v3" + - name: Run PHPCS checks + continue-on-error: true + run: vendor/bin/phpcs --standard=.phpcs.xml --report-full --report-checkstyle=./phpcs-report.xml . + - name: Show PHPCS results in PR + run: cs2pr ./phpcs-report.xml diff --git a/.github/workflows/todos.yml b/.github/workflows/todos.yml new file mode 100644 index 0000000..f24b835 --- /dev/null +++ b/.github/workflows/todos.yml @@ -0,0 +1,26 @@ +name: Sync TODOs with Issues + +on: + workflow_dispatch: + push: + paths-ignore: + - '**.md' + +jobs: + sync_todos: + runs-on: ubuntu-latest + permissions: + contents: write + issues: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Sync TODOs + uses: Solo-Web-Works/TODO-Sync@v2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + summary_file: TODO_SUMMARY.md + dry_run: false + commit: false diff --git a/.github/workflows/wpengine.yml b/.github/workflows/wpengine.yml new file mode 100644 index 0000000..2608f59 --- /dev/null +++ b/.github/workflows/wpengine.yml @@ -0,0 +1,64 @@ +name: Deploy to WPEngine +on: + workflow_dispatch + # Remove "workflow_dispatch" above and uncomment the lines below to enable deploy on push + # only do this once you're actually ready to start deploying to Flywheel + # push: + # branches: + # - main + +jobs: + build: + runs-on: ubuntu-latest + if: ${{ !contains(github.event.head_commit.message, '#skipGA') }} + + steps: + - uses: actions/checkout@v3 + + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - uses: actions/cache@v3 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-composer- + + - name: Install PHP Composer + uses: php-actions/composer@v6 + with: + php_version: "8.2" + + - name: Cache node modules + id: cache-npm + uses: actions/cache@v3 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Install npm dependencies + run: npm install + + - name: Run build task + run: npm run build + + - name: Clean up node modules (not needed to deploy) + run: rm -rf node_modules + + - name: Deploy to WPE + uses: wpengine/github-action-wpe-site-deploy@v3 + with: + WPE_SSHG_KEY_PRIVATE: ${{ secrets.WPE_SSHG_KEY_PRIVATE }} + WPE_ENV: vdiv5 + FLAGS: '-azvr --inplace --delete --exclude=".*"' + REMOTE_PATH: "wp-content/themes/vdi-v5" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a26245 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*~ +.DS_Store +vendor +node_modules +static/dist/ +.env +bak/ +testimonials.class.php +resource-filter/ +phpcs-results.txt + +# Playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/.phpcs.xml b/.phpcs.xml new file mode 100644 index 0000000..85c37aa --- /dev/null +++ b/.phpcs.xml @@ -0,0 +1,46 @@ + + + Coding Style Checks. + + + + + + + + vendor/ + node_modules/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..91454e0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "workbench.colorCustomizations": { + "tree.indentGuidesStroke": "#3d92ec", + "activityBar.background": "#213309", + "titleBar.activeBackground": "#2E470C", + "titleBar.activeForeground": "#F6FCEE", + "titleBar.inactiveBackground": "#213209", + "titleBar.inactiveForeground": "#F7FCEF", + "statusBar.background": "#213209", + "statusBar.foreground": "#F7FCEF", + "statusBar.debuggingBackground": "#213209", + "statusBar.debuggingForeground": "#F7FCEF", + "statusBar.noFolderBackground": "#213209", + "statusBar.noFolderForeground": "#F7FCEF" + } +} diff --git a/404.php b/404.php new file mode 100644 index 0000000..cca68d1 --- /dev/null +++ b/404.php @@ -0,0 +1,47 @@ + + +
+

Page Not Found

+

Sorry, the page you're looking for doesn't exist.

+ +

It might have been removed, had its name changed, or is temporarily unavailable.

+ +

+

+

+ +

Or check out the links below:

+ +
+ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..4f666ee --- /dev/null +++ b/README.md @@ -0,0 +1,488 @@ +# VDI WordPress Theme Starter v5 + +VDI WordPress Theme Starter v5 is a minimal WordPress theme designed as a starting point for custom theme development. It focuses on modern development approaches with a lean architecture that avoids the overhead of theme frameworks. + +Repo: [https://github.com/Vincent-Design-Inc/VDI-Starter-v5](https://github.com/Vincent-Design-Inc/VDI-Starter-v5) +AC Bug/Issue Tracking: [https://next-app.activecollab.com/119590/projects/4553?modal=Task-98192-4553](https://next-app.activecollab.com/119590/projects/4553?modal=Task-98192-4553) + +## Key Features + +- Tailwind CSS +- Namespaced PHP for isolation +- Built-in support for ACF blocks +- Fast development workflow with watch and compile functions + +## Project Structure + +```plaintext +VDI-Starter-v5/ +├── acf/ # ACF field group JSON definitions +├── bin/ # Build scripts +├── content/ # Sample page and post content for testing +├── lib/ # PHP library files +│ ├── class-breadcrumbs.php # Breadcrumb generation +│ ├── class-acf.php # ACF integration +│ ├── class-enqueue.php # Assets enqueuing +│ ├── class-menuitems.php # Navigation menu builder +│ ├── class-resources.php # Custom Resources post type +│ ├── extras.php # Miscellaneous theme functions +│ ├── helpers.php # Helper functions +│ ├── hooks.php # WordPress hooks and filters +│ ├── search-features.php # Enhanced search functionality +│ └── show-template.php # Script to show which template is used for the current page +├── static/ # Static assets +│ ├── dist/ # Compiled assets +│ ├── img/ # Static theme images +│ └── js/ # JavaScript files +│ ├── components/ # JS components +│ │ └── button.js # Button custom component +│ ├── modules/ # JS theme modules +│ │ ├── GetHeaderHeight.js # Calculate header height and set it as a CSS variable +│ │ ├── Navigation.js # Script controlling navigation behavior +│ │ └── TagExternalLinks.js # Tags external links with appropriate attributes +│ ├── admin.js # Admin-specific JS +│ └── theme.js # Main theme JS +├── styles/ # CSS styles +│ ├── backend/ # Admin styles +│ ├── base/ # Base styles +│ ├── blocks/ # Block styles +│ ├── components/ # Component styles +│ ├── fonts/ # Font styles +│ └── theme.css # Main CSS entry point +├── tests/ # Automated Playwright tests +│ └── site-a11y.spec.js # Site Accessibility tests +├── views/ # Template views +│ ├── blocks/ # Custom ACF blocks +│ ├── icons/ # SVG icons +│ ├── forms/ # Form templates +│ └── partials/ # Reusable template parts +├── 404.php # 404 error template +├── footer.php # Footer template +├── front-page.php # Front page template +├── functions.php # Main functions file +├── header.php # Header template +├── index.php # Main template +├── page.php # Page template +├── search.php # Search results template +├── sidebar.php # Main sidebar template +├── sidebar-page.php # Page sidebar template +├── single.php # Single post template +├── style.css # Theme metadata +└── whitelist.php # Tailwind class whitelist +``` + +## Core Files and Templates + +### Theme Core Files + +- **style.css**: Contains theme metadata and registration information +- **functions.php**: Initializes the theme and loads necessary dependencies +- **class-acf.php**: Handles Advanced Custom Fields (ACF) functionality +- **class-breadcrumbs.php**: Generates breadcrumb navigation for the site +- **class-enqueue.php**: Manages script and style enqueuing for frontend and backend +- **class-menuitems.php**: Builder for the navigation menus +- **class-resources.php**: Custom post type management for "Resources", included as an example of CPT usage +- **extras.php**: Miscellaneous theme functions, including sidebar and page header checks +- **helpers.php**: Utility functions for common tasks +- **hooks.php**: Contains WordPress hooks and filters for theme functionality +- **search-features.php**: Enhances search functionality with custom queries and filters +- **show-template.php**: Outputs the current template file being used for debugging +- **whitelist.php**: Contains Tailwind CSS class whitelist for styles used in WordPress editor + +### Template Files + +- **header.php**: Defines the site header with primary navigation +- **footer.php**: Defines the site footer with widget areas and copyright +- **front-page.php**: Template for the front page of the site +- **page.php**: Displays individual static pages with optional sidebar +- **index.php**: Main template file that displays the blog posts list +- **single.php**: Displays individual posts with author and category information +- **search.php**: Displays search results with pagination +- **404.php**: Custom "Page Not Found" template with search form +- **sidebar.php**: Primary sidebar template +- **sidebar-page.php**: Page-specific sidebar template +- **views/forms/search.php** - Search form template for use in various locations + +### Included Blocks + +- **Boilerplate**: Example block for custom development +- **Accordion**: Collapsible content sections +- **Buttons**: Group of buttons +- **Button**: Configurable button element +- **Grid**: Flexible grid layout system +- **Grid Cell**: Individual grid item +- **Homepage Hero**: Hero section typically used on homepage +- **Media Text**: Image or video with accompanying text +- **Media Text with Inner Blocks**: Media-text with nested block support +- **Page Children**: Displays child pages of current page +- **Section**: Container block with background and width (contained and full-screen width) options + +## Library Functions and Classes + +### helpers.php + +```php +getFieldValue($field_path) +``` + +- Retrieves a nested value from an ACF field using dot notation +- **Parameters**: `$field_path` - The dot-notated path to the value (e.g., `contact_info.phone`) +- **Returns**: The value at the specified path + +```php +customMenuOrder($menu_ord) +``` + +- Customizes the order of admin menu items in WordPress dashboard +- Add other admin menu URLs to the array to change their order +- **Parameters**: `$menu_ord` - The existing menu order array +- **Returns**: Array specifying the custom menu order, or true for default order + +```php +blockCategories($categories) +``` + +- Adds custom block category for theme blocks +- **Parameters**: `$categories` - The existing block categories +- **Returns**: Modified array of categories + +```php +consoleLog($data) +``` + +- Utility function to print a variable to the console for debugging +- **Parameters**: `$data` - The data to print to the console + +### search-features.php + +```php +pageSearch($query) +``` + +- Modifies the WordPress query for page search functionality +- **Parameters**: `$query` - The WordPress query object +- **Returns**: void + +```php +postSort($key) +``` + +- Returns a sorting function for WP_Post objects in reverse order +- **Parameters**: `$key` - WP_Post object property used for sorting +- **Returns**: Sorting function + +```php +dedupe($posts, $key) +``` + +- Removes duplicate posts based on a specified key +- **Parameters**: + - `$posts` - Array of posts + - `$key` - Key to check for duplicates +- **Returns**: Filtered array of posts + +```php +searchResultFilter($posts, $query) +``` + +- Filters and processes search results +- **Parameters**: + - `$posts` - Array of posts + - `$query` - The search query +- **Returns**: Filtered array of posts + +### extras.php + +```php +getChildrenPages() +``` + +- Gets child pages of the current page +- **Returns**: Array of child pages or empty array + +```php +hasSidebar() +``` + +- Checks if sidebar should be rendered +- **Returns**: Boolean indicating sidebar presence + +```php +hasPageHeader() +``` + +- Checks if the page should render a page header +- **Returns**: Boolean indicating page header presence + +```php +createOwnerRole() +``` + +- Creates a new WordPress role named "Owner" with admin capabilities minus plugin/theme management +- **Returns**: void + +```php +getTheTitle() +``` + +- Gets the title based on the current context (archive, search, etc.) +- **Returns**: Appropriate title string + +```php +divWrapper($content) +``` + +- Wraps iframes and embeds in a div with the class "embed" +- **Parameters**: `$content` - The content to process +- **Returns**: Modified content + +### Class: Resources (class-resources.php) + +Custom post type and taxonomy management for "Resources" + +### Class: Enqueue (class-enqueue.php) + +Manages script and style enqueueing + +```php +enqFEAssets() +``` + +- Enqueues frontend CSS and JS files +- **Returns**: void + +```php +enqBEAssets() +``` + +- Enqueues backend (admin/editor) CSS and JS files +- **Returns**: void + +### Class: ACF (class-acf.php) + +Handles ACF (Advanced Custom Fields) functionality + +```php +saveJson($path) +``` + +- Sets the path for saving ACF field groups as JSON +- **Parameters**: `$path` - The default path +- **Returns**: Modified path + +```php +loadJson($paths) +``` + +- Sets the path for loading ACF field groups from JSON +- **Parameters**: `$paths` - The default paths +- **Returns**: Modified paths array + +### Class: Breadcrumbs (class-breadcrumbs.php) + +Generates and displays breadcrumb navigation + +```php +generate() +``` + +- Generates breadcrumb data based on the current page +- **Returns**: Array of breadcrumb items + +```php +render() +``` + +- Renders breadcrumb HTML with schema.org markup +- **Returns**: void (echoes HTML) + +The class also includes other helper methods for different page types: + +- `getHomeBreadcrumb()` +- `getBlogPostsIndexBreadcrumb()` +- `getSinglePostBreadcrumbs()` +- `getCustomPostTypeBreadcrumbs()` +- `getStaticPageBreadcrumbs($post)` +- `getTaxonomyArchiveBreadcrumb()` +- `getPostTypeArchiveBreadcrumb()` +- `getDateArchiveBreadcrumbs()` +- `getMonthArchiveBreadcrumb()` +- `getYearArchiveBreadcrumb()` +- `getAuthorArchiveBreadcrumb()` +- `getSearchBreadcrumb()` +- `get404Breadcrumb()` + +## ACF Blocks System + +The theme implements a custom block system using Advanced Custom Fields. Blocks are registered automatically in functions.php via the `regACFBlocks()` function. + +See `views/blocks/boilerplate/` for a starting point for custom blocks. + +### Block Structure + +Each block consists of: + +- PHP template file (block rendering) +- CSS file (block-specific styles) +- block.json file (block configuration) + +See the [ACF Blocks Documentation](https://www.advancedcustomfields.com/resources/#acf-blocks) for more details on creating custom blocks. + +## JavaScript Components + +The theme utilizes custom web components for enhanced functionality. + +### ButtonComponent + +A custom HTML element for creating buttons with various configurations: + +```javascript +class ButtonComponent extends HTMLElement { + // Attributes: + // - btnClasses: Additional CSS classes + // - element: The element to use (`a` or `button`) + // - type: Button type (for non-anchor elements) + // - url: The URL for links + // - target: Target attribute for links + // - title: Button text + // - color: Button color + // - variant: Button style variant + // - size: Button size + // - width: Button width +} +``` + +Usage: + +```html + +``` + +## Asset Management + +### CSS + +The theme uses Tailwind CSS for styling with custom utilities: + +- Base styles in `views/styles/base` +- Component styles in `views/styles/components` +- Block-specific styles in individual block folders and `views/styles/blocks` +- Admin/editor styles in `views/styles/backend` + +### JavaScript + +- **theme.js**: Main frontend JavaScript +- **admin.js**: Admin-specific JavaScript +- **components**: JavaScript components +- **modules**: JavaScript modules for specific functionality (e.g., navigation, focus styling) + +### Build System + +The theme includes a simple build system in the bin directory: + +- **.build.js**: Production build script that compiles Tailwind CSS +- **.watch.js**: Development watch script with BrowserSync for live reloading +- **.utils.js**: Shared utility functions for the build process + +## Development Workflow + +### Setup + +1. Create a new repo using this one as a template. +2. Clone the repo to your local dev folder. +3. Install dependencies (if asked to overwrite, choose "no"): + + ```bash + # Install theme dependencies + composer install + npm i + + # Configure playwright for testing + npm init playwright@latest --yes "--" . '--quiet' '--browser=chromium' '--browser=firefox' '--browser=webkit' '--lang=js' + + # Perform initial build + npm run build + ``` + +4. Create .env file from .env.example and set: + + - `LOCALHOST_URL`: Local development URL. + - `BROWSERSYNC_PORT`: Port for BrowserSync (default: 5000). + +5. Start building your project. + + - Run `npm run start` to start the development server with live reloading. + - Activate the theme in your WordPress admin. + - (Optional) Import the sample content from `content`. + +### Sart Development Server + +- Run `npm run watch` or `npm run start` to start development server with live reloading. +- Changes to PHP, CSS, and JS files will trigger automatic reload. + +### Production + +- Run `npm run build` to compile and optimize CSS for production (normally handled by GitHub Actions). + +### Deployment + +- Deployment is handled via GitHub Actions. +- Ensure you update `.github/workflows/wpengine,yml` with the correct WP Engine deployment configuration (environment and theme folder). + +## Testing + +The theme includes a suite of testing tools to ensure code quality and functionality. + +Accessibility tests using Playwright and Axe: + +- Test files located in `tests`. +- Run via the [VSCode Playwright extension](https://marketplace.visualstudio.com/items/?itemName=ms-playwright.playwright) or with `npx playwright test --ui` in your terminal for the dedicated Playwright window. +- Tests include: + - `site-a11y.spec.js`: Accessibility tests for the site. +- Generates reports in `playwright-report` and screenshots in `test-results`. + +Code linting for modified WordPress coding standards using phpcs: + +- Run `composer lint` in your terminal to check PHP files for coding standards violations + - Test results are saved in `phpcs-results.txt`. Review the file for error details. + - Automated fixes noted in the results can be done using `composer fix` in your terminal. + +### Files + +- `404.php` - Displays a custom "Page Not Found" message when a visitor tries to access a page that doesn't exist. +- `archive.php` - Displays a list of posts from a particular archive, such as a category, date, or tag archive. +- `author.php` - Displays a list of posts by a specific author, along with the author's information. +- `category.php` - Displays a list of posts from a specific category. +- `footer.php` - Contains the footer section of the theme, typically including closing HTML tags and widgets or navigation in the footer area. +- `front-page.php` - The template used for the front page of the site, either static or a blog, depending on the site settings. +- `functions.php` - Imports custom functionality for the theme. **Should not be edited**, all changes/additions should live in the `lib` directory. +- `header.php` - Contains the header section of the theme, typically including the site's title, meta tags, and navigation menu. +- `index.php` - The fallback template for all WordPress pages, used if no other more specific template (like `category.php` or `single.php`) is available. +- `page.php` - Displays individual static pages, such as "About" or "Contact" pages. +- `screenshot.png` - An image of the theme’s design, shown in the WordPress theme selector to give users a preview of the theme's appearance. +- `search.php` - Displays the results of a search query, showing posts or pages that match the search terms entered by the user. +- `single.php` - Displays individual posts, often used for blog posts or custom post types. +- `tag.php` - Displays a list of posts associated with a specific tag. + +### Folders + +- `acf` - Storage for ACF field group JSON files. You shouldn't edit anything here manually. +- `bin` - Helper files for the dev and build processes. +- `lib` - Main library for the theme, including the Twig engine and other helper functions. +- `static` - Static assets for the theme, including CSS, JS, and images. The rendered stylesheet is stored here. +- `styles` - The raw CSS files compiled by Tailwind into the final CSS file. +- `views` - Twig view templates for the theme. This is where you will do most of your work. + - `blocks` - ACF block templates. + - `boilerplate` - Example ACF block template. Used to build your own blocks (more on this below). + - `icons` - Icon templates for SVG icons. + - `partials` - Partial templates for the page hero, breadcrumb, and social media sections. diff --git a/acf/group_5f7f85a2a3e13.json b/acf/group_5f7f85a2a3e13.json new file mode 100644 index 0000000..16be4a3 --- /dev/null +++ b/acf/group_5f7f85a2a3e13.json @@ -0,0 +1,217 @@ +{ + "key": "group_5f7f85a2a3e13", + "title": "Button", + "fields": [ + { + "key": "field_67d5cd1108a6e", + "label": "Element", + "name": "element", + "aria-label": "", + "type": "radio", + "instructions": "", + "required": 1, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "a": "<a> Element", + "button": "<button> Element" + }, + "default_value": "a", + "return_format": "value", + "allow_null": 0, + "other_choice": 0, + "allow_in_bindings": 0, + "layout": "horizontal", + "save_other_choice": 0, + "wpml_cf_preferences": 1 + }, + { + "key": "field_5f7f85a71151d", + "label": "Link", + "name": "link", + "aria-label": "", + "type": "link", + "instructions": "", + "required": 1, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "wpml_cf_preferences": 1 + }, + { + "key": "field_5f7f85bd1151e", + "label": "Color", + "name": "color", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "primary": "Primary", + "secondary": "Secondary", + "white": "White", + "black": "Black" + }, + "default_value": "primary", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 1, + "ui": 0, + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0, + "wpml_cf_preferences": 1 + }, + { + "key": "field_5f7f85e41151f", + "label": "Variant", + "name": "variant", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "default": "Default", + "outline": "Outline" + }, + "default_value": "default", + "allow_null": 0, + "multiple": 0, + "ui": 0, + "return_format": "value", + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0, + "wpml_cf_preferences": 1 + }, + { + "key": "field_5f807a47dd2a8", + "label": "Size", + "name": "size", + "aria-label": "", + "type": "select", + "instructions": "Controls the padding of the buttons", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "small": "Small", + "medium": "Medium", + "large": "Large" + }, + "default_value": "medium", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 1, + "ui": 0, + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0, + "wpml_cf_preferences": 1 + }, + { + "key": "field_605924972a98a", + "label": "Width", + "name": "width", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "auto": "Auto", + "small": "Small", + "wide": "Wide", + "full": "Full Width" + }, + "default_value": "auto", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 1, + "ui": 0, + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0, + "wpml_cf_preferences": 1 + }, + { + "key": "field_6924c83e85da9", + "label": "ARIA Label", + "name": "aria_label", + "aria-label": "", + "type": "text", + "instructions": "Used to give the link an accessible name if using \"Read more\" as the title", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "wpml_cf_preferences": 0, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + } + ], + "location": [ + [ + { + "param": "block", + "operator": "==", + "value": "acf\/button" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "display_title": "", + "acfml_field_group_mode": "translation", + "modified": 1764018311 +} diff --git a/acf/group_5fd3e006e5da5.json b/acf/group_5fd3e006e5da5.json new file mode 100644 index 0000000..e5097d6 --- /dev/null +++ b/acf/group_5fd3e006e5da5.json @@ -0,0 +1,459 @@ +{ + "key": "group_5fd3e006e5da5", + "title": "Global Fields", + "fields": [ + { + "key": "field_5fd3e0137bfed", + "label": "Contact Info", + "name": "contact_info", + "aria-label": "", + "type": "group", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "row", + "sub_fields": [ + { + "key": "field_5fd3e0277bfee", + "label": "Email", + "name": "email", + "aria-label": "", + "type": "email", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_5fd3e02f7bfef", + "label": "Phone", + "name": "phone", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "placeholder": "", + "prepend": "", + "append": "", + "maxlength": "" + }, + { + "key": "field_684ad36ebaf40", + "label": "Fax", + "name": "fax", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 1, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_5fd3e0437bff0", + "label": "Address", + "name": "address", + "aria-label": "", + "type": "textarea", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "placeholder": "", + "maxlength": "", + "rows": 3, + "new_lines": "br" + }, + { + "key": "field_60381dcb082b5", + "label": "Hours", + "name": "hours", + "aria-label": "", + "type": "textarea", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "placeholder": "", + "maxlength": "", + "rows": 3, + "new_lines": "br" + } + ] + }, + { + "key": "field_677bf0e692d37", + "label": "Social Media", + "name": "social_media", + "aria-label": "", + "type": "group", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "row", + "sub_fields": [ + { + "key": "field_677bf0e692d3c", + "label": "Facebook", + "name": "facebook", + "aria-label": "", + "type": "url", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "allow_in_bindings": 1, + "placeholder": "" + }, + { + "key": "field_677bf0e692d3e", + "label": "Instagram", + "name": "instagram", + "aria-label": "", + "type": "url", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "allow_in_bindings": 1, + "placeholder": "" + }, + { + "key": "field_677bf0e692d3d", + "label": "X\/Twitter", + "name": "twitter", + "aria-label": "", + "type": "url", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "allow_in_bindings": 1, + "placeholder": "" + }, + { + "key": "field_677bf0e692d41", + "label": "LinkedIn", + "name": "linkedin", + "aria-label": "", + "type": "url", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "allow_in_bindings": 1, + "placeholder": "" + }, + { + "key": "field_677bf0e692d40", + "label": "Youtube", + "name": "youtube", + "aria-label": "", + "type": "url", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "allow_in_bindings": 1, + "placeholder": "" + }, + { + "key": "field_677bf0e692d3f", + "label": "Pinterest", + "name": "pinterest", + "aria-label": "", + "type": "url", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "allow_in_bindings": 1, + "placeholder": "" + } + ] + }, + { + "key": "field_60302ebb3604d", + "label": "Header", + "name": "header", + "aria-label": "", + "type": "group", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "row", + "sub_fields": [ + { + "key": "field_60cbbb8fc100a", + "label": "Header Logo", + "name": "header_logo", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "preview_size": "medium", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "" + } + ] + }, + { + "key": "field_61df32ca33bc0", + "label": "Footer", + "name": "footer", + "aria-label": "", + "type": "group", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "block", + "sub_fields": [ + { + "key": "field_61df32e833bc1", + "label": "Footer Logo", + "name": "footer_logo", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "preview_size": "medium", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "" + }, + { + "key": "field_64761ea8cb0dd", + "label": "Footer Description", + "name": "footer_description", + "aria-label": "", + "type": "wysiwyg", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "tabs": "all", + "toolbar": "full", + "media_upload": 1, + "delay": 0 + }, + { + "key": "field_61df3348c3795", + "label": "Copyright Text", + "name": "copyright_text", + "aria-label": "", + "type": "text", + "instructions": "Use '%Y' to display the current year.", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "© %Y. All rights reserved.", + "maxlength": "", + "allow_in_bindings": 1, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_684af923d5f68", + "label": "Credit Text", + "name": "credit_text", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "Web Design & Development by Vincent Design<\/strong><\/a>", + "maxlength": "", + "allow_in_bindings": 1, + "placeholder": "", + "prepend": "", + "append": "" + } + ] + }, + { + "key": "field_60cbbba3c100b", + "label": "Admin", + "name": "admin", + "aria-label": "", + "type": "group", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "row", + "sub_fields": [ + { + "key": "field_60cbbbb2c100c", + "label": "404 Page", + "name": "404_page", + "aria-label": "", + "type": "post_object", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "post_type": [ + "page" + ], + "taxonomy": "", + "allow_null": 0, + "multiple": 0, + "return_format": "object", + "ui": 1, + "bidirectional_target": [] + } + ] + } + ], + "location": [ + [ + { + "param": "options_page", + "operator": "==", + "value": "global-fields" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1749744328 +} diff --git a/acf/group_600f5a9e242c3.json b/acf/group_600f5a9e242c3.json new file mode 100644 index 0000000..e63bf97 --- /dev/null +++ b/acf/group_600f5a9e242c3.json @@ -0,0 +1,362 @@ +{ + "key": "group_600f5a9e242c3", + "title": "Grid", + "fields": [ + { + "key": "field_6010666abf912", + "label": "Grid Settings", + "name": "", + "aria-label": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 1, + "multi_expand": 1, + "endpoint": 0 + }, + { + "key": "field_600f6ea6251d4", + "label": "Columns", + "name": "columns", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_600f6ee1251d6", + "label": "Columns (sm)", + "name": "columns_sm", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106fa83e9ae", + "operator": "==", + "value": "sm" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_600f6f41251d7", + "label": "Columns (md)", + "name": "columns_md", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106fa83e9ae", + "operator": "==", + "value": "md" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_600f6f4d251d8", + "label": "Columns (lg)", + "name": "columns_lg", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106fa83e9ae", + "operator": "==", + "value": "lg" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_600f6f57251d9", + "label": "Columns (xl)", + "name": "columns_xl", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106fa83e9ae", + "operator": "==", + "value": "xl" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_600f6f66251da", + "label": "Columns (2xl)", + "name": "columns_2xl", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106fa83e9ae", + "operator": "==", + "value": "2xl" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_60106fa83e9ae", + "label": "Breakpoints", + "name": "columns_breakpoints", + "aria-label": "", + "type": "checkbox", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "sm": "sm (640px)", + "md": "md (768px)", + "lg": "lg (1024px)", + "xl": "xl (1280px)", + "2xl": "2xl (1536px)" + }, + "allow_custom": 0, + "default_value": [], + "layout": "vertical", + "toggle": 0, + "return_format": "value", + "save_custom": 0, + "custom_choice_button_text": "Add new choice" + }, + { + "key": "field_600f5d3ec8e30", + "label": "Gap X", + "name": "gap_x", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "10": "10", + "11": "11", + "12": "12", + "14": "14", + "16": "16", + "18": "18", + "20": "20", + "24": "24", + "28": "28", + "32": "32", + "36": "36", + "40": "40", + "48": "48", + "56": "56", + "64": "64", + "72": "72", + "80": "80", + "88": "88", + "96": "96" + }, + "default_value": 0, + "allow_null": 0, + "multiple": 0, + "ui": 0, + "return_format": "value", + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_60dca39d232a1", + "label": "Gap Y", + "name": "gap_y", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "10": "10", + "11": "11", + "12": "12", + "14": "14", + "16": "16", + "18": "18", + "20": "20", + "24": "24", + "28": "28", + "32": "32", + "36": "36", + "40": "40", + "48": "48", + "56": "56", + "64": "64", + "72": "72", + "80": "80", + "88": "88", + "96": "96" + }, + "default_value": 0, + "allow_null": 0, + "multiple": 0, + "ui": 0, + "return_format": "value", + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_60106e64bf91c", + "label": "Grid Settings End", + "name": "", + "aria-label": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 0, + "endpoint": 1 + } + ], + "location": [ + [ + { + "param": "block", + "operator": "==", + "value": "acf\/grid" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1744581665 +} diff --git a/acf/group_60106ed700da3.json b/acf/group_60106ed700da3.json new file mode 100644 index 0000000..c6061f8 --- /dev/null +++ b/acf/group_60106ed700da3.json @@ -0,0 +1,256 @@ +{ + "key": "group_60106ed700da3", + "title": "Grid Cell", + "fields": [ + { + "key": "field_60106ed7117ef", + "label": "Col Span", + "name": "", + "aria-label": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 1, + "multi_expand": 1, + "endpoint": 0 + }, + { + "key": "field_60106ed7117f7", + "label": "Default", + "name": "col_span", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "hide-top-label", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_60106ed711802", + "label": "(sm)", + "name": "col_span_sm", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106ed711830", + "operator": "==", + "value": "sm" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_60106ed71180a", + "label": "(md)", + "name": "col_span_md", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106ed711830", + "operator": "==", + "value": "md" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_60106ed711811", + "label": "(lg)", + "name": "col_span_lg", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106ed711830", + "operator": "==", + "value": "lg" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_60106ed71181d", + "label": "(xl)", + "name": "col_span_xl", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106ed711830", + "operator": "==", + "value": "xl" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_60106ed711825", + "label": "(2xl)", + "name": "col_span_2xl", + "aria-label": "", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60106ed711830", + "operator": "==", + "value": "2xl" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": 1, + "max": 12, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_60106ed711830", + "label": "Breakpoints", + "name": "col_span_breakpoints", + "aria-label": "", + "type": "checkbox", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "sm": "sm (640px)", + "md": "md (768px)", + "lg": "lg (1024px)", + "xl": "xl (1280px)", + "2xl": "2xl (1536px)" + }, + "allow_custom": 0, + "default_value": [], + "layout": "vertical", + "toggle": 0, + "return_format": "value", + "save_custom": 0, + "custom_choice_button_text": "Add new choice" + }, + { + "key": "field_60106ed711838", + "label": "Col Span End", + "name": "", + "aria-label": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 0, + "endpoint": 1 + } + ], + "location": [ + [ + { + "param": "block", + "operator": "==", + "value": "acf\/grid-cell" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1697125043 +} diff --git a/acf/group_60bfb84ae973c.json b/acf/group_60bfb84ae973c.json new file mode 100644 index 0000000..eea5b46 --- /dev/null +++ b/acf/group_60bfb84ae973c.json @@ -0,0 +1,192 @@ +{ + "key": "group_60bfb84ae973c", + "title": "Page Heading", + "fields": [ + { + "key": "field_60bfda53dc0f2", + "label": "Hero Style", + "name": "hero_style", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "default": "Default", + "none": "None" + }, + "default_value": false, + "allow_null": 0, + "multiple": 0, + "ui": 0, + "return_format": "value", + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_6478f669004aa", + "label": "Background Color", + "name": "background_color", + "aria-label": "", + "type": "color_picker", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "enable_opacity": 0, + "return_format": "string" + }, + { + "key": "field_6478f68c004ab", + "label": "Is Dark?", + "name": "is_dark", + "aria-label": "", + "type": "true_false", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "message": "", + "default_value": 1, + "ui": 0, + "ui_on_text": "", + "ui_off_text": "" + }, + { + "key": "field_60bfb8534a41f", + "label": "Heading", + "name": "heading", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60bfda53dc0f2", + "operator": "!=", + "value": "none" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "placeholder": "", + "prepend": "", + "append": "", + "maxlength": "" + }, + { + "key": "field_60bfb85a4a420", + "label": "Intro", + "name": "intro", + "aria-label": "", + "type": "textarea", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_60bfda53dc0f2", + "operator": "!=", + "value": "none" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "placeholder": "", + "maxlength": "", + "rows": "", + "new_lines": "" + }, + { + "key": "field_60bfb8614a421", + "label": "Call to Actions", + "name": "call_to_actions", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": false, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "collapsed": "", + "min": 0, + "max": 0, + "layout": "table", + "button_label": "Add Call to Action", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_60bfb86e4a422", + "label": "Link", + "name": "link", + "aria-label": "", + "type": "link", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "parent_repeater": "field_60bfb8614a421" + } + ] + } + ], + "location": [ + [ + { + "param": "post_type", + "operator": "==", + "value": "page" + } + ], + [ + { + "param": "post_type", + "operator": "==", + "value": "post" + } + ] + ], + "menu_order": 1, + "position": "side", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1746895738 +} diff --git a/acf/group_60bfdb328901d.json b/acf/group_60bfdb328901d.json new file mode 100644 index 0000000..815a701 --- /dev/null +++ b/acf/group_60bfdb328901d.json @@ -0,0 +1,106 @@ +{ + "key": "group_60bfdb328901d", + "title": "Homepage Hero", + "fields": [ + { + "key": "field_60bfdb328cfae", + "label": "Heading", + "name": "heading", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "placeholder": "", + "prepend": "", + "append": "", + "maxlength": "" + }, + { + "key": "field_60bfdb328cfb9", + "label": "Intro", + "name": "intro", + "aria-label": "", + "type": "wysiwyg", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "tabs": "all", + "toolbar": "full", + "media_upload": 1, + "delay": 0 + }, + { + "key": "field_60bfdb328cfc0", + "label": "Calls to Action", + "name": "calls_to_action", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "table", + "pagination": 0, + "min": 0, + "max": 0, + "collapsed": "", + "button_label": "Add Call to Action", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_60bfdb3294667", + "label": "Link", + "name": "link", + "aria-label": "", + "type": "link", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "parent_repeater": "field_60bfdb328cfc0" + } + ] + } + ], + "location": [ + [ + { + "param": "block", + "operator": "==", + "value": "acf\/homepage-hero" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1742332828 +} diff --git a/acf/group_6261bc658dd80.json b/acf/group_6261bc658dd80.json new file mode 100644 index 0000000..c04d051 --- /dev/null +++ b/acf/group_6261bc658dd80.json @@ -0,0 +1,556 @@ +{ + "key": "group_6261bc658dd80", + "title": "Section", + "fields": [ + { + "key": "field_6262e24ce0672", + "label": "Background", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 1, + "endpoint": 0 + }, + { + "key": "field_6262df5194500", + "label": "Background Color", + "name": "background_color", + "type": "color_picker", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "enable_opacity": 0, + "return_format": "string" + }, + { + "key": "field_6261bc723d308", + "label": "Background Image", + "name": "background_image", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "preview_size": "medium", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "" + }, + { + "key": "field_62a9e85035329", + "label": "Background Position", + "name": "background_position", + "type": "group", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_6261bc723d308", + "operator": "!=empty" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "block", + "sub_fields": [ + { + "key": "field_62a9e87c3532a", + "label": "Size", + "name": "size", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "cover": "Cover", + "contain": "Contain", + "custom": "Custom" + }, + "default_value": false, + "allow_null": 0, + "multiple": 0, + "ui": 0, + "return_format": "value", + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_62a9e8ef3532b", + "label": "Scale", + "name": "scale", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_62a9e87c3532a", + "operator": "==", + "value": "custom" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": 100, + "min": "", + "max": 200, + "step": "", + "prepend": "", + "append": "%" + }, + { + "key": "field_62a9e92e3532c", + "label": "X", + "name": "x", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": 50, + "min": "", + "max": "", + "step": "", + "prepend": "", + "append": "%" + }, + { + "key": "field_62a9e98c3532d", + "label": "Y", + "name": "y", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": 50, + "min": "", + "max": "", + "step": "", + "prepend": "", + "append": "%" + } + ] + }, + { + "key": "field_6262df6394501", + "label": "Background End", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 0, + "endpoint": 1 + }, + { + "key": "field_6262df8794502", + "label": "Overlay", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 1, + "endpoint": 0 + }, + { + "key": "field_6261bfcb2d09c", + "label": "Overlay Color", + "name": "overlay_color", + "type": "color_picker", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "enable_opacity": 0, + "return_format": "string" + }, + { + "key": "field_6262df9994503", + "label": "Overlay Image", + "name": "overlay_image", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "preview_size": "medium", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "" + }, + { + "key": "field_6261c02e08b7f", + "label": "Overlay Opacity", + "name": "overlay_opacity", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_6261bfcb2d09c", + "operator": "!=empty" + } + ], + [ + { + "field": "field_6262df9994503", + "operator": "!=empty" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "min": "", + "max": "", + "step": "", + "prepend": "", + "append": "%" + }, + { + "key": "field_62a9e9ab3532e", + "label": "Overlay Position", + "name": "overlay_position", + "type": "group", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_6262df9994503", + "operator": "!=empty" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "block", + "sub_fields": [ + { + "key": "field_62a9e9ab3532f", + "label": "Size", + "name": "size", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "cover": "Cover", + "contain": "Contain", + "custom": "Custom" + }, + "default_value": false, + "allow_null": 0, + "multiple": 0, + "ui": 0, + "return_format": "value", + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_62a9e9ab35330", + "label": "Scale", + "name": "scale", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_62a9e9ab3532f", + "operator": "==", + "value": "custom" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": 100, + "min": "", + "max": 200, + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_62a9e9ab35331", + "label": "X", + "name": "x", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": 50, + "min": "", + "max": "", + "step": "", + "prepend": "", + "append": "%" + }, + { + "key": "field_62a9e9ab35332", + "label": "Y", + "name": "y", + "type": "range", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": 50, + "min": "", + "max": "", + "step": "", + "prepend": "", + "append": "%" + } + ] + }, + { + "key": "field_6262e26be0673", + "label": "Overlay End", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 0, + "endpoint": 1 + }, + { + "key": "field_6262dfbb94504", + "label": "Theme", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 1, + "endpoint": 0 + }, + { + "key": "field_6261c14931371", + "label": "Is Dark", + "name": "is_dark", + "type": "true_false", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "message": "", + "default_value": 0, + "ui": 0, + "ui_on_text": "", + "ui_off_text": "" + }, + { + "key": "field_6262e2b1e0674", + "label": "Theme End", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 0, + "endpoint": 1 + }, + { + "key": "field_6262eadf25dae", + "label": "Content", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 1, + "endpoint": 0 + }, + { + "key": "field_6262eb0025db0", + "label": "Content Width", + "name": "content_width", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "default": "Default", + "full": "Full Width" + }, + "default_value": "default", + "allow_null": 0, + "multiple": 0, + "ui": 0, + "return_format": "value", + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_6262eaeb25daf", + "label": "Content End", + "name": "", + "type": "accordion", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "open": 0, + "multi_expand": 0, + "endpoint": 1 + } + ], + "location": [ + [ + { + "param": "block", + "operator": "==", + "value": "acf\/section" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1655311426 +} diff --git a/acf/group_645e51f721207.json b/acf/group_645e51f721207.json new file mode 100644 index 0000000..d3fb96c --- /dev/null +++ b/acf/group_645e51f721207.json @@ -0,0 +1,132 @@ +{ + "key": "group_645e51f721207", + "title": "Accordion Block", + "fields": [ + { + "key": "field_64639b159080f", + "label": "First Item Open?", + "name": "open", + "aria-label": "", + "type": "true_false", + "instructions": "Should the first accordion item be open on page load?", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "message": "", + "default_value": 0, + "ui": 0, + "ui_on_text": "", + "ui_off_text": "" + }, + { + "key": "field_67fabc2185ea0", + "label": "Item Group Name", + "name": "group_items", + "aria-label": "", + "type": "text", + "instructions": "Enables single expansion mode – closes previously open items when opening a new one.", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_645e52e3e0ac2", + "label": "Accordion Items", + "name": "accordion_items", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "row", + "pagination": 0, + "min": 0, + "max": 0, + "collapsed": "", + "button_label": "Add Row", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_645e51f7eadcb", + "label": "Title", + "name": "title", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "placeholder": "", + "prepend": "", + "append": "", + "parent_repeater": "field_645e52e3e0ac2" + }, + { + "key": "field_645e523feadcc", + "label": "Content", + "name": "content", + "aria-label": "", + "type": "wysiwyg", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "tabs": "all", + "toolbar": "full", + "media_upload": 1, + "delay": 0, + "parent_repeater": "field_645e52e3e0ac2" + } + ] + } + ], + "location": [ + [ + { + "param": "block", + "operator": "==", + "value": "acf\/accordion" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1744493675 +} diff --git a/acf/group_645e7cf448e66.json b/acf/group_645e7cf448e66.json new file mode 100644 index 0000000..a15dbe9 --- /dev/null +++ b/acf/group_645e7cf448e66.json @@ -0,0 +1,389 @@ +{ + "key": "group_645e7cf448e66", + "title": "Media With Text Block", + "fields": [ + { + "key": "field_645e7cf4c6700", + "label": "Background Color", + "name": "background_color", + "aria-label": "", + "type": "color_picker", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "enable_opacity": 0, + "return_format": "string" + }, + { + "key": "field_645e7d22c6701", + "label": "Is Dark", + "name": "is_dark", + "aria-label": "", + "type": "true_false", + "instructions": "If the background is dark, check this so text will remain legible", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "message": "", + "default_value": 0, + "ui": 0, + "ui_on_text": "", + "ui_off_text": "" + }, + { + "key": "field_645e7df0c6702", + "label": "Media Type", + "name": "media_type", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "image": "Image", + "video": "Video" + }, + "default_value": false, + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "ui": 0, + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_645e7e2cc6703", + "label": "Image", + "name": "image", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_645e7df0c6702", + "operator": "==", + "value": "image" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "", + "preview_size": "medium" + }, + { + "key": "field_645e7e60c6704", + "label": "Video", + "name": "video", + "aria-label": "", + "type": "oembed", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_645e7df0c6702", + "operator": "==", + "value": "video" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "width": "", + "height": "" + }, + { + "key": "field_645e7f04c6705", + "label": "Media on Left", + "name": "media_on_left", + "aria-label": "", + "type": "true_false", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "message": "", + "default_value": 0, + "ui": 0, + "ui_on_text": "", + "ui_off_text": "" + }, + { + "key": "field_645e7f26c6706", + "label": "Heading", + "name": "heading", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_645e7f3dc6707", + "label": "Subheading", + "name": "subheading", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_645e7f49c6708", + "label": "Content", + "name": "content", + "aria-label": "", + "type": "wysiwyg", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "tabs": "all", + "toolbar": "full", + "media_upload": 1, + "delay": 0 + }, + { + "key": "field_645e7f85c6709", + "label": "Calls To Action", + "name": "calls_to_action", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "block", + "pagination": 0, + "min": 0, + "max": 0, + "collapsed": "", + "button_label": "Add Row", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_645e7f93c670a", + "label": "Link", + "name": "link", + "aria-label": "", + "type": "link", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "parent_repeater": "field_645e7f85c6709" + }, + { + "key": "field_646500c05f6da", + "label": "Color", + "name": "color", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "primary": "Primary", + "secondary": "Secondary", + "white": "White", + "gray": "Gray" + }, + "default_value": "primary", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "ui": 0, + "ajax": 0, + "placeholder": "", + "parent_repeater": "field_645e7f85c6709" + }, + { + "key": "field_646501305f6db", + "label": "Variant", + "name": "variant", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "default": "Default", + "outline": "Outline" + }, + "default_value": "default", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "ui": 0, + "ajax": 0, + "placeholder": "", + "parent_repeater": "field_645e7f85c6709" + }, + { + "key": "field_646501565f6dc", + "label": "Size", + "name": "size", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "small": "Small", + "medium": "Medium", + "large": "Large" + }, + "default_value": "medium", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "ui": 0, + "ajax": 0, + "placeholder": "", + "parent_repeater": "field_645e7f85c6709" + }, + { + "key": "field_646501735f6dd", + "label": "Width", + "name": "width", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "auto": "Auto", + "small": "Small", + "wide": "Wide", + "full": "Full Width" + }, + "default_value": "auto", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 1, + "ui": 0, + "ajax": 0, + "placeholder": "", + "parent_repeater": "field_645e7f85c6709" + } + ] + } + ], + "location": [ + [ + { + "param": "block", + "operator": "==", + "value": "acf\/media-text" + } + ], + [ + { + "param": "block", + "operator": "==", + "value": "acf\/media-text-innerblocks" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1742680440 +} diff --git a/bin/.build.js b/bin/.build.js new file mode 100644 index 0000000..4af1d81 --- /dev/null +++ b/bin/.build.js @@ -0,0 +1,24 @@ +require("dotenv").config(); + +const fs = require("fs"); +const path = require("path"); +const distDir = path.resolve(`static/dist`); +const { tailwindToCSS } = require(`./.utils`); +const start = performance.now(); + +// Tailwind to CSS +try { + // Ensure the output directory exists + if (!fs.existsSync(distDir)) { + fs.mkdirSync(distDir, { recursive: true }); + } + + // Compile Tailwind + tailwindToCSS(); + + const end = performance.now(); + const runtime = (end - start).toFixed(3); + console.log(`Production build successfully run in ${runtime}ms`); +} catch (error) { + console.error("Error processing CSS files:", error); +} diff --git a/bin/.utils.js b/bin/.utils.js new file mode 100644 index 0000000..9f3b807 --- /dev/null +++ b/bin/.utils.js @@ -0,0 +1,25 @@ +/** + * Utility functions shared between builds + */ + +const fs = require("fs"); +const path = require("path"); +const distDir = path.resolve(`static/dist`); +const debounce = require("lodash.debounce"); + +require("dotenv").config(); + +// Theme root as working directory +const cwd = path.resolve(".."); + +// Compile Tailwind +module.exports.tailwindToCSS = debounce(() => { + try { + require("child_process").execSync( + `npx @tailwindcss/cli -i styles/theme.css -o static/dist/theme.css`, + { stdio: "inherit" } + ); + } catch (error) { + console.log(`Error compiling Tailwind to CSS:`, error); + } +}, 50); diff --git a/bin/.watch.js b/bin/.watch.js new file mode 100644 index 0000000..da7651a --- /dev/null +++ b/bin/.watch.js @@ -0,0 +1,48 @@ +require("dotenv").config(); + +const fs = require("fs"); +const path = require("path"); +const browserSync = require("browser-sync").create(); +const { tailwindToCSS } = require(`./.utils`); + +// Theme root as working directory +const cwd = path.resolve("../"); + +// Initialize BrowserSync +browserSync.init({ + proxy: process.env.LOCALHOST_URL, + port: process.env.BROWSERSYNC_PORT, + cors: true, + cwd: cwd, + logLevel: `warn`, + minify: false, + open: false, + ui: false, + ghostMode: false, + reloadOnRestart: true, + notify: false, + watch: true, +}); + +// Reload JS during development +browserSync.watch(`static/js/*.js`, (event, file) => { + if (event !== "change") return; + + const start = performance.now(); + try { + browserSync.stream(); + const end = performance.now(); + const runtime = (end - start).toFixed(3); + console.log(`JS re-injected successfully in ${runtime}ms`); + } catch (error) { + console.log("Error compiling JS:", error); + } +}); + +// Compile tailwind to css and reload on changes +browserSync.watch(["**/*.css", "**/*.php"], (event, file) => { + if (event !== "change") return; + + tailwindToCSS(); + browserSync.reload(); +}); diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..248f02b --- /dev/null +++ b/composer.json @@ -0,0 +1,32 @@ +{ + "name": "vincentdesigninc/basic-wp", + "description": "Minimal custom WordPress theme with modern templating, a lightning fast build process, and no tom foolery.", + "type": "project", + "license": "MIT", + "authors": [ + { + "name": "Keith Solomon", + "email": "keith@vincentdesign.ca" + } + ], + "require-dev": { + "squizlabs/php_codesniffer": "^3.12", + "wp-coding-standards/wpcs": "^3.1" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "scripts": { + "lint": [ + "phpcs --report-full=./phpcs-results.txt ." + ], + "fix": [ + "phpcbf --standard=.phpcs.xml ." + ], + "phpcs-config": [ + "phpcs --config-show" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..b912502 --- /dev/null +++ b/composer.lock @@ -0,0 +1,417 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "2c997c41672ef92cfa6b4d04f9c9097a", + "packages": [], + "packages-dev": [ + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" + }, + "time": "2023-01-05T11:28:13+00:00" + }, + { + "name": "phpcsstandards/phpcsextra", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", + "reference": "46d08eb86eec622b96c466adec3063adfed280dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/46d08eb86eec622b96c466adec3063adfed280dd", + "reference": "46d08eb86eec622b96c466adec3063adfed280dd", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsutils": "^1.0.9", + "squizlabs/php_codesniffer": "^3.12.1" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "phpcsstandards/phpcsdevtools": "^1.2.1", + "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" + } + ], + "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", + "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSExtra" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-04-20T23:35:32+00:00" + }, + { + "name": "phpcsstandards/phpcsutils", + "version": "1.0.12", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" + }, + "require-dev": { + "ext-filter": "*", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPCSUtils/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + } + ], + "description": "A suite of utility functions for use with PHP_CodeSniffer", + "homepage": "https://phpcsutils.com/", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "phpcs3", + "standards", + "static analysis", + "tokens", + "utility" + ], + "support": { + "docs": "https://phpcsutils.com/", + "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", + "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSUtils" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-05-20T13:34:27+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.12.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", + "reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-04-13T04:10:18+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/9333efcbff231f10dfd9c56bb7b65818b4733ca7", + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-libxml": "*", + "ext-tokenizer": "*", + "ext-xmlreader": "*", + "php": ">=5.4", + "phpcsstandards/phpcsextra": "^1.2.1", + "phpcsstandards/phpcsutils": "^1.0.10", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.0", + "phpcsstandards/phpcsdevtools": "^1.2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "suggest": { + "ext-iconv": "For improved results", + "ext-mbstring": "For improved results" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/php_codesniffer", + "type": "custom" + } + ], + "time": "2024-03-25T16:39:00+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/content/basic-wp-test-content.xml b/content/basic-wp-test-content.xml new file mode 100644 index 0000000..c6d1357 --- /dev/null +++ b/content/basic-wp-test-content.xml @@ -0,0 +1,11646 @@ + + + + + + + + + + + + + + + + + + + + + + + Basic-WP + http://basic-wp.test + + Mon, 19 May 2025 17:23:14 +0000 + en-US + 1.2 + http://basic-wp.test + http://basic-wp.test + + 1 + + + 6 + + + + + + 4 + + + + + + 3 + + + + + + 7 + + + + + + 1 + + + + + + 5 + + + + + + 8 + + + + + 12 + + + + + 11 + + + + + 10 + + + + + 9 + + + + 21nav_menu + + 13nav_menu + + 2nav_menu + + + https://wordpress.org/?v=6.8.1 + + + <![CDATA[First Item Open?]]> + http://basic-wp.test/?post_type=acf-field&p=6 + Sun, 09 Mar 2025 19:14:24 +0000 + + http://basic-wp.test/?post_type=acf-field&p=6 + + + + 6 + + + + + + + + + 5 + 0 + + + 0 + + + <![CDATA[Accordion Items]]> + http://basic-wp.test/?post_type=acf-field&p=7 + Sun, 09 Mar 2025 19:14:24 +0000 + + http://basic-wp.test/?post_type=acf-field&p=7 + + + + 7 + + + + + + + + + 5 + 2 + + + 0 + + + <![CDATA[Title]]> + http://basic-wp.test/?post_type=acf-field&p=8 + Sun, 09 Mar 2025 19:14:24 +0000 + + http://basic-wp.test/?post_type=acf-field&p=8 + + + + 8 + + + + + + + + + 7 + 0 + + + 0 + + + <![CDATA[Content]]> + http://basic-wp.test/?post_type=acf-field&p=9 + Sun, 09 Mar 2025 19:14:24 +0000 + + http://basic-wp.test/?post_type=acf-field&p=9 + + + + 9 + + + + + + + + + 7 + 1 + + + 0 + + + <![CDATA[Contact Info]]> + http://basic-wp.test/?post_type=acf-field&p=11 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=11 + + + + 11 + + + + + + + + + 10 + 0 + + + 0 + + + <![CDATA[Email]]> + http://basic-wp.test/?post_type=acf-field&p=12 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=12 + + + + 12 + + + + + + + + + 11 + 0 + + + 0 + + + <![CDATA[Phone]]> + http://basic-wp.test/?post_type=acf-field&p=13 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=13 + + + + 13 + + + + + + + + + 11 + 1 + + + 0 + + + <![CDATA[Address]]> + http://basic-wp.test/?post_type=acf-field&p=14 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=14 + + + + 14 + + + + + + + + + 11 + 2 + + + 0 + + + <![CDATA[Hours]]> + http://basic-wp.test/?post_type=acf-field&p=15 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=15 + + + + 15 + + + + + + + + + 11 + 3 + + + 0 + + + <![CDATA[Social Media]]> + http://basic-wp.test/?post_type=acf-field&p=16 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=16 + + + + 16 + + + + + + + + + 10 + 1 + + + 0 + + + <![CDATA[Facebook]]> + http://basic-wp.test/?post_type=acf-field&p=17 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=17 + + + + 17 + + + + + + + + + 16 + 0 + + + 0 + + + <![CDATA[X/Twitter]]> + http://basic-wp.test/?post_type=acf-field&p=18 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=18 + + + + 18 + + + + + + + + + 16 + 1 + + + 0 + + + <![CDATA[Instagram]]> + http://basic-wp.test/?post_type=acf-field&p=19 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=19 + + + + 19 + + + + + + + + + 16 + 2 + + + 0 + + + <![CDATA[Pinterest]]> + http://basic-wp.test/?post_type=acf-field&p=20 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=20 + + + + 20 + + + + + + + + + 16 + 3 + + + 0 + + + <![CDATA[Youtube]]> + http://basic-wp.test/?post_type=acf-field&p=21 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=21 + + + + 21 + + + + + + + + + 16 + 4 + + + 0 + + + <![CDATA[LinkedIn]]> + http://basic-wp.test/?post_type=acf-field&p=22 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=22 + + + + 22 + + + + + + + + + 16 + 5 + + + 0 + + + <![CDATA[Header]]> + http://basic-wp.test/?post_type=acf-field&p=23 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=23 + + + + 23 + + + + + + + + + 10 + 2 + + + 0 + + + <![CDATA[Header Logo]]> + http://basic-wp.test/?post_type=acf-field&p=24 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=24 + + + + 24 + + + + + + + + + 23 + 0 + + + 0 + + + <![CDATA[Footer]]> + http://basic-wp.test/?post_type=acf-field&p=25 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=25 + + + + 25 + + + + + + + + + 10 + 3 + + + 0 + + + <![CDATA[Footer Logo]]> + http://basic-wp.test/?post_type=acf-field&p=26 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=26 + + + + 26 + + + + + + + + + 25 + 0 + + + 0 + + + <![CDATA[Footer Description]]> + http://basic-wp.test/?post_type=acf-field&p=27 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=27 + + + + 27 + + + + + + + + + 25 + 1 + + + 0 + + + <![CDATA[Copyright Text]]> + http://basic-wp.test/?post_type=acf-field&p=28 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=28 + + + + 28 + + + + + + + + + 25 + 2 + + + 0 + + + <![CDATA[Admin]]> + http://basic-wp.test/?post_type=acf-field&p=29 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=29 + + + + 29 + + + + + + + + + 10 + 4 + + + 0 + + + <![CDATA[404 Page]]> + http://basic-wp.test/?post_type=acf-field&p=30 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?post_type=acf-field&p=30 + + + + 30 + + + + + + + + + 29 + 0 + + + 0 + + + <![CDATA[Link]]> + http://basic-wp.test/?post_type=acf-field&p=144 + Sat, 15 Mar 2025 18:30:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=144 + + + + 144 + + + + + + + + + 143 + 1 + + + 0 + + + <![CDATA[Color]]> + http://basic-wp.test/?post_type=acf-field&p=145 + Sat, 15 Mar 2025 18:30:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=145 + + + + 145 + + + + + + + + + 143 + 2 + + + 0 + + + <![CDATA[Variant]]> + http://basic-wp.test/?post_type=acf-field&p=146 + Sat, 15 Mar 2025 18:30:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=146 + + + + 146 + + + + + + + + + 143 + 3 + + + 0 + + + <![CDATA[Size]]> + http://basic-wp.test/?post_type=acf-field&p=147 + Sat, 15 Mar 2025 18:30:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=147 + + + + 147 + + + + + + + + + 143 + 4 + + + 0 + + + <![CDATA[Width]]> + http://basic-wp.test/?post_type=acf-field&p=148 + Sat, 15 Mar 2025 18:30:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=148 + + + + 148 + + + + + + + + + 143 + 5 + + + 0 + + + <![CDATA[Element]]> + http://basic-wp.test/?post_type=acf-field&p=150 + Sat, 15 Mar 2025 18:57:03 +0000 + + http://basic-wp.test/?post_type=acf-field&p=150 + + + + 150 + + + + + + + + + 143 + 0 + + + 0 + + + <![CDATA[Heading]]> + http://basic-wp.test/?post_type=acf-field&p=184 + Tue, 18 Mar 2025 21:20:00 +0000 + + http://basic-wp.test/?post_type=acf-field&p=184 + + + + 184 + + + + + + + + + 183 + 0 + + + 0 + + + <![CDATA[Intro]]> + http://basic-wp.test/?post_type=acf-field&p=185 + Tue, 18 Mar 2025 21:20:00 +0000 + + http://basic-wp.test/?post_type=acf-field&p=185 + + + + 185 + + + + + + + + + 183 + 1 + + + 0 + + + <![CDATA[Calls to Action]]> + http://basic-wp.test/?post_type=acf-field&p=186 + Tue, 18 Mar 2025 21:20:00 +0000 + + http://basic-wp.test/?post_type=acf-field&p=186 + + + + 186 + + + + + + + + + 183 + 2 + + + 0 + + + <![CDATA[Link]]> + http://basic-wp.test/?post_type=acf-field&p=187 + Tue, 18 Mar 2025 21:20:00 +0000 + + http://basic-wp.test/?post_type=acf-field&p=187 + + + + 187 + + + + + + + + + 186 + 0 + + + 0 + + + <![CDATA[Hero Style]]> + http://basic-wp.test/?post_type=acf-field&p=194 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?post_type=acf-field&p=194 + + + + 194 + + + + + + + + + 193 + 0 + + + 0 + + + <![CDATA[Background Color]]> + http://basic-wp.test/?post_type=acf-field&p=195 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?post_type=acf-field&p=195 + + + + 195 + + + + + + + + + 193 + 1 + + + 0 + + + <![CDATA[Is Dark?]]> + http://basic-wp.test/?post_type=acf-field&p=196 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?post_type=acf-field&p=196 + + + + 196 + + + + + + + + + 193 + 2 + + + 0 + + + <![CDATA[Heading]]> + http://basic-wp.test/?post_type=acf-field&p=197 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?post_type=acf-field&p=197 + + + + 197 + + + + + + + + + 193 + 3 + + + 0 + + + <![CDATA[Intro]]> + http://basic-wp.test/?post_type=acf-field&p=198 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?post_type=acf-field&p=198 + + + + 198 + + + + + + + + + 193 + 4 + + + 0 + + + <![CDATA[Call to Actions]]> + http://basic-wp.test/?post_type=acf-field&p=199 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?post_type=acf-field&p=199 + + + + 199 + + + + + + + + + 193 + 5 + + + 0 + + + <![CDATA[Link]]> + http://basic-wp.test/?post_type=acf-field&p=200 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?post_type=acf-field&p=200 + + + + 200 + + + + + + + + + 199 + 0 + + + 0 + + + <![CDATA[Background Color]]> + http://basic-wp.test/?post_type=acf-field&p=212 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=212 + + + + 212 + + + + + + + + + 211 + 0 + + + 0 + + + <![CDATA[Is Dark]]> + http://basic-wp.test/?post_type=acf-field&p=213 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=213 + + + + 213 + + + + + + + + + 211 + 1 + + + 0 + + + <![CDATA[Media Type]]> + http://basic-wp.test/?post_type=acf-field&p=214 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=214 + + + + 214 + + + + + + + + + 211 + 2 + + + 0 + + + <![CDATA[Image]]> + http://basic-wp.test/?post_type=acf-field&p=215 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=215 + + + + 215 + + + + + + + + + 211 + 3 + + + 0 + + + <![CDATA[Video]]> + http://basic-wp.test/?post_type=acf-field&p=216 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=216 + + + + 216 + + + + + + + + + 211 + 4 + + + 0 + + + <![CDATA[Media on Left]]> + http://basic-wp.test/?post_type=acf-field&p=217 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=217 + + + + 217 + + + + + + + + + 211 + 5 + + + 0 + + + <![CDATA[Heading]]> + http://basic-wp.test/?post_type=acf-field&p=218 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=218 + + + + 218 + + + + + + + + + 211 + 6 + + + 0 + + + <![CDATA[Subheading]]> + http://basic-wp.test/?post_type=acf-field&p=219 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=219 + + + + 219 + + + + + + + + + 211 + 7 + + + 0 + + + <![CDATA[Content]]> + http://basic-wp.test/?post_type=acf-field&p=220 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=220 + + + + 220 + + + + + + + + + 211 + 8 + + + 0 + + + <![CDATA[Calls To Action]]> + http://basic-wp.test/?post_type=acf-field&p=221 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=221 + + + + 221 + + + + + + + + + 211 + 9 + + + 0 + + + <![CDATA[Link]]> + http://basic-wp.test/?post_type=acf-field&p=222 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=222 + + + + 222 + + + + + + + + + 221 + 0 + + + 0 + + + <![CDATA[Color]]> + http://basic-wp.test/?post_type=acf-field&p=223 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=223 + + + + 223 + + + + + + + + + 221 + 1 + + + 0 + + + <![CDATA[Variant]]> + http://basic-wp.test/?post_type=acf-field&p=224 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=224 + + + + 224 + + + + + + + + + 221 + 2 + + + 0 + + + <![CDATA[Size]]> + http://basic-wp.test/?post_type=acf-field&p=225 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=225 + + + + 225 + + + + + + + + + 221 + 3 + + + 0 + + + <![CDATA[Width]]> + http://basic-wp.test/?post_type=acf-field&p=226 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?post_type=acf-field&p=226 + + + + 226 + + + + + + + + + 221 + 4 + + + 0 + + + <![CDATA[Grid Settings]]> + http://basic-wp.test/?post_type=acf-field&p=235 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=235 + + + + 235 + + + + + + + + + 234 + 0 + + + 0 + + + <![CDATA[Columns]]> + http://basic-wp.test/?post_type=acf-field&p=236 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=236 + + + + 236 + + + + + + + + + 234 + 1 + + + 0 + + + <![CDATA[Columns (sm)]]> + http://basic-wp.test/?post_type=acf-field&p=237 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=237 + + + + 237 + + + + + + + + + 234 + 2 + + + 0 + + + <![CDATA[Columns (md)]]> + http://basic-wp.test/?post_type=acf-field&p=238 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=238 + + + + 238 + + + + + + + + + 234 + 3 + + + 0 + + + <![CDATA[Columns (lg)]]> + http://basic-wp.test/?post_type=acf-field&p=239 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=239 + + + + 239 + + + + + + + + + 234 + 4 + + + 0 + + + <![CDATA[Columns (xl)]]> + http://basic-wp.test/?post_type=acf-field&p=240 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=240 + + + + 240 + + + + + + + + + 234 + 5 + + + 0 + + + <![CDATA[Columns (2xl)]]> + http://basic-wp.test/?post_type=acf-field&p=241 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=241 + + + + 241 + + + + + + + + + 234 + 6 + + + 0 + + + <![CDATA[Breakpoints]]> + http://basic-wp.test/?post_type=acf-field&p=242 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=242 + + + + 242 + + + + + + + + + 234 + 7 + + + 0 + + + <![CDATA[Gap X]]> + http://basic-wp.test/?post_type=acf-field&p=243 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=243 + + + + 243 + + + + + + + + + 234 + 8 + + + 0 + + + <![CDATA[Gap Y]]> + http://basic-wp.test/?post_type=acf-field&p=244 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=244 + + + + 244 + + + + + + + + + 234 + 9 + + + 0 + + + <![CDATA[Grid Settings End]]> + http://basic-wp.test/?post_type=acf-field&p=245 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=245 + + + + 245 + + + + + + + + + 234 + 10 + + + 0 + + + <![CDATA[Col Span]]> + http://basic-wp.test/?post_type=acf-field&p=250 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=250 + + + + 250 + + + + + + + + + 249 + 0 + + + 0 + + + <![CDATA[Default]]> + http://basic-wp.test/?post_type=acf-field&p=251 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=251 + + + + 251 + + + + + + + + + 249 + 1 + + + 0 + + + <![CDATA[(sm)]]> + http://basic-wp.test/?post_type=acf-field&p=252 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=252 + + + + 252 + + + + + + + + + 249 + 2 + + + 0 + + + <![CDATA[(md)]]> + http://basic-wp.test/?post_type=acf-field&p=253 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=253 + + + + 253 + + + + + + + + + 249 + 3 + + + 0 + + + <![CDATA[(lg)]]> + http://basic-wp.test/?post_type=acf-field&p=254 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=254 + + + + 254 + + + + + + + + + 249 + 4 + + + 0 + + + <![CDATA[(xl)]]> + http://basic-wp.test/?post_type=acf-field&p=255 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=255 + + + + 255 + + + + + + + + + 249 + 5 + + + 0 + + + <![CDATA[(2xl)]]> + http://basic-wp.test/?post_type=acf-field&p=256 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=256 + + + + 256 + + + + + + + + + 249 + 6 + + + 0 + + + <![CDATA[Breakpoints]]> + http://basic-wp.test/?post_type=acf-field&p=257 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=257 + + + + 257 + + + + + + + + + 249 + 7 + + + 0 + + + <![CDATA[Col Span End]]> + http://basic-wp.test/?post_type=acf-field&p=258 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?post_type=acf-field&p=258 + + + + 258 + + + + + + + + + 249 + 8 + + + 0 + + + <![CDATA[Background]]> + http://basic-wp.test/?post_type=acf-field&p=292 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=292 + + + + 292 + + + + + + + + + 291 + 0 + + + 0 + + + <![CDATA[Background Color]]> + http://basic-wp.test/?post_type=acf-field&p=293 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=293 + + + + 293 + + + + + + + + + 291 + 1 + + + 0 + + + <![CDATA[Background Image]]> + http://basic-wp.test/?post_type=acf-field&p=294 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=294 + + + + 294 + + + + + + + + + 291 + 2 + + + 0 + + + <![CDATA[Background Position]]> + http://basic-wp.test/?post_type=acf-field&p=295 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=295 + + + + 295 + + + + + + + + + 291 + 3 + + + 0 + + + <![CDATA[Size]]> + http://basic-wp.test/?post_type=acf-field&p=296 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=296 + + + + 296 + + + + + + + + + 295 + 0 + + + 0 + + + <![CDATA[Scale]]> + http://basic-wp.test/?post_type=acf-field&p=297 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=297 + + + + 297 + + + + + + + + + 295 + 1 + + + 0 + + + <![CDATA[X]]> + http://basic-wp.test/?post_type=acf-field&p=298 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=298 + + + + 298 + + + + + + + + + 295 + 2 + + + 0 + + + <![CDATA[Y]]> + http://basic-wp.test/?post_type=acf-field&p=299 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=299 + + + + 299 + + + + + + + + + 295 + 3 + + + 0 + + + <![CDATA[Background End]]> + http://basic-wp.test/?post_type=acf-field&p=300 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=300 + + + + 300 + + + + + + + + + 291 + 4 + + + 0 + + + <![CDATA[Overlay]]> + http://basic-wp.test/?post_type=acf-field&p=301 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=301 + + + + 301 + + + + + + + + + 291 + 5 + + + 0 + + + <![CDATA[Overlay Color]]> + http://basic-wp.test/?post_type=acf-field&p=302 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=302 + + + + 302 + + + + + + + + + 291 + 6 + + + 0 + + + <![CDATA[Overlay Image]]> + http://basic-wp.test/?post_type=acf-field&p=303 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=303 + + + + 303 + + + + + + + + + 291 + 7 + + + 0 + + + <![CDATA[Overlay Opacity]]> + http://basic-wp.test/?post_type=acf-field&p=304 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=304 + + + + 304 + + + + + + + + + 291 + 8 + + + 0 + + + <![CDATA[Overlay Position]]> + http://basic-wp.test/?post_type=acf-field&p=305 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=305 + + + + 305 + + + + + + + + + 291 + 9 + + + 0 + + + <![CDATA[Size]]> + http://basic-wp.test/?post_type=acf-field&p=306 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=306 + + + + 306 + + + + + + + + + 305 + 0 + + + 0 + + + <![CDATA[Scale]]> + http://basic-wp.test/?post_type=acf-field&p=307 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=307 + + + + 307 + + + + + + + + + 305 + 1 + + + 0 + + + <![CDATA[X]]> + http://basic-wp.test/?post_type=acf-field&p=308 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=308 + + + + 308 + + + + + + + + + 305 + 2 + + + 0 + + + <![CDATA[Y]]> + http://basic-wp.test/?post_type=acf-field&p=309 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=309 + + + + 309 + + + + + + + + + 305 + 3 + + + 0 + + + <![CDATA[Overlay End]]> + http://basic-wp.test/?post_type=acf-field&p=310 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=310 + + + + 310 + + + + + + + + + 291 + 10 + + + 0 + + + <![CDATA[Theme]]> + http://basic-wp.test/?post_type=acf-field&p=311 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=311 + + + + 311 + + + + + + + + + 291 + 11 + + + 0 + + + <![CDATA[Is Dark]]> + http://basic-wp.test/?post_type=acf-field&p=312 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=312 + + + + 312 + + + + + + + + + 291 + 12 + + + 0 + + + <![CDATA[Theme End]]> + http://basic-wp.test/?post_type=acf-field&p=313 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=313 + + + + 313 + + + + + + + + + 291 + 13 + + + 0 + + + <![CDATA[Content]]> + http://basic-wp.test/?post_type=acf-field&p=314 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=314 + + + + 314 + + + + + + + + + 291 + 14 + + + 0 + + + <![CDATA[Content Width]]> + http://basic-wp.test/?post_type=acf-field&p=315 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=315 + + + + 315 + + + + + + + + + 291 + 15 + + + 0 + + + <![CDATA[Accordion Block]]> + http://basic-wp.test/?post_type=acf-field-group&p=5 + Sun, 09 Mar 2025 19:14:24 +0000 + + http://basic-wp.test/?p=5 + + + + 5 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + <![CDATA[Global Fields]]> + http://basic-wp.test/?post_type=acf-field-group&p=10 + Sun, 09 Mar 2025 19:14:30 +0000 + + http://basic-wp.test/?p=10 + + + + 10 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + <![CDATA[wp_dummy_content_generator_46.jpg]]> + http://basic-wp.test/est-facilis-rem-at-ex-velit-temporibus/wp_dummy_content_generator_46-jpg/ + Sat, 15 Mar 2025 15:28:41 +0000 + + http://basic-wp.test/2025/03/15/est-facilis-rem-at-ex-velit-temporibus/wp_dummy_content_generator_46-jpg/ + + + + 47 + + + + + + + + + 46 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_48.jpg]]> + http://basic-wp.test/et-dolores-magnam-repudiandae-officia/wp_dummy_content_generator_48-jpg/ + Sat, 15 Mar 2025 15:28:41 +0000 + + http://basic-wp.test/2025/03/15/et-dolores-magnam-repudiandae-officia/wp_dummy_content_generator_48-jpg/ + + + + 49 + + + + + + + + + 48 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_50.jpg]]> + http://basic-wp.test/quo-sint-eveniet-debitis-aut/wp_dummy_content_generator_50-jpg/ + Sat, 15 Mar 2025 15:28:41 +0000 + + http://basic-wp.test/2025/03/15/quo-sint-eveniet-debitis-aut/wp_dummy_content_generator_50-jpg/ + + + + 51 + + + + + + + + + 50 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_52.jpg]]> + http://basic-wp.test/ut-eaque-est-quibusdam-quaerat-non/wp_dummy_content_generator_52-jpg/ + Sat, 15 Mar 2025 15:28:41 +0000 + + http://basic-wp.test/2025/03/15/ut-eaque-est-quibusdam-quaerat-non/wp_dummy_content_generator_52-jpg/ + + + + 53 + + + + + + + + + 52 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_54.jpg]]> + http://basic-wp.test/quia-quo-sit-voluptates-excepturi/wp_dummy_content_generator_54-jpg/ + Sat, 15 Mar 2025 15:28:41 +0000 + + http://basic-wp.test/2025/03/15/quia-quo-sit-voluptates-excepturi/wp_dummy_content_generator_54-jpg/ + + + + 55 + + + + + + + + + 54 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_56.jpg]]> + http://basic-wp.test/dolorem-vitae-voluptas-architecto/wp_dummy_content_generator_56-jpg/ + Sat, 15 Mar 2025 15:28:41 +0000 + + http://basic-wp.test/2025/03/15/dolorem-vitae-voluptas-architecto/wp_dummy_content_generator_56-jpg/ + + + + 57 + + + + + + + + + 56 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_58.jpg]]> + http://basic-wp.test/nulla-provident-aut-dolores-velit-fuga/wp_dummy_content_generator_58-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/nulla-provident-aut-dolores-velit-fuga/wp_dummy_content_generator_58-jpg/ + + + + 59 + + + + + + + + + 58 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_60.jpg]]> + http://basic-wp.test/dignissimos-est-sint-et-esse-ut/wp_dummy_content_generator_60-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/dignissimos-est-sint-et-esse-ut/wp_dummy_content_generator_60-jpg/ + + + + 61 + + + + + + + + + 60 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[Button]]> + http://basic-wp.test/?post_type=acf-field-group&p=143 + Sat, 15 Mar 2025 18:30:57 +0000 + + http://basic-wp.test/?p=143 + + + + 143 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + <![CDATA[Homepage Hero]]> + http://basic-wp.test/?post_type=acf-field-group&p=183 + Tue, 18 Mar 2025 21:20:00 +0000 + + http://basic-wp.test/?p=183 + + + + 183 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + <![CDATA[Page Heading]]> + http://basic-wp.test/?post_type=acf-field-group&p=193 + Thu, 20 Mar 2025 16:04:22 +0000 + + http://basic-wp.test/?p=193 + + + + 193 + + + + + + + + + 0 + 1 + + + 0 + + + + + + + <![CDATA[Media With Text Block]]> + http://basic-wp.test/?post_type=acf-field-group&p=211 + Sat, 22 Mar 2025 18:26:01 +0000 + + http://basic-wp.test/?p=211 + + + + 211 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + <![CDATA[Grid]]> + http://basic-wp.test/?post_type=acf-field-group&p=234 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?p=234 + + + + 234 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + <![CDATA[Grid Cell]]> + http://basic-wp.test/?post_type=acf-field-group&p=249 + Sat, 22 Mar 2025 19:15:31 +0000 + + http://basic-wp.test/?p=249 + + + + 249 + + + + + + + + + 0 + 0 + + + 0 + + + <![CDATA[Section]]> + http://basic-wp.test/?post_type=acf-field-group&p=291 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?p=291 + + + + 291 + + + + + + + + + 0 + 0 + + + 0 + + + <![CDATA[Content End]]> + http://basic-wp.test/?post_type=acf-field&p=316 + Sat, 22 Mar 2025 23:14:57 +0000 + + http://basic-wp.test/?post_type=acf-field&p=316 + + + + 316 + + + + + + + + + 291 + 16 + + + 0 + + + <![CDATA[Item Group Name]]> + http://basic-wp.test/?post_type=acf-field&p=447 + Sat, 12 Apr 2025 19:18:26 +0000 + + http://basic-wp.test/?post_type=acf-field&p=447 + + + + 447 + + + + + + + + + 5 + 1 + + + 0 + + + <![CDATA[Default Post Image]]> + http://basic-wp.test/?post_type=acf-field&p=522 + Sun, 04 May 2025 21:06:37 +0000 + + http://basic-wp.test/?post_type=acf-field&p=522 + + + + 522 + + + + + + + + + 29 + 1 + + + 0 + + + <![CDATA[wp_dummy_content_generator_62.jpg]]> + http://basic-wp.test/praesentium-quia-qui-sequi-dicta/wp_dummy_content_generator_62-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/praesentium-quia-qui-sequi-dicta/wp_dummy_content_generator_62-jpg/ + + + + 63 + + + + + + + + + 62 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_64.jpg]]> + http://basic-wp.test/et-dolor-dolor-voluptas-temporibus/wp_dummy_content_generator_64-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/et-dolor-dolor-voluptas-temporibus/wp_dummy_content_generator_64-jpg/ + + + + 65 + + + + + + + + + 64 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_66.jpg]]> + http://basic-wp.test/laboriosam-quae-enim-suscipit-a/wp_dummy_content_generator_66-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/laboriosam-quae-enim-suscipit-a/wp_dummy_content_generator_66-jpg/ + + + + 67 + + + + + + + + + 66 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_68.jpg]]> + http://basic-wp.test/ab-corrupti-libero-molestiae-et/wp_dummy_content_generator_68-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/ab-corrupti-libero-molestiae-et/wp_dummy_content_generator_68-jpg/ + + + + 69 + + + + + + + + + 68 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_70.jpg]]> + http://basic-wp.test/magnam-atque-et-sed-itaque-aut/wp_dummy_content_generator_70-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/magnam-atque-et-sed-itaque-aut/wp_dummy_content_generator_70-jpg/ + + + + 71 + + + + + + + + + 70 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_72.jpg]]> + http://basic-wp.test/veniam-aut-qui-atque-eum/wp_dummy_content_generator_72-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/veniam-aut-qui-atque-eum/wp_dummy_content_generator_72-jpg/ + + + + 73 + + + + + + + + + 72 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_74.jpg]]> + http://basic-wp.test/nam-quo-rem-enim-incidunt/wp_dummy_content_generator_74-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/nam-quo-rem-enim-incidunt/wp_dummy_content_generator_74-jpg/ + + + + 75 + + + + + + + + + 74 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_76.jpg]]> + http://basic-wp.test/ut-ratione-asperiores-autem/wp_dummy_content_generator_76-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/ut-ratione-asperiores-autem/wp_dummy_content_generator_76-jpg/ + + + + 77 + + + + + + + + + 76 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_78.jpg]]> + http://basic-wp.test/non-porro-qui-sed-quam-soluta-hic/wp_dummy_content_generator_78-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/non-porro-qui-sed-quam-soluta-hic/wp_dummy_content_generator_78-jpg/ + + + + 79 + + + + + + + + + 78 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_80.jpg]]> + http://basic-wp.test/quidem-quis-nihil-numquam-ea-facere/wp_dummy_content_generator_80-jpg/ + Sat, 15 Mar 2025 15:28:42 +0000 + + http://basic-wp.test/2025/03/15/quidem-quis-nihil-numquam-ea-facere/wp_dummy_content_generator_80-jpg/ + + + + 81 + + + + + + + + + 80 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_82.jpg]]> + http://basic-wp.test/rerum-eligendi-sint-vero-quia/wp_dummy_content_generator_82-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/rerum-eligendi-sint-vero-quia/wp_dummy_content_generator_82-jpg/ + + + + 83 + + + + + + + + + 82 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_84.jpg]]> + http://basic-wp.test/vel-consectetur-vero-laudantium/wp_dummy_content_generator_84-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/vel-consectetur-vero-laudantium/wp_dummy_content_generator_84-jpg/ + + + + 85 + + + + + + + + + 84 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_86.jpg]]> + http://basic-wp.test/adipisci-natus-fugit-illum-nemo/wp_dummy_content_generator_86-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/adipisci-natus-fugit-illum-nemo/wp_dummy_content_generator_86-jpg/ + + + + 87 + + + + + + + + + 86 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_88.jpg]]> + http://basic-wp.test/ipsum-quos-non-nihil-ipsa-fugit/wp_dummy_content_generator_88-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/ipsum-quos-non-nihil-ipsa-fugit/wp_dummy_content_generator_88-jpg/ + + + + 89 + + + + + + + + + 88 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_90.jpg]]> + http://basic-wp.test/totam-nam-molestiae-quo-et-hic/wp_dummy_content_generator_90-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/totam-nam-molestiae-quo-et-hic/wp_dummy_content_generator_90-jpg/ + + + + 91 + + + + + + + + + 90 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_92.jpg]]> + http://basic-wp.test/aut-quia-quia-qui-excepturi-itaque/wp_dummy_content_generator_92-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/aut-quia-quia-qui-excepturi-itaque/wp_dummy_content_generator_92-jpg/ + + + + 93 + + + + + + + + + 92 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_94.jpg]]> + http://basic-wp.test/voluptatum-consequatur-quae-dolor-cum/wp_dummy_content_generator_94-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/voluptatum-consequatur-quae-dolor-cum/wp_dummy_content_generator_94-jpg/ + + + + 95 + + + + + + + + + 94 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_96.jpg]]> + http://basic-wp.test/eveniet-eaque-veritatis-aut-voluptas/wp_dummy_content_generator_96-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/eveniet-eaque-veritatis-aut-voluptas/wp_dummy_content_generator_96-jpg/ + + + + 97 + + + + + + + + + 96 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_98.jpg]]> + http://basic-wp.test/voluptate-at-aut-minima-alias/wp_dummy_content_generator_98-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/voluptate-at-aut-minima-alias/wp_dummy_content_generator_98-jpg/ + + + + 99 + + + + + + + + + 98 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_100.jpg]]> + http://basic-wp.test/quasi-consequatur-ut-ut-aut/wp_dummy_content_generator_100-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/quasi-consequatur-ut-ut-aut/wp_dummy_content_generator_100-jpg/ + + + + 101 + + + + + + + + + 100 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_102.jpg]]> + http://basic-wp.test/ratione-facilis-expedita-nostrum/wp_dummy_content_generator_102-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/ratione-facilis-expedita-nostrum/wp_dummy_content_generator_102-jpg/ + + + + 103 + + + + + + + + + 102 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_104.jpg]]> + http://basic-wp.test/dolore-quod-minus-veniam-dolore/wp_dummy_content_generator_104-jpg/ + Sat, 15 Mar 2025 15:28:43 +0000 + + http://basic-wp.test/2025/03/15/dolore-quod-minus-veniam-dolore/wp_dummy_content_generator_104-jpg/ + + + + 105 + + + + + + + + + 104 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_106.jpg]]> + http://basic-wp.test/eos-nihil-facilis-aut-esse/wp_dummy_content_generator_106-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/eos-nihil-facilis-aut-esse/wp_dummy_content_generator_106-jpg/ + + + + 107 + + + + + + + + + 106 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_108.jpg]]> + http://basic-wp.test/minus-qui-aspernatur-ut-saepe-sapiente/wp_dummy_content_generator_108-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/minus-qui-aspernatur-ut-saepe-sapiente/wp_dummy_content_generator_108-jpg/ + + + + 109 + + + + + + + + + 108 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_110.jpg]]> + http://basic-wp.test/dolorem-nam-nesciunt-quos/wp_dummy_content_generator_110-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/dolorem-nam-nesciunt-quos/wp_dummy_content_generator_110-jpg/ + + + + 111 + + + + + + + + + 110 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_112.jpg]]> + http://basic-wp.test/hic-sed-ex-vel-doloribus-sapiente/wp_dummy_content_generator_112-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/hic-sed-ex-vel-doloribus-sapiente/wp_dummy_content_generator_112-jpg/ + + + + 113 + + + + + + + + + 112 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_114.jpg]]> + http://basic-wp.test/doloremque-omnis-nobis-vel-rem-ut-vero/wp_dummy_content_generator_114-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/doloremque-omnis-nobis-vel-rem-ut-vero/wp_dummy_content_generator_114-jpg/ + + + + 115 + + + + + + + + + 114 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_116.jpg]]> + http://basic-wp.test/mollitia-quo-aut-dolor/wp_dummy_content_generator_116-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/mollitia-quo-aut-dolor/wp_dummy_content_generator_116-jpg/ + + + + 117 + + + + + + + + + 116 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_118.jpg]]> + http://basic-wp.test/modi-est-nobis-modi-quasi-doloremque/wp_dummy_content_generator_118-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/modi-est-nobis-modi-quasi-doloremque/wp_dummy_content_generator_118-jpg/ + + + + 119 + + + + + + + + + 118 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_120.jpg]]> + http://basic-wp.test/excepturi-dolore-modi-eius-doloribus/wp_dummy_content_generator_120-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/excepturi-dolore-modi-eius-doloribus/wp_dummy_content_generator_120-jpg/ + + + + 121 + + + + + + + + + 120 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_122.jpg]]> + http://basic-wp.test/fugit-eum-labore-cupiditate/wp_dummy_content_generator_122-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/fugit-eum-labore-cupiditate/wp_dummy_content_generator_122-jpg/ + + + + 123 + + + + + + + + + 122 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_124.jpg]]> + http://basic-wp.test/aut-eos-cumque-sit-beatae/wp_dummy_content_generator_124-jpg/ + Sat, 15 Mar 2025 15:28:44 +0000 + + http://basic-wp.test/2025/03/15/aut-eos-cumque-sit-beatae/wp_dummy_content_generator_124-jpg/ + + + + 125 + + + + + + + + + 124 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[aurora]]> + http://basic-wp.test/blocks/media-text-block/aurora/ + Sat, 22 Mar 2025 18:19:58 +0000 + + http://basic-wp.test/wp-content/uploads/2025/03/aurora.jpg + + + + 207 + + + + + + + + + 201 + 0 + + + 0 + + + + + + + + + + + + <![CDATA[logo]]> + http://basic-wp.test/logo/ + Sat, 22 Mar 2025 21:41:56 +0000 + + http://basic-wp.test/wp-content/uploads/2025/03/logo.svg + + + + 274 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_335.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_335-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/deleniti-velit-odit-molestiae-qui/wp_dummy_content_generator_335-jpg/ + + + + 336 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_337.jpg]]> + http://basic-wp.test/resources/earum-quis-quasi-qui-in/wp_dummy_content_generator_337-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/earum-quis-quasi-qui-in/wp_dummy_content_generator_337-jpg/ + + + + 338 + + + + + + + + + 337 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_339.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_339-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/ea-nulla-pariatur-sapiente-et-sequi/wp_dummy_content_generator_339-jpg/ + + + + 340 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_341.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_341-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/animi-eum-et-ut-odio-provident/wp_dummy_content_generator_341-jpg/ + + + + 342 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_343.jpg]]> + http://basic-wp.test/resources/consequatur-omnis-quo-tempora-amet/wp_dummy_content_generator_343-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/consequatur-omnis-quo-tempora-amet/wp_dummy_content_generator_343-jpg/ + + + + 344 + + + + + + + + + 343 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_345.jpg]]> + http://basic-wp.test/resources/at-optio-eos-quibusdam/wp_dummy_content_generator_345-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/at-optio-eos-quibusdam/wp_dummy_content_generator_345-jpg/ + + + + 346 + + + + + + + + + 345 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_347.jpg]]> + http://basic-wp.test/resources/et-nihil-ipsam-et-magnam/wp_dummy_content_generator_347-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/et-nihil-ipsam-et-magnam/wp_dummy_content_generator_347-jpg/ + + + + 348 + + + + + + + + + 347 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_349.jpg]]> + http://basic-wp.test/resources/beatae-et-qui-quia-laudantium/wp_dummy_content_generator_349-jpg/ + Sat, 29 Mar 2025 18:00:20 +0000 + + http://basic-wp.test/resources/beatae-et-qui-quia-laudantium/wp_dummy_content_generator_349-jpg/ + + + + 350 + + + + + + + + + 349 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_351.jpg]]> + http://basic-wp.test/resources/dicta-cum-repellendus-qui-qui-ut/wp_dummy_content_generator_351-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/dicta-cum-repellendus-qui-qui-ut/wp_dummy_content_generator_351-jpg/ + + + + 352 + + + + + + + + + 351 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_353.jpg]]> + http://basic-wp.test/resources/architecto-quam-molestias-et/wp_dummy_content_generator_353-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/architecto-quam-molestias-et/wp_dummy_content_generator_353-jpg/ + + + + 354 + + + + + + + + + 353 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_355.jpg]]> + http://basic-wp.test/resources/autem-esse-repellat-quasi-et/wp_dummy_content_generator_355-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/autem-esse-repellat-quasi-et/wp_dummy_content_generator_355-jpg/ + + + + 356 + + + + + + + + + 355 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_357.jpg]]> + http://basic-wp.test/resources/aut-soluta-totam-fuga-dolores/wp_dummy_content_generator_357-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/aut-soluta-totam-fuga-dolores/wp_dummy_content_generator_357-jpg/ + + + + 358 + + + + + + + + + 357 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_359.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_359-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/laborum-dolores-qui-praesentium-at/wp_dummy_content_generator_359-jpg/ + + + + 360 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_361.jpg]]> + http://basic-wp.test/resources/voluptatibus-quo-ipsum-dolor-omnis/wp_dummy_content_generator_361-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/voluptatibus-quo-ipsum-dolor-omnis/wp_dummy_content_generator_361-jpg/ + + + + 362 + + + + + + + + + 361 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_363.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_363-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/et-sit-rerum-asperiores/wp_dummy_content_generator_363-jpg/ + + + + 364 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_365.jpg]]> + http://basic-wp.test/resources/est-ipsa-tempore-veniam-officia-et-est/wp_dummy_content_generator_365-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/est-ipsa-tempore-veniam-officia-et-est/wp_dummy_content_generator_365-jpg/ + + + + 366 + + + + + + + + + 365 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_367.jpg]]> + http://basic-wp.test/resources/eius-deserunt-nemo-a/wp_dummy_content_generator_367-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/eius-deserunt-nemo-a/wp_dummy_content_generator_367-jpg/ + + + + 368 + + + + + + + + + 367 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_369.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_369-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/quo-distinctio-aut-ea-modi-voluptate/wp_dummy_content_generator_369-jpg/ + + + + 370 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_371.jpg]]> + http://basic-wp.test/resources/nemo-dolores-illum-quia-dolor/wp_dummy_content_generator_371-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/nemo-dolores-illum-quia-dolor/wp_dummy_content_generator_371-jpg/ + + + + 372 + + + + + + + + + 371 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_373.jpg]]> + http://basic-wp.test/resources/officia-necessitatibus-neque-enim/wp_dummy_content_generator_373-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/officia-necessitatibus-neque-enim/wp_dummy_content_generator_373-jpg/ + + + + 374 + + + + + + + + + 373 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_375.jpg]]> + http://basic-wp.test/resources/voluptas-id-non-voluptate-quod-aut/wp_dummy_content_generator_375-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/voluptas-id-non-voluptate-quod-aut/wp_dummy_content_generator_375-jpg/ + + + + 376 + + + + + + + + + 375 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_377.jpg]]> + http://basic-wp.test/resources/aut-nemo-sint-consequatur-molestiae/wp_dummy_content_generator_377-jpg/ + Sat, 29 Mar 2025 18:00:21 +0000 + + http://basic-wp.test/resources/aut-nemo-sint-consequatur-molestiae/wp_dummy_content_generator_377-jpg/ + + + + 378 + + + + + + + + + 377 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_379.jpg]]> + http://basic-wp.test/resources/voluptate-fugiat-nemo-nisi/wp_dummy_content_generator_379-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/voluptate-fugiat-nemo-nisi/wp_dummy_content_generator_379-jpg/ + + + + 380 + + + + + + + + + 379 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_381.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_381-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/et-sapiente-et-facere-temporibus-iusto/wp_dummy_content_generator_381-jpg/ + + + + 382 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_383.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_383-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/totam-sint-debitis-sit/wp_dummy_content_generator_383-jpg/ + + + + 384 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_385.jpg]]> + http://basic-wp.test/resources/et-repudiandae-maxime-qui-quas/wp_dummy_content_generator_385-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/et-repudiandae-maxime-qui-quas/wp_dummy_content_generator_385-jpg/ + + + + 386 + + + + + + + + + 385 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_387.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_387-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/cumque-aut-natus-et-ea-id-omnis-animi/wp_dummy_content_generator_387-jpg/ + + + + 388 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_389.jpg]]> + http://basic-wp.test/resources/eum-sint-expedita-doloremque/wp_dummy_content_generator_389-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/eum-sint-expedita-doloremque/wp_dummy_content_generator_389-jpg/ + + + + 390 + + + + + + + + + 389 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_391.jpg]]> + http://basic-wp.test/resources/eum-dolorem-in-qui/wp_dummy_content_generator_391-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/eum-dolorem-in-qui/wp_dummy_content_generator_391-jpg/ + + + + 392 + + + + + + + + + 391 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_393.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_393-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/quia-dignissimos-error-alias-qui-in/wp_dummy_content_generator_393-jpg/ + + + + 394 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_395.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_395-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/et-eveniet-alias-omnis-sed-deleniti-ut/wp_dummy_content_generator_395-jpg/ + + + + 396 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_397.jpg]]> + http://basic-wp.test/resources/id-enim-iusto-quis-est-dolorem/wp_dummy_content_generator_397-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/id-enim-iusto-quis-est-dolorem/wp_dummy_content_generator_397-jpg/ + + + + 398 + + + + + + + + + 397 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_399.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_399-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/aut-pariatur-fugiat-ducimus-expedita/wp_dummy_content_generator_399-jpg/ + + + + 400 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_401.jpg]]> + http://basic-wp.test/resources/blanditiis-est-voluptatem-quisquam-rem/wp_dummy_content_generator_401-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/blanditiis-est-voluptatem-quisquam-rem/wp_dummy_content_generator_401-jpg/ + + + + 402 + + + + + + + + + 401 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_403.jpg]]> + http://basic-wp.test/resources/saepe-aliquam-quaerat-corporis-quam/wp_dummy_content_generator_403-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/saepe-aliquam-quaerat-corporis-quam/wp_dummy_content_generator_403-jpg/ + + + + 404 + + + + + + + + + 403 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_405.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_405-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/quaerat-minima-nulla-delectus-nemo-qui/wp_dummy_content_generator_405-jpg/ + + + + 406 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_407.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_407-jpg/ + Sat, 29 Mar 2025 18:00:22 +0000 + + http://basic-wp.test/resources/rerum-ea-veniam-quaerat/wp_dummy_content_generator_407-jpg/ + + + + 408 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_409.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_409-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/ut-eos-hic-consequuntur/wp_dummy_content_generator_409-jpg/ + + + + 410 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_411.jpg]]> + http://basic-wp.test/resources/modi-et-in-eum-et-esse-quam/wp_dummy_content_generator_411-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/modi-et-in-eum-et-esse-quam/wp_dummy_content_generator_411-jpg/ + + + + 412 + + + + + + + + + 411 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_413.jpg]]> + http://basic-wp.test/resources/velit-deleniti-nam-autem-rem/wp_dummy_content_generator_413-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/velit-deleniti-nam-autem-rem/wp_dummy_content_generator_413-jpg/ + + + + 414 + + + + + + + + + 413 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_415.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_415-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/suscipit-rerum-qui-neque-vero/wp_dummy_content_generator_415-jpg/ + + + + 416 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_417.jpg]]> + http://basic-wp.test/resources/culpa-ea-blanditiis-ipsam/wp_dummy_content_generator_417-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/culpa-ea-blanditiis-ipsam/wp_dummy_content_generator_417-jpg/ + + + + 418 + + + + + + + + + 417 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_419.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_419-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/aut-qui-sit-vel/wp_dummy_content_generator_419-jpg/ + + + + 420 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_421.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_421-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/qui-nesciunt-et-dolorem-fugit-itaque/wp_dummy_content_generator_421-jpg/ + + + + 422 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_423.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_423-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/nostrum-dolorem-quasi-minima-et/wp_dummy_content_generator_423-jpg/ + + + + 424 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_425.jpg]]> + http://basic-wp.test/resources/sed-quia-nulla-autem-recusandae-unde/wp_dummy_content_generator_425-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/sed-quia-nulla-autem-recusandae-unde/wp_dummy_content_generator_425-jpg/ + + + + 426 + + + + + + + + + 425 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/31/ + Sun, 09 Mar 2025 19:15:39 +0000 + + http://basic-wp.test/?p=31 + + + + 31 + + + + + + + + + 0 + 2 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/35/ + Sun, 09 Mar 2025 19:18:00 +0000 + + http://basic-wp.test/?p=35 + + + + 35 + + + + + + + + + 0 + 5 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/44/ + Sat, 15 Mar 2025 15:27:06 +0000 + + http://basic-wp.test/?p=44 + + + + 44 + + + + + + + + + 0 + 1 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/45/ + Sat, 15 Mar 2025 15:27:06 +0000 + + http://basic-wp.test/?p=45 + + + + 45 + + + + + + + + + 0 + 11 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/131/ + Sat, 15 Mar 2025 17:37:41 +0000 + + http://basic-wp.test/?p=131 + + + + 131 + + + + + + + + + 33 + 6 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/141/ + Sat, 15 Mar 2025 18:28:26 +0000 + + http://basic-wp.test/?p=141 + + + + 141 + + + + + + + + + 33 + 7 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/203/ + Sat, 22 Mar 2025 18:16:52 +0000 + + http://basic-wp.test/?p=203 + + + + 203 + + + + + + + + + 33 + 9 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/261/ + Sat, 22 Mar 2025 19:16:19 +0000 + + http://basic-wp.test/?p=261 + + + + 261 + + + + + + + + + 33 + 8 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/275/ + Sat, 22 Mar 2025 21:42:53 +0000 + + http://basic-wp.test/?p=275 + + + + 275 + + + + + + + + + 0 + 1 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/276/ + Sat, 22 Mar 2025 21:42:53 +0000 + + http://basic-wp.test/?p=276 + + + + 276 + + + + + + + + + 0 + 6 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/277/ + Sat, 22 Mar 2025 21:42:53 +0000 + + http://basic-wp.test/?p=277 + + + + 277 + + + + + + + + + 0 + 2 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/278/ + Sat, 22 Mar 2025 21:42:53 +0000 + + http://basic-wp.test/?p=278 + + + + 278 + + + + + + + + + 0 + 3 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/318/ + Sat, 22 Mar 2025 23:15:45 +0000 + + http://basic-wp.test/?p=318 + + + + 318 + + + + + + + + + 33 + 10 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_427.jpg]]> + http://basic-wp.test/resources/inventore-ad-pariatur-quia/wp_dummy_content_generator_427-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/inventore-ad-pariatur-quia/wp_dummy_content_generator_427-jpg/ + + + + 428 + + + + + + + + + 427 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_429.jpg]]> + http://basic-wp.test/resources/excepturi-quidem-a-magnam-quas/wp_dummy_content_generator_429-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/excepturi-quidem-a-magnam-quas/wp_dummy_content_generator_429-jpg/ + + + + 430 + + + + + + + + + 429 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_431.jpg]]> + http://basic-wp.test/wp_dummy_content_generator_431-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/sapiente-iure-omnis-voluptatem-ex/wp_dummy_content_generator_431-jpg/ + + + + 432 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[wp_dummy_content_generator_433.jpg]]> + http://basic-wp.test/resources/omnis-architecto-ut-aut-dicta/wp_dummy_content_generator_433-jpg/ + Sat, 29 Mar 2025 18:00:23 +0000 + + http://basic-wp.test/resources/omnis-architecto-ut-aut-dicta/wp_dummy_content_generator_433-jpg/ + + + + 434 + + + + + + + + + 433 + 0 + + + 0 + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/437/ + Sat, 29 Mar 2025 18:16:06 +0000 + + http://basic-wp.test/?p=437 + + + + 437 + + + + + + + + + 0 + 4 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/526/ + Sun, 04 May 2025 21:25:28 +0000 + + http://basic-wp.test/?p=526 + + + + 526 + + + + + + + + + 0 + 3 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/539/ + Sun, 18 May 2025 22:09:54 +0000 + + http://basic-wp.test/?p=539 + + + + 539 + + + + + + + + + 0 + 1 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[Hello world!]]> + http://basic-wp.test/hello-world/ + Sun, 09 Mar 2025 18:50:27 +0000 + + http://basic-wp.test/?p=1 + + +

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

+]]>
+ + 1 + + + + + + + + + 0 + 0 + + + 0 + + + 1 + + + https://wordpress.org/ + + + + Gravatar
.]]> + + + 0 + 0 + + + + <![CDATA[Sample Page]]> + http://basic-wp.test/sample-page/ + Sun, 09 Mar 2025 18:50:27 +0000 + + http://basic-wp.test/?page_id=2 + + +

This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

+ + + +
+

Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)

+
+ + + +

...or something like this:

+ + + +
+

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

+
+ + + +

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

+ + + +

Mus aliquam ut quis a tincidunt fermentum ac vestibulum pulvinar mauris cum a habitasse rutrum. Ullamcorper odio hac non pulvinar adipiscing leo dis bibendum litora et leo quis scelerisque praesent aptent ultrices pretium a varius vestibulum quam ullamcorper iaculis. A rutrum facilisi cum malesuada risus conubia semper suspendisse et eget accumsan parturient condimentum vitae nam lobortis. Pulvinar at magnis a class suspendisse erat ante lacus porta eget malesuada neque scelerisque netus fringilla erat. Fermentum auctor imperdiet justo condimentum a cum fermentum leo sapien sem lectus et fringilla suscipit lacus scelerisque parturient convallis vestibulum vel parturient parturient mauris senectus.

+ + + +

Curae platea tempus et dis adipiscing dignissim pharetra eu vestibulum neque non lacus sociosqu vestibulum luctus nisl blandit. Porttitor in aliquam duis etiam parturient ac id scelerisque tempus scelerisque a a praesent eu parturient vestibulum a senectus et natoque dolor auctor adipiscing est. Ad quisque quis curae bibendum ac consectetur nibh etiam ad a class vestibulum natoque mi viverra nisi nec praesent sed nibh. Imperdiet mus parturient fames magnis vivamus a orci parturient id diam parturient diam phasellus sed imperdiet a scelerisque.

+ + + +

Enim vel a tempor a parturient cum dignissim facilisi laoreet phasellus enim id ullamcorper dis suspendisse penatibus vestibulum mattis lacinia ridiculus nam quisque. Phasellus ultrices consequat ipsum facilisis nascetur condimentum suscipit vivamus proin varius erat natoque sodales arcu leo mi platea ut lobortis consectetur rutrum adipiscing hac a vel mus consectetur. Egestas ullamcorper mus a dis adipiscing sagittis fringilla nam netus ullamcorper scelerisque per netus imperdiet.

+]]>
+ + 2 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Blocks]]> + http://basic-wp.test/blocks/ + Sun, 09 Mar 2025 19:17:47 +0000 + + http://basic-wp.test/?page_id=33 + + ]]> + + 33 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[Home]]> + http://basic-wp.test/ + Sat, 15 Mar 2025 15:25:41 +0000 + + http://basic-wp.test/?page_id=40 + + ]]> + + 40 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[News]]> + http://basic-wp.test/news/ + Sat, 15 Mar 2025 15:25:49 +0000 + + http://basic-wp.test/?page_id=42 + + + + 42 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[Est facilis rem at ex velit temporibus.]]> + http://basic-wp.test/est-facilis-rem-at-ex-velit-temporibus/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/est-facilis-rem-at-ex-velit-temporibus/ + + + + 46 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Et dolores magnam repudiandae officia.]]> + http://basic-wp.test/et-dolores-magnam-repudiandae-officia/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/et-dolores-magnam-repudiandae-officia/ + + + + 48 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Quo sint eveniet debitis aut.]]> + http://basic-wp.test/quo-sint-eveniet-debitis-aut/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/quo-sint-eveniet-debitis-aut/ + + + + 50 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Accordion Block]]> + http://basic-wp.test/blocks/accordion-block/ + Sat, 15 Mar 2025 17:35:56 +0000 + + http://basic-wp.test/?page_id=126 + + +

Show a group of content items in collapsable sections. Used for things like FAQ questions, etc. Configurable for first item open and grouped (single expansion mode) items.

+ + + +

Standard, Grouped Items

+ + + + + +
+ + + +

First Item Open

+ + +]]>
+ + 126 + + + + + + + + + 33 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Buttons Block]]> + http://basic-wp.test/blocks/buttons-block/ + Sat, 15 Mar 2025 18:27:27 +0000 + + http://basic-wp.test/?page_id=137 + + +

Use as a normal link (i.e., an <a> element) or as a regualr (i.e., form control <button> element) button. Default is <a> element, "medium" size, and "auto" width.

+ + + +

Small Buttons

+ + + + + + + + + + + +

Medium Buttons (All Default Settings)

+ + + + + + + + + + + +

Large Buttons

+ + + + + + + + + + + +

Small Width Buttons

+ + + + + + + + + +

Wide Width Buttons

+ + + + + + + + + +

Full-width Button

+ + + + +]]>
+ + 137 + + + + + + + + + 33 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Media Text Block]]> + http://basic-wp.test/blocks/media-text-block/ + Sat, 22 Mar 2025 18:16:25 +0000 + + http://basic-wp.test/?page_id=201 + + + + + + + + + +

Media Text Block - InnerBlocks Variant

+ + + +

This is a paragraph block inside the InnerBlocks variant of the Media Text Block. The title is a core Heading block.

+ +]]>
+ + 201 + + + + + + + + + 33 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Grid Block]]> + http://basic-wp.test/blocks/grid-block/ + Sat, 22 Mar 2025 19:16:05 +0000 + + http://basic-wp.test/?page_id=259 + + + + +

Column 1 - Spans 2 columns at "xl" breakpoint

+ + + + + +

Column 2 - Spans 3 columns at "xl" breakpoint

+ + + + + +

Column 3 - Spans 3 columns at "xl" breakpoint

+ + + + + +

Column 4 - 1 column

+ + + + + +

Column 5 - 1 column

+ + + + + +

Column 6 - 1 column

+ + + + + +

Column 7 - Spans 4 columns at "xl" breakpoint

+ + +]]>
+ + 259 + + + + + + + + + 33 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Section Block]]> + http://basic-wp.test/blocks/section-block/ + Sat, 22 Mar 2025 23:11:20 +0000 + + http://basic-wp.test/?page_id=286 + + + +

Normal Width - ml-break-out

+ + + +

Senectus a parturient mi molestie mus duis sodales ut a a a ullamcorper vestibulum a tristique cubilia erat. Et placerat consectetur cubilia venenatis dolor risus dictumst eget adipiscing est venenatis ligula parturient elit dignissim vulputate nec nunc congue consectetur ullamcorper pharetra parturient. Suspendisse mollis odio cubilia parturient senectus suspendisse nam adipiscing tristique ultrices interdum non cras posuere vestibulum blandit felis dignissim. Lacinia commodo a congue dis adipiscing massa sodales fermentum himenaeos a auctor est arcu a suspendisse morbi a. Et inceptos vestibulum vestibulum ullamcorper egestas at ad adipiscing torquent lectus ullamcorper congue ac ipsum nulla morbi risus purus id lacus suspendisse nascetur nisl parturient penatibus a imperdiet volutpat. Vestibulum diam proin viverra bibendum scelerisque eget mollis sem laoreet convallis consequat hac tortor iaculis.

+ + + + + +

Normal Width - mr-break-out

+ + + +

Senectus a parturient mi molestie mus duis sodales ut a a a ullamcorper vestibulum a tristique cubilia erat. Et placerat consectetur cubilia venenatis dolor risus dictumst eget adipiscing est venenatis ligula parturient elit dignissim vulputate nec nunc congue consectetur ullamcorper pharetra parturient. Suspendisse mollis odio cubilia parturient senectus suspendisse nam adipiscing tristique ultrices interdum non cras posuere vestibulum blandit felis dignissim. Lacinia commodo a congue dis adipiscing massa sodales fermentum himenaeos a auctor est arcu a suspendisse morbi a. Et inceptos vestibulum vestibulum ullamcorper egestas at ad adipiscing torquent lectus ullamcorper congue ac ipsum nulla morbi risus purus id lacus suspendisse nascetur nisl parturient penatibus a imperdiet volutpat. Vestibulum diam proin viverra bibendum scelerisque eget mollis sem laoreet convallis consequat hac tortor iaculis.

+ + + + + +

Full Width - WP controls

+ + + +

Senectus a parturient mi molestie mus duis sodales ut a a a ullamcorper vestibulum a tristique cubilia erat. Et placerat consectetur cubilia venenatis dolor risus dictumst eget adipiscing est venenatis ligula parturient elit dignissim vulputate nec nunc congue consectetur ullamcorper pharetra parturient. Suspendisse mollis odio cubilia parturient senectus suspendisse nam adipiscing tristique ultrices interdum non cras posuere vestibulum blandit felis dignissim. Lacinia commodo a congue dis adipiscing massa sodales fermentum himenaeos a auctor est arcu a suspendisse morbi a. Et inceptos vestibulum vestibulum ullamcorper egestas at ad adipiscing torquent lectus ullamcorper congue ac ipsum nulla morbi risus purus id lacus suspendisse nascetur nisl parturient penatibus a imperdiet volutpat. Vestibulum diam proin viverra bibendum scelerisque eget mollis sem laoreet convallis consequat hac tortor iaculis.

+ + + + + +

Full Width - mx-break-out

+ + + +

Senectus a parturient mi molestie mus duis sodales ut a a a ullamcorper vestibulum a tristique cubilia erat. Et placerat consectetur cubilia venenatis dolor risus dictumst eget adipiscing est venenatis ligula parturient elit dignissim vulputate nec nunc congue consectetur ullamcorper pharetra parturient. Suspendisse mollis odio cubilia parturient senectus suspendisse nam adipiscing tristique ultrices interdum non cras posuere vestibulum blandit felis dignissim. Lacinia commodo a congue dis adipiscing massa sodales fermentum himenaeos a auctor est arcu a suspendisse morbi a. Et inceptos vestibulum vestibulum ullamcorper egestas at ad adipiscing torquent lectus ullamcorper congue ac ipsum nulla morbi risus purus id lacus suspendisse nascetur nisl parturient penatibus a imperdiet volutpat. Vestibulum diam proin viverra bibendum scelerisque eget mollis sem laoreet convallis consequat hac tortor iaculis.

+ +]]>
+ + 286 + + + + + + + + + 33 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Content Filter]]> + http://basic-wp.test/?page_id=435 + Sat, 29 Mar 2025 18:15:50 +0000 + + http://basic-wp.test/?page_id=435 + + +

What is this?

+ + + +

This page incorporates our Content Filter plugin. offing easy filtering and display of any content chosen in the admin control panel.

+ + + +[resource_filter] +]]>
+ + 435 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Page With Sidebar]]> + http://basic-wp.test/page-with-sidebar/ + Sun, 04 May 2025 21:02:38 +0000 + + http://basic-wp.test/?page_id=520 + + +

Ac facilisi sit scelerisque proin luctus a ullamcorper etiam massa ac potenti volutpat iaculis integer facilisis vivamus. Vestibulum mi porta non at risus euismod nascetur a vestibulum sociosqu parturient ornare adipiscing habitasse dui nec eget aliquam. Odio cras sem mi a vestibulum tristique eget rhoncus penatibus porta sem suscipit egestas rhoncus imperdiet a parturient mollis ut facilisi. Eleifend risus dapibus in quis habitasse cum iaculis a habitant suspendisse cras ac vestibulum facilisi suspendisse. Ut a tristique vestibulum montes malesuada duis condimentum netus quam odio elit dictumst pharetra pulvinar per interdum ad. A sagittis posuere mi conubia a mattis a at parturient scelerisque venenatis a velit ultrices primis orci eu mi odio urna sem enim ullamcorper eget id fermentum a.

+ + + +

Vel parturient eu eget a a litora ullamcorper nostra facilisis neque ullamcorper ridiculus duis non et condimentum euismod ultricies curabitur. Et vestibulum a venenatis a elementum ligula penatibus dignissim eget eu donec a adipiscing pharetra ac dui scelerisque. Penatibus malesuada lectus nunc vel a ad volutpat cursus ultricies habitasse posuere blandit morbi lectus quisque sit scelerisque purus erat a vestibulum adipiscing bibendum scelerisque. Suspendisse placerat nec non vehicula conubia quis risus a leo erat etiam scelerisque mi arcu viverra senectus tincidunt platea mollis eu erat ut.

+ + + +

In suscipit a velit fermentum purus elementum posuere per platea in amet ut urna dignissim non eleifend sed mus donec aliquam leo non integer convallis parturient consectetur. Dis dui in mattis nullam ornare adipiscing placerat mi a dictum vestibulum orci cubilia parturient rhoncus urna tellus consectetur nullam. Dictumst nunc erat himenaeos urna vivamus odio et fusce etiam lobortis hendrerit dictumst cubilia iaculis non a inceptos ac platea. Augue aptent a ullamcorper nibh porta condimentum mus vestibulum at non mus a ridiculus himenaeos ullamcorper conubia vivamus suspendisse fermentum euismod justo ullamcorper. A a iaculis euismod integer nec vestibulum tristique id a ullamcorper at id ad vestibulum dis ullamcorper.

+ + + +

Vestibulum mauris non hac id a parturient porta cras adipiscing condimentum a sociosqu scelerisque sociis quam dolor a a fermentum eleifend eros lectus erat convallis id inceptos. Himenaeos penatibus senectus vestibulum morbi a ante imperdiet parturient habitant suspendisse adipiscing ad a consequat nibh aliquam torquent at ad consectetur montes. Sociosqu habitant suspendisse a libero orci eros facilisis adipiscing leo lorem risus ante ad nam a litora mi primis.

+ + + +

Condimentum molestie vestibulum habitasse tristique sed et hendrerit consectetur scelerisque nibh ac facilisi condimentum feugiat etiam aptent lacus a etiam in a erat ac nec. Potenti amet ut parturient pharetra litora in tempus mattis eu purus cum aptent volutpat turpis ipsum taciti id purus viverra. Ut convallis conubia condimentum a a a a a ullamcorper erat scelerisque a dolor ac nullam ullamcorper. A dui justo adipiscing facilisis scelerisque duis duis nisl est accumsan suscipit a justo primis at blandit posuere at consectetur tortor eget imperdiet est ornare sapien odio suscipit. Dictumst fermentum a a nisi nunc volutpat congue adipiscing quam vestibulum suspendisse laoreet scelerisque torquent mus a condimentum eget convallis.

+]]>
+ + 520 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Sidebar Test]]> + http://basic-wp.test/?page_id=528 + Sat, 10 May 2025 14:40:53 +0000 + + http://basic-wp.test/?page_id=528 + + +

Ac facilisi sit scelerisque proin luctus a ullamcorper etiam massa ac potenti volutpat iaculis integer facilisis vivamus. Vestibulum mi porta non at risus euismod nascetur a vestibulum sociosqu parturient ornare adipiscing habitasse dui nec eget aliquam. Odio cras sem mi a vestibulum tristique eget rhoncus penatibus porta sem suscipit egestas rhoncus imperdiet a parturient mollis ut facilisi. Eleifend risus dapibus in quis habitasse cum iaculis a habitant suspendisse cras ac vestibulum facilisi suspendisse. Ut a tristique vestibulum montes malesuada duis condimentum netus quam odio elit dictumst pharetra pulvinar per interdum ad. A sagittis posuere mi conubia a mattis a at parturient scelerisque venenatis a velit ultrices primis orci eu mi odio urna sem enim ullamcorper eget id fermentum a.

+ + + +

Vel parturient eu eget a a litora ullamcorper nostra facilisis neque ullamcorper ridiculus duis non et condimentum euismod ultricies curabitur. Et vestibulum a venenatis a elementum ligula penatibus dignissim eget eu donec a adipiscing pharetra ac dui scelerisque. Penatibus malesuada lectus nunc vel a ad volutpat cursus ultricies habitasse posuere blandit morbi lectus quisque sit scelerisque purus erat a vestibulum adipiscing bibendum scelerisque. Suspendisse placerat nec non vehicula conubia quis risus a leo erat etiam scelerisque mi arcu viverra senectus tincidunt platea mollis eu erat ut.

+ + + +

In suscipit a velit fermentum purus elementum posuere per platea in amet ut urna dignissim non eleifend sed mus donec aliquam leo non integer convallis parturient consectetur. Dis dui in mattis nullam ornare adipiscing placerat mi a dictum vestibulum orci cubilia parturient rhoncus urna tellus consectetur nullam. Dictumst nunc erat himenaeos urna vivamus odio et fusce etiam lobortis hendrerit dictumst cubilia iaculis non a inceptos ac platea. Augue aptent a ullamcorper nibh porta condimentum mus vestibulum at non mus a ridiculus himenaeos ullamcorper conubia vivamus suspendisse fermentum euismod justo ullamcorper. A a iaculis euismod integer nec vestibulum tristique id a ullamcorper at id ad vestibulum dis ullamcorper.

+ + + +

Vestibulum mauris non hac id a parturient porta cras adipiscing condimentum a sociosqu scelerisque sociis quam dolor a a fermentum eleifend eros lectus erat convallis id inceptos. Himenaeos penatibus senectus vestibulum morbi a ante imperdiet parturient habitant suspendisse adipiscing ad a consequat nibh aliquam torquent at ad consectetur montes. Sociosqu habitant suspendisse a libero orci eros facilisis adipiscing leo lorem risus ante ad nam a litora mi primis.

+ + + +

Condimentum molestie vestibulum habitasse tristique sed et hendrerit consectetur scelerisque nibh ac facilisi condimentum feugiat etiam aptent lacus a etiam in a erat ac nec. Potenti amet ut parturient pharetra litora in tempus mattis eu purus cum aptent volutpat turpis ipsum taciti id purus viverra. Ut convallis conubia condimentum a a a a a ullamcorper erat scelerisque a dolor ac nullam ullamcorper. A dui justo adipiscing facilisis scelerisque duis duis nisl est accumsan suscipit a justo primis at blandit posuere at consectetur tortor eget imperdiet est ornare sapien odio suscipit. Dictumst fermentum a a nisi nunc volutpat congue adipiscing quam vestibulum suspendisse laoreet scelerisque torquent mus a condimentum eget convallis.

+]]>
+ + 528 + + + + + + + + + 520 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[]]> + http://basic-wp.test/531/ + Sun, 11 May 2025 19:20:59 +0000 + + http://basic-wp.test/?p=531 + + + + 531 + + + + + + + + + 0 + 5 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/532/ + Sun, 11 May 2025 19:20:59 +0000 + + http://basic-wp.test/?p=532 + + + + 532 + + + + + + + + + 0 + 4 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[Contact]]> + http://basic-wp.test/contact/ + Sun, 18 May 2025 22:08:58 +0000 + + http://basic-wp.test/?page_id=537 + + ]]> + + 537 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[]]> + http://basic-wp.test/543/ + Mon, 19 May 2025 01:30:13 +0000 + + http://basic-wp.test/?p=543 + + + + 543 + + + + + + + + + 0 + 7 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[Ut eaque est quibusdam quaerat non.]]> + http://basic-wp.test/ut-eaque-est-quibusdam-quaerat-non/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/ut-eaque-est-quibusdam-quaerat-non/ + + + + 52 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Quia quo sit voluptates excepturi.]]> + http://basic-wp.test/quia-quo-sit-voluptates-excepturi/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/quia-quo-sit-voluptates-excepturi/ + + + + 54 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Dolorem vitae voluptas architecto.]]> + http://basic-wp.test/dolorem-vitae-voluptas-architecto/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/dolorem-vitae-voluptas-architecto/ + + + + 56 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Nulla provident aut dolores velit fuga.]]> + http://basic-wp.test/nulla-provident-aut-dolores-velit-fuga/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/nulla-provident-aut-dolores-velit-fuga/ + + + + 58 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Dignissimos est sint et esse ut.]]> + http://basic-wp.test/dignissimos-est-sint-et-esse-ut/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/dignissimos-est-sint-et-esse-ut/ + + + + 60 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Praesentium quia qui sequi dicta.]]> + http://basic-wp.test/praesentium-quia-qui-sequi-dicta/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/praesentium-quia-qui-sequi-dicta/ + + + + 62 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Et dolor dolor voluptas temporibus.]]> + http://basic-wp.test/et-dolor-dolor-voluptas-temporibus/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/et-dolor-dolor-voluptas-temporibus/ + + + + 64 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Laboriosam quae enim suscipit a.]]> + http://basic-wp.test/laboriosam-quae-enim-suscipit-a/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/laboriosam-quae-enim-suscipit-a/ + + + + 66 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Ab corrupti libero molestiae et.]]> + http://basic-wp.test/ab-corrupti-libero-molestiae-et/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/ab-corrupti-libero-molestiae-et/ + + + + 68 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Magnam atque et sed itaque aut.]]> + http://basic-wp.test/magnam-atque-et-sed-itaque-aut/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/magnam-atque-et-sed-itaque-aut/ + + + + 70 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Veniam aut qui atque eum.]]> + http://basic-wp.test/veniam-aut-qui-atque-eum/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/veniam-aut-qui-atque-eum/ + + + + 72 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Nam quo rem enim incidunt.]]> + http://basic-wp.test/nam-quo-rem-enim-incidunt/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/nam-quo-rem-enim-incidunt/ + + + + 74 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Ut ratione asperiores autem.]]> + http://basic-wp.test/ut-ratione-asperiores-autem/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/ut-ratione-asperiores-autem/ + + + + 76 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Non porro qui sed quam soluta hic.]]> + http://basic-wp.test/non-porro-qui-sed-quam-soluta-hic/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/non-porro-qui-sed-quam-soluta-hic/ + + + + 78 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Quidem quis nihil numquam ea facere.]]> + http://basic-wp.test/quidem-quis-nihil-numquam-ea-facere/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/quidem-quis-nihil-numquam-ea-facere/ + + + + 80 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Rerum eligendi sint vero quia.]]> + http://basic-wp.test/rerum-eligendi-sint-vero-quia/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/rerum-eligendi-sint-vero-quia/ + + + + 82 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Vel consectetur vero laudantium.]]> + http://basic-wp.test/vel-consectetur-vero-laudantium/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/vel-consectetur-vero-laudantium/ + + +

Minima inventore sint fuga recusandae nulla qui. Voluptatum eveniet quo odit sunt et ducimus enim. Aut itaque laboriosam sit.

+ + + +

Et minima iure hic porro ut sit. Ratione occaecati voluptatum odio voluptatum voluptatem molestias. Accusantium alias et dignissimos fugit iusto ducimus. Aut perferendis minima dolores et.

+ + + +

Rem saepe omnis minima molestias porro magnam. Quia ducimus quidem culpa exercitationem voluptas rerum occaecati. Qui qui odio nulla ea. Illum impedit vero inventore quis omnis nobis commodi.Vel ut officia odit sit in atque omnis. Quia ullam voluptate temporibus et culpa dolor rerum. Asperiores aliquid illo quod. Aliquam ratione quos voluptas inventore. Voluptatem et doloribus ducimus voluptatem. Et voluptas quia quos pariatur occaecati. Aut pariatur enim et dolor non aut error accusantium. Officia velit iure atque minus recusandae blanditiis fugiat. Culpa reiciendis aut eos quidem quaerat consequuntur magnam. Beatae et beatae culpa explicabo modi. Et ut voluptatem porro aliquam nulla quam fugiat. Sit accusantium necessitatibus et corporis aut. Magni qui sapiente ea nulla qui sit. Quisquam est nulla repellendus est illum. Sit quo alias quia suscipit ut odit et laboriosam.

+]]>
+ + 84 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[Adipisci natus fugit illum nemo.]]> + http://basic-wp.test/adipisci-natus-fugit-illum-nemo/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/adipisci-natus-fugit-illum-nemo/ + + + + 86 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Ipsum quos non nihil ipsa fugit.]]> + http://basic-wp.test/ipsum-quos-non-nihil-ipsa-fugit/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/ipsum-quos-non-nihil-ipsa-fugit/ + + + + 88 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Totam nam molestiae quo et hic.]]> + http://basic-wp.test/totam-nam-molestiae-quo-et-hic/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/totam-nam-molestiae-quo-et-hic/ + + + + 90 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Aut quia quia qui excepturi itaque.]]> + http://basic-wp.test/aut-quia-quia-qui-excepturi-itaque/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/aut-quia-quia-qui-excepturi-itaque/ + + + + 92 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Voluptatum consequatur quae dolor cum.]]> + http://basic-wp.test/voluptatum-consequatur-quae-dolor-cum/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/voluptatum-consequatur-quae-dolor-cum/ + + + + 94 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Eveniet eaque veritatis aut voluptas.]]> + http://basic-wp.test/eveniet-eaque-veritatis-aut-voluptas/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/eveniet-eaque-veritatis-aut-voluptas/ + + + + 96 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Voluptate at aut minima alias.]]> + http://basic-wp.test/voluptate-at-aut-minima-alias/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/voluptate-at-aut-minima-alias/ + + + + 98 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Quasi consequatur ut ut aut.]]> + http://basic-wp.test/quasi-consequatur-ut-ut-aut/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/quasi-consequatur-ut-ut-aut/ + + + + 100 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Ratione facilis expedita nostrum.]]> + http://basic-wp.test/ratione-facilis-expedita-nostrum/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/ratione-facilis-expedita-nostrum/ + + + + 102 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Dolore quod minus veniam dolore.]]> + http://basic-wp.test/dolore-quod-minus-veniam-dolore/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/dolore-quod-minus-veniam-dolore/ + + + + 104 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Eos nihil facilis aut esse.]]> + http://basic-wp.test/eos-nihil-facilis-aut-esse/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/eos-nihil-facilis-aut-esse/ + + + + 106 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Minus qui aspernatur ut saepe sapiente.]]> + http://basic-wp.test/minus-qui-aspernatur-ut-saepe-sapiente/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/minus-qui-aspernatur-ut-saepe-sapiente/ + + + + 108 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Dolorem nam nesciunt quos.]]> + http://basic-wp.test/dolorem-nam-nesciunt-quos/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/dolorem-nam-nesciunt-quos/ + + + + 110 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Hic sed ex vel doloribus sapiente.]]> + http://basic-wp.test/hic-sed-ex-vel-doloribus-sapiente/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/hic-sed-ex-vel-doloribus-sapiente/ + + + + 112 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Doloremque omnis nobis vel rem ut vero.]]> + http://basic-wp.test/doloremque-omnis-nobis-vel-rem-ut-vero/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/doloremque-omnis-nobis-vel-rem-ut-vero/ + + + + 114 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Mollitia quo aut dolor.]]> + http://basic-wp.test/mollitia-quo-aut-dolor/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/mollitia-quo-aut-dolor/ + + + + 116 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Modi est nobis modi quasi doloremque.]]> + http://basic-wp.test/modi-est-nobis-modi-quasi-doloremque/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/modi-est-nobis-modi-quasi-doloremque/ + + + + 118 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Excepturi dolore modi eius doloribus.]]> + http://basic-wp.test/excepturi-dolore-modi-eius-doloribus/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/excepturi-dolore-modi-eius-doloribus/ + + + + 120 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Fugit eum labore cupiditate.]]> + http://basic-wp.test/fugit-eum-labore-cupiditate/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/fugit-eum-labore-cupiditate/ + + + + 122 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Aut eos cumque sit beatae.]]> + http://basic-wp.test/aut-eos-cumque-sit-beatae/ + Sat, 15 Mar 2025 00:00:00 +0000 + + http://basic-wp.test/2025/03/15/aut-eos-cumque-sit-beatae/ + + + + 124 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + + + <![CDATA[Aut soluta totam fuga dolores.]]> + http://basic-wp.test/resources/aut-soluta-totam-fuga-dolores/ + Mon, 06 Feb 2023 08:13:41 +0000 + + http://basic-wp.test/resources/aut-soluta-totam-fuga-dolores/ + + + + 357 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Est ipsa tempore veniam officia et est.]]> + http://basic-wp.test/resources/est-ipsa-tempore-veniam-officia-et-est/ + Fri, 03 Feb 2023 22:44:27 +0000 + + http://basic-wp.test/resources/est-ipsa-tempore-veniam-officia-et-est/ + + + + 365 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Culpa ea blanditiis ipsam.]]> + http://basic-wp.test/resources/culpa-ea-blanditiis-ipsam/ + Fri, 20 Jan 2023 06:54:31 +0000 + + http://basic-wp.test/resources/culpa-ea-blanditiis-ipsam/ + + + + 417 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Earum quis quasi qui in.]]> + http://basic-wp.test/resources/earum-quis-quasi-qui-in/ + Mon, 31 Jul 2023 07:18:34 +0000 + + http://basic-wp.test/resources/earum-quis-quasi-qui-in/ + + + + 337 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Consequatur omnis quo tempora amet.]]> + http://basic-wp.test/resources/consequatur-omnis-quo-tempora-amet/ + Thu, 21 Dec 2023 04:37:54 +0000 + + http://basic-wp.test/resources/consequatur-omnis-quo-tempora-amet/ + + + + 343 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[At optio eos quibusdam.]]> + http://basic-wp.test/resources/at-optio-eos-quibusdam/ + Sat, 01 Apr 2023 16:06:54 +0000 + + http://basic-wp.test/resources/at-optio-eos-quibusdam/ + + + + 345 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Et nihil ipsam et magnam.]]> + http://basic-wp.test/resources/et-nihil-ipsam-et-magnam/ + Fri, 03 Nov 2023 22:25:51 +0000 + + http://basic-wp.test/resources/et-nihil-ipsam-et-magnam/ + + + + 347 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Dicta cum repellendus qui qui ut.]]> + http://basic-wp.test/resources/dicta-cum-repellendus-qui-qui-ut/ + Mon, 03 Jul 2023 13:29:58 +0000 + + http://basic-wp.test/resources/dicta-cum-repellendus-qui-qui-ut/ + + + + 351 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Architecto quam molestias et.]]> + http://basic-wp.test/resources/architecto-quam-molestias-et/ + Sun, 18 Jun 2023 16:57:58 +0000 + + http://basic-wp.test/resources/architecto-quam-molestias-et/ + + + + 353 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Voluptatibus quo ipsum dolor omnis.]]> + http://basic-wp.test/resources/voluptatibus-quo-ipsum-dolor-omnis/ + Thu, 14 Dec 2023 02:14:07 +0000 + + http://basic-wp.test/resources/voluptatibus-quo-ipsum-dolor-omnis/ + + + + 361 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Eius deserunt nemo a.]]> + http://basic-wp.test/resources/eius-deserunt-nemo-a/ + Tue, 04 Apr 2023 18:24:03 +0000 + + http://basic-wp.test/resources/eius-deserunt-nemo-a/ + + + + 367 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Officia necessitatibus neque enim.]]> + http://basic-wp.test/resources/officia-necessitatibus-neque-enim/ + Mon, 24 Apr 2023 07:43:27 +0000 + + http://basic-wp.test/resources/officia-necessitatibus-neque-enim/ + + + + 373 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Voluptas id non voluptate quod aut.]]> + http://basic-wp.test/resources/voluptas-id-non-voluptate-quod-aut/ + Thu, 07 Dec 2023 13:25:44 +0000 + + http://basic-wp.test/resources/voluptas-id-non-voluptate-quod-aut/ + + + + 375 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Aut nemo sint consequatur molestiae.]]> + http://basic-wp.test/resources/aut-nemo-sint-consequatur-molestiae/ + Mon, 07 Aug 2023 06:23:16 +0000 + + http://basic-wp.test/resources/aut-nemo-sint-consequatur-molestiae/ + + + + 377 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Voluptate fugiat nemo nisi.]]> + http://basic-wp.test/resources/voluptate-fugiat-nemo-nisi/ + Mon, 13 Nov 2023 00:50:51 +0000 + + http://basic-wp.test/resources/voluptate-fugiat-nemo-nisi/ + + + + 379 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Eum sint expedita doloremque.]]> + http://basic-wp.test/resources/eum-sint-expedita-doloremque/ + Tue, 27 Jun 2023 15:23:22 +0000 + + http://basic-wp.test/resources/eum-sint-expedita-doloremque/ + + + + 389 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Eum dolorem in qui.]]> + http://basic-wp.test/resources/eum-dolorem-in-qui/ + Mon, 27 Nov 2023 17:14:27 +0000 + + http://basic-wp.test/resources/eum-dolorem-in-qui/ + + + + 391 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Id enim iusto quis est dolorem.]]> + http://basic-wp.test/resources/id-enim-iusto-quis-est-dolorem/ + Wed, 10 May 2023 08:47:30 +0000 + + http://basic-wp.test/resources/id-enim-iusto-quis-est-dolorem/ + + + + 397 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Blanditiis est voluptatem quisquam rem.]]> + http://basic-wp.test/resources/blanditiis-est-voluptatem-quisquam-rem/ + Thu, 21 Dec 2023 03:24:52 +0000 + + http://basic-wp.test/resources/blanditiis-est-voluptatem-quisquam-rem/ + + + + 401 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Velit deleniti nam autem rem.]]> + http://basic-wp.test/resources/velit-deleniti-nam-autem-rem/ + Sun, 23 Apr 2023 06:31:06 +0000 + + http://basic-wp.test/resources/velit-deleniti-nam-autem-rem/ + + + + 413 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Inventore ad pariatur quia.]]> + http://basic-wp.test/resources/inventore-ad-pariatur-quia/ + Fri, 22 Sep 2023 22:38:42 +0000 + + http://basic-wp.test/resources/inventore-ad-pariatur-quia/ + + + + 427 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Excepturi quidem a magnam quas.]]> + http://basic-wp.test/resources/excepturi-quidem-a-magnam-quas/ + Tue, 09 Jan 2024 05:40:55 +0000 + + http://basic-wp.test/resources/excepturi-quidem-a-magnam-quas/ + + + + 429 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Omnis architecto ut aut dicta.]]> + http://basic-wp.test/resources/omnis-architecto-ut-aut-dicta/ + Tue, 30 May 2023 06:34:08 +0000 + + http://basic-wp.test/resources/omnis-architecto-ut-aut-dicta/ + + + + 433 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Primary]]> + http://basic-wp.test/primary/ + Sat, 15 Mar 2025 19:24:58 +0000 + + http://basic-wp.test/2025/03/15/primary/ + + ]]> + + 152 + + + + + + + + + 0 + 0 + + + 0 + + + <![CDATA[Beatae et qui quia laudantium.]]> + http://basic-wp.test/resources/beatae-et-qui-quia-laudantium/ + Mon, 12 Feb 2024 21:38:43 +0000 + + http://basic-wp.test/resources/beatae-et-qui-quia-laudantium/ + + + + 349 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Autem esse repellat quasi et.]]> + http://basic-wp.test/resources/autem-esse-repellat-quasi-et/ + Thu, 18 Jan 2024 09:07:44 +0000 + + http://basic-wp.test/resources/autem-esse-repellat-quasi-et/ + + + + 355 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Nemo dolores illum quia dolor.]]> + http://basic-wp.test/resources/nemo-dolores-illum-quia-dolor/ + Sun, 14 Jan 2024 13:57:02 +0000 + + http://basic-wp.test/resources/nemo-dolores-illum-quia-dolor/ + + + + 371 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Et repudiandae maxime qui quas.]]> + http://basic-wp.test/resources/et-repudiandae-maxime-qui-quas/ + Sat, 23 Mar 2024 05:58:50 +0000 + + http://basic-wp.test/resources/et-repudiandae-maxime-qui-quas/ + + + + 385 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Saepe aliquam quaerat corporis quam.]]> + http://basic-wp.test/resources/saepe-aliquam-quaerat-corporis-quam/ + Mon, 01 Apr 2024 22:12:58 +0000 + + http://basic-wp.test/resources/saepe-aliquam-quaerat-corporis-quam/ + + + + 403 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Modi et in eum et esse quam.]]> + http://basic-wp.test/resources/modi-et-in-eum-et-esse-quam/ + Thu, 22 Feb 2024 16:04:53 +0000 + + http://basic-wp.test/resources/modi-et-in-eum-et-esse-quam/ + + + + 411 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Sed quia nulla autem recusandae unde.]]> + http://basic-wp.test/resources/sed-quia-nulla-autem-recusandae-unde/ + Fri, 01 Mar 2024 04:17:33 +0000 + + http://basic-wp.test/resources/sed-quia-nulla-autem-recusandae-unde/ + + + + 425 + + + + + + + + + 0 + 0 + + + 0 + + + + + + + + + + + <![CDATA[Custom Styles]]> + http://basic-wp.test/wp-global-styles-basic-wp/ + Sat, 12 Apr 2025 21:11:23 +0000 + + http://basic-wp.test/2025/04/12/wp-global-styles-basic-wp/ + + + + 449 + + + + + + + + + 0 + 0 + + + 0 + + + + + \ No newline at end of file diff --git a/footer.php b/footer.php new file mode 100644 index 0000000..4ce59d1 --- /dev/null +++ b/footer.php @@ -0,0 +1,111 @@ + + + + +
+
+
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+
+ + +
+ + + + diff --git a/front-page.php b/front-page.php new file mode 100644 index 0000000..10b0719 --- /dev/null +++ b/front-page.php @@ -0,0 +1,27 @@ + + +
+
+ +
+
+ + diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..59e3d91 --- /dev/null +++ b/functions.php @@ -0,0 +1,38 @@ + + + +> + + + <?php wp_title( '' ); ?> + + + + + + +> + + + + +
+ + + diff --git a/index.php b/index.php new file mode 100644 index 0000000..108af7f --- /dev/null +++ b/index.php @@ -0,0 +1,100 @@ + + +
+ +
+
+
+ +
+
+ + + + <?php echo esc_attr( $imgAlt ); ?> + +
+ +
+
+ Posted in: + $category ) : + $separator = $index < count( $categories ) - 1 ? ', ' : ''; + ?> + name ); ?> + +
+ + +

+
+ +
+ +
+ + +
+
+ +
+ +
+ 2, + 'prev_text' => '« Previous', + 'next_text' => 'Next »', + ) + ); + ?> +
+
+
+ +
+
+

Nothing here yet…

+

No published posts found.

+
+
+ + + + + +
+ + diff --git a/lib/activation.php b/lib/activation.php new file mode 100644 index 0000000..94d4e5d --- /dev/null +++ b/lib/activation.php @@ -0,0 +1,251 @@ + array(), + 'News' => array(), + 'Page Not Found (Error 404)' => array(), + 'Contact Us' => array(), + /** + * Sample nested structure + * + * 'Parent Page' => array( + * 'Subpage 1' => array( + * 'Sub-subpage 1', + * 'Sub-subpage 2' + * ), + * 'Subpage 2.2' => array() + * ), + */ + ); + + foreach ( $arrPages as $pageTitle => $childPages ) { + // phpcs:ignore + $pageExists = get_page_by_title($pageTitle); + + if ( ! $pageExists ) { + // Create the parent page + $pageId = wp_insert_post( + array( + 'post_title' => $pageTitle, + 'post_content' => '', + 'post_type' => 'page', + 'post_status' => 'publish', + ) + ); + + // If there are child pages, create them under the parent page + foreach ( $childPages as $childPageTitle => $subChildPages ) { + if ( is_array( $subChildPages ) ) { + $subpageId = wp_insert_post( + array( + 'post_title' => $childPageTitle, + 'post_content' => '', + 'post_type' => 'page', + 'post_status' => 'publish', + 'post_parent' => $pageId, + ) + ); + + foreach ( $subChildPages as $subChildPageTitle ) { + wp_insert_post( + array( + 'post_title' => $subChildPageTitle, + 'post_content' => '', + 'post_type' => 'page', + 'post_status' => 'publish', + 'post_parent' => $subpageId, + ) + ); + } + } else { + wp_insert_post( + array( + 'post_title' => $childPageTitle, + 'post_content' => '', + 'post_type' => 'page', + 'post_status' => 'publish', + 'post_parent' => $pageId, + ) + ); + } + } + } + } + + // Use a static front page + // phpcs:ignore + $home = get_page_by_title('Home'); + update_option( 'page_on_front', $home->ID ); + update_option( 'show_on_front', 'page' ); + + // Set the blog/news page + // phpcs:ignore + $news = get_page_by_title('News'); + update_option( 'page_for_posts', $news->ID ); + + // Trash the samples + wp_delete_post( 1, true ); + wp_delete_post( 2, true ); + + // Flush rewrite rules to ensure new pages are recognized + flush_rewrite_rules(); + + /** + * Install and activate must-use plugins + */ + + $muPlugins = array( + array( + 'url' => 'https://docs.vincentdevelopment.ca/files/advanced-custom-fields-pro.zip', + 'active' => true, + ), + array( + 'url' => 'https://docs.vincentdevelopment.ca/files/gravity-forms.zip', + 'active' => true, + ), + array( + 'url' => 'https://updraftplus.com/wp-content/uploads/updraftplus.zip', + 'active' => false, + ), + array( + 'url' => 'https://downloads.wordpress.org/plugin/simple-history.5.11.0.zip', + 'active' => true, + ), + array( + 'url' => 'https://downloads.wordpress.org/plugin/autodescription.5.1.2.zip', + 'active' => true, + ), + array( + 'url' => 'https://downloads.wordpress.org/plugin/better-search-replace.1.4.10.zip', + 'active' => true, + ), + array( + 'url' => 'https://downloads.wordpress.org/plugin/google-site-kit.1.153.0.zip', + 'active' => false, + ), + ); + + // Custom log file + $logFile = WP_CONTENT_DIR . '/mu-plugin-install.log'; + + /** + * Simple logging function. + * + * @param string $message The message to log. + */ + function log_message( $message ) { + global $logFile; + $timestamp = gmdate( 'Y-m-d H:i:s' ); + // phpcs:ignore + file_put_contents( $logFile, "[$timestamp] $message\n", FILE_APPEND ); + } + + // Include necessary WordPress files + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + + // Force direct filesystem access + add_filter( 'filesystem_method', fn() => 'direct' ); + + global $wp_filesystem; + if ( ! WP_Filesystem() ) { + log_message( 'Filesystem initialization failed.' ); + return; + } + + // Define a silent skin to avoid show_message() errors + // phpcs:disable + class Silent_Upgrader_Skin extends WP_Upgrader_Skin { + public function feedback( $string, ...$args ) {} + public function header() {} + public function footer() {} + public function error( $errors ) { + log_message( 'Upgrader error: ' . print_r( $errors, true ) ); + } + public function before() {} + public function after() {} + } + // phpcs:enable + + $skin = new Silent_Upgrader_Skin(); + $upgrader = new Plugin_Upgrader( $skin ); + + // Process each plugin + foreach ( $muPlugins as $plug ) { + $plugUrl = $plug['url']; + $shouldActivate = ! empty( $plug['active'] ); + + // Download plugin + $response = wp_remote_get( $plugUrl ); + if ( is_wp_error( $response ) ) { + log_message( "Failed to download plugin from {$plugUrl}: " . $response->get_error_message() ); + continue; + } + + // Extract filename from URL + $plugFileName = basename( wp_parse_url( $plugUrl, PHP_URL_PATH ) ); + + // Save the plugin zip + $plugZip = wp_upload_bits( $plugFileName, null, wp_remote_retrieve_body( $response ) ); + if ( $plugZip['error'] ) { + log_message( "Failed to save plugin zip {$plugFileName}: " . $plugZip['error'] ); + continue; + } + + // Install the plugin + $installResult = $upgrader->install( $plugZip['file'] ); + if ( is_wp_error( $installResult ) ) { + log_message( "Failed to install plugin {$plugFileName}: " . $installResult->get_error_message() ); + // Cleanup temp zip + if ( file_exists( $plugZip['file'] ) ) { + wp_delete_file( $plugZip['file'] ); + } + continue; + } + + // Get plugin info ( folder/main file ) + $plugInfo = $upgrader->plugin_info(); + log_message( "plugin_info for {$plugFileName}: {$plugInfo}" ); + + if ( ! $plugInfo || ! file_exists( WP_PLUGIN_DIR . '/' . $plugInfo ) ) { + log_message( "Could not determine installed plugin file for {$plugFileName}." ); + // Cleanup temp zip + if ( file_exists( $plugZip['file'] ) ) { + wp_delete_file( $plugZip['file'] ); + } + continue; + } + + log_message( "Successfully installed plugin {$plugInfo}." ); + + // Attempt activation if marked active + if ( $shouldActivate ) { + $activateResult = activate_plugin( $plugInfo ); + if ( is_wp_error( $activateResult ) ) { + log_message( "Failed to activate plugin {$plugInfo}: " . $activateResult->get_error_message() ); + } else { + log_message( "Successfully activated plugin {$plugInfo}." ); + } + } else { + log_message( "Plugin {$plugInfo} installed but not activated ( per configuration )." ); + } + + // Cleanup temp zip + if ( file_exists( $plugZip['file'] ) ) { + wp_delete_file( $plugZip['file'] ); + log_message( "Deleted temporary zip file {$plugZip['file']}." ); + } + } + + log_message( '=== Plugin installation and activation process completed ===' ); +} diff --git a/lib/class-acf.php b/lib/class-acf.php new file mode 100644 index 0000000..65116db --- /dev/null +++ b/lib/class-acf.php @@ -0,0 +1,59 @@ +path = get_stylesheet_directory() . '/acf'; + add_filter( 'acf/settings/load_json', array( $this, 'loadJson' ) ); + add_filter( 'acf/settings/save_json', array( $this, 'saveJson' ) ); + } + + /** Save JSON. + * + * @param mixed $path The path to save the JSON file. + */ + // phpcs:ignore + public function saveJson( $path ) { + return $this->path; + } + + /** Load JSON. + * + * @param mixed $paths The paths to load the JSON file. + */ + // phpcs:ignore + public function loadJson( $paths ) { + return array( $this->path ); + } +} + +if ( function_exists( 'get_fields' ) ) { + $acfInstance = new ACF(); +} diff --git a/lib/class-breadcrumbs.php b/lib/class-breadcrumbs.php new file mode 100644 index 0000000..c89c699 --- /dev/null +++ b/lib/class-breadcrumbs.php @@ -0,0 +1,396 @@ + home_url(), + 'label' => 'Home', + ); + } + + /** Generates the breadcrumb for the blog posts index page. + * + * This method is responsible for creating a breadcrumb entry + * that represents the blog posts index page in the breadcrumb trail. + * + * @return array An associative array representing the breadcrumb for the blog posts index page. + */ + private static function getBlogPostsIndexBreadcrumb() { + return array( 'label' => get_the_title( get_option( 'page_for_posts' ) ) ); + } + + /** Generates the breadcrumb trail for a single post. + * + * This method is responsible for creating the breadcrumb navigation + * specific to single post views. It typically includes links to the + * homepage, category (or categories) the post belongs to, and the + * post title itself. + * + * @return array An array representing the breadcrumb trail, where each + * element is a breadcrumb item (e.g., URL and label). + */ + private static function getSinglePostBreadcrumbs() { + $breadcrumbs = array(); + $categories = get_the_category(); + + $breadcrumbs[] = array( + 'url' => get_permalink( get_option( 'page_for_posts' ) ), + 'label' => get_the_title( get_option( 'page_for_posts' ) ), + ); + + if ( ! empty( $categories ) ) { + $cat = $categories[0]; + $breadcrumbs[] = array( + 'url' => get_category_link( $cat ), + 'label' => $cat->name, + ); + } + + $breadcrumbs[] = array( 'label' => get_the_title() ); + return $breadcrumbs; + } + + /** Generates breadcrumbs for custom post types. + * + * This method is responsible for creating breadcrumb navigation + * specific to custom post types. It retrieves and formats the + * breadcrumb trail based on the custom post type's hierarchy + * and structure. + * + * @return array An array representing the breadcrumb trail for the custom post type. + */ + private static function getCustomPostTypeBreadcrumbs() { + $breadcrumbs = array(); + $postType = get_post_type_object( get_post_type() ); + if ( $postType && ! in_array( get_post_type(), array( 'post', 'page' ), true ) ) { + $breadcrumbs[] = array( + 'url' => get_post_type_archive_link( $postType->name ), + 'label' => $postType->labels->name, + ); + } + $breadcrumbs[] = array( 'label' => get_the_title() ); + return $breadcrumbs; + } + + /** Generates breadcrumbs for a static page. + * + * This method is responsible for creating breadcrumb navigation + * for static pages in a WordPress theme. It utilizes the provided + * post object to determine the breadcrumb structure. + * + * @param WP_Post $post The WordPress post object representing the static page. + * @return array An array of breadcrumb items, where each item is typically + * an associative array containing 'title' and 'url' keys. + */ + private static function getStaticPageBreadcrumbs( $post ) { + $breadcrumbs = array(); + if ( $post->post_parent ) { + $ancestors = array_reverse( get_post_ancestors( $post->ID ) ); + foreach ( $ancestors as $ancestor ) { + $breadcrumbs[] = array( + 'url' => get_permalink( $ancestor ), + 'label' => get_the_title( $ancestor ), + ); + } + } + $breadcrumbs[] = array( 'label' => get_the_title() ); + return $breadcrumbs; + } + + /** Generates a breadcrumb for taxonomy archive pages. + * + * This method is responsible for creating breadcrumb navigation + * specific to taxonomy archive pages, providing users with a clear + * path to navigate back to the taxonomy or related sections. + * + * @return array An array representing the breadcrumb trail for the taxonomy archive. + */ + private static function getTaxonomyArchiveBreadcrumb() { + $term = get_queried_object(); + return $term && isset( $term->name ) ? array( 'label' => $term->name ) : array(); + } + + /** Generates a breadcrumb for the archive page of a custom post type. + * + * This method is responsible for creating a breadcrumb link that points + * to the archive page of a specific custom post type. It is typically used + * in breadcrumb navigation to provide users with a way to navigate back + * to the archive page of the post type they are currently viewing. + * + * @return array An array containing the breadcrumb data for the custom post type archive. + */ + private static function getPostTypeArchiveBreadcrumb() { + $postType = get_post_type_object( get_post_type() ); + return $postType ? array( 'label' => $postType->labels->name ) : array(); + } + + /** Generates breadcrumbs for date-based archives. + * + * This method is responsible for creating breadcrumb navigation + * for WordPress date archive pages, such as year, month, or day archives. + * + * @return array An array representing the breadcrumb trail for the date archive. + */ + private static function getDateArchiveBreadcrumbs() { + return array( + array( + 'url' => get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ), + 'label' => get_the_date( 'F Y' ), + ), + array( 'label' => get_the_date() ), + ); + } + + /** Generates a breadcrumb for a monthly archive page. + * + * This method is responsible for creating a breadcrumb + * specific to WordPress monthly archive pages. It typically + * includes the year and month as part of the breadcrumb trail. + * + * @return string The HTML markup for the monthly archive breadcrumb. + */ + private static function getMonthArchiveBreadcrumb() { + return array( 'label' => get_the_date( 'F Y' ) ); + } + + /** Generates a breadcrumb for the year-based archive page. + * + * This method is responsible for creating a breadcrumb link + * specific to the year archive in a WordPress site. It is typically + * used to provide navigation for users when they are viewing posts + * filtered by a specific year. + * + * @return string The HTML markup for the year archive breadcrumb. + */ + private static function getYearArchiveBreadcrumb() { + return array( 'label' => get_the_date( 'Y' ) ); + } + + /** Generates the breadcrumb for the author archive page. + * + * This method is responsible for creating a breadcrumb trail + * specific to the author archive, providing navigation context + * for pages that display posts by a particular author. + * + * @return string The HTML markup for the author archive breadcrumb. + */ + private static function getAuthorArchiveBreadcrumb() { + $author = get_queried_object(); + return array( 'label' => 'Author: ' . $author->display_name ); + } + + /** Generates the breadcrumb for search results. + * + * This method is responsible for creating a breadcrumb trail + * specific to search result pages. It helps users navigate back + * to the search context or other parts of the site. + * + * @return string The HTML markup for the search breadcrumb. + */ + private static function getSearchBreadcrumb() { + return array( 'label' => 'Search: ' . get_search_query() ); + } + + /** Generates the breadcrumb trail for a 404 error page. + * + * This method is responsible for creating a breadcrumb structure + * specifically for 404 error pages, providing users with a navigational + * context when a requested page is not found. + * + * @return array An array representing the breadcrumb trail for the 404 page. + */ + private static function get404Breadcrumb() { + return array( 'label' => '404 Not Found' ); + } + + /** Renders the breadcrumb navigation. + * + * This method generates and outputs the breadcrumb trail for the current page. + * + * @return void + */ + public static function render() { + $items = self::generate(); + + $metadata = array( + '@context' => 'https://schema.org', + '@type' => 'BreadcrumbList', + 'itemListElement' => array(), + ); + + ob_start(); + ?> + + + + + + array( + 'class' => array(), + 'href' => array(), + 'title' => array(), + 'rel' => array(), + 'target' => array(), + 'aria-label' => array(), + 'aria-current' => array(), + ), + 'nav' => array( + 'aria-label' => array(), + 'class' => array(), + 'vocab' => array(), + 'typeof' => array(), + ), + 'span' => array( + 'class' => array(), + 'aria-current' => array(), + ), + 'svg' => array( + 'class' => array(), + 'xmlns' => array(), + 'viewBox' => array(), + 'fill' => array(), + 'aria-hidden' => array(), + 'aria-label' => array(), + ), + 'path' => array( + 'd' => array(), + 'fill-rule' => array(), + 'clip-rule' => array(), + 'fill' => array(), + 'xmlns:xlink' => array(), + ), + 'script' => array( + 'type' => array(), + 'src' => array(), + ), + ) + ); + } +} diff --git a/lib/class-enqueue.php b/lib/class-enqueue.php new file mode 100644 index 0000000..2058a8a --- /dev/null +++ b/lib/class-enqueue.php @@ -0,0 +1,112 @@ +displayLocation = $menuName; + + $this->topLevelNavItems = $this->getTopLevelNavItems(); + $this->hasChildren = function ( $item ) { + return $this->hasChildren( $item ); + }; + $this->nestedNavItems = function ( $parentItem ) { + return $this->getNestedNavItems( $parentItem ); + }; + $this->currentPage = function ( $item ) { + return $this->currentPage( $item ); + }; + } + + /** + * Retrieves the list of menus. + * + * @return array An array containing menu items. + */ + public function getMenus() { + $menus = get_nav_menu_locations(); + return empty( $menus ) ? array() : $menus; + } + + /** + * Retrieves the navigation items. + * + * @return array An array of navigation items. + */ + public function getNavItems() { + $locations = $this->getMenus(); + + // If the menu location doesn't exist, return empty array + if ( ! isset( $locations[ $this->displayLocation ] ) ) { + return array(); + } + + // Get the menu ID for this location + $menuId = $locations[ $this->displayLocation ]; + + // Direct call to wp_get_nav_menu_items with the menu ID + $items = wp_get_nav_menu_items( $menuId ); + + // Return empty array if no items + return is_array( $items ) ? $items : array(); + } + + /** + * Checks if the given parent item has child items. + * + * @param mixed $parentItem The parent item to check for children. + * @return bool Returns true if the parent item has children, false otherwise. + */ + public function hasChildren( $parentItem ) { + foreach ( $this->getNavItems() as $item ) { + if ( $item->menu_item_parent === strval( $parentItem->ID ) ) { + return true; + } + } + return false; + } + + /** + * Retrieves the top-level navigation items. + * + * @return array An array of top-level navigation items. + */ + public function getTopLevelNavItems() { + $items = array(); + foreach ( $this->getNavItems() as $item ) { + if ( $item->menu_item_parent === '0' ) { + array_push( $items, $item ); + } + } + return $items; + } + + /** + * Retrieves the nested navigation items for a given parent item. + * + * @param mixed $parentItem The parent navigation item for which nested items are to be retrieved. + * @return array The list of nested navigation items. + */ + public function getNestedNavItems( $parentItem ) { + $childrenItems = array(); + foreach ( $this->getNavItems() as $item ) { + if ( $item->menu_item_parent === strval( $parentItem->ID ) ) { + array_push( $childrenItems, $item ); + } + } + return $childrenItems; + } + + /** + * Determines the current page based on the provided item. + * + * @param mixed $item The item used to determine the current page. + * @return mixed The current page information. + */ + public function currentPage( $item ) { + global $wp; + return ( $item->url === home_url( $wp->request ) . '/' ) ? 'true' : 'false'; + } + + /** + * Renders the output for the current context. + * + * This method is responsible for generating and returning the + * appropriate output for the current context or request. + * + * @return void + */ + public function render() { + global $views; + + // Extract class properties to local variables + $location = $this->displayLocation; + $topLevelNavItems = $this->topLevelNavItems; + $hasChildren = $this->hasChildren; + $nestedNavItems = $this->nestedNavItems; + $currentPage = $this->currentPage; + + include $views . '/components/menu-items/index.php'; + } +} diff --git a/lib/class-resources.php b/lib/class-resources.php new file mode 100644 index 0000000..12e58ac --- /dev/null +++ b/lib/class-resources.php @@ -0,0 +1,129 @@ + array( + 'name' => 'Resources', + 'singular_name' => 'Resource', + 'menu_name' => 'Resources', + 'name_admin_bar' => 'Resource', + 'add_new' => 'Add New Resource', + 'add_new_item' => 'Add New Resource', + 'edit_item' => 'Edit Resource', + 'new_item' => 'New Resource', + 'view_item' => 'View Resource', + 'search_items' => 'Search Resources', + 'not_found' => 'No resources found', + 'not_found_in_trash' => 'No resources found in Trash', + ), + 'public' => true, + 'has_archive' => true, + 'rewrite' => array( 'slug' => 'resources' ), + 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'revisions', 'custom-fields' ), + 'menu_position' => 20, + 'menu_icon' => 'dashicons-hammer', + 'show_in_rest' => true, + ) + ); + } + + /** + * Registers a custom taxonomy. + * + * This method is responsible for defining and registering a custom taxonomy + * within the WordPress environment. It should include the necessary arguments + * and settings for the taxonomy to function as intended. + * + * @return void + */ + public function registerTaxonomy() { + register_taxonomy( + 'resource_type', + array( 'resources' ), + array( + 'labels' => array( + 'name' => 'Resource Types', + 'singular_name' => 'Resource Type', + 'search_items' => 'Search Resource Types', + 'all_items' => 'All Resource Types', + 'parent_item' => 'Parent Resource Type', + 'parent_item_colon' => 'Parent Resource Type:', + 'edit_item' => 'Edit Resource Type', + 'update_item' => 'Update Resource Type', + 'add_new_item' => 'Add New Resource Type', + 'new_item_name' => 'New Resource Type Name', + 'menu_name' => 'Resource Types', + ), + 'public' => true, + 'hierarchical' => true, + 'show_admin_column' => true, + 'rewrite' => array( + 'slug' => 'resources', + 'with_front' => false, + 'hierarchical' => true, + ), + 'show_in_rest' => true, + ) + ); + } + + /** + * Filters the permalink for a post of a specific post type. + * + * @param string $post_link The post's permalink. + * @param WP_Post $post The post object. + * @return string The filtered post permalink. + */ + public function postTypeLink( $post_link, $post ) { + if ( 'resources' === $post->post_type ) { + $terms = get_the_terms( $post->ID, 'resource_type' ); + if ( $terms && ! is_wp_error( $terms ) ) { + $term_slug = $terms[0]->slug; + + return home_url( "resources/{$term_slug}/{$post->post_name}" ); + } + } + + return $post_link; + } +} + +new Resources(); diff --git a/lib/extras.php b/lib/extras.php new file mode 100644 index 0000000..3142418 --- /dev/null +++ b/lib/extras.php @@ -0,0 +1,260 @@ + get_the_ID(), + 'sort_order' => 'ASC', + 'sort_column' => 'menu_order', + ) + ); + + foreach ( $children as &$child ) { + $child->url = get_page_link( $child->ID ); + } + + return $children; +} + +// Modify which pages should render the sidebar. +add_filter( + 'hasSidebar', + function ( $has_sidebar ) { + // Add post types that should never have a sidebar. + + if ( is_page() && ! get_field( 'has_sidebar' ) ) { + return false; + } + + return $has_sidebar; + } +); + +/** Helper to check whether or not the sidebar should be rendered + * (to add/remove a sidebar from a page, edit the filter instead + * of modifying this function). + */ +function hasSidebar() { + return apply_filters( 'hasSidebar', true ); +} + +// Add extra body classes here. +add_filter( + 'body_class', + function ( $classes ) { + if ( hasSidebar() ) { + $classes = array_merge( $classes, array( 'has-sidebar' ) ); + } + + return $classes; + } +); + +/** + * Checks if the page should render a page header. + * + * @return bool true if page header should be rendered, false otherwise + */ +function hasPageHeader() { + global $post; + + if ( get_field( 'hero_style' ) !== 'none' ) { + return false; + } + + return true; +} + +/** Create the Owner role. + * + * This function creates a new role named "Owner" with all the capabilities of the + * Administrator role, except for the following: + * + * - activate_plugins + * - delete_plugins + * - edit_plugins + * - install_plugins + * - update_plugins + * - switch_themes + * - edit_themes + * - delete_themes + * - install_themes + * - update_themes + * - update_core + * - manage_options + * + * This role is meant to be used by a person who should have almost all the same + * capabilities as an Administrator, but should not have the ability to update + * the WordPress core software, manage plugins or themes, or edit other site + * options. + * + * @return void + */ +function createOwnerRole() { + // First, remove the role if it exists. + remove_role( 'owner' ); + + // Get the administrator role. + $admin_role = get_role( 'administrator' ); + $admin_capabilities = $admin_role->capabilities; + + // Remove specific capabilities. + $capabilities_to_remove = array( + 'activate_plugins', + 'delete_plugins', + 'edit_plugins', + 'install_plugins', + 'update_plugins', + 'switch_themes', + 'edit_themes', + 'delete_themes', + 'install_themes', + 'update_themes', + 'update_core', + 'manage_options', + ); + + foreach ( $capabilities_to_remove as $capability ) { + unset( $admin_capabilities[ $capability ] ); + } + + // Add the Owner role with the modified capabilities. + add_role( 'owner', 'Owner', $admin_capabilities ); +} +add_action( 'init', __NAMESPACE__ . '\\createOwnerRole' ); + +/** Retrieves the appropriate title for the current page context. + * + * The function determines the type of page being viewed and returns + * the corresponding title. It handles different page types, including + * the home page, single posts, archives, search results, and 404 pages. + * If none of these conditions apply, it defaults to fetching the page's title. + * + * @return string The title relevant to the current page context. + */ +function getTheTitle() { + $title = ''; + + if ( is_home() || is_single() ) { + $title = get_the_title( get_option( 'page_for_posts', true ) ); + } elseif ( is_archive() ) { + $title = get_the_archive_title(); + } elseif ( is_search() ) { + $title = sprintf( + /* translators: %s is replaced with the search query */ + __( 'Search Results for "%s"', 'basicwp' ), + get_search_query() + ); + } elseif ( is_404() ) { + $title = 'Page Not Found (error 404)'; + } else { + $title = get_the_title(); + } + + return $title; +} + +/** Wraps iframes and embed elements in a div with a specific class. + * + * This function searches for iframe and embed elements within the provided + * content and wraps each found element in a div with the class "embed". + * It is useful for applying consistent styling or responsive behavior + * to embedded media elements. + * + * @param string $content The HTML content containing iframes or embeds. + * @return string The modified content with wrapped iframes and embeds. + */ +function divWrapper( $content ) { + // match any iframes. + $pattern = '~|~'; + preg_match_all( $pattern, $content, $matches ); + + foreach ( $matches[0] as $match ) { + // wrap matched iframe with div. + $wrappedframe = '
' . $match . '
'; + + // replace original iframe with new in content. + $content = str_replace( $match, $wrappedframe, $content ); + } + + return $content; +} + +add_filter( 'the_content', __NAMESPACE__ . '\\divWrapper' ); + +/** Selectively add sidebar to page. + * + * This function adds a custom field group to the WordPress editor for + * pages, allowing users to specify whether a page should have a sidebar. + * Default is no sidebar. + * + * @return void + */ +add_action( + 'acf/include_fields', + function () { + if ( ! function_exists( 'acf_add_local_field_group' ) ) { + return; + } + + acf_add_local_field_group( + array( + 'key' => 'group_6817d79573087', + 'title' => 'Page Sidebar', + 'fields' => array( + array( + 'key' => 'field_6817d7954a168', + 'label' => '', + 'name' => 'has_sidebar', + 'aria-label' => '', + 'type' => 'true_false', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'message' => 'Should this page have a sidebar?', + 'default_value' => 0, + 'allow_in_bindings' => 0, + 'ui' => 0, + 'ui_on_text' => '', + 'ui_off_text' => '', + ), + ), + 'location' => array( + array( + array( + 'param' => 'post_type', + 'operator' => '==', + 'value' => 'page', + ), + ), + ), + 'menu_order' => 0, + 'position' => 'side', + 'style' => 'default', + 'label_placement' => 'top', + 'instruction_placement' => 'label', + 'hide_on_screen' => '', + 'active' => true, + 'description' => '', + 'show_in_rest' => 0, + ) + ); + } +); diff --git a/lib/helpers.php b/lib/helpers.php new file mode 100644 index 0000000..be9223f --- /dev/null +++ b/lib/helpers.php @@ -0,0 +1,219 @@ + $classes, + ) + ); +} + +// Add Global Fields options page. +if ( function_exists( 'acf_add_options_page' ) ) { + add_action( + 'init', + function () { + acf_add_options_page( + array( + 'page_title' => 'Global Fields', + 'menu_title' => 'Global Fields', + 'menu_slug' => 'global-fields', + 'icon_url' => 'dashicons-admin-site', + ) + ); + } + ); +} + +/** Customizes the order of the admin menu items in WordPress. + * + * This function modifies the default menu order in the WordPress admin dashboard + * by specifying a custom sequence for menu items, separators, and additional + * options. If the menu order is not specified, it returns true to allow the + * default order to be used. + * + * @param bool $menu_ord Indicates whether the menu order has been specified. + * + * @return array|bool An array specifying the custom menu order, or true if the + * menu order is not specified. + */ +function customMenuOrder( $menu_ord ) { + if ( ! $menu_ord ) { + return true; + } + + return array( + 'index.php', // Dashboard. + 'global-fields', // Global Theme Fields. + 'edit.php?post_type=acf-field-group', // ACF Field Groups. + 'separator1', // First separator. + 'edit.php', // Posts. + 'edit.php?post_type=page', // Pages. + 'edit.php?post_type=resources', // Resources. + 'upload.php', // Media. + 'separator2', // Second separator. + 'edit.php?post_type=page-template', // Page Templates. + 'edit.php?post_type=wp_block', // Reusable Blocks. + 'edit.php?post_type=block-pattern', // Block Patterns. + 'edit.php?post_type=element', // Elements. + 'separator3', // Third separator. + 'link-manager.php', // Links. + 'edit-comments.php', // Comments. + 'gf_edit_forms', // Gravity Forms. + 'themes.php', // Appearance. + 'plugins.php', // Plugins. + 'separator-last', // Last separator. + 'users.php', // Users. + 'tools.php', // Tools. + 'options-general.php', // Settings. + ); +} + +add_filter( 'custom_menu_order', __NAMESPACE__ . '\\customMenuOrder', 10, 1 ); +add_filter( 'menu_order', __NAMESPACE__ . '\\customMenuOrder', 10, 1 ); + +/** Add custom block category for our blocks + * + * @param array $categories The existing block categories. + * @return array + */ +function blockCategories( $categories ) { + $vdi_cat = array( + 'slug' => 'vdi-blocks', + 'title' => 'VDI Custom Blocks', + 'icon' => 'dashicons-admin-customizer', + ); + + array_unshift( $categories, $vdi_cat ); + return $categories; +} + +add_filter( 'block_categories_all', __NAMESPACE__ . '\\blockCategories', 10, 2 ); + +/** + * Creates a escaping function to allowed certain HTML for embed content. + * Needed for when echoing the innerblock HTML. + * + * @return array An array of HTML elements allowed. + */ +function escEmbeds() { + /** + * Return the allowed html + * These are the elements in the rendered embed block for youtube and vimeo videos. + * Therefore we need to allow these to keep the same structure. + */ + return array( + 'iframe' => array( + 'role' => true, // Add role="presentation" to iframes. + 'presentation' => true, // Add role="presentation" to iframes. + 'src' => true, + 'height' => true, + 'width' => true, + 'frameborder' => true, + 'allowfullscreen' => true, + ), + 'figure' => array( + 'class' => true, + ), + 'div' => array( + 'class' => true, + ), + ); +} + +/** + * Finds the numeric position of the first occurrence of a needle in a haystack array. + * + * @param string $haystack The string to search in. + * @param mixed $needles The array of strings to search for. + * @param int $offset (Optional) The position to start the search from. + * @return int|false The numeric position of the first occurrence of a needle in the haystack array. + */ +function strposArray( $haystack, $needles, $offset = 0 ) { + if ( is_array( $needles ) ) { + $positions = array(); + + foreach ( $needles as $str ) { + $pos = strpos( $haystack, $str, $offset ); + + if ( $pos !== false ) { + $positions[] = $pos; } + } + + return count( $positions ) ? min( $positions ) : false; + } else { + return strpos( $haystack, $needles, $offset ); + } +} + +/** + * Generates a custom excerpt for the given text. + * + * @param string $text The text to generate the excerpt from. + * @param int $number_of_words The maximum number of words in the excerpt. Default is 55. + * @param string|null $more The string to append to the end of the excerpt if it is truncated. Default is null. + * @return void + */ +function customExcerpt( $text, $number_of_words = 55, $more = null ) { + $allowed_end = array( '.', '!', '?', '...' ); + $text_no_html = wp_strip_all_tags( $text ); + $trimmed_text = wp_trim_words( $text, $number_of_words, $more ); + $trimmed_text_length = strlen( $trimmed_text ); + $sentence_end_position = strposArray( $text_no_html, $allowed_end, $trimmed_text_length ); + $text_with_html = ( ( $sentence_end_position !== false ) ? substr( $text_no_html, 0, ( $sentence_end_position + 1 ) ) : $trimmed_text ); + + echo wp_kses_post( wpautop( $text_with_html ) ); +} + +/** Print a variable to the console for debugging purposes. + * + * @param mixed $data The data to print to the console. + */ +function consoleLog( $data ) { + echo ''; +} diff --git a/lib/hooks.php b/lib/hooks.php new file mode 100644 index 0000000..af043e2 --- /dev/null +++ b/lib/hooks.php @@ -0,0 +1,301 @@ + + + + 'Main Navigation', + 'aux_navigation' => 'Auxiliary Navigation', + 'footer_navigation' => 'Footer Navigation', + ) +); + +/** + * Widget Areas + * + * Set up sidebar/widget areas for the theme. + * + * @return void + */ +add_action( + 'widgets_init', + function () { + $config = array( + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ); + + $cfg_foot = array( + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ); + + register_sidebar( + array( + 'name' => 'Primary Sidebar', + 'id' => 'sidebar-primary', + ) + $config + ); + + register_sidebar( + array( + 'name' => 'Page Sidebar', + 'id' => 'sidebar-page', + ) + $config + ); + + register_sidebar( + array( + 'name' => 'Footer Area 1', + 'id' => 'footer-1', + ) + $cfg_foot + ); + + register_sidebar( + array( + 'name' => 'Footer Area 2', + 'id' => 'footer-2', + ) + $cfg_foot + ); + + register_sidebar( + array( + 'name' => 'Footer Area 3', + 'id' => 'footer-3', + ) + $cfg_foot + ); + } +); + +/** + * Basic SEO + * + * {Site URL}: {Title} + */ +add_filter( + 'wp_title', + function ( $title ) { + $site_name = get_bloginfo( 'name' ); + + return "{$site_name}: {$title}"; + } +); + +/** + * Excerpt + */ +add_filter( + 'excerpt_more', + function () { + return '…'; + } +); + +/** + * Whether the page hero should hold the main h1 of the page. + */ +add_filter( + 'include_page_title_in_hero', + function ( $include_title ) { + // Add post types that should not use the title in the hero. + if ( is_singular( ( 'post' ) ) ) { + return false; + } + + return $include_title; + } +); + +/** + * WP Cleanup + */ +function init() { + remove_action( 'wp_head', 'print_emoji_detection_script', 7 ); + remove_action( 'wp_print_styles', 'print_emoji_styles' ); + remove_action( 'admin_print_styles', 'print_emoji_styles' ); + remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); + remove_filter( 'the_content_feed', 'wp_staticize_emoji' ); + remove_filter( 'comment_text_rss', 'wp_staticize_emoji' ); + remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' ); + wp_dequeue_style( 'wp-block-library' ); // Core block styles. + wp_dequeue_style( 'wp-block-library-theme' ); // Block theme styles. + wp_dequeue_style( 'global-styles' ); // Global styles. + wp_dequeue_style( 'core-block-supports' ); // Core block supports. + wp_dequeue_style( 'core-block-styles' ); // Core block styles. + remove_action( 'wp_enqueue_scripts', 'wp_enqueue_global_styles', 1 ); + remove_action( 'wp_enqueue_scripts', 'wp_enqueue_classic_theme_styles', 1 ); + remove_action( 'wp_head', 'wp_print_head_scripts', 9 ); + remove_action( 'wp_head', 'wp_generator' ); // WordPress version. + remove_action( 'wp_head', 'rsd_link' ); // RSD link. + remove_action( 'wp_head', 'wlwmanifest_link' ); // Windows Live Writer. + remove_action( 'wp_head', 'wp_shortlink_wp_head' ); // Shortlink. + remove_action( 'wp_head', 'rest_output_link_wp_head' ); // REST API link. + remove_action( 'wp_head', 'wp_oembed_add_discovery_links' ); // oEmbed discovery links. + remove_action( 'wp_head', 'rel_canonical' ); // Canonical URL. + remove_action( 'wp_head', 'wp_resource_hints', 2 ); // DNS Prefetch. + add_filter( 'wp_img_tag_add_width_and_height_attr', '__return_false' ); // Disable intrinsic image size. + add_filter( 'wp_img_tag_add_auto_sizes', '__return_false' ); // Disable auto sizes. + add_filter( 'xmlrpc_enabled', '__return_false' ); + + // Add theme support features + add_theme_support( 'post-thumbnails' ); + add_theme_support( 'title-tag' ); + add_theme_support( + 'html5', + array( + 'caption', + 'comment-form', + 'comment-list', + 'gallery', + 'global-search-form', + 'script', + 'style', + ) + ); + add_theme_support( 'align-wide' ); + add_theme_support( 'editor-styles' ); + add_theme_support( 'responsive-embeds' ); + add_theme_support( 'customize-selective-refresh-widgets' ); +} + +add_action( 'init', __NAMESPACE__ . '\\init', 1 ); + +/** + * Allow SVG uploads + */ +add_filter( + 'wp_check_filetype_and_ext', + function ( $data, $file, $filename, $mimes ) { + global $wp_version; + + if ( '4.7.1' !== $wp_version ) { + return $data; + } + + $filetype = wp_check_filetype( $filename, $mimes ); + + return array( + 'ext' => $filetype['ext'], + 'type' => $filetype['type'], + 'proper_filename' => $data['proper_filename'], + ); + }, + 10, + 4 +); + +add_filter( + 'upload_mimes', + function ( $mimes ) { + $mimes['svg'] = 'image/svg+xml'; + return $mimes; + } +); + +/** + * Fix display issues with SVGs in admin + */ +add_action( + 'admin_head', + function () { + echo ' + + '; + } +); + +/** + * Filters the email address used as the sender in outgoing emails. + * + * This function allows you to modify the default "from" email address + * used by WordPress when sending emails. + * + * @param string $old The original email address. + * @return string The new email address to use as the sender. + */ +// phpcs:ignore +function new_mail_from( $old ) { + return get_option( 'admin_email' ); +} + +/** + * Filters the name used as the sender in outgoing emails. + * + * This function allows you to modify the default "from" name + * used by WordPress when sending emails. + * + * @param string $old The original name. + * @return string The new name to use as the sender. + */ +// phpcs:ignore +function new_mail_from_name( $old ) { + return get_option( 'blogname' ); +} + +add_filter( 'wp_mail_from', __NAMESPACE__ . '\\new_mail_from' ); +add_filter( 'wp_mail_from_name', __NAMESPACE__ . '\\new_mail_from_name' ); + +/** + * Add child page template + */ +add_filter( + 'page_template', + function ( $template ) { + global $post; + + if ( $post->post_parent ) { + // get top level parent page + $parent = get_post( + reset( array_reverse( get_post_ancestors( $post->ID ) ) ) + ); + + $child_template = locate_template( + array( + $parent->post_name . '-child.php', + ) + ); + + if ( $child_template ) { + return $child_template; + } + } + + return $template; + } +); diff --git a/lib/search-features.php b/lib/search-features.php new file mode 100644 index 0000000..a8257af --- /dev/null +++ b/lib/search-features.php @@ -0,0 +1,122 @@ +is_main_query() && $query->is_search ) { + $query->set( 'paged', ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1 ); + $query->set( 'posts_per_page', -1 ); + } +} + +add_action( 'pre_get_posts', __NAMESPACE__ . '\\pageSearch' ); + +/** + * Sort WP_Post objects in reverse order (most recent first). + * + * @param string $key WP_Post object property used for sorting. 'post_date' is assumed. + * + * @return int + */ +function postSort( $key ) { + return function ( $a, $b ) use ( $key ) { + if ( $a->$key < $b->$key ) { + return 1; + } elseif ( $a->$key > $b->$key ) { + return -1; + } else { + // If first comparison is equal, use title as secondary sort key. + return strnatcasecmp( $a->post_title, $b->post_title ); + } + }; +} + +/** + * Remove duplicate posts in combined list from default and secondary queries. + * + * @param array $posts Array of WP_Post objects. + * @param string $key Search key used to identify duplicate objects. Post ID is used. + * + * @return array + */ +function dedupe( $posts, $key ) { + $unique_posts = array(); + $ids = array(); + + foreach ( $posts as $post ) { + if ( ! in_array( $post->$key, $ids, true ) ) { + $ids[] = $post->$key; + $unique_posts[] = $post; + } + } + + return $unique_posts; +} + +/** + * Posts_results filter hook callback. + * + * @param array $posts Array of WP_Post objects. + * @param object $query WP_Query object from default search. + * + * @return array + */ +function searchResultFilter( $posts, $query ) { + if ( \is_search() && $query->is_search() && ! \is_admin() ) { + $args = array( + 'post_type' => array( 'post', 'page' ), + 'posts_per_page' => -1, + 'tax_query' => array( + 'relation' => 'OR', // Include both tags and categories. + array( + 'taxonomy' => 'post_tag', + 'field' => 'name', + 'terms' => $query->get( 's' ), + ), + array( + 'taxonomy' => 'category', + 'field' => 'name', + 'terms' => $query->get( 's' ), + ), + ), + ); + + // Remove callback to avoid infinite loop. + remove_filter( 'posts_results', __NAMESPACE__ . '\\searchResultFilter', 10 ); + + $secondary_query = new \WP_Query( $args ); + + $tagged_posts = $secondary_query->get_posts(); + + // Combine default search results with secondary query. + $all_posts = array_merge( $posts, $tagged_posts ); + + // Remove duplicate posts. + $unique_posts = dedupe( $all_posts, 'ID' ); + + // Sort by reverse post_date order (most recent first). + usort( $unique_posts, postSort( 'post_date' ) ); + + // Restore posts_results callback. + add_filter( 'posts_results', __NAMESPACE__ . '\\searchResultFilter', 10, 2 ); + + return $unique_posts; + } else { + return $posts; + } +} + +add_filter( 'posts_results', __NAMESPACE__ . '\\searchResultFilter', 10, 2 ); diff --git a/lib/show-template.php b/lib/show-template.php new file mode 100644 index 0000000..3ab3e9a --- /dev/null +++ b/lib/show-template.php @@ -0,0 +1,174 @@ +template = $template; + } + } elseif ( is_search() ) { + $template = get_search_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_tax() ) { + $template = get_taxonomy_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_home() ) { + $template = get_home_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_front_page() ) { + $template = get_front_page_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_attachment() ) { + $template = get_attachment_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_single() ) { + $template = get_single_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_page() ) { + $template = get_page_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_category() ) { + $template = get_category_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_tag() ) { + $template = get_tag_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_author() ) { + $template = get_author_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_date() ) { + $template = get_date_template(); + + if ( $template ) { + $this->template = $template; + } + } elseif ( is_archive() ) { + $template = get_archive_template(); + + if ( $template ) { + $this->template = $template; + } + } else { + $this->template = function_exists( 'get_index_template' ) ? get_index_template() : get_template_directory() . '/index.php'; + } + + $this->template = apply_filters( 'template_include', $this->template ); + + // Hook into the footer so we can echo the active template + add_action( 'wp_footer', array( &$this, 'show_template' ), 100 ); + } + + /** + * Echo the active template to the footer + * Try to catch when a plugin or otherwise hooks template_redirect to include a different template + * + * @since 1.0.0 + */ + public function show_template() { + $fudge = false; + + foreach ( debug_backtrace() as $trace ) { // phpcs:ignore + switch ( $trace['function'] ) { + case 'wp_footer': + $wp_footer = $trace['file']; + break; + case 'get_footer': + $get_footer = $trace['file']; + break; + } + } + + $fudge = isset( $get_footer ) ? $get_footer : $wp_footer; + + if ( $fudge === $this->template || $fudge === false ) { + echo wp_kses_post( "\n" ); + } else { + echo esc_html( "\n" ); + } + } +} + +$ShowTemplate = new ShowTemplate(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ec0ced1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3021 @@ +{ + "name": "vdi-starter-v5", + "version": "5.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vdi-starter-v5", + "version": "5.0", + "license": "MIT", + "dependencies": { + "@tailwindcss/cli": "^4.0.13", + "@tailwindcss/typography": "^0.5.16", + "glob": "^10.3.10", + "lodash": "^4.17.21", + "lodash.debounce": "^4.0.8", + "tailwindcss": "^4.0.13" + }, + "devDependencies": { + "@axe-core/playwright": "^4.10.1", + "@playwright/test": "^1.52.0", + "@types/node": "^22.15.2", + "browser-sync": "^3.0.3", + "dotenv": "^16.4.7" + } + }, + "node_modules/@axe-core/playwright": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.10.1.tgz", + "integrity": "sha512-EV5t39VV68kuAfMKqb/RL+YjYKhfuGim9rgIaQ6Vntb2HgaCaau0h98Y3WEUqW1+PbdzxDtDNjFAipbtZuBmEA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "axe-core": "~4.10.2" + }, + "peerDependencies": { + "playwright-core": ">= 1.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true + }, + "node_modules/@tailwindcss/cli": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.0.13.tgz", + "integrity": "sha512-HakblDajmZu3aUsWbBDbJnB5D0PiwICH4fudsLsG55YbmZlVkSbfZ/yKa8r79N9dDhae4vNAj+21gm2WLpPLGA==", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "@tailwindcss/node": "4.0.13", + "@tailwindcss/oxide": "4.0.13", + "enhanced-resolve": "^5.18.1", + "lightningcss": "1.29.2", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.0.13" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.13.tgz", + "integrity": "sha512-P9TmtE9Vew0vv5FwyD4bsg/dHHsIsAuUXkenuGUc5gm8fYgaxpdoxIKngCyEMEQxyCKR8PQY5V5VrrKNOx7exg==", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.13" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.13.tgz", + "integrity": "sha512-pTH3Ex5zAWC9LbS+WsYAFmkXQW3NRjmvxkKJY3NP1x0KHBWjz0Q2uGtdGMJzsa0EwoZ7wq9RTbMH1UNPceCpWw==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.13", + "@tailwindcss/oxide-darwin-arm64": "4.0.13", + "@tailwindcss/oxide-darwin-x64": "4.0.13", + "@tailwindcss/oxide-freebsd-x64": "4.0.13", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.13", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.13", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.13", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.13", + "@tailwindcss/oxide-linux-x64-musl": "4.0.13", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.13", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.13" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.13.tgz", + "integrity": "sha512-+9zmwaPQ8A9ycDcdb+hRkMn6NzsmZ4YJBsW5Xqq5EdOu9xlIgmuMuJauVzDPB5BSbIWfhPdZ+le8NeRZpl1coA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.13.tgz", + "integrity": "sha512-Bj1QGlEJSjs/205CIRfb5/jeveOqzJ4pFMdRxu0gyiYWxBRyxsExXqaD+7162wnLP/EDKh6S1MC9E/1GwEhLtA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.13.tgz", + "integrity": "sha512-lRTkxjTpMGXhLLM5GjZ0MtjPczMuhAo9j7PeSsaU6Imkm7W7RbrXfT8aP934kS7cBBV+HKN5U19Z0WWaORfb8Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.13.tgz", + "integrity": "sha512-p/YLyKhs+xFibVeAPlpMGDVMKgjChgzs12VnDFaaqRSJoOz+uJgRSKiir2tn50e7Nm4YYw35q/DRBwpDBNo1MQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.13.tgz", + "integrity": "sha512-Ua/5ydE/QOTX8jHuc7M9ICWnaLi6K2MV/r+Ws2OppsOjy8tdlPbqYainJJ6Kl7ofm524K+4Fk9CQITPzeIESPw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.13.tgz", + "integrity": "sha512-/W1+Q6tBAVgZWh/bhfOHo4n7Ryh6E7zYj4bJd9SRbkPyLtRioyK3bi6RLuDj57sa7Amk/DeomSV9iycS0xqIPA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.13.tgz", + "integrity": "sha512-GQj6TWevNxwsYw20FdT2r2d1f7uiRsF07iFvNYxPIvIyPEV74eZ0zgFEsAH1daK1OxPy+LXdZ4grV17P5tVzhQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.13.tgz", + "integrity": "sha512-sQRH09faifF9w9WS6TKDWr1oLi4hoPx0EIWXZHQK/jcjarDpXGQ2DbF0KnALJCwWBxOIP/1nrmU01fZwwMzY3g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.13.tgz", + "integrity": "sha512-Or1N8DIF3tP+LsloJp+UXLTIMMHMUcWXFhJLCsM4T7MzFzxkeReewRWXfk5mk137cdqVeUEH/R50xAhY1mOkTQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.13.tgz", + "integrity": "sha512-u2mQyqCFrr9vVTP6sfDRfGE6bhOX3/7rInehzxNhHX1HYRIx09H3sDdXzTxnZWKOjIg3qjFTCrYFUZckva5PIg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.13.tgz", + "integrity": "sha512-sOEc4iCanp1Yqyeu9suQcEzfaUcHnqjBUgDg0ZXpjUMUwdSi37S1lu1RGoV1BYInvvGu3y3HHTmvsSfDhx2L8w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", + "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.2.tgz", + "integrity": "sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-3.0.3.tgz", + "integrity": "sha512-91hoBHKk1C4pGeD+oE9Ld222k2GNQEAsI5AElqR8iLLWNrmZR2LPP8B0h8dpld9u7kro5IEUB3pUb0DJ3n1cRQ==", + "dev": true, + "dependencies": { + "browser-sync-client": "^3.0.3", + "browser-sync-ui": "^3.0.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "micromatch": "^4.0.8", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "^0.19.0", + "serve-index": "^1.9.1", + "serve-static": "^1.16.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-3.0.3.tgz", + "integrity": "sha512-TOEXaMgYNjBYIcmX5zDlOdjEqCeCN/d7opf/fuyUD/hhGVCfP54iQIDhENCi012AqzYZm3BvuFl57vbwSTwkSQ==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-3.0.3.tgz", + "integrity": "sha512-FcGWo5lP5VodPY6O/f4pXQy5FFh4JK0f2/fTBsp0Lx1NtyBWs/IfPPJbW8m1ujTW/2r07oUXKTF2LYZlCZktjw==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-ui/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/browser-sync/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.1.0.tgz", + "integrity": "sha512-+mn7lRm+Zf1UT/YaH8WXtpU6PIV2iOjzP6jgKoiaq/VNrjYKp+OHZGe2znaLgDeFkw8cL9ffuaUm+nNnzcYyGw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eazy-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", + "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/send": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.13.tgz", + "integrity": "sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q==" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6f4fad8 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "vdi-starter-v5", + "version": "5.0", + "description": "VDI-Starter-v5 is a minimal WordPress theme designed as a starting point for custom theme development. It focuses on modern development approaches with a lean architecture that avoids the overhead of theme frameworks.", + "scripts": { + "start": "npm run watch", + "watch": "node bin/.watch.js", + "build": "npx @tailwindcss/cli -i ./styles/theme.css -o ./static/dist/theme.css --optimize" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Vincent-Design-Inc/VDI-Starter-v5.git" + }, + "keywords": [ + "wordpress", + "minimal", + "basic", + "custom", + "theme" + ], + "author": "Keith Solomon ", + "license": "MIT", + "bugs": { + "url": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5/issues" + }, + "homepage": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5#readme", + "devDependencies": { + "@axe-core/playwright": "^4.10.1", + "@playwright/test": "^1.52.0", + "@types/node": "^22.15.2", + "browser-sync": "^3.0.3", + "dotenv": "^16.4.7" + }, + "dependencies": { + "@tailwindcss/cli": "^4.0.13", + "@tailwindcss/typography": "^0.5.16", + "glob": "^10.3.10", + "lodash": "^4.17.21", + "lodash.debounce": "^4.0.8", + "tailwindcss": "^4.0.13" + } +} diff --git a/page.php b/page.php new file mode 100644 index 0000000..317f494 --- /dev/null +++ b/page.php @@ -0,0 +1,41 @@ + + +
+
+ +
+ + + + +
+ + diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 0000000..18e8c18 --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,82 @@ +// @ts-check +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * @see https://playwright.dev/docs/test-configuration + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + ignoreHTTPSErrors: true, + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + // { + // name: 'firefox', + // use: { ...devices['Desktop Firefox'] }, + // }, + + // { + // name: 'webkit', + // use: { ...devices['Desktop Safari'] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); + diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..d0e6a12 Binary files /dev/null and b/screenshot.png differ diff --git a/search.php b/search.php new file mode 100644 index 0000000..8499e37 --- /dev/null +++ b/search.php @@ -0,0 +1,103 @@ + + +
+ +
+
+
+ +
+
+ + + <?php echo esc_attr( $imgAlt ); ?> +
+ +
+ +
+ Posted in: + $category ) : + $separator = $index < count( $categories ) - 1 ? ', ' : ''; + ?> + name ); ?> + +
+ +
+ + Post Type: +
+ + + +

+
+ + +
+
+ +
+ +
+ 2, + 'prev_text' => '« Previous', + 'next_text' => 'Next »', + ) + ); + ?> +
+
+
+ +
+
+

Nothing here yet…

+

No published posts found.

+
+
+ + + + + +
+ + diff --git a/sidebar-page.php b/sidebar-page.php new file mode 100644 index 0000000..ac23f09 --- /dev/null +++ b/sidebar-page.php @@ -0,0 +1,15 @@ + + + diff --git a/sidebar.php b/sidebar.php new file mode 100644 index 0000000..b777db8 --- /dev/null +++ b/sidebar.php @@ -0,0 +1,14 @@ + + + diff --git a/single.php b/single.php new file mode 100644 index 0000000..673c44b --- /dev/null +++ b/single.php @@ -0,0 +1,86 @@ + + +
+
+ + +
+

+
+ + + + +
+ + + + +
+ + diff --git a/static/img/logo.svg b/static/img/logo.svg new file mode 100644 index 0000000..e80437b --- /dev/null +++ b/static/img/logo.svg @@ -0,0 +1,7 @@ + + + kevinleary.net + + + + \ No newline at end of file diff --git a/static/img/select_arrow.png b/static/img/select_arrow.png new file mode 100644 index 0000000..0ddda64 Binary files /dev/null and b/static/img/select_arrow.png differ diff --git a/static/js/admin.js b/static/js/admin.js new file mode 100644 index 0000000..f409c57 --- /dev/null +++ b/static/js/admin.js @@ -0,0 +1,12 @@ +/** + * Admin JS + */ +import { registerButtonComponent } from './components/button.js'; + +const app = () => { + registerButtonComponent(); +} + +document.addEventListener('DOMContentLoaded', app); + +console.log(`admin.js loaded.`); diff --git a/static/js/components/backToTop.js b/static/js/components/backToTop.js new file mode 100644 index 0000000..8a0ce2b --- /dev/null +++ b/static/js/components/backToTop.js @@ -0,0 +1,33 @@ +// Back to Top Button Component +class BackToTopButton extends HTMLElement { + connectedCallback() { + this.innerHTML = ` + + `; + + const btn = this.querySelector('#backToTopBtn'); + + let previousScrollY = window.scrollY; + + window.addEventListener('scroll', () => { + const currentScrollY = window.scrollY; + const isScrollingUp = currentScrollY < previousScrollY; + const shouldShowButton = currentScrollY > 300 && isScrollingUp; + + btn.style.display = shouldShowButton ? 'block' : 'none'; + previousScrollY = currentScrollY; + }); + + btn.addEventListener('click', () => { + window.scrollTo({ top: 0, behavior: 'smooth' }); + }); + } +} + +export function registerBackToTopButton() { + if (!customElements.get('back-to-top')) { + customElements.define('back-to-top', BackToTopButton); + } +} diff --git a/static/js/components/button.js b/static/js/components/button.js new file mode 100644 index 0000000..969a40c --- /dev/null +++ b/static/js/components/button.js @@ -0,0 +1,99 @@ +class ButtonComponent extends HTMLElement { + /** + * Parameters + * - btnClasses: Additional classes to add to the block. + * - element: The element to use for the button. Defaults to 'a'. + * - url: The URL to link to. + * - target: The target for the link. + * - title: The text to display on the button. + * - ariaLabel: The ARIA label for the button. + * - color: The color of the button. + * - variant: The variant of the button. + * - size: The size of the button. + * - width: The width of the button. + * + */ + + connectedCallback() { + if (!this.querySelector(this.getAttribute('element'))) { + this.append(document.createElement(this.getAttribute('element'))); + } + + this.update(); + } + + static get observedAttributes() { + return [ + 'btnClasses', + 'el', + 'element', + 'type', + 'url', + 'target', + 'title', + 'ariaLabel', + 'color', + 'variant', + 'size', + 'width', + ] + } + + attributeChangedCallback() { + this.update(); + } + + update() { + const btn = this.querySelector(this.getAttribute('element')); + + // console.log('[ButtonComponent] attributes', { + // btnClasses: this.getAttribute('btnClasses'), + // element: this.getAttribute('element'), + // type: this.getAttribute('type'), + // url: this.getAttribute('url'), + // target: this.getAttribute('target'), + // title: this.getAttribute('title'), + // ariaLabel: this.getAttribute('ariaLabel'), + // color: this.getAttribute('color'), + // variant: this.getAttribute('variant'), + // size: this.getAttribute('size'), + // width: this.getAttribute('width'), + // }); + + if (btn) { + btn.classList = this.getAttribute('btnClasses') || ''; + + if (this.getAttribute('element') == 'a') { + btn.href = this.getAttribute('url') || '#'; + + if (btn.target) { + btn.target = 'target="${this.getAttribute(target)}"'; + } + } + + const type = this.getAttribute('type'); + if (type && this.getAttribute('element') !== 'a') { + btn.type = type; + } + + btn.title = this.getAttribute('title') || ''; + btn.textContent = this.getAttribute('title') || ''; + + if (!this.getAttribute('ariaLabel') && this.getAttribute('url')) { + btn.setAttribute('aria-label', `Link to ${this.getAttribute('url')}`); + } else { + btn.setAttribute('aria-label', this.getAttribute('ariaLabel')); + } + + btn.setAttribute('aria-label', this.getAttribute('ariaLabel')); + btn.setAttribute('data-button-color', this.getAttribute('color')); + btn.setAttribute('data-button-variant', this.getAttribute('variant')); + btn.setAttribute('data-button-size', this.getAttribute('size')); + btn.setAttribute('data-button-width', this.getAttribute('width')); + } + } +} + +export const registerButtonComponent = () => { + customElements.define('x-button', ButtonComponent); +} diff --git a/static/js/modules/GetHeaderHeight.js b/static/js/modules/GetHeaderHeight.js new file mode 100644 index 0000000..2850ccc --- /dev/null +++ b/static/js/modules/GetHeaderHeight.js @@ -0,0 +1,12 @@ +/** + * Get Header Height + * - + * Get header height and set CSS variable "--hgtHeader" to the header height. + */ + +function getHeaderHeight() { + const headerHeight = document.querySelector('.header__nav-main').getBoundingClientRect().height; + document.documentElement.style.setProperty('--hgtHeader', `${headerHeight}px`); +} + +export default getHeaderHeight; diff --git a/static/js/modules/Navigation.js b/static/js/modules/Navigation.js new file mode 100644 index 0000000..ce92855 --- /dev/null +++ b/static/js/modules/Navigation.js @@ -0,0 +1,576 @@ +/** + * VDI Main Nav - All Main Navigation Functionality + * + * Please review documentation upon first use, and, as-needed: + * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ + */ + +/** + * Navigation + * Handles navigation logic + * + * @param {string} mobileMenuButtonId + * @param {string} dropDownClass + * @param {string} subMenuLinkClass + */ +class Navigation { + /** + * The main toggle element + * + * @type {HTMLElement} + * @link {https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_properties} + */ + #mobileMenuButton; + + /** + * List of sub dropdown buttons + * + * @type {NodeList} + * @link {https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_properties} + */ + #dropdownButtons; + + /** + * Class name to identify sub menu items (ul>li>a) + * @type {string} + */ + #subMenuElementIdentifier; + + /** + * Current navigation level in sliding viewport + * @type {number} + */ + #currentLevel = 0; + + /** + * Navigation stack for breadcrumb functionality + * @type {Array} + */ + #navigationStack = []; + + /** + * Whether sliding viewport mode is enabled + * @type {boolean} + */ + #slidingViewportEnabled = false; + + + + constructor(mobileMenuButtonId, dropDownClass, subMenuLinkClass = "sub-menu-item") { + this.#mobileMenuButton = document.getElementById(mobileMenuButtonId); + this.#dropdownButtons = document.querySelectorAll(dropDownClass); // Do not change this to getElementsByClassName, logic is iterating over non-live node list + this.#subMenuElementIdentifier = subMenuLinkClass; + + this.handleEscapeKey(); + + // Initialize sliding viewport immediately if styles are detected + this.initializeSlidingViewport(); + } + + /** + * Handles main mobile toggling + * Adds an event listener to mobile menu dropdown + * toggle button + */ + mobileMenuToggle() { + this.#mobileMenuButton.addEventListener("click", (event) => { + this.toggleMobileMenu(event, this.#mobileMenuButton); // toggle submenu on mobile + }); + + this.closeOnBlur(this.#mobileMenuButton, { "navType": "desktop" }); // close submenu when user clicks outside + this.closeOnBlur(this.#mobileMenuButton, { "navType": "mobile" }); + } + + /** + * Handles dropdowns on desktop navigation + * Loops over list of navigation dropdown buttons + * and adds eventlisteners to toggle view + */ + desktopMenuDropdowns() { + this.#dropdownButtons.forEach((button) => { + button.addEventListener("click", (event) => { + this.toggleDropdown(event, button); + }); + + this.closeOnBlur(button); // close menu when user clicks outside + this.handleFocus(button); // close dropdown when user finishes tabbing submenu elements + }); + } + + /** + * Toggles desktop dropdowns + * + * @param {EventTarget} event + * @param {HTMLButtonElement} button + */ + toggleDropdown(event, button) { + this.toggleAriaExpanded(event, button); + } + + /** + * Toggles mobile menu + * + * @param {EventTarget} event + * @param {HTMLButtonElement} button + */ + toggleMobileMenu(event, button) { + this.toggleAriaExpanded(event, button); + + const isExpanded = button.getAttribute("aria-expanded") === "true"; + + if (!isExpanded) { + // Reset sliding navigation when menu is closed + if (this.#slidingViewportEnabled) { + this.resetSlidingNavigation(); + } + } + } + + /** + * Toggles aria-expanded attribute + * + * @param {EventTarget} event + * @param {HTMLButtonElement} button + */ + toggleAriaExpanded(event, button) { + let isExpanded = event.currentTarget.getAttribute("aria-expanded") === "true"; // true is returned as string + + // ... but open the targeted secondary nav + if (!isExpanded) { + // close all dropdowns... + this.closeAllDropDowns(); + // then toggle targeted dropdown... + button.setAttribute("aria-expanded", true); + } else { + button.setAttribute("aria-expanded", false); + } + } + + /** + * Close dropdown when user clicks anywhere else on the screen + * + * @param {HTMLButtonElement} button + * @link {https://developer.mozilla.org/en-US/docs/Web/API/Element/blur_event} + * @link {https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/relatedTarget} + */ + closeOnBlur(button, args) { + if (args === undefined || args?.navType === "desktop") { + button.addEventListener("blur", (event) => { + if (event.relatedTarget == null) { + event.currentTarget.setAttribute("aria-expanded", false); + } + }, { passive: true }); + } + + //FIXME: Remove hardcoded literal + if (args?.navType === "mobile") { + document.getElementById("menu-container").addEventListener("blur", (event) => { + // Note: cannot group negation -1*-1*-1 != -(1*1*1) + const isNull = event.relatedTarget == null; + const isNotMenuItem = !isNull && !event.relatedTarget.classList.contains("menu-vdi__toggle") + && !event.relatedTarget.classList.contains("sub-menu-item") + && !event.relatedTarget.classList.contains("menu-vdi__link") + && !event.relatedTarget.classList.contains("menu-vdi__back"); // Don't close on back button click + + if (isNull || isNotMenuItem) + button.setAttribute("aria-expanded", false); + }, true) + } + } + + /** + * Handles escape behaviour + * Closes all dropdown when user hits + * escape key + * + * @link {https://developer.mozilla.org/en-US/docs/Web/API/Element/keyup_event} + */ + handleEscapeKey() { + window.addEventListener("keyup", (event) => { + if (event.key === "Escape") { + this.#mobileMenuButton.setAttribute("aria-expanded", false); + this.closeAllDropDowns(); + + // Reset sliding navigation on escape + if (this.#slidingViewportEnabled) { + this.resetSlidingNavigation(); + } + } + }, { passive: true }); + } + + /** + * Close all dropdown menus + * Sets aria expanded property by looping + * over the list of dropdown button elements + * + * @link {https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-expanded} + */ + closeAllDropDowns() { + this.#dropdownButtons.forEach((button) => { + button.setAttribute("aria-expanded", false); + }); + } + + /** + * Handle focus + * Watches blur event on submenu list container, if the next + * focus element is not a submenu list item, closes the + * dropdown. + * + * Implemented for WCAG 2.2 compliance + * + * @param {htmlButtonElement} button + */ + handleFocus(button) { + const subMenuListElement = button.closest("ul"); + + /** + * Ducking JavaScript, I am not sure why the blur event on submenu(ul) + * would bubble up to the button since the button and sub menu list element + * are siblings and not nested. This is a mystery to me. + * + * Here we are stopping any bubbling event that may be propagated to the + * top level buttons. This includes the bubbling event from sub menu list element. + * + * If anyone finds a better solution to this or can explain bubbling of focus event + * to next sibling, you time and effort would be much appreciated. + */ + button.addEventListener("focusout", (event) => { + event.stopImmediatePropagation(); + }) + + subMenuListElement.addEventListener("focusout", (event) => { + // blur event triggers when user clicks outside + const nextFocusElement = event.relatedTarget; + + let isSubMenuElement; + + if (nextFocusElement !== null) { + isSubMenuElement = nextFocusElement.classList.contains(this.#subMenuElementIdentifier); + } else { + isSubMenuElement = false; // close when user clicks outside + } + + if (!isSubMenuElement) { + this.closeAllDropDowns(); + } + }); + } + + /** + * Initialize sliding viewport navigation + * Detects if sliding viewport should be enabled and sets up the structure + */ + initializeSlidingViewport() { + // Check if we should enable sliding viewport (could be based on screen size, user preference, etc.) + this.#slidingViewportEnabled = this.shouldEnableSlidingViewport(); + + if (this.#slidingViewportEnabled) { + console.log('Sliding viewport enabled, setting up structure'); + this.setupSlidingViewportStructure(); + } else { + console.log('Sliding viewport not enabled'); + } + } + + /** + * Determine if sliding viewport should be enabled + * @returns {boolean} + */ + shouldEnableSlidingViewport() { + // Check if sliding viewport styles are loaded by testing if the CSS rule exists + // This allows CSS-based switching between navigation styles + const isMobile = window.innerWidth <= 1000; // 62.5rem converted to px + + if (!isMobile) return false; + + // Check if sliding viewport CSS is loaded by testing a specific rule + // We need to test the element within the proper context (.nav-main) + try { + const navMain = document.querySelector('.nav-main'); + if (!navMain) return false; + + const testElement = document.createElement('div'); + testElement.className = 'menu-vdi--sliding'; + testElement.style.position = 'absolute'; + testElement.style.visibility = 'hidden'; + testElement.style.height = '1px'; + testElement.style.width = '1px'; + + navMain.appendChild(testElement); + + // Get computed styles to check if sliding viewport CSS is active + const computedStyle = window.getComputedStyle(testElement); + const hasOverflowHidden = computedStyle.overflow === 'hidden'; + + navMain.removeChild(testElement); + + return hasOverflowHidden; + } catch (error) { + console.warn('Error detecting sliding viewport styles:', error); + return false; + } + } + + /** + * Setup the HTML structure for sliding viewport navigation + */ + setupSlidingViewportStructure() { + const menuContainer = document.getElementById('menu-container'); + if (!menuContainer) { + console.warn('Menu container not found'); + return; + } + + // Don't set up if already configured + if (menuContainer.classList.contains('menu-vdi--sliding')) { + console.log('Sliding viewport already configured'); + return; + } + + console.log('Setting up sliding viewport structure'); + + // Add sliding class to enable sliding styles + menuContainer.classList.add('menu-vdi--sliding'); + + // Create viewport container + const viewport = document.createElement('div'); + viewport.className = 'menu-vdi__viewport'; + viewport.setAttribute('data-current-level', '0'); + + // Create main level + const mainLevel = document.createElement('div'); + mainLevel.className = 'menu-vdi__level menu-vdi__level--main'; + mainLevel.setAttribute('data-level', '0'); + + // Move existing menu items to main level + const existingItems = Array.from(menuContainer.children); + console.log('Moving', existingItems.length, 'existing items to main level'); + + existingItems.forEach(item => { + mainLevel.appendChild(item); + }); + + // Setup click handlers for parent items in sliding mode + this.setupSlidingClickHandlers(mainLevel); + + viewport.appendChild(mainLevel); + menuContainer.appendChild(viewport); + + console.log('Sliding viewport structure complete'); + } + + /** + * Setup click handlers for parent menu items in sliding mode + * @param {HTMLElement} level + */ + setupSlidingClickHandlers(level) { + const parentButtons = level.querySelectorAll('.menu-vdi__toggle'); + + parentButtons.forEach(button => { + button.addEventListener('click', (event) => { + if (this.#slidingViewportEnabled) { + event.preventDefault(); + event.stopPropagation(); + + const parentItem = button.closest('.menu-vdi__item--parent'); + const submenu = parentItem.querySelector('.menu-vdi__submenu'); + + if (submenu) { + this.navigateToLevel(button.textContent.trim(), submenu); + } + } + }, true); // Use capture phase to intercept before other handlers + }); + } + + /** + * Navigate to a specific navigation level + * @param {string} levelTitle + * @param {HTMLElement} submenuElement + */ + navigateToLevel(levelTitle, submenuElement) { + const viewport = document.querySelector('.menu-vdi__viewport'); + if (!viewport) return; + + this.#currentLevel++; + this.#navigationStack.push({ title: levelTitle, level: this.#currentLevel }); + + // Create new level + const newLevel = document.createElement('div'); + newLevel.className = 'menu-vdi__level'; + newLevel.setAttribute('data-level', this.#currentLevel); + + // Add back button + const backButton = this.createBackButton(); + newLevel.appendChild(backButton); + + // Add level title + const levelTitleEl = document.createElement('div'); + levelTitleEl.className = 'menu-vdi__level-title'; + levelTitleEl.textContent = levelTitle; + newLevel.appendChild(levelTitleEl); + + // Clone and add submenu items + const submenuItems = submenuElement.cloneNode(true); + submenuItems.className = 'menu-vdi__level-items'; + + // Convert submenu items to level items and ensure proper visibility + const items = submenuItems.querySelectorAll('.menu-vdi__item'); + items.forEach(item => { + // Remove any nested classes that don't apply to sliding mode + item.classList.remove('menu-vdi__item--child', 'menu-vdi__item--grandchild'); + + // Handle nested items if they exist + const nestedToggle = item.querySelector('.menu-vdi__toggle'); + if (nestedToggle) { + nestedToggle.addEventListener('click', (event) => { + event.preventDefault(); + // Could implement deeper nesting here if needed + }); + } + }); + + // Remove any hidden submenu classes from nested elements to ensure visibility + const nestedSubmenus = submenuItems.querySelectorAll('.menu-vdi__submenu'); + nestedSubmenus.forEach(nestedSubmenu => { + nestedSubmenu.classList.remove('menu-vdi__submenu'); + nestedSubmenu.classList.add('menu-vdi__nested-items'); + }); + + // Ensure all list items are visible in sliding mode + const allListItems = submenuItems.querySelectorAll('li'); + allListItems.forEach(li => { + if (!li.classList.contains('menu-vdi__item')) { + li.classList.add('menu-vdi__item'); + } + }); + + newLevel.appendChild(submenuItems); + viewport.appendChild(newLevel); + + // Animate to new level + this.animateToLevel(this.#currentLevel); + } + + /** + * Create a back button for navigation levels + * @returns {HTMLElement} + */ + createBackButton() { + const backButton = document.createElement('button'); + backButton.className = 'menu-vdi__back'; + backButton.innerHTML = ` + + + + Back + `; + + backButton.addEventListener('click', (event) => { + event.preventDefault(); + event.stopPropagation(); + this.navigateBack(); + }); + + return backButton; + } + + /** + * Navigate back to previous level + */ + navigateBack() { + if (this.#currentLevel > 0) { + this.#currentLevel--; + this.#navigationStack.pop(); + + // Remove the current level element + const viewport = document.querySelector('.menu-vdi__viewport'); + const currentLevelEl = viewport.querySelector(`[data-level="${this.#currentLevel + 1}"]`); + if (currentLevelEl) { + currentLevelEl.remove(); + } + + // Animate back to previous level + this.animateToLevel(this.#currentLevel); + + // Ensure menu stays open after back navigation + setTimeout(() => { + if (this.#mobileMenuButton.getAttribute("aria-expanded") === "false") { + this.#mobileMenuButton.setAttribute("aria-expanded", "true"); + } + }, 50); + } + } + + /** + * Animate viewport to specific level + * @param {number} level + */ + animateToLevel(level) { + const viewport = document.querySelector('.menu-vdi__viewport'); + if (!viewport) return; + + const translateX = -level * 100; + viewport.style.transform = `translateX(${translateX}%)`; + viewport.setAttribute('data-current-level', level); + } + + /** + * Reset sliding navigation to main level + */ + resetSlidingNavigation() { + const menuContainer = document.getElementById('menu-container'); + if (!menuContainer) return; + + if (this.#slidingViewportEnabled) { + this.#currentLevel = 0; + this.#navigationStack = []; + + const viewport = document.querySelector('.menu-vdi__viewport'); + if (viewport) { + // Remove all levels except main + const levels = viewport.querySelectorAll('.menu-vdi__level:not(.menu-vdi__level--main)'); + levels.forEach(level => level.remove()); + + // Reset position + this.animateToLevel(0); + } + } else { + // Clean up sliding structure and restore normal menu + this.cleanupSlidingStructure(); + } + } + + /** + * Clean up sliding viewport structure and restore normal menu + */ + cleanupSlidingStructure() { + const menuContainer = document.getElementById('menu-container'); + if (!menuContainer) return; + + // Remove sliding class + menuContainer.classList.remove('menu-vdi--sliding'); + + // Find viewport and move items back to container + const viewport = menuContainer.querySelector('.menu-vdi__viewport'); + if (viewport) { + const mainLevel = viewport.querySelector('.menu-vdi__level--main'); + if (mainLevel) { + // Move all items back to menu container + const items = Array.from(mainLevel.children); + items.forEach(item => { + menuContainer.appendChild(item); + }); + } + + // Remove viewport structure + viewport.remove(); + } + + console.log('Sliding structure cleaned up'); + } +} + +export default Navigation; diff --git a/static/js/modules/TagExternalLinks.js b/static/js/modules/TagExternalLinks.js new file mode 100644 index 0000000..f341d9c --- /dev/null +++ b/static/js/modules/TagExternalLinks.js @@ -0,0 +1,39 @@ + +/** + * Tags external links in the document with appropriate attributes and styling. + * + * This function identifies all anchor elements with href attributes and determines + * if they point to external domains. External links are enhanced with: + * - Accessibility label indicating they open in a new tab + * - target="_blank" to open in new tab + * - rel="noopener noreferrer" for security + * - Custom CSS class "extLink" for styling + * + * Links are considered external if their host differs from the current page's host. + * Malformed URLs are silently ignored. + * + * @function tagExternalLinks + * @returns {void} + */ + +function tagExternalLinks() { + const currentHost = window.location.host; + + document.querySelectorAll('a[href]').forEach(link => { + try { + const url = new URL(link.href, window.location.href); + + // If the link's host is different from the current host, treat as external + if (url.host !== currentHost) { + link.setAttribute('aria-label', 'External link, opens in a new tab'); + link.setAttribute('target', '_blank'); + link.setAttribute('rel', 'noopener noreferrer'); // Security best practice + link.classList.add('extLink'); // Add a custom class for icons or other styling + } + } catch (e) { + // Ignore malformed URLs + } + }); +} + +export default tagExternalLinks; diff --git a/static/js/theme.js b/static/js/theme.js new file mode 100644 index 0000000..3d6e871 --- /dev/null +++ b/static/js/theme.js @@ -0,0 +1,76 @@ +/** + * Theme JS + */ + +import { registerButtonComponent } from './components/button.js'; +import { registerBackToTopButton } from './components/backToTop.js'; +import GetHeaderHeight from './modules/GetHeaderHeight.js'; +import tagExternalLinks from './modules/TagExternalLinks.js'; +import Navigation from './modules/Navigation.js'; + +// Add passive event listeners +! function (e) { + "function" == typeof define && define.amd ? define(e) : e() +}(function () { + let e; + const t = ["scroll", "wheel", "touchstart", "touchmove", "touchenter", "touchend", "touchleave", "mouseout", "mouseleave", "mouseup", "mousedown", "mousemove", "mouseenter", "mousewheel", "mouseover"]; + if (function () { + let e = !1; + try { + const t = Object.defineProperty({}, "passive", { + get: function () { + e = !0 + } + }); + window.addEventListener("test", null, t); + window.removeEventListener("test", null, t); + } catch (e) { } + return e + }()) { + const n = EventTarget.prototype.addEventListener; + e = n; + EventTarget.prototype.addEventListener = function (n, o, r) { + let i; + const s = "object" == typeof r && null !== r, + u = s ? r.capture : r; + if (s) { + const t = Object.getOwnPropertyDescriptor(r, "passive"); + r = t && !0 !== t.writable && void 0 === t.set ? { ...r } : r; + } else { + r = {}; + } + r.passive = void 0 !== (i = r.passive) ? i : -1 !== t.indexOf(n) && !0; + r.capture = void 0 !== u && u; + e.call(this, n, o, r); + }; + EventTarget.prototype.addEventListener._original = e + } +}); + +/** + * Application entrypoint + */ +document.addEventListener('DOMContentLoaded', () => { + // Tag external links + tagExternalLinks(); + + // Register button component + registerButtonComponent(); + registerBackToTopButton(); + + // Initialize Navigation + const navigation = new Navigation('navMainToggle', '.menu-vdi__toggle'); + + // Initialize Navigation + navigation.desktopMenuDropdowns(); + navigation.mobileMenuToggle(); + + // Initialize Header Height + GetHeaderHeight(); + + // Add Back to Top button to body + const backToTop = document.createElement('back-to-top'); + document.body.appendChild(backToTop); +}); + +console.log(`theme.js loaded.`); diff --git a/style.css b/style.css new file mode 100644 index 0000000..a09198e --- /dev/null +++ b/style.css @@ -0,0 +1,7 @@ +/* + * Theme Name:VDI Starter v5 + * Description: Custom WordPress theme starter for VDI Projects + * Version: 5.0 + * Author: Vincent Design Inc. + * Text Domain: basicwp + */ diff --git a/styles/backend/admin.css b/styles/backend/admin.css new file mode 100644 index 0000000..849a676 --- /dev/null +++ b/styles/backend/admin.css @@ -0,0 +1,2 @@ +/* Light admin styles; avoid overriding core wp-admin UI */ + diff --git a/styles/backend/editor.css b/styles/backend/editor.css new file mode 100644 index 0000000..4c22fb9 --- /dev/null +++ b/styles/backend/editor.css @@ -0,0 +1,55 @@ +/* Theme editor styles */ + +@import "../../static/dist/theme.css"; + +:root { + --vdi-editor-gutter: clamp(1rem, 4vw, 3rem); +} + +body { + font-family: var(--font-sans); + + h1, h2, h3, + h4, h5, h6 { + font-family: var(--font-headings); + font-weight: 700; + margin: 0 0 1rem; + } +} + +.editor-styles-wrapper.is-root-container, +.editor-styles-wrapper .block-editor-block-list__layout.is-root-container, +.editor-styles-wrapper .wp-block-post-content, +.editor-visual-editor__post-title-wrapper { + box-sizing: border-box; + margin-inline: auto; + max-width: min(100%, var(--wp--style--global--wide-size, 1536px)); + padding-inline: var(--vdi-editor-gutter); + width: 100%; +} + +.editor-styles-wrapper .alignfull, +.editor-styles-wrapper .mx-break-out { + margin-left: calc(var(--vdi-editor-gutter) * -1); + margin-right: calc(var(--vdi-editor-gutter) * -1); + max-width: none; + width: calc(100% + (var(--vdi-editor-gutter) * 2)); +} + +.editor-styles-wrapper .ml-break-out { + margin-left: calc(var(--vdi-editor-gutter) * -1); + max-width: none; + width: calc(100% + var(--vdi-editor-gutter)); +} + +.editor-styles-wrapper .mr-break-out { + margin-left: 0; + margin-right: calc(var(--vdi-editor-gutter) * -1); + max-width: none; + width: calc(100% + var(--vdi-editor-gutter)); +} + +.wp-block-buttons .block-editor-block-list__layout { + display: flex; + gap: 1rem; +} diff --git a/styles/base/break-out.css b/styles/base/break-out.css new file mode 100644 index 0000000..2bcb074 --- /dev/null +++ b/styles/base/break-out.css @@ -0,0 +1,24 @@ +@theme { + /** Break-out variables + * These are used for the break-out plugin and the responsive utilities. + * The break-out variables are set to match the default plugin settings. + * You can override them if you need to adjust for a particular use case. + */ + --twcb-scrollbar-width: 0px; +} + +@utility mx-break-out { + margin-left: calc(50% - 50vw); + margin-right: calc(50% - 50vw); + width: calc(100vw - var(--twcb-scrollbar-width)); +} + +@utility ml-break-out { + margin-left: calc(50% - 50vw); + width: 100%; +} + +@utility mr-break-out { + margin-left: calc(-50% + 50vw); + width: 100%; +} diff --git a/styles/base/colors.css b/styles/base/colors.css new file mode 100644 index 0000000..73cd2e3 --- /dev/null +++ b/styles/base/colors.css @@ -0,0 +1,41 @@ +/* Theme color definitions */ + +@theme { + --color-black: oklch(0% 0 0); + --color-white: oklch(100% 0 0); + + --color-background: oklch(89.75% 0 0); + --color-text: var(--color-black); + + --color-primary: oklch(0.57 0.203362 257.1706); + --color-primary-100: color-mix(in oklch, var(--color-primary) 10%, white); + --color-primary-200: color-mix(in oklch, var(--color-primary) 20%, white); + --color-primary-300: color-mix(in oklch, var(--color-primary) 30%, white); + --color-primary-400: color-mix(in oklch, var(--color-primary) 40%, white); + --color-primary-500: color-mix(in oklch, var(--color-primary) 50%, white); + --color-primary-600: color-mix(in oklch, var(--color-primary) 60%, white); + --color-primary-700: color-mix(in oklch, var(--color-primary) 70%, white); + --color-primary-800: color-mix(in oklch, var(--color-primary) 80%, white); + --color-primary-900: color-mix(in oklch, var(--color-primary) 90%, white); + + --color-secondary: oklch(0.56 0.0176 257.23); + --color-secondary-100: color-mix(in oklch, var(--color-secondary) 10%, white); + --color-secondary-200: color-mix(in oklch, var(--color-secondary) 20%, white); + --color-secondary-300: color-mix(in oklch, var(--color-secondary) 30%, white); + --color-secondary-400: color-mix(in oklch, var(--color-secondary) 40%, white); + --color-secondary-500: color-mix(in oklch, var(--color-secondary) 50%, white); + --color-secondary-600: color-mix(in oklch, var(--color-secondary) 60%, white); + --color-secondary-700: color-mix(in oklch, var(--color-secondary) 70%, white); + --color-secondary-800: color-mix(in oklch, var(--color-secondary) 80%, white); + --color-secondary-900: color-mix(in oklch, var(--color-secondary) 90%, white); + + --color-bodylinks: oklch(0.48 0.0789 211.58); + --color-footlinks: oklch(0.65 0.1104 212.2); + + --color-success: oklch(64.01% 0.1751 146.7); + --color-info: oklch(0.55 0.0922 211.57); + --color-warning: oklch(84.42% 0.1722 84.93); + --color-danger: oklch(0.5126 0.1865 22.61); + --color-light: oklch(98.16% 0.0017 247.8); + --color-dark: oklch(34.51% 0.0133 248.2); +} diff --git a/styles/base/forms.css b/styles/base/forms.css new file mode 100644 index 0000000..bc40609 --- /dev/null +++ b/styles/base/forms.css @@ -0,0 +1,67 @@ +/* Forms */ + +/* Base styles */ +input[type="text"], input[type="email"], input[type="tel"], +input[type="url"], input[type="number"], input[type="password"], +input[type="date"], select, textarea { + @apply px-4 py-2 w-full rounded border-2 border-primary; + @apply text-black bg-white; + @apply focus-visible:border-transparent focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-primary; + + font-size: inherit; + line-height: inherit; +} + +/* Gravity Forms styles */ +.gform_wrapper { + @apply max-w-full mx-auto; + + .gform_fields { @apply text-black; } + + fieldset.gfield { @apply mb-6; } + + legend, label { @apply text-lg font-bold mb-2; } + + label.gform-field-label--type-sub{ @apply font-normal text-base; } + + .gfield_required { @apply text-danger text-xs font-bold ml-1; } + + .dark { + input[type="text"], input[type="email"], input[type="tel"], + input[type="url"], input[type="number"], input[type="password"], + input[type="date"], select, textarea { + @apply text-black bg-white; + @apply focus-visible:border-transparent focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-primary; + } + } + + .ginput_complex { + @apply sm:flex; + + span { + @apply block grow; + + &:not(:first-child) { @apply mt-6 sm:mt-0 sm:ml-4; } + } + } + + .gform_footer { @apply mt-8; } + + h2.gform_submission_error { @apply text-xl text-danger font-bold my-4; } + + .validation_message { @apply italic text-danger; } + + .hidden_label > label { @apply hidden; } +} + +/* Search block styles */ +.wp-block-search__input { + @apply px-4 py-2 w-full rounded border-2 border-transparent focus-visible:bg-secondary-300 focus-visible:border-primary; + + appearance: none; + flex-grow: 1; + margin-left: 0; + margin-right: 0; + min-width: 3rem; + text-decoration: unset !important; +} diff --git a/styles/base/global.css b/styles/base/global.css new file mode 100644 index 0000000..3c65906 --- /dev/null +++ b/styles/base/global.css @@ -0,0 +1,85 @@ +/* Miscellaneous custom styles */ +@theme { + --spacing-menu-top: calc(100% + .9375rem); + --spacing-section: 2rem; + + --shadow-menu-shadow: 0 .25rem .375rem rgba(0,0,0,0.1); + + /** Breakpoints + * The breakpoints are set to match the default Tailwind breakpoints. + * You can override them here if you want to use different breakpoints. + * + * @see https://tailwindcss.com/docs/breakpoints + */ + --breakpoint-*: initial; + --breakpoint-xxs: 22.5rem; /* 360px */ + --breakpoint-xs: 29.6875rem; /* 475px */ + --breakpoint-sm: 40rem; /* 640px */ + --breakpoint-md: 48rem; /* 768px */ + --breakpoint-lg: 64rem; /* 1024px */ + --breakpoint-xl: 70rem; /* 1280px */ + --breakpoint-2xl: 96rem; /* 1536px */ +} + +/* Basic layout styles */ +main#maincontent { + background-color: var(--color-background); + color: var(--color-text); + margin: 0; + padding: 0 0 4rem; +} + +.container { + margin: 0 auto; + width: 100%; + padding-inline: clamp(1.5rem, 5vw, 3rem); +} + +.section { + @apply relative my-section px-section; + + &:first-child { + @apply mt-0; + } + + &:last-child, p:last-child { + @apply mb-0; + } + + &.has-background { + @apply py-section bg-cover bg-no-repeat; + } +} + +/** Allows containers inside containers + * + * .container .wp-block-section { + * @apply mx-break-out; + * } + */ + +.content-wrapper { + .alignfull { + @apply max-w-full; + } + + .alignwide { + @apply max-w-full; + } + + .alignleft { + @apply ml-0 mr-auto float-none; + } + + .alignright { + @apply ml-auto mr-0 float-none; + } + + .aligncenter { + @apply mx-auto; + } +} + +/* Responsive embeds */ +.embed { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; } +.embed iframe, .embed object, .embed embed, .embed video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } diff --git a/styles/base/index.css b/styles/base/index.css new file mode 100644 index 0000000..8fd4d91 --- /dev/null +++ b/styles/base/index.css @@ -0,0 +1,9 @@ +/* Theme base styles */ + +@import "./global.css"; +@import "./colors.css"; +@import "./prose.css"; +@import "./typography.css"; +@import "./skip-link.css"; +@import './misc.css'; +@import "./forms.css"; diff --git a/styles/base/misc.css b/styles/base/misc.css new file mode 100644 index 0000000..5da6b1d --- /dev/null +++ b/styles/base/misc.css @@ -0,0 +1 @@ +/* Miscellaneous extra styles */ diff --git a/styles/base/prose.css b/styles/base/prose.css new file mode 100644 index 0000000..c8640a5 --- /dev/null +++ b/styles/base/prose.css @@ -0,0 +1,36 @@ +/* Theme prose styles */ + +@theme { + --tw-prose-body: var(--color-primary); + --tw-prose-headings: var(--color-primary); + --tw-prose-lead: var(--color-primary); + --tw-prose-links: var(--color-info); + --tw-prose-bold: var(--color-primary); + --tw-prose-counters: var(--color-primary); + --tw-prose-bullets: var(--color-secondary); + --tw-prose-hr: var(--color-secondary); + --tw-prose-quotes: var(--color-primary); + --tw-prose-quote-borders: var(--color-primary); + --tw-prose-captions: var(--color-secondary); + --tw-prose-code: var(--color-primary); + --tw-prose-pre-code: var(--color-primary); + --tw-prose-pre-bg: var(--color-secondary); + --tw-prose-th-borders: var(--color-secondary); + --tw-prose-td-borders: var(--color-secondary); + --tw-prose-invert-body: var(--color-primary); + --tw-prose-invert-headings: var(--color-primary); + --tw-prose-invert-lead: var(--color-primary); + --tw-prose-invert-links: var(--color-secondary); + --tw-prose-invert-bold: var(--color-primary); + --tw-prose-invert-counters: var(--color-primary); + --tw-prose-invert-bullets: var(--color-primary); + --tw-prose-invert-hr: var(--color-secondary); + --tw-prose-invert-quotes: var(--color-primary); + --tw-prose-invert-quote-borders: var(--color-primary); + --tw-prose-invert-captions: var(--color-primary); + --tw-prose-invert-code: var(--color-secondary); + --tw-prose-invert-pre-code: var(--color-primary); + --tw-prose-invert-pre-bg: oklch(0% 0 0 / 50%); + --tw-prose-invert-th-borders: var(--color-primary); + --tw-prose-invert-td-borders: var(--color-primary); +} diff --git a/styles/base/skip-link.css b/styles/base/skip-link.css new file mode 100644 index 0000000..d81d799 --- /dev/null +++ b/styles/base/skip-link.css @@ -0,0 +1,25 @@ +.skip-link { + background-color: #f6ff00 !important; + border-color: #f6ff00 !important; + color: #000 !important; + font-size: larger; + font-weight: 600; + left: 0; + margin: 0 auto; + max-width: 90vw; + opacity: 1; + outline-color: #f6ff00 !important; + padding: 1rem; + position: absolute; + right: 0; + text-align: center; + top: 0.5rem; + transition: transform 0.1875s ease-out; + width: 15rem; + z-index: 999; + + &:not(:focus):not(:hover) { + opacity: 0; + transform: translateY(-4em); + } +} diff --git a/styles/base/typography.css b/styles/base/typography.css new file mode 100644 index 0000000..3bbc0c3 --- /dev/null +++ b/styles/base/typography.css @@ -0,0 +1,174 @@ +/* Basic typographical styles */ + +/** + * All font sizes are based on 16px base font size and 1920px wide screen + * Default size is expressed as percentage of screen width. + * text-14px: 12px-27px, default: 14px + * text-16px: 14px-28px, default: 16px + * text-18px: 14px-30px, default: 18px + * text-20px: 16px-32px, default: 20px + * text-22px: 17px-33px, default: 22px + * text-25px: 18px-35px, default: 25px + * text-30px: 19px-37px, default: 30px + * text-35px: 20px-40px, default: 35px + * text-38px: 22px-48px, default: 38px + * text-40px: 24px-56px, default: 40px + * text-45px: 25px-64px, default: 45px + * text-50px: 27px-72px, default: 50px + * text-55px: 28px-76px, default: 55px + * text-60px: 30px-80px, default: 60px + * text-70px: 30px-76px, default: 70px + * text-75px: 32px-80px, default: 75px + * + * Font sizes at standard viewport widths: + * | 360px | 640px | 768px | 1024px | 1280px | 1440px | 1920px + * |-------|-------|-------|--------|--------|--------|------- + * text-14px | 12.00 | 12.36 | 12.52 | 12.85 | 13.18 | 13.38 | 14.00 + * text-16px | 14.00 | 14.36 | 14.52 | 14.85 | 15.18 | 15.38 | 16.00 + * text-18px | 14.00 | 14.72 | 15.05 | 15.70 | 16.36 | 16.77 | 18.00 + * text-20px | 16.00 | 16.72 | 17.05 | 17.70 | 18.36 | 18.77 | 20.00 + * text-22px | 17.60 | 18.36 | 18.75 | 19.47 | 20.19 | 20.65 | 22.00 + * text-25px | 18.00 | 19.26 | 19.83 | 20.98 | 22.13 | 22.85 | 25.00 + * text-30px | 18.96 | 20.89 | 21.85 | 23.66 | 25.47 | 26.60 | 30.00 + * text-35px | 20.00 | 22.69 | 23.92 | 26.38 | 28.85 | 30.38 | 35.00 + * text-38px | 22.40 | 24.85 | 26.48 | 29.04 | 31.60 | 33.20 | 38.00 + * text-40px | 24.00 | 26.87 | 28.18 | 30.81 | 33.44 | 35.08 | 40.00 + * text-45px | 25.60 | 29.22 | 30.67 | 33.86 | 37.04 | 39.03 | 45.00 + * text-50px | 27.20 | 31.58 | 33.16 | 36.90 | 40.65 | 42.98 | 50.00 + * text-70px | 30.40 | 37.01 | 40.76 | 47.26 | 53.75 | 57.82 | 70.00 + * text-75px | 32.00 | 39.46 | 43.25 | 50.30 | 57.36 | 61.77 | 75.00 +*/ + +@theme { + --font-sans: "Raleway", sans-serif; + --line-height: 1.6; + + --text-base: 1rem; + --text-14px: clamp(0.75rem, calc(0.7212rem + 0.1282vw), 0.875rem); + --text-16px: clamp(0.875rem, calc(0.8462rem + 0.1282vw), 1rem); + --text-18px: clamp(0.875rem, calc(0.8173rem + 0.2564vw), 1.125rem); + --text-20px: clamp(1rem, calc(0.9423rem + 0.2564vw), 1.25rem); + --text-22px: clamp(1.1rem, calc(1.0365rem + 0.2821vw), 1.375rem); + --text-25px: clamp(1.125rem, calc(1.024rem + 0.4487vw), 1.5625rem); + --text-30px: clamp(1.185rem, calc(1.0258rem + 0.7077vw), 1.875rem); + --text-35px: clamp(1.25rem, calc(1.0337rem + 0.9615vw), 2.1875rem); + --text-38px: clamp(1.4rem, calc(1.175rem + 1vw), 2.375rem); + --text-40px: clamp(1.5rem, calc(1.2692rem + 1.0256vw), 2.5rem); + --text-45px: clamp(1.6rem, calc(1.3202rem + 1.2436vw), 2.8125rem); + --text-50px: clamp(1.7rem, calc(1.3712rem + 1.4615vw), 3.125rem); + --text-70px: clamp(1.9rem, calc(1.3288rem + 2.5385vw), 4.375rem); + --text-75px: clamp(2rem, calc(1.3798rem + 2.7564vw), 4.6875rem); + + --h1: calc(var(--text-base) * 2.25); + --h2: calc(var(--text-base) * 1.75); + --h3: calc(var(--text-base) * 1.5); + --h4: calc(var(--text-base) * 1.25); + --h5: calc(var(--text-base) * 1.125); + --h6: calc(var(--text-base) * 1.05); +} + +body { + background-color: white; + color: black; + font-family: var(--font-sans); + font-size: var(--text-base); + line-height: var(--line-height); +} + +::selection { background: var(--color-warning); } + +@layer components { + h1, h2, h3, + h4, h5, h6 { + font-family: var(--font-headings); + font-weight: 700; + margin: 0 0 1rem; + } + + h1, .h1 { + font-size: var(--h1); + line-height: 1.2; + } + + h2, .h2 { + font-size: var(--h2); + line-height: 1.3; + } + + h3, .h3 { + font-size: var(--h3); + line-height: 1.4; + } + + h4, .h4 { + font-size: var(--h4); + line-height: 1.5; + } + + h5, .h5 { font-size: var(--h5); } + + h6, .h6 { font-size: var(--h6); } +} + +a, .link { + color: var(--color-bodylinks); + text-decoration: none; + transition: color 200ms; + cursor: pointer; + + &:hover { color: var(--color-primary); } +} + +h1 a, .h1 a, +h2 a, .h2 a, +h3 a, .h3 a { + color: inherit; + text-decoration: underline; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + + +ul { list-style-type: disc; } + +ol { list-style-type: decimal; } + +li ul, li ol { margin: 0 1rem; } + +ol ol { list-style: lower-alpha; } + +ol ol ol { list-style: lower-roman; } + +ol ol ol ol { list-style: lower-alpha; } + +pre, code, +samp, style { font-family: monospace; } + +pre { + font-size: 0.875rem; + overflow: auto; + padding: 1.5rem; +} + +pre code { + background-color: inherit; + border-radius: 0; + color: inherit; + padding: 0; +} + +code { + @apply bg-black/30 px-[3px] py-0.5 font-mono text-black text-xs rounded-sm; +} + +hr { + background-color: black; + border: none; + display: block; + height: 1px; + margin: 1rem 0; + width: 100%; +} diff --git a/styles/blocks/buttons.css b/styles/blocks/buttons.css new file mode 100644 index 0000000..09f4264 --- /dev/null +++ b/styles/blocks/buttons.css @@ -0,0 +1,176 @@ +/* Button styles */ + +@theme { + /* Configuration */ + + /** + * Button component settings + * + * The variables below are used to define the button styles. + * Most of these variables come from the main theme configuration. + * The following variables are not defined, but have fallback values + * in their respective locations and can be added if needed: + * + * --button-font-weight (fallback is 600/semibold) + * --button-font-size (fallback is 1rem) + * --button-outline-width (fallback is --button-border-width) + * --button-outline-style (fallback is --button-border-style) + * --button-outline-color (fallback is --button-border-color) + */ + + --button-bg: var(--color-primary); + --button-color: var(--color-white); + --button-hover-bg: var(--color-info); + --button-hover-border-color: var(--color-info); + --button-hover-color: var(--color-white); + --button-border-width: 3px; + --button-border-style: solid; + --button-border-color: var(--button-bg); + --button-radius: 0.5rem; +} + +.btn, .button, .acf-block-preview .button { + @apply px-8 py-2 min-w-0; + + background: var(--button-bg); + color: var(--button-color); + cursor: pointer; + display: inline-block; + transition: background 200ms, border-color 200ms, color 200ms; + + border-width: var(--button-border-width); + border-style: var(--button-border-style); + border-color: var(--button-border-color); + border-radius: var(--button-radius); + + text-decoration: none; + font-weight: var(--button-font-weight, 600); + font-size: var(--button-font-size, 1rem); + line-height: 1.1; + + &[data-button-variant="outline"] { + background: transparent; + &:hover { background: transparent; } + + --button-color: var(--button-outline-color, var(--button-bg)); + --button-hover-border-color: var(--button-hover-bg); + --button-hover-color: var(--button-hover-bg); + } +} + +/* Hover/focus/active */ +.btn:hover, .button:hover, .acf-block-preview .button:hover { + background: var(--button-hover-bg); + border-color: var(--button-hover-border-color); + color: var(--button-hover-color); +} + +.btn:focus, .button:focus { + outline-width: var(--button-outline-width, var(--button-border-width)); + outline-style: var(--button-outline-style, var(--button-border-style)); + outline-color: var(--button-outline-color, var(--button-border-color)); + outline-offset: calc(var(--button-border-width) * 2); +} + +.btn:active, .button:active { transform: scale(99%); } + +/* Back To Top Button */ +#backToTopBtn { + display:none; + position:fixed; + bottom:2rem; + right:2rem; + z-index:1000; + padding:0.75em 1.5em; + font-size:1.1rem; + border-radius:2em; + background:var(--color-primary,#3857BC); + color:#fff; + border:none; + box-shadow:0 2px 8px rgba(0,0,0,0.15); + cursor:pointer; + transition:opacity 0.2s; +} + +/** + * Variants + * + * The following styles are used to define button variants. + * These styles are applied to the button element using the + * `data-button-*` attributes. + */ + +/* Sizes */ +.btn[data-button-size="small"], .button[data-button-size="small"] { @apply px-4 py-0.5; } +.btn[data-button-size="medium"], .button[data-button-size="medium"] { @apply px-8 py-2; } +.btn[data-button-size="large"], .button[data-button-size="large"] { @apply px-12 py-3; } + +/* Width */ +.btn[data-button-width="auto"], .button[data-button-width="auto"] { @apply min-w-0; } +.btn[data-button-width="small"], .button[data-button-width="small"] { @apply px-2; } +.btn[data-button-width="wide"], .button[data-button-width="wide"] { @apply sm:min-w-[20rem]; } +.button[data-button-width="full"], +x-button:has(.button[data-button-width="full"]) { @apply w-full; } + +/** + * Colors + * + * We don't need to speicifcally target "primary" buttons + * as the button styling defaults to "primary". + * However, you can, if necessary, by adding a style block + * like the ones below and changing the color values. + */ +.btn[data-button-color="secondary"], .button[data-button-color="secondary"] { + --button-bg: var(--color-secondary); + --button-color: var(--color-white); + --button-border-color: var(--color-secondary); + --button-outline-color: oklch(0.48 0.0136 252.2); + --button-hover-bg: var(--color-dark); + --button-hover-border-color: var(--color-dark); + --button-hover-color: var(--color-white); +} + +.btn[data-button-color="light"], .button[data-button-color="light"] { + --button-bg: var(--color-white); + --button-color: var(--color-dark); + --button-border-color: var(--color-white); + --button-hover-bg: var(--color-dark); + --button-hover-border-color: var(--color-dark); + --button-hover-color: var(--color-white); +} + +.btn[data-button-color="white"], .button[data-button-color="white"] { + --button-bg: var(--color-white); + --button-color: var(--color-black); + --button-border-color: var(--color-white); + --button-hover-bg: var(--color-secondary-200); + --button-hover-border-color: var(--color-secondary-200); + --button-hover-color: var(--color-black); +} + +.btn[data-button-color="black"], .button[data-button-color="black"] { + --button-bg: var(--color-black); + --button-color: var(--color-white); + --button-border-color: var(--color-black); + --button-hover-bg: var(--color-secondary); + --button-hover-border-color: var(--color-secondary); + --button-hover-color: var(--color-dark); +} + +.back-to-top { + background: var(--color-primary, #3857BC); + color: #fff; + border: none; + border-radius: 2em; + padding: 0.75em 1.5em; + font-size: 1.1rem; + box-shadow: 0 2px 8px rgba(0,0,0,0.15); + cursor: pointer; + transition: opacity 0.2s, background 0.2s; + opacity: 0.85; +} +.back-to-top:hover, .back-to-top:focus { + background: var(--color-info, #233a7a); + opacity: 1; + outline: 2px solid var(--color-info, #233a7a); +} diff --git a/styles/blocks/core.css b/styles/blocks/core.css new file mode 100644 index 0000000..af75e9d --- /dev/null +++ b/styles/blocks/core.css @@ -0,0 +1,5 @@ +.alignfull { + margin-left: calc(50% - 50vw); + margin-right: calc(50% - 50vw); + width: 100vw; +} diff --git a/styles/blocks/index.css b/styles/blocks/index.css new file mode 100644 index 0000000..e7efb94 --- /dev/null +++ b/styles/blocks/index.css @@ -0,0 +1,4 @@ +/* Theme block styles */ + +@import './buttons.css'; +@import './core.css'; diff --git a/styles/components/breadcrumbs.css b/styles/components/breadcrumbs.css new file mode 100644 index 0000000..91c3d8a --- /dev/null +++ b/styles/components/breadcrumbs.css @@ -0,0 +1,13 @@ +/* Breadcrumb styles */ + +#breadcrumbs { + @apply text-white; + + a { + color: oklch(0.72 0.122 212.25); + + &:hover { + color:color-mix(in oklch, oklch(0.72 0.122 212.25) 60%, white); + } + } +} diff --git a/styles/components/index.css b/styles/components/index.css new file mode 100644 index 0000000..fb03dae --- /dev/null +++ b/styles/components/index.css @@ -0,0 +1,8 @@ +/* Theme component styles */ + +@import "./site-header.css"; +@import "./breadcrumbs.css"; +@import "./post-list.css"; +@import "./sidebar.css"; +@import "./pagination.css"; +@import "./site-footer.css"; diff --git a/styles/components/pagination.css b/styles/components/pagination.css new file mode 100644 index 0000000..e5cd5e0 --- /dev/null +++ b/styles/components/pagination.css @@ -0,0 +1,35 @@ +/* Post index pagination styles */ + +.pagination { + .nav-links { + @apply hidden md:flex items-center justify-center mt-12; + + .page-numbers { + @apply hidden md:flex items-center justify-center h-10 p-4 text-base font-medium transition duration-300 rounded stroke-primary text-primary hover:bg-info hover:text-light hover:stroke-info focus-visible:bg-info focus-visible:text-light focus-visible:stroke-info focus-visible:outline-none; + } + + .page-numbers.current { + @apply text-light whitespace-nowrap bg-info ring-offset-2 hover:bg-primary hover:stroke-primary focus-visible:bg-info; + } + + .prev, .next { + @apply flex gap-4; + } + } + + & a, & span { + border: 1px solid #ddd; + border-radius: 4px; + color: #3857BC !important; + margin: 0 5px; + padding: .25rem .5rem; + text-decoration: none; + } + + & .current, & a:hover { + background: #3857BC !important; + border-color: #3857BC !important; + color: #fff !important; + padding: .25rem .5rem; + } +} diff --git a/styles/components/post-list.css b/styles/components/post-list.css new file mode 100644 index 0000000..e32e448 --- /dev/null +++ b/styles/components/post-list.css @@ -0,0 +1,37 @@ +/* Blog/post index listing styles */ + +.post-list { + /* Original styles, if needed + * .post-list__posts { + * } + * .post-list__h1 { + * } + * .post-list__post { + * &:hover { + * img { + * } + * } + * .post-list__title { + * } + * .post-list__details { + * } + * .post-list__byline { + * } + * .post-list__author { + * } + * .post-list__sep { + * } + * .post-list__date { + * } + * } + */ +} + +/* Original styles, if needed +* .no-posts { +* .no-posts__title { +* } +* .no-posts__desc { +* } +* } +*/ diff --git a/styles/components/sidebar.css b/styles/components/sidebar.css new file mode 100644 index 0000000..4c9dd72 --- /dev/null +++ b/styles/components/sidebar.css @@ -0,0 +1,28 @@ +/* Sidebar styles */ + +.sidebar{ + .widget { + /* Widget styles */ + @apply mb-8; + + h3 { + /* Widget title styles */ + @apply m-0 mb-2 font-semibold; + } + + ul { + /* List styles */ + @apply list-none m-0 p-0 pl-3 border-l-3 border-secondary-400; + + li { + /* List item styles */ + @apply text-balance; + + &:first-of-type { + /* First list item styles */ + @apply leading-none mb-1; + } + } + } + } +} diff --git a/styles/components/site-footer.css b/styles/components/site-footer.css new file mode 100644 index 0000000..4c5437b --- /dev/null +++ b/styles/components/site-footer.css @@ -0,0 +1,41 @@ +/* Footer styles */ + +.site-footer { + #footRight { + div { + @apply col-span-1 md:col-span-4 lg:col-span-1; + + h3 { + @apply font-bold text-secondary-300 text-20px mb-4 pb-2 border-b border-b-secondary-300 + } + + a { + @apply text-footlinks hover:opacity-60; + } + } + + .widget { + li { + @apply text-16px my-1 mb-2 leading-4; + } + + h4 { + @apply font-bold text-18px text-secondary mb-2; + } + + a { + @apply transition-colors duration-300 hover:text-success focus-visible:text-success; + } + } + + .menu-footer-menu-container { + @apply grow; + } + } + + .copyright { + p { @apply leading-none m-0 p-0; } + + a { @apply text-white hover:text-primary-500 underline underline-offset-2; } + } +} diff --git a/styles/components/site-header.css b/styles/components/site-header.css new file mode 100644 index 0000000..6718720 --- /dev/null +++ b/styles/components/site-header.css @@ -0,0 +1,22 @@ +/* Header styles */ + +.site-header { + /* Site header styles */ + .nav-aux__container { + a { + /* Link styles */ + color: var(--color-primary-600); + text-decoration: none; + font-weight: 500; + transition: color 0.3s ease; + + &:hover { + color: var(--color-primary-800); + } + } + + #globalSearch { + @apply text-14px text-light; + } + } +} diff --git a/styles/fonts/Lineicons.svg b/styles/fonts/Lineicons.svg new file mode 100644 index 0000000..d283ae8 --- /dev/null +++ b/styles/fonts/Lineicons.svg @@ -0,0 +1,1835 @@ + + + +{ + "author": "Lineicons", + "version": "5.0", + "url": "lineicons.com" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/fonts/Lineicons.woff2 b/styles/fonts/Lineicons.woff2 new file mode 100644 index 0000000..640d571 Binary files /dev/null and b/styles/fonts/Lineicons.woff2 differ diff --git a/styles/fonts/lineicons.css b/styles/fonts/lineicons.css new file mode 100644 index 0000000..0b6410c --- /dev/null +++ b/styles/fonts/lineicons.css @@ -0,0 +1,702 @@ +/*-------------------------------- +Lineicons regular icon font +-------------------------------- */ +@font-face { + font-family: 'Lineicons'; + src: url('../../styles/fonts/Lineicons.woff2') format('woff2'), + url('../../styles/fonts/Lineicons.svg') format('svg'); +} + +/* base class */ +[class^="lni-"], [class*=" lni-"], +[class^="icon-"], [class*=" icon-"], +[class^="lni-"]:before, [class*=" lni-"]:before, +[class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "Lineicons", sans-serif; + font-style: normal; + speak: never; + display: inline-block; + text-decoration: inherit; + vertical-align: middle; + text-align: center; + /* If needed - opacity: .8; */ + /* Animation center compensation - margins should be symmetric */ + /* if needed - margin-left: .2rem; */ + /* if needed - margin-right: .2rem; */ + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + font-size: 120%; + /* Font smoothing. That was taken from TWBS */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + /** + * Uncomment for 3D effect + * + * text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); + */ +} + +/* Circular Icons */ +.circular-icon { + @apply box-content bg-secondary rounded-full text-gray-800 inline-block; + + --size: 3rem; + height: var(--size); + text-align: center; + width: var(--size); + + i { + display: inline-block; + height: var(--size); + line-height: var(--size); + text-align: center; + vertical-align: middle; + width: var(--size); + } + + &i::before, span { line-height: var(--size) !important; } +} + +/* rotate the icon infinitely */ +.lni-is-spinning { animation: lni-spin 1s infinite linear; } + +@keyframes lni-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* transform */ +.lni-rotate-90 { transform: rotate(90deg); } +.lni-rotate-180 { transform: rotate(180deg); } +.lni-rotate-270 { transform: rotate(270deg); } +.lni-flip-y { transform: scaleY(-1); } +.lni-flip-x { transform: scaleX(-1); } + +/* icons */ +.lni-500px:before, .icon-500px:before { content: "\ea01"; } +.lni-adobe:before, .icon-adobe:before { content: "\ea02"; } +.lni-adonis:before, .icon-adonis:before { content: "\ea03"; } +.lni-aeroplane-1:before, .icon-aeroplane-1:before { content: "\ea04"; } +.lni-agenda:before, .icon-agenda:before { content: "\ea05"; } +.lni-airbnb:before, .icon-airbnb:before { content: "\ea06"; } +.lni-airtable:before, .icon-airtable:before { content: "\ea07"; } +.lni-alarm-1:before, .icon-alarm-1:before { content: "\ea08"; } +.lni-align-text-center:before, .icon-align-text-center:before { content: "\ea09"; } +.lni-align-text-left:before, .icon-align-text-left:before { content: "\ea0a"; } +.lni-align-text-right:before, .icon-align-text-right:before { content: "\ea0b"; } +.lni-alpinejs:before, .icon-alpinejs:before { content: "\ea0c"; } +.lni-amazon:before, .icon-amazon:before { content: "\ea0d"; } +.lni-amazon-original:before, .icon-amazon-original:before { content: "\ea0e"; } +.lni-amazon-pay:before, .icon-amazon-pay:before { content: "\ea0f"; } +.lni-ambulance-1:before, .icon-ambulance-1:before { content: "\ea10"; } +.lni-amd:before, .icon-amd:before { content: "\ea11"; } +.lni-amex:before, .icon-amex:before { content: "\ea12"; } +.lni-anchor:before, .icon-anchor:before { content: "\ea13"; } +.lni-android:before, .icon-android:before { content: "\ea14"; } +.lni-android-old:before, .icon-android-old:before { content: "\ea15"; } +.lni-angellist:before, .icon-angellist:before { content: "\ea16"; } +.lni-angle-double-down:before, .icon-angle-double-down:before { content: "\ea17"; } +.lni-angle-double-left:before, .icon-angle-double-left:before { content: "\ea18"; } +.lni-angle-double-right:before, .icon-angle-double-right:before { content: "\ea19"; } +.lni-angle-double-up:before, .icon-angle-double-up:before { content: "\ea1a"; } +.lni-angular:before, .icon-angular:before { content: "\ea1b"; } +.lni-app-store:before, .icon-app-store:before { content: "\ea1c"; } +.lni-apple-brand:before, .icon-apple-brand:before { content: "\ea1d"; } +.lni-apple-music:before, .icon-apple-music:before { content: "\ea1e"; } +.lni-apple-music-alt:before, .icon-apple-music-alt:before { content: "\ea1f"; } +.lni-apple:before, .icon-apple:before { content: "\ea1d"; } +.lni-apple-music:before, .icon-apple-music:before { content: "\ea1e"; } +.lni-apple-music-alt:before, .icon-apple-music-alt:before { content: "\ea1f"; } +.lni-apple-pay:before, .icon-apple-pay:before { content: "\ea20"; } +.lni-arc-browser:before, .icon-arc-browser:before { content: "\ea21"; } +.lni-arrow-all-direction:before, .icon-arrow-all-direction:before { content: "\ea22"; } +.lni-arrow-angular-top-left:before, .icon-arrow-angular-top-left:before { content: "\ea23"; } +.lni-arrow-angular-top-right:before, .icon-arrow-angular-top-right:before { content: "\ea24"; } +.lni-arrow-both-direction-horizontal-1:before, .icon-arrow-both-direction-horizontal-1:before { content: "\ea25"; } +.lni-arrow-both-direction-vertical-1:before, .icon-arrow-both-direction-vertical-1:before { content: "\ea26"; } +.lni-arrow-downward:before, .icon-arrow-downward:before { content: "\ea27"; } +.lni-arrow-left:before, .icon-arrow-left:before { content: "\ea28"; } +.lni-arrow-left-circle:before, .icon-arrow-left-circle:before { content: "\ea29"; } +.lni-arrow-right:before, .icon-arrow-right:before { content: "\ea2a"; } +.lni-arrow-right-circle:before, .icon-arrow-right-circle:before { content: "\ea2b"; } +.lni-arrow-upward:before, .icon-arrow-upward:before { content: "\ea2c"; } +.lni-asana:before, .icon-asana:before { content: "\ea2d"; } +.lni-astro:before, .icon-astro:before { content: "\ea2e"; } +.lni-atlassian:before, .icon-atlassian:before { content: "\ea2f"; } +.lni-audi:before, .icon-audi:before { content: "\ea30"; } +.lni-audi-alt:before, .icon-audi-alt:before { content: "\ea31"; } +.lni-aws:before, .icon-aws:before { content: "\ea32"; } +.lni-azure:before, .icon-azure:before { content: "\ea33"; } +.lni-badge-decagram-percent:before, .icon-badge-decagram-percent:before { content: "\ea34"; } +.lni-balloons:before, .icon-balloons:before { content: "\ea35"; } +.lni-ban-2:before, .icon-ban-2:before { content: "\ea36"; } +.lni-bar-chart-4:before, .icon-bar-chart-4:before { content: "\ea37"; } +.lni-bar-chart-dollar:before, .icon-bar-chart-dollar:before { content: "\ea38"; } +.lni-basket-shopping-3:before, .icon-basket-shopping-3:before { content: "\ea39"; } +.lni-beat:before, .icon-beat:before { content: "\ea3a"; } +.lni-behance:before, .icon-behance:before { content: "\ea3b"; } +.lni-bell-1:before, .icon-bell-1:before { content: "\ea3c"; } +.lni-bike:before, .icon-bike:before { content: "\ea3d"; } +.lni-bing:before, .icon-bing:before { content: "\ea3e"; } +.lni-bitbucket:before, .icon-bitbucket:before { content: "\ea3f"; } +.lni-bitcoin:before, .icon-bitcoin:before { content: "\ea40"; } +.lni-bittorrent:before, .icon-bittorrent:before { content: "\ea41"; } +.lni-blogger:before, .icon-blogger:before { content: "\ea42"; } +.lni-blogger-alt:before, .icon-blogger-alt:before { content: "\ea43"; } +.lni-bluetooth:before, .icon-bluetooth:before { content: "\ea44"; } +.lni-bluetooth-logo:before, .icon-bluetooth-logo:before { content: "\ea45"; } +.lni-bmw:before, .icon-bmw:before { content: "\ea46"; } +.lni-board-writing-3:before, .icon-board-writing-3:before { content: "\ea47"; } +.lni-bold:before, .icon-bold:before { content: "\ea48"; } +.lni-bolt-2:before, .icon-bolt-2:before { content: "\ea49"; } +.lni-bolt-3:before, .icon-bolt-3:before { content: "\ea4a"; } +.lni-book-1:before, .icon-book-1:before { content: "\ea4b"; } +.lni-bookmark-1:before, .icon-bookmark-1:before { content: "\ea4c"; } +.lni-bookmark-circle:before, .icon-bookmark-circle:before { content: "\ea4d"; } +.lni-books-2:before, .icon-books-2:before { content: "\ea4e"; } +.lni-bootstrap-5:before, .icon-bootstrap-5:before { content: "\ea4f"; } +.lni-bootstrap-5-square:before, .icon-bootstrap-5-square:before { content: "\ea50"; } +.lni-box-archive-1:before, .icon-box-archive-1:before { content: "\ea51"; } +.lni-box-closed:before, .icon-box-closed:before { content: "\ea52"; } +.lni-box-gift-1:before, .icon-box-gift-1:before { content: "\ea53"; } +.lni-brave:before, .icon-brave:before { content: "\ea54"; } +.lni-bricks:before, .icon-bricks:before { content: "\ea55"; } +.lni-bridge-3:before, .icon-bridge-3:before { content: "\ea56"; } +.lni-briefcase-1:before, .icon-briefcase-1:before { content: "\ea57"; } +.lni-briefcase-2:before, .icon-briefcase-2:before { content: "\ea58"; } +.lni-briefcase-plus-1:before, .icon-briefcase-plus-1:before { content: "\ea59"; } +.lni-brush-1-rotated:before, .icon-brush-1-rotated:before { content: "\ea5a"; } +.lni-brush-2:before, .icon-brush-2:before { content: "\ea5b"; } +.lni-btc:before, .icon-btc:before { content: "\ea5c"; } +.lni-bug-1:before, .icon-bug-1:before { content: "\ea5d"; } +.lni-buildings-1:before, .icon-buildings-1:before { content: "\ea5e"; } +.lni-bulb-2:before, .icon-bulb-2:before { content: "\ea5f"; } +.lni-bulb-4:before, .icon-bulb-4:before { content: "\ea60"; } +.lni-burger-1:before, .icon-burger-1:before { content: "\ea61"; } +.lni-burger-drink:before, .icon-burger-drink:before { content: "\ea62"; } +.lni-bus-1:before, .icon-bus-1:before { content: "\ea63"; } +.lni-busket-ball:before, .icon-busket-ball:before { content: "\ea64"; } +.lni-cake-1:before, .icon-cake-1:before { content: "\ea65"; } +.lni-calculator-1:before, .icon-calculator-1:before { content: "\ea66"; } +.lni-calculator-2:before, .icon-calculator-2:before { content: "\ea67"; } +.lni-calendar-days:before, .icon-calendar-days:before { content: "\ea68"; } +.lni-camera-1:before, .icon-camera-1:before { content: "\ea69"; } +.lni-camera-movie-1:before, .icon-camera-movie-1:before { content: "\ea6a"; } +.lni-candy-cane-2:before, .icon-candy-cane-2:before { content: "\ea6b"; } +.lni-candy-round-1:before, .icon-candy-round-1:before { content: "\ea6c"; } +.lni-canva:before, .icon-canva:before { content: "\ea6d"; } +.lni-capsule-1:before, .icon-capsule-1:before { content: "\ea6e"; } +.lni-car-2:before, .icon-car-2:before { content: "\ea6f"; } +.lni-car-4:before, .icon-car-4:before { content: "\ea70"; } +.lni-car-6:before, .icon-car-6:before { content: "\ea71"; } +.lni-caravan-1:before, .icon-caravan-1:before { content: "\ea72"; } +.lni-cart-1:before, .icon-cart-1:before { content: "\ea73"; } +.lni-cart-2:before, .icon-cart-2:before { content: "\ea74"; } +.lni-cash-app:before, .icon-cash-app:before { content: "\ea75"; } +.lni-certificate-badge-1:before, .icon-certificate-badge-1:before { content: "\ea76"; } +.lni-chat-bubble-2:before, .icon-chat-bubble-2:before { content: "\ea77"; } +.lni-check:before, .icon-check:before { content: "\ea78"; } +.lni-check-circle-1:before, .icon-check-circle-1:before { content: "\ea79"; } +.lni-check-square-2:before, .icon-check-square-2:before { content: "\ea7a"; } +.lni-chevron-down:before, .icon-chevron-down:before { content: "\ea7b"; } +.lni-chevron-down-circle:before, .icon-chevron-down-circle:before { content: "\ea7c"; } +.lni-chevron-left:before, .icon-chevron-left:before { content: "\ea7d"; } +.lni-chevron-left-circle:before, .icon-chevron-left-circle:before { content: "\ea7e"; } +.lni-chevron-right:before, .icon-chevron-right:before { content: "\ea7d"; transform: rotate(180deg); } +.lni-chevron-right-circle:before, .icon-chevron-right-circle:before { content: "\ea7f"; } +.lni-chevron-up:before, .icon-chevron-up:before { content: "\ea80"; } +.lni-chevron-up-circle:before, .icon-chevron-up-circle:before { content: "\ea81"; } +.lni-chrome:before, .icon-chrome:before { content: "\ea82"; } +.lni-chromecast:before, .icon-chromecast:before { content: "\ea83"; } +.lni-cisco:before, .icon-cisco:before { content: "\ea84"; } +.lni-claude:before, .icon-claude:before { content: "\ea85"; } +.lni-clickup:before, .icon-clickup:before { content: "\ea86"; } +.lni-clipboard:before, .icon-clipboard:before { content: "\ea87"; } +.lni-cloud-2:before, .icon-cloud-2:before { content: "\ea88"; } +.lni-cloud-bolt-1:before, .icon-cloud-bolt-1:before { content: "\ea89"; } +.lni-cloud-bolt-2:before, .icon-cloud-bolt-2:before { content: "\ea8a"; } +.lni-cloud-check-circle:before, .icon-cloud-check-circle:before { content: "\ea8b"; } +.lni-cloud-download:before, .icon-cloud-download:before { content: "\ea8c"; } +.lni-cloud-iot-2:before, .icon-cloud-iot-2:before { content: "\ea8d"; } +.lni-cloud-rain:before, .icon-cloud-rain:before { content: "\ea8e"; } +.lni-cloud-refresh-clockwise:before, .icon-cloud-refresh-clockwise:before { content: "\ea8f"; } +.lni-cloud-sun:before, .icon-cloud-sun:before { content: "\ea90"; } +.lni-cloud-upload:before, .icon-cloud-upload:before { content: "\ea91"; } +.lni-cloudflare:before, .icon-cloudflare:before { content: "\ea92"; } +.lni-code-1:before, .icon-code-1:before { content: "\ea93"; } +.lni-code-s:before, .icon-code-s:before { content: "\ea94"; } +.lni-codepen:before, .icon-codepen:before { content: "\ea95"; } +.lni-coffee-cup-2:before, .icon-coffee-cup-2:before { content: "\ea96"; } +.lni-coinbase:before, .icon-coinbase:before { content: "\ea97"; } +.lni-colour-palette-3:before, .icon-colour-palette-3:before { content: "\ea98"; } +.lni-comment-1:before, .icon-comment-1:before { content: "\ea99"; } +.lni-comment-1-share:before, .icon-comment-1-share:before { content: "\ea9a"; } +.lni-comment-1-text:before, .icon-comment-1-text:before { content: "\ea9b"; } +.lni-compass-drafting-2:before, .icon-compass-drafting-2:before { content: "\ea9c"; } +.lni-connectdevelop:before, .icon-connectdevelop:before { content: "\ea9d"; } +.lni-copilot:before, .icon-copilot:before { content: "\ea9e"; } +.lni-coral:before, .icon-coral:before { content: "\ea9f"; } +.lni-cpanel:before, .icon-cpanel:before { content: "\eaa0"; } +.lni-crane-4:before, .icon-crane-4:before { content: "\eaa1"; } +.lni-creative-commons:before, .icon-creative-commons:before { content: "\eaa2"; } +.lni-credit-card-multiple:before, .icon-credit-card-multiple:before { content: "\eaa3"; } +.lni-crop-2:before, .icon-crop-2:before { content: "\eaa4"; } +.lni-crown-3:before, .icon-crown-3:before { content: "\eaa5"; } +.lni-css3:before, .icon-css3:before { content: "\eaa6"; } +.lni-dashboard-square-1:before, .icon-dashboard-square-1:before { content: "\eaa7"; } +.lni-database-2:before, .icon-database-2:before { content: "\eaa8"; } +.lni-deno:before, .icon-deno:before { content: "\eaa9"; } +.lni-dev:before, .icon-dev:before { content: "\eaaa"; } +.lni-dialogflow:before, .icon-dialogflow:before { content: "\eaab"; } +.lni-diamonds-1:before, .icon-diamonds-1:before { content: "\eaac"; } +.lni-diamonds-2:before, .icon-diamonds-2:before { content: "\eaad"; } +.lni-digitalocean:before, .icon-digitalocean:before { content: "\eaae"; } +.lni-diners-club:before, .icon-diners-club:before { content: "\eaaf"; } +.lni-direction-ltr:before, .icon-direction-ltr:before { content: "\eab0"; } +.lni-direction-rtl:before, .icon-direction-rtl:before { content: "\eab1"; } +.lni-discord:before, .icon-discord:before { content: "\eab2"; } +.lni-discord-chat:before, .icon-discord-chat:before { content: "\eab3"; } +.lni-discover:before, .icon-discover:before { content: "\eab4"; } +.lni-docker:before, .icon-docker:before { content: "\eab5"; } +.lni-dollar:before, .icon-dollar:before { content: "\eab6"; } +.lni-dollar-circle:before, .icon-dollar-circle:before { content: "\eab7"; } +.lni-double-quotes-end-1:before, .icon-double-quotes-end-1:before { content: "\eab8"; } +.lni-download-1:before, .icon-download-1:before { content: "\eab9"; } +.lni-download-circle-1:before, .icon-download-circle-1:before { content: "\eaba"; } +.lni-dribbble:before, .icon-dribbble:before { content: "\eabb"; } +.lni-dribbble-symbol:before, .icon-dribbble-symbol:before { content: "\eabc"; } +.lni-drizzle:before, .icon-drizzle:before { content: "\eabd"; } +.lni-dropbox:before, .icon-dropbox:before { content: "\eabe"; } +.lni-drupal:before, .icon-drupal:before { content: "\eabf"; } +.lni-dumbbell-1:before, .icon-dumbbell-1:before { content: "\eac0"; } +.lni-edge:before, .icon-edge:before { content: "\eac1"; } +.lni-emoji-expressionless:before, .icon-emoji-expressionless:before { content: "\eac2"; } +.lni-emoji-expressionless-flat-eyes:before, .icon-emoji-expressionless-flat-eyes:before { content: "\eac3"; } +.lni-emoji-grin:before, .icon-emoji-grin:before { content: "\eac4"; } +.lni-emoji-sad:before, .icon-emoji-sad:before { content: "\eac5"; } +.lni-emoji-smile:before, .icon-emoji-smile:before { content: "\eac6"; } +.lni-emoji-smile-side:before, .icon-emoji-smile-side:before { content: "\eac7"; } +.lni-emoji-smile-sunglass:before, .icon-emoji-smile-sunglass:before { content: "\eac8"; } +.lni-emoji-smile-tongue:before, .icon-emoji-smile-tongue:before { content: "\eac9"; } +.lni-enter:before, .icon-enter:before { content: "\eaca"; } +.lni-enter-down:before, .icon-enter-down:before { content: "\eacb"; } +.lni-envato:before, .icon-envato:before { content: "\eacc"; } +.lni-envelope-1:before, .icon-envelope-1:before { content: "\eacd"; } +.lni-eraser-1:before, .icon-eraser-1:before { content: "\eace"; } +.lni-ethereum-logo:before, .icon-ethereum-logo:before { content: "\eacf"; } +.lni-euro:before, .icon-euro:before { content: "\ead0"; } +.lni-exit:before, .icon-exit:before { content: "\ead1"; } +.lni-exit-up:before, .icon-exit-up:before { content: "\ead2"; } +.lni-expand-arrow-1:before, .icon-expand-arrow-1:before { content: "\ead3"; } +.lni-expand-square-4:before, .icon-expand-square-4:before { content: "\ead4"; } +.lni-expressjs:before, .icon-expressjs:before { content: "\ead5"; } +.lni-eye:before, .icon-eye:before { content: "\ead6"; } +.lni-facebook:before, .icon-facebook:before { content: "\ead7"; } +.lni-facebook-messenger:before, .icon-facebook-messenger:before { content: "\ead8"; } +.lni-facebook-rounded:before, .icon-facebook-rounded:before { content: "\ead9"; } +.lni-facebook-square:before, .icon-facebook-square:before { content: "\eada"; } +.lni-facetime:before, .icon-facetime:before { content: "\eadb"; } +.lni-figma:before, .icon-figma:before { content: "\eadc"; } +.lni-file-format-zip:before, .icon-file-format-zip:before { content: "\eadd"; } +.lni-file-multiple:before, .icon-file-multiple:before { content: "\eade"; } +.lni-file-pencil:before, .icon-file-pencil:before { content: "\eadf"; } +.lni-file-plus-circle:before, .icon-file-plus-circle:before { content: "\eae0"; } +.lni-file-question:before, .icon-file-question:before { content: "\eae1"; } +.lni-file-xmark:before, .icon-file-xmark:before { content: "\eae2"; } +.lni-firebase:before, .icon-firebase:before { content: "\eae3"; } +.lni-firefox:before, .icon-firefox:before { content: "\eae4"; } +.lni-firework-rocket-4:before, .icon-firework-rocket-4:before { content: "\eae5"; } +.lni-fitbit:before, .icon-fitbit:before { content: "\eae6"; } +.lni-flag-1:before, .icon-flag-1:before { content: "\eae7"; } +.lni-flag-2:before, .icon-flag-2:before { content: "\eae8"; } +.lni-flickr:before, .icon-flickr:before { content: "\eae9"; } +.lni-floppy-disk-1:before, .icon-floppy-disk-1:before { content: "\eaea"; } +.lni-flower-2:before, .icon-flower-2:before { content: "\eaeb"; } +.lni-flutter:before, .icon-flutter:before { content: "\eaec"; } +.lni-folder-1:before, .icon-folder-1:before { content: "\eaed"; } +.lni-ford:before, .icon-ford:before { content: "\eaee"; } +.lni-framer:before, .icon-framer:before { content: "\eaef"; } +.lni-funnel-1:before, .icon-funnel-1:before { content: "\eaf0"; } +.lni-gallery:before, .icon-gallery:before { content: "\eaf1"; } +.lni-game-pad-modern-1:before, .icon-game-pad-modern-1:before { content: "\eaf2"; } +.lni-gatsby:before, .icon-gatsby:before { content: "\eaf3"; } +.lni-gauge-1:before, .icon-gauge-1:before { content: "\eaf4"; } +.lni-gear-1:before, .icon-gear-1:before { content: "\eaf5"; } +.lni-gears-3:before, .icon-gears-3:before { content: "\eaf6"; } +.lni-gemini:before, .icon-gemini:before { content: "\eaf7"; } +.lni-git:before, .icon-git:before { content: "\eaf8"; } +.lni-github:before, .icon-github:before { content: "\eaf9"; } +.lni-glass-juice-1:before, .icon-glass-juice-1:before { content: "\eafa"; } +.lni-globe-1:before, .icon-globe-1:before { content: "\eafb"; } +.lni-globe-stand:before, .icon-globe-stand:before { content: "\eafc"; } +.lni-go:before, .icon-go:before { content: "\eafd"; } +.lni-goodreads:before, .icon-goodreads:before { content: "\eafe"; } +.lni-google:before, .icon-google:before { content: "\eaff"; } +.lni-google-cloud:before, .icon-google-cloud:before { content: "\eb00"; } +.lni-google-drive:before, .icon-google-drive:before { content: "\eb01"; } +.lni-google-meet:before, .icon-google-meet:before { content: "\eb02"; } +.lni-google-pay:before, .icon-google-pay:before { content: "\eb03"; } +.lni-google-wallet:before, .icon-google-wallet:before { content: "\eb04"; } +.lni-graduation-cap-1:before, .icon-graduation-cap-1:before { content: "\eb05"; } +.lni-grammarly:before, .icon-grammarly:before { content: "\eb06"; } +.lni-hacker-news:before, .icon-hacker-news:before { content: "\eb07"; } +.lni-hammer-1:before, .icon-hammer-1:before { content: "\eb08"; } +.lni-hammer-2:before, .icon-hammer-2:before { content: "\eb09"; } +.lni-hand-mic:before, .icon-hand-mic:before { content: "\eb0a"; } +.lni-hand-shake:before, .icon-hand-shake:before { content: "\eb0b"; } +.lni-hand-stop:before, .icon-hand-stop:before { content: "\eb0c"; } +.lni-hand-taking-dollar:before, .icon-hand-taking-dollar:before { content: "\eb0d"; } +.lni-hand-taking-leaf-1:before, .icon-hand-taking-leaf-1:before { content: "\eb0e"; } +.lni-hand-taking-user:before, .icon-hand-taking-user:before { content: "\eb0f"; } +.lni-hashnode:before, .icon-hashnode:before { content: "\eb10"; } +.lni-hat-chef-3:before, .icon-hat-chef-3:before { content: "\eb11"; } +.lni-headphone-1:before, .icon-headphone-1:before { content: "\eb12"; } +.lni-heart:before, .icon-heart:before { content: "\eb13"; } +.lni-helicopter-2:before, .icon-helicopter-2:before { content: "\eb14"; } +.lni-helmet-safety-1:before, .icon-helmet-safety-1:before { content: "\eb15"; } +.lni-hierarchy-1:before, .icon-hierarchy-1:before { content: "\eb16"; } +.lni-highlighter-1:before, .icon-highlighter-1:before { content: "\eb17"; } +.lni-highlighter-2:before, .icon-highlighter-2:before { content: "\eb18"; } +.lni-home-2:before, .icon-home-2:before { content: "\eb19"; } +.lni-hospital-2:before, .icon-hospital-2:before { content: "\eb1a"; } +.lni-hourglass:before, .icon-hourglass:before { content: "\eb1b"; } +.lni-html5:before, .icon-html5:before { content: "\eb1c"; } +.lni-ibm:before, .icon-ibm:before { content: "\eb1d"; } +.lni-id-card:before, .icon-id-card:before { content: "\eb1e"; } +.lni-imdb:before, .icon-imdb:before { content: "\eb1f"; } +.lni-indent:before, .icon-indent:before { content: "\eb20"; } +.lni-info:before, .icon-info:before { content: "\eb21"; } +.lni-injection-1:before, .icon-injection-1:before { content: "\eb22"; } +.lni-instagram:before, .icon-instagram:before { content: "\eb23"; } +.lni-instagram-logotype:before, .icon-instagram-logotype:before { content: "\eb24"; } +.lni-intel:before, .icon-intel:before { content: "\eb25"; } +.lni-ios:before, .icon-ios:before { content: "\eb26"; } +.lni-island-2:before, .icon-island-2:before { content: "\eb27"; } +.lni-jaguar:before, .icon-jaguar:before { content: "\eb28"; } +.lni-jamstack:before, .icon-jamstack:before { content: "\eb29"; } +.lni-java:before, .icon-java:before { content: "\eb2a"; } +.lni-javascript:before, .icon-javascript:before { content: "\eb2b"; } +.lni-jcb:before, .icon-jcb:before { content: "\eb2c"; } +.lni-joomla:before, .icon-joomla:before { content: "\eb2d"; } +.lni-jsfiddle:before, .icon-jsfiddle:before { content: "\eb2e"; } +.lni-key-1:before, .icon-key-1:before { content: "\eb2f"; } +.lni-keyboard:before, .icon-keyboard:before { content: "\eb30"; } +.lni-knife-fork-1:before, .icon-knife-fork-1:before { content: "\eb31"; } +.lni-kubernetes:before, .icon-kubernetes:before { content: "\eb32"; } +.lni-label-dollar-2:before, .icon-label-dollar-2:before { content: "\eb33"; } +.lni-laptop-2:before, .icon-laptop-2:before { content: "\eb34"; } +.lni-laptop-phone:before, .icon-laptop-phone:before { content: "\eb35"; } +.lni-laravel:before, .icon-laravel:before { content: "\eb36"; } +.lni-layers-1:before, .icon-layers-1:before { content: "\eb37"; } +.lni-layout-26:before, .icon-layout-26:before { content: "\eb38"; } +.lni-layout-9:before, .icon-layout-9:before { content: "\eb39"; } +.lni-leaf-1:before, .icon-leaf-1:before { content: "\eb3a"; } +.lni-leaf-6:before, .icon-leaf-6:before { content: "\eb3b"; } +.lni-lemon-squeezy:before, .icon-lemon-squeezy:before { content: "\eb3c"; } +.lni-life-guard-tube-1:before, .icon-life-guard-tube-1:before { content: "\eb3d"; } +.lni-line:before, .icon-line:before { content: "\eb3e"; } +.lni-line-dashed:before, .icon-line-dashed:before { content: "\eb3f"; } +.lni-line-dotted:before, .icon-line-dotted:before { content: "\eb40"; } +.lni-line-height:before, .icon-line-height:before { content: "\eb41"; } +.lni-lineicons:before, .icon-lineicons:before { content: "\eb42"; } +.lni-link-2-angular-right:before, .icon-link-2-angular-right:before { content: "\eb43"; } +.lni-linkedin:before, .icon-linkedin:before { content: "\eb44"; } +.lni-location-arrow-right:before, .icon-location-arrow-right:before { content: "\eb45"; } +.lni-locked-1:before, .icon-locked-1:before { content: "\eb46"; } +.lni-locked-2:before, .icon-locked-2:before { content: "\eb47"; } +.lni-loom:before, .icon-loom:before { content: "\eb48"; } +.lni-magento:before, .icon-magento:before { content: "\eb49"; } +.lni-magnet:before, .icon-magnet:before { content: "\eb4a"; } +.lni-mailchimp:before, .icon-mailchimp:before { content: "\eb4b"; } +.lni-map-marker-1:before, .icon-map-marker-1:before { content: "\eb4c"; } +.lni-map-marker-5:before, .icon-map-marker-5:before { content: "\eb4d"; } +.lni-map-pin-5:before, .icon-map-pin-5:before { content: "\eb4e"; } +.lni-markdown:before, .icon-markdown:before { content: "\eb4f"; } +.lni-mastercard:before, .icon-mastercard:before { content: "\eb50"; } +.lni-medium:before, .icon-medium:before { content: "\eb51"; } +.lni-medium-alt:before, .icon-medium-alt:before { content: "\eb52"; } +.lni-megaphone-1:before, .icon-megaphone-1:before { content: "\eb53"; } +.lni-menu-cheesburger:before, .icon-menu-cheesburger:before { content: "\eb54"; } +.lni-menu-hamburger-1:before, .icon-menu-hamburger-1:before { content: "\eb55"; } +.lni-menu-meatballs-1:before, .icon-menu-meatballs-1:before { content: "\eb56"; } +.lni-menu-meatballs-2:before, .icon-menu-meatballs-2:before { content: "\eb57"; } +.lni-mercedes:before, .icon-mercedes:before { content: "\eb58"; } +.lni-message-2:before, .icon-message-2:before { content: "\eb59"; } +.lni-message-2-question:before, .icon-message-2-question:before { content: "\eb5a"; } +.lni-message-3-text:before, .icon-message-3-text:before { content: "\eb5b"; } +.lni-meta:before, .icon-meta:before { content: "\eb5c"; } +.lni-meta-alt:before, .icon-meta-alt:before { content: "\eb5d"; } +.lni-microphone-1:before, .icon-microphone-1:before { content: "\eb5e"; } +.lni-microscope:before, .icon-microscope:before { content: "\eb5f"; } +.lni-microsoft:before, .icon-microsoft:before { content: "\eb60"; } +.lni-microsoft-edge:before, .icon-microsoft-edge:before { content: "\eb61"; } +.lni-microsoft-teams:before, .icon-microsoft-teams:before { content: "\eb62"; } +.lni-minus:before, .icon-minus:before { content: "\eb63"; } +.lni-minus-circle:before, .icon-minus-circle:before { content: "\eb64"; } +.lni-mongodb:before, .icon-mongodb:before { content: "\eb65"; } +.lni-monitor:before, .icon-monitor:before { content: "\eb66"; } +.lni-monitor-code:before, .icon-monitor-code:before { content: "\eb67"; } +.lni-monitor-mac:before, .icon-monitor-mac:before { content: "\eb68"; } +.lni-moon-half-right-5:before, .icon-moon-half-right-5:before { content: "\eb69"; } +.lni-mountains-2:before, .icon-mountains-2:before { content: "\eb6a"; } +.lni-mouse-2:before, .icon-mouse-2:before { content: "\eb6b"; } +.lni-mushroom-1:before, .icon-mushroom-1:before { content: "\eb6c"; } +.lni-mushroom-5:before, .icon-mushroom-5:before { content: "\eb6d"; } +.lni-music:before, .icon-music:before { content: "\eb6e"; } +.lni-mysql:before, .icon-mysql:before { content: "\eb6f"; } +.lni-nasa:before, .icon-nasa:before { content: "\eb70"; } +.lni-netflix:before, .icon-netflix:before { content: "\eb71"; } +.lni-netlify:before, .icon-netlify:before { content: "\eb72"; } +.lni-next-step-2:before, .icon-next-step-2:before { content: "\eb73"; } +.lni-nextjs:before, .icon-nextjs:before { content: "\eb74"; } +.lni-nike:before, .icon-nike:before { content: "\eb75"; } +.lni-nissan:before, .icon-nissan:before { content: "\eb76"; } +.lni-nodejs:before, .icon-nodejs:before { content: "\eb77"; } +.lni-nodejs-alt:before, .icon-nodejs-alt:before { content: "\eb78"; } +.lni-notebook-1:before, .icon-notebook-1:before { content: "\eb79"; } +.lni-notion:before, .icon-notion:before { content: "\eb7a"; } +.lni-npm:before, .icon-npm:before { content: "\eb7b"; } +.lni-nuxt:before, .icon-nuxt:before { content: "\eb7c"; } +.lni-nvidia:before, .icon-nvidia:before { content: "\eb7d"; } +.lni-oculus:before, .icon-oculus:before { content: "\eb7e"; } +.lni-open-ai:before, .icon-open-ai:before { content: "\eb7f"; } +.lni-opera-mini:before, .icon-opera-mini:before { content: "\eb80"; } +.lni-oracle:before, .icon-oracle:before { content: "\eb81"; } +.lni-outdent:before, .icon-outdent:before { content: "\eb82"; } +.lni-paddle:before, .icon-paddle:before { content: "\eb83"; } +.lni-page-break-1:before, .icon-page-break-1:before { content: "\eb84"; } +.lni-pagination:before, .icon-pagination:before { content: "\eb85"; } +.lni-paint-bucket:before, .icon-paint-bucket:before { content: "\eb86"; } +.lni-paint-roller-1:before, .icon-paint-roller-1:before { content: "\eb87"; } +.lni-paperclip-1:before, .icon-paperclip-1:before { content: "\eb88"; } +.lni-party-flags:before, .icon-party-flags:before { content: "\eb89"; } +.lni-party-spray:before, .icon-party-spray:before { content: "\eb8a"; } +.lni-patreon:before, .icon-patreon:before { content: "\eb8b"; } +.lni-pause:before, .icon-pause:before { content: "\eb8c"; } +.lni-payoneer:before, .icon-payoneer:before { content: "\eb8d"; } +.lni-paypal:before, .icon-paypal:before { content: "\eb8e"; } +.lni-pen-to-square:before, .icon-pen-to-square:before { content: "\eb8f"; } +.lni-pencil-1:before, .icon-pencil-1:before { content: "\eb90"; } +.lni-pepsi:before, .icon-pepsi:before { content: "\eb91"; } +.lni-phone:before, .icon-phone:before { content: "\eb92"; } +.lni-photos:before, .icon-photos:before { content: "\eb93"; } +.lni-php:before, .icon-php:before { content: "\eb94"; } +.lni-pie-chart-2:before, .icon-pie-chart-2:before { content: "\eb95"; } +.lni-pilcrow:before, .icon-pilcrow:before { content: "\eb96"; } +.lni-pimjo-logo:before, .icon-pimjo-logo:before { content: "\eb97"; } +.lni-pimjo-symbol:before, .icon-pimjo-symbol:before { content: "\eb98"; } +.lni-pinterest:before, .icon-pinterest:before { content: "\eb99"; } +.lni-pizza-2:before, .icon-pizza-2:before { content: "\eb9a"; } +.lni-placeholder-dollar:before, .icon-placeholder-dollar:before { content: "\eb9b"; } +.lni-plantscale:before, .icon-plantscale:before { content: "\eb9c"; } +.lni-play:before, .icon-play:before { content: "\eb9d"; } +.lni-play-store:before, .icon-play-store:before { content: "\eb9e"; } +.lni-playstation:before, .icon-playstation:before { content: "\eb9f"; } +.lni-plug-1:before, .icon-plug-1:before { content: "\eba0"; } +.lni-plus:before, .icon-plus:before { content: "\eba1"; } +.lni-plus-circle:before, .icon-plus-circle:before { content: "\eba2"; } +.lni-pnpm:before, .icon-pnpm:before { content: "\eba3"; } +.lni-postgresql:before, .icon-postgresql:before { content: "\eba4"; } +.lni-postman:before, .icon-postman:before { content: "\eba5"; } +.lni-pound:before, .icon-pound:before { content: "\eba6"; } +.lni-power-button:before, .icon-power-button:before { content: "\eba7"; } +.lni-previous-step-2:before, .icon-previous-step-2:before { content: "\eba8"; } +.lni-printer:before, .icon-printer:before { content: "\eba9"; } +.lni-prisma:before, .icon-prisma:before { content: "\ebaa"; } +.lni-producthunt:before, .icon-producthunt:before { content: "\ebab"; } +.lni-proton-mail-logo:before, .icon-proton-mail-logo:before { content: "\ebac"; } +.lni-proton-mail-symbol:before, .icon-proton-mail-symbol:before { content: "\ebad"; } +.lni-python:before, .icon-python:before { content: "\ebae"; } +.lni-question-mark:before, .icon-question-mark:before { content: "\ebaf"; } +.lni-question-mark-circle:before, .icon-question-mark-circle:before { content: "\ebb0"; } +.lni-quora:before, .icon-quora:before { content: "\ebb1"; } +.lni-radis:before, .icon-radis:before { content: "\ebb2"; } +.lni-react:before, .icon-react:before { content: "\ebb3"; } +.lni-reddit:before, .icon-reddit:before { content: "\ebb4"; } +.lni-refresh-circle-1-clockwise:before, .icon-refresh-circle-1-clockwise:before { content: "\ebb5"; } +.lni-refresh-dollar-1:before, .icon-refresh-dollar-1:before { content: "\ebb6"; } +.lni-refresh-user-1:before, .icon-refresh-user-1:before { content: "\ebb7"; } +.lni-remix-js:before, .icon-remix-js:before { content: "\ebb8"; } +.lni-road-1:before, .icon-road-1:before { content: "\ebb9"; } +.lni-rocket-5:before, .icon-rocket-5:before { content: "\ebba"; } +.lni-route-1:before, .icon-route-1:before { content: "\ebbb"; } +.lni-rss-right:before, .icon-rss-right:before { content: "\ebbc"; } +.lni-ruler-1:before, .icon-ruler-1:before { content: "\ebbd"; } +.lni-ruler-pen:before, .icon-ruler-pen:before { content: "\ebbe"; } +.lni-rupee:before, .icon-rupee:before { content: "\ebbf"; } +.lni-safari:before, .icon-safari:before { content: "\ebc0"; } +.lni-sanity:before, .icon-sanity:before { content: "\ebc1"; } +.lni-school-bench-1:before, .icon-school-bench-1:before { content: "\ebc2"; } +.lni-school-bench-2:before, .icon-school-bench-2:before { content: "\ebc3"; } +.lni-scissors-1-vertical:before, .icon-scissors-1-vertical:before { content: "\ebc4"; } +.lni-scoter:before, .icon-scoter:before { content: "\ebc5"; } +.lni-scroll-down-2:before, .icon-scroll-down-2:before { content: "\ebc6"; } +.lni-search-1:before, .icon-search-1:before { content: "\ebc7"; } +.lni-search-2:before, .icon-search-2:before { content: "\ebc8"; } +.lni-search-minus:before, .icon-search-minus:before { content: "\ebc9"; } +.lni-search-plus:before, .icon-search-plus:before { content: "\ebca"; } +.lni-search-text:before, .icon-search-text:before { content: "\ebcb"; } +.lni-select-cursor-1:before, .icon-select-cursor-1:before { content: "\ebcc"; } +.lni-seo-monitor:before, .icon-seo-monitor:before { content: "\ebcd"; } +.lni-service-bell-1:before, .icon-service-bell-1:before { content: "\ebce"; } +.lni-share-1:before, .icon-share-1:before { content: "\ebcf"; } +.lni-share-1-circle:before, .icon-share-1-circle:before { content: "\ebd0"; } +.lni-share-2:before, .icon-share-2:before { content: "\ebd1"; } +.lni-shield-2:before, .icon-shield-2:before { content: "\ebd2"; } +.lni-shield-2-check:before, .icon-shield-2-check:before { content: "\ebd3"; } +.lni-shield-dollar:before, .icon-shield-dollar:before { content: "\ebd4"; } +.lni-shift-left:before, .icon-shift-left:before { content: "\ebd5"; } +.lni-shift-right:before, .icon-shift-right:before { content: "\ebd6"; } +.lni-ship-1:before, .icon-ship-1:before { content: "\ebd7"; } +.lni-shirt-1:before, .icon-shirt-1:before { content: "\ebd8"; } +.lni-shopify:before, .icon-shopify:before { content: "\ebd9"; } +.lni-shovel:before, .icon-shovel:before { content: "\ebda"; } +.lni-shuffle:before, .icon-shuffle:before { content: "\ebdb"; } +.lni-sign-post-left:before, .icon-sign-post-left:before { content: "\ebdc"; } +.lni-signal-app:before, .icon-signal-app:before { content: "\ebdd"; } +.lni-signs-post-2:before, .icon-signs-post-2:before { content: "\ebde"; } +.lni-sketch:before, .icon-sketch:before { content: "\ebdf"; } +.lni-skype:before, .icon-skype:before { content: "\ebe0"; } +.lni-slack:before, .icon-slack:before { content: "\ebe1"; } +.lni-slice-2:before, .icon-slice-2:before { content: "\ebe2"; } +.lni-sliders-horizontal-square-2:before, .icon-sliders-horizontal-square-2:before { content: "\ebe3"; } +.lni-slideshare:before, .icon-slideshare:before { content: "\ebe4"; } +.lni-snapchat:before, .icon-snapchat:before { content: "\ebe5"; } +.lni-sort-alphabetical:before, .icon-sort-alphabetical:before { content: "\ebe6"; } +.lni-sort-high-to-low:before, .icon-sort-high-to-low:before { content: "\ebe7"; } +.lni-soundcloud:before, .icon-soundcloud:before { content: "\ebe8"; } +.lni-spacex:before, .icon-spacex:before { content: "\ebe9"; } +.lni-spellcheck:before, .icon-spellcheck:before { content: "\ebea"; } +.lni-spinner-2-sacle:before, .icon-spinner-2-sacle:before { content: "\ebeb"; } +.lni-spinner-3:before, .icon-spinner-3:before { content: "\ebec"; } +.lni-sports:before, .icon-sports:before { content: "\ebed"; } +.lni-spotify:before, .icon-spotify:before { content: "\ebee"; } +.lni-spotify-alt:before, .icon-spotify-alt:before { content: "\ebef"; } +.lni-squarespace:before, .icon-squarespace:before { content: "\ebf0"; } +.lni-stackoverflow:before, .icon-stackoverflow:before { content: "\ebf1"; } +.lni-stamp:before, .icon-stamp:before { content: "\ebf2"; } +.lni-star-fat:before, .icon-star-fat:before { content: "\ebf3"; } +.lni-star-fat-half-2:before, .icon-star-fat-half-2:before { content: "\ebf4"; } +.lni-star-sharp-disabled:before, .icon-star-sharp-disabled:before { content: "\ebf5"; } +.lni-statista:before, .icon-statista:before { content: "\ebf6"; } +.lni-steam:before, .icon-steam:before { content: "\ebf7"; } +.lni-stethoscope-1:before, .icon-stethoscope-1:before { content: "\ebf8"; } +.lni-stopwatch:before, .icon-stopwatch:before { content: "\ebf9"; } +.lni-storage-hdd-2:before, .icon-storage-hdd-2:before { content: "\ebfa"; } +.lni-strikethrough-1:before, .icon-strikethrough-1:before { content: "\ebfb"; } +.lni-stripe:before, .icon-stripe:before { content: "\ebfc"; } +.lni-stumbleupon:before, .icon-stumbleupon:before { content: "\ebfd"; } +.lni-sun-1:before, .icon-sun-1:before { content: "\ebfe"; } +.lni-supabase:before, .icon-supabase:before { content: "\ebff"; } +.lni-surfboard-2:before, .icon-surfboard-2:before { content: "\ec00"; } +.lni-svelte:before, .icon-svelte:before { content: "\ec01"; } +.lni-swift:before, .icon-swift:before { content: "\ec02"; } +.lni-tab:before, .icon-tab:before { content: "\ec03"; } +.lni-tailwindcss:before, .icon-tailwindcss:before { content: "\ec04"; } +.lni-target-user:before, .icon-target-user:before { content: "\ec05"; } +.lni-telegram:before, .icon-telegram:before { content: "\ec06"; } +.lni-telephone-1:before, .icon-telephone-1:before { content: "\ec07"; } +.lni-telephone-3:before, .icon-telephone-3:before { content: "\ec08"; } +.lni-tesla:before, .icon-tesla:before { content: "\ec09"; } +.lni-text-format:before, .icon-text-format:before { content: "\ec0a"; } +.lni-text-format-remove:before, .icon-text-format-remove:before { content: "\ec0b"; } +.lni-text-paragraph:before, .icon-text-paragraph:before { content: "\ec0c"; } +.lni-thumbs-down-3:before, .icon-thumbs-down-3:before { content: "\ec0d"; } +.lni-thumbs-up-3:before, .icon-thumbs-up-3:before { content: "\ec0e"; } +.lni-ticket-1:before, .icon-ticket-1:before { content: "\ec0f"; } +.lni-tickets-3:before, .icon-tickets-3:before { content: "\ec10"; } +.lni-tiktok:before, .icon-tiktok:before { content: "\ec11"; } +.lni-tiktok-alt:before, .icon-tiktok-alt:before { content: "\ec12"; } +.lni-tower-broadcast-1:before, .icon-tower-broadcast-1:before { content: "\ec13"; } +.lni-toyota:before, .icon-toyota:before { content: "\ec14"; } +.lni-train-1:before, .icon-train-1:before { content: "\ec15"; } +.lni-train-3:before, .icon-train-3:before { content: "\ec16"; } +.lni-trash-3:before, .icon-trash-3:before { content: "\ec17"; } +.lni-tree-2:before, .icon-tree-2:before { content: "\ec18"; } +.lni-trees-3:before, .icon-trees-3:before { content: "\ec19"; } +.lni-trello:before, .icon-trello:before { content: "\ec1a"; } +.lni-trend-down-1:before, .icon-trend-down-1:before { content: "\ec1b"; } +.lni-trend-up-1:before, .icon-trend-up-1:before { content: "\ec1c"; } +.lni-trophy-1:before, .icon-trophy-1:before { content: "\ec1d"; } +.lni-trowel-1:before, .icon-trowel-1:before { content: "\ec1e"; } +.lni-truck-delivery-1:before, .icon-truck-delivery-1:before { content: "\ec1f"; } +.lni-tumblr:before, .icon-tumblr:before { content: "\ec20"; } +.lni-turborepo:before, .icon-turborepo:before { content: "\ec21"; } +.lni-twitch:before, .icon-twitch:before { content: "\ec22"; } +.lni-twitter-old:before, .icon-twitter-old:before { content: "\ec23"; } +.lni-typescript:before, .icon-typescript:before { content: "\ec24"; } +.lni-uber:before, .icon-uber:before { content: "\ec25"; } +.lni-uber-symbol:before, .icon-uber-symbol:before { content: "\ec26"; } +.lni-ubuntu:before, .icon-ubuntu:before { content: "\ec27"; } +.lni-underline:before, .icon-underline:before { content: "\ec28"; } +.lni-unlink-2-angular-eft:before, .icon-unlink-2-angular-eft:before { content: "\ec29"; } +.lni-unlocked-2:before, .icon-unlocked-2:before { content: "\ec2a"; } +.lni-unsplash:before, .icon-unsplash:before { content: "\ec2b"; } +.lni-upload-1:before, .icon-upload-1:before { content: "\ec2c"; } +.lni-upload-circle-1:before, .icon-upload-circle-1:before { content: "\ec2d"; } +.lni-user-4:before, .icon-user-4:before { content: "\ec2e"; } +.lni-user-multiple-4:before, .icon-user-multiple-4:before { content: "\ec2f"; } +.lni-vector-nodes-6:before, .icon-vector-nodes-6:before { content: "\ec30"; } +.lni-vector-nodes-7:before, .icon-vector-nodes-7:before { content: "\ec31"; } +.lni-vercel:before, .icon-vercel:before { content: "\ec32"; } +.lni-vimeo:before, .icon-vimeo:before { content: "\ec33"; } +.lni-visa:before, .icon-visa:before { content: "\ec34"; } +.lni-vite:before, .icon-vite:before { content: "\ec35"; } +.lni-vk:before, .icon-vk:before { content: "\ec36"; } +.lni-vmware:before, .icon-vmware:before { content: "\ec37"; } +.lni-volkswagen:before, .icon-volkswagen:before { content: "\ec38"; } +.lni-volume-1:before, .icon-volume-1:before { content: "\ec39"; } +.lni-volume-high:before, .icon-volume-high:before { content: "\ec3a"; } +.lni-volume-low:before, .icon-volume-low:before { content: "\ec3b"; } +.lni-volume-mute:before, .icon-volume-mute:before { content: "\ec3c"; } +.lni-volume-off:before, .icon-volume-off:before { content: "\ec3d"; } +.lni-vs-code:before, .icon-vs-code:before { content: "\ec3e"; } +.lni-vuejs:before, .icon-vuejs:before { content: "\ec3f"; } +.lni-wallet-1:before, .icon-wallet-1:before { content: "\ec40"; } +.lni-watch-beat-1:before, .icon-watch-beat-1:before { content: "\ec41"; } +.lni-water-drop-1:before, .icon-water-drop-1:before { content: "\ec42"; } +.lni-webflow:before, .icon-webflow:before { content: "\ec43"; } +.lni-webhooks:before, .icon-webhooks:before { content: "\ec44"; } +.lni-wechat:before, .icon-wechat:before { content: "\ec45"; } +.lni-weight-machine-1:before, .icon-weight-machine-1:before { content: "\ec46"; } +.lni-whatsapp:before, .icon-whatsapp:before { content: "\ec47"; } +.lni-wheelbarrow-empty:before, .icon-wheelbarrow-empty:before { content: "\ec48"; } +.lni-wheelchair-1:before, .icon-wheelchair-1:before { content: "\ec49"; } +.lni-windows:before, .icon-windows:before { content: "\ec4a"; } +.lni-wise:before, .icon-wise:before { content: "\ec4b"; } +.lni-wordpress:before, .icon-wordpress:before { content: "\ec4c"; } +.lni-www:before, .icon-www:before { content: "\ec4d"; } +.lni-www-cursor:before, .icon-www-cursor:before { content: "\ec4e"; } +.lni-x:before, .icon-x:before { content: "\ec4f"; } +.lni-xampp:before, .icon-xampp:before { content: "\ec50"; } +.lni-xbox:before, .icon-xbox:before { content: "\ec51"; } +.lni-xmark:before, .icon-xmark:before { content: "\ec52"; } +.lni-xmark-circle:before, .icon-xmark-circle:before { content: "\ec53"; } +.lni-xrp:before, .icon-xrp:before { content: "\ec54"; } +.lni-yahoo:before, .icon-yahoo:before { content: "\ec55"; } +.lni-yarn:before, .icon-yarn:before { content: "\ec56"; } +.lni-ycombinator:before, .icon-ycombinator:before { content: "\ec57"; } +.lni-yen:before, .icon-yen:before { content: "\ec58"; } +.lni-youtube:before, .icon-youtube:before { content: "\ec59"; } +.lni-youtube-kids:before, .icon-youtube-kids:before { content: "\ec5a"; } +.lni-youtube-music:before, .icon-youtube-music:before { content: "\ec5b"; } +.lni-zapier:before, .icon-zapier:before { content: "\ec5c"; } +.lni-zero-size:before, .icon-zero-size:before { content: "\ec5d"; } +.lni-zoom:before, .icon-zoom:before { content: "\ec5e"; } + +.icon-chevron-right-after { + align-items: flex-start; + display: flex; + justify-content: space-between; + line-height: 1; + margin-top: 0; + padding-top: 0; + width: 100%; + + &:after { + content: "\ea7d"; + margin-top: .25rem; + transform: rotate(180deg); + } +} diff --git a/styles/navigation/index.css b/styles/navigation/index.css new file mode 100644 index 0000000..cfaabe4 --- /dev/null +++ b/styles/navigation/index.css @@ -0,0 +1,36 @@ +/** +* Navigation component +* A composite component consisting of +* following components: +* - nav-main-mega.php +* - menu-items +* - index.php +* - nav-functional.php +* +* Desktop Navigation Styles: +* Choose one or the other for the main navigation, based on theme needs. +* @import 'nav-main-default'; (standard dropdown) +* @import 'nav-main-mega'; (mega menu style) +* +* Mobile Navigation Styles: +* Choose one for mobile navigation behavior: +* @import 'nav-mobile-accordion'; (traditional dropdown/accordion style) +* @import 'nav-mobile-sliding'; (sliding viewport style) +*/ + +@import "./nav-functional.css"; +@import "./nav-aux.css"; + +/* Mobile Navigation Style - Choose one of the following: */ +/* Traditional dropdown style */ +@import "./nav-main-default.css"; +/* Mega menu style */ +/* @import "./nav-main-mega.css"; */ + +/* Mobile Navigation Style - Choose one of the following: */ +/* Accordion/dropdown style */ +/* @import "./nav-mobile-accordion.css"; */ +/* Sliding viewport style */ +@import "./nav-mobile-sliding.css"; + +@import "./nav-footer.css"; diff --git a/styles/navigation/nav-aux.css b/styles/navigation/nav-aux.css new file mode 100644 index 0000000..afeb7f3 --- /dev/null +++ b/styles/navigation/nav-aux.css @@ -0,0 +1,36 @@ +/** + * VDI Navs & Menu - Auxiliary Nav Styles + * + * Please review documentation upon first use, and, as-needed: + * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ + */ + +.nav-aux { + @apply relative flex flex-wrap gap-2 items-center justify-end p-0 m-0; + + .menu-vdi { + @apply relative flex flex-wrap gap-4 items-center gap-y-2 gap-x-4 p-0 m-0; + + .menu-vdi__toggle { + /* styles */ + @apply flex items-center gap-2; + /* interaction */ + @apply focus-visible:underline hover:underline; + } + } +} + +/* desktop overrides */ +@media screen and (min-width: 62.5rem) { + .nav-aux { + @apply gap-4; + + .menu-vdi { + @apply justify-end; + + .menu-vdi__toggle { + @apply flex items-center gap-2; + } + } + } +} diff --git a/styles/navigation/nav-footer.css b/styles/navigation/nav-footer.css new file mode 100644 index 0000000..0f48b9a --- /dev/null +++ b/styles/navigation/nav-footer.css @@ -0,0 +1,102 @@ +/** + * VDI Navs & Menu - Footer Navigation + * + * Please review documentation upon first use, and, as-needed: + * ___Link_Here___ + */ + +/* desktop */ +@media screen and (min-width: 62.5rem) { + .nav-footer .menu-vdi { + @apply flex flex-col items-start justify-start p-0 m-0; + + >li { + >a { + /* text */ + @apply font-normal leading-snug text-secondary text-18px; + /* spacing & display */ + @apply mx-0 p-0 no-underline; + } + } + } +} + +/* mobile */ +@media screen and (max-width: 62.5rem) { + .nav-footer { + .nav-footer__toggle { + /* display */ + @apply text-primary p-3; + } + + .menu-vdi { + @apply flex-col w-[95%] py-6; + + .menu-vdi__submenu { + @apply py-2 px-7 flex-col; + } + + .menu-vdi__item { + a, + button { + /* text */ + @apply font-normal leading-snug text-lg; + /* spacing & display */ + @apply block w-full p-4; + /* interaction */ + @apply focus-visible:bg-secondary-200 hover:bg-secondary-200; + } + + a { + @apply block w-full; + } + + button { + @apply flex w-full justify-between; + } + } + } + } +} + +@media screen and (min-width: 62.5rem) { + .nav-footer .menu-vdi { + .menu-vdi__toggle { + @apply font-semibold underline text-20px mt-3 pb-1; + + >svg { + @apply hidden; + } + } + + .menu-vdi__item--parent { + @apply static; + } + + .menu-vdi__submenu { + @apply static block m-0 mb-3 p-0 pl-2 shadow-none; + + >li { + @apply w-full m-0 p-0; + } + + .menu-vdi__item { + /* text */ + @apply font-normal leading-snug text-18px; + /* spacing & display */ + @apply block w-full; + /* interaction */ + @apply focus-visible:bg-secondary-200 hover:bg-secondary-200; + + a { + @apply block w-full; + } + } + + a.menu-vdi__item, + .menu-vdi__item a { + @apply p-0 text-secondary; + } + } + } +} diff --git a/styles/navigation/nav-functional.css b/styles/navigation/nav-functional.css new file mode 100644 index 0000000..9a4591b --- /dev/null +++ b/styles/navigation/nav-functional.css @@ -0,0 +1,100 @@ +/** + * VDI Navs & Menu - Functional Styles + * + * Please review documentation upon first use, and, as-needed: + * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ + */ + +/* all sizes */ +.menu-vdi { + @apply hidden; + + >li { + @apply list-none; + >a { + @apply focus-visible:underline hover:underline; + } + + a[aria-current="true"] { + @apply underline; + } + + .menu-vdi__toggle { + &[aria-expanded="true"] { + svg { + @apply rotate-180; + } + + +.menu-vdi__submenu { + @apply flex; + } + } + } + } + + .menu-vdi__submenu { + @apply hidden container z-10; + + /* should also put current page here */ + .menu-vdi__item--grandchild a { + @apply no-underline focus-visible:underline hover:underline; + } + } +} + +/* Mobile */ +@media screen and (max-width: 62.5rem) { + #app:has(.nav-main__toggle[aria-expanded="true"]) { height: calc(100vh - var(--hgtHeader)); } + + .nav-main__toggle { + .nav-toggle-hamburger { display: inline-block !important; } + + .nav-toggle-x { display: none !important; } + + &[aria-expanded="true"] { + .nav-toggle-hamburger { display: none !important; } + + .nav-toggle-x { display: inline-block !important; } + } + } + .nav-main { + .nav-main__toggle[aria-expanded="true"] { + +ul { + @apply absolute flex; + } + } + + .menu-vdi { + @apply absolute right-0 z-10; + + .menu-vdi__toggle { + @apply flex items-center gap-2; + } + } + } + + .nav-aux { + .menu-vdi__submenu { + @apply absolute list-none; + } + } +} + +/* Desktop */ +@media screen and (min-width: 62.5rem) { + .nav-main__toggle { + @apply hidden; + } + + .menu-vdi { + @apply flex list-none; + + .menu-vdi__toggle { + @apply flex items-center gap-2; + } + + .menu-vdi__submenu { + @apply absolute list-none; + } + } +} diff --git a/styles/navigation/nav-main-default.css b/styles/navigation/nav-main-default.css new file mode 100644 index 0000000..7742244 --- /dev/null +++ b/styles/navigation/nav-main-default.css @@ -0,0 +1,67 @@ +/** + * VDI Navs & Menu - Main Navigation + Default Dropdown Menu Styles (Desktop Only) + * + * This file contains only desktop navigation styles. + * For mobile navigation, choose one of: + * - nav-mobile-accordion.css (traditional dropdown/accordion style) + * - nav-mobile-sliding.css (sliding viewport style) + * + * Please review documentation upon first use, and, as-needed: + * TODO: Add documenation link here + */ + +/* desktop */ +@media screen and (min-width: 62.5rem) { + .nav-main .menu-vdi { + @apply flex items-center justify-end p-0 m-0; + + >li { + >a, + >.menu-vdi__toggle { + /* text*/ + @apply font-bold text-20px text-black hover:text-light no-underline leading-snug; + /* spacing & display */ + @apply mx-4 p-0 no-underline; + } + } + } +} + +@media screen and (min-width: 62.5rem) { + .menu-vdi { + .menu-vdi__toggle { + @apply flex items-center gap-2; + } + + .menu-vdi__item--parent { + @apply relative; + } + + .menu-vdi__submenu { + @apply bg-white shadow-lg left-4 w-64 flex-col; + top: calc(100% + 1rem); + + >li { + @apply w-full; + } + + .menu-vdi__item { + /* text */ + @apply font-bold text-18px text-black hover:text-light no-underline leading-snug; + /* spacing & display */ + @apply block w-full; + /* interaction */ + @apply focus-visible:bg-secondary-200 hover:bg-secondary-200; + + a { + @apply block w-full; + } + } + + a.menu-vdi__item, + .menu-vdi__item a { + @apply p-4; + } + } + } +} diff --git a/styles/navigation/nav-main-mega.css b/styles/navigation/nav-main-mega.css new file mode 100644 index 0000000..f6342d2 --- /dev/null +++ b/styles/navigation/nav-main-mega.css @@ -0,0 +1,129 @@ +/** + * VDI Navs & Menu - Main Navigation + Mega Menu Styles + * + * Please review documentation upon first use, and, as-needed: + * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ + */ + +/* all sizes */ +.nav-main .menu-vdi { + .menu-vdi__toggle { + @apply flex items-center gap-2; + } +} + +/* mobile */ +@media screen and (max-width: 62.5rem) { + .nav-main { + .nav-main__toggle { + /* display */ + @apply text-white p-3; + } + + .menu-vdi { + @apply flex-col bg-white w-[95%] right-0 z-10 py-6; + top: var(--hgtHeader); + min-height: calc(100vh - var(--hgtHeader)); + + .menu-vdi__submenu { + @apply py-2 px-7 flex-col; + } + + .menu-vdi__item { + a, + button { + /* text */ + @apply font-bold text-20px text-black hover:text-light no-underline leading-snug; + /* spacing & display */ + @apply block w-full p-4; + /* interaction */ + @apply focus-visible:bg-secondary-200 hover:bg-secondary-200; + } + + a { + @apply block w-full; + } + + button { + @apply flex w-full justify-between; + } + } + } + } +} + +/* desktop */ +@media screen and (min-width: 62.5rem) { + .nav-main .menu-vdi { + @apply flex items-center justify-end p-0 m-0; + + >li { + >a, + >.menu-vdi__toggle { + /* text */ + @apply font-bold text-20px text-black hover:text-light no-underline leading-snug; + /* spacing & display */ + @apply w-max mx-4 p-0 no-underline; + } + } + + .menu-vdi__toggle { + @apply flex items-center gap-2; + } + + .menu-vdi__item--parent { + @apply relative; + + /* Mega Menu */ + &:has(.menu-vdi__item--grandchild) { + @apply static; + } + } + + .menu-vdi__submenu { + @apply bg-white shadow-lg left-4 w-64 flex-col; + + top: calc(100% + 1rem); + + >li { + @apply w-full; + } + + .menu-vdi__item { + /* text */ + @apply font-bold text-18px text-black hover:text-light no-underline leading-snug; + /* spacing & display */ + @apply block w-full; + /* interaction */ + @apply focus-visible:bg-secondary-200 hover:bg-secondary-200; + + a { + @apply block w-max; + } + } + + a.menu-vdi__item, + .menu-vdi__item a { + @apply p-4; + } + + /* Mega Menu */ + &:has(.menu-vdi__item--grandchild) { + @apply flex-row gap-x-8 right-0 ml-auto mr-0 p-4 w-max; + + span { + @apply font-bold text-xl underline w-max; + } + + a.menu-vdi__item, + .menu-vdi__item a { + @apply p-0; + } + + .menu-vdi__megaCol { + @apply px-0 w-max; + } + } + } + } +} diff --git a/styles/navigation/nav-mobile-accordion.css b/styles/navigation/nav-mobile-accordion.css new file mode 100644 index 0000000..9481544 --- /dev/null +++ b/styles/navigation/nav-mobile-accordion.css @@ -0,0 +1,52 @@ +/** + * VDI Navs & Menu - Mobile Accordion Navigation + * + * Traditional mobile accordion/dropdown style navigation + * Include this file for accordion-style mobile navigation + */ + +/* Mobile accordion navigation */ +@media screen and (max-width: 62.5rem) { + .nav-main { + .nav-main__toggle { + /* display */ + @apply text-white p-3; + } + + .menu-vdi { + @apply flex-col bg-white w-[95%] right-0 z-10 py-6; + @apply absolute hidden; /* Hidden by default */ + top: var(--hgtHeader); + min-height: calc(100vh - var(--hgtHeader)); + + .menu-vdi__submenu { + @apply py-2 px-7 flex-col; + } + + .menu-vdi__item { + a, + button { + /* text */ + @apply font-bold text-20px text-black hover:text-light no-underline leading-snug; + /* spacing & display */ + @apply block w-full p-4; + /* interaction */ + @apply focus-visible:bg-secondary-200 hover:bg-secondary-200; + } + + a { + @apply block w-full; + } + + button { + @apply flex w-full justify-between; + } + } + } + + /* Show menu when toggle button is expanded */ + .nav-main__toggle[aria-expanded="true"] ~ .menu-vdi:not(.menu-vdi--sliding) { + @apply !flex; /* Use !important to override hidden */ + } + } +} \ No newline at end of file diff --git a/styles/navigation/nav-mobile-sliding.css b/styles/navigation/nav-mobile-sliding.css new file mode 100644 index 0000000..d3df530 --- /dev/null +++ b/styles/navigation/nav-mobile-sliding.css @@ -0,0 +1,130 @@ +/** + * VDI Navs & Menu - Mobile Sliding Viewport Navigation + * + * Sliding viewport style for mobile navigation where + * users can navigate through menu levels by sliding between views + * Include this file for sliding-style mobile navigation + */ + +/* Mobile sliding viewport navigation */ +@media screen and (max-width: 62.5rem) { + .nav-main { + .nav-main__toggle { + /* display */ + @apply text-white p-3; + } + + .menu-vdi--sliding { + @apply relative overflow-hidden bg-white w-[95%] right-0 z-10 py-6; + @apply absolute hidden; /* Hidden by default */ + top: var(--hgtHeader); + min-height: calc(100vh - var(--hgtHeader)); + + /* Container for all navigation levels */ + .menu-vdi__viewport { + @apply flex transition-transform duration-300 ease-in-out; + width: 100%; + } + + /* Each navigation level */ + .menu-vdi__level { + @apply w-full flex-shrink-0 flex-col; + min-width: 100%; + } + + /* Back button for secondary levels */ + .menu-vdi__back { + @apply flex items-center gap-2 p-4 border-b border-gray-200 font-bold text-black hover:bg-secondary-200 focus-visible:bg-secondary-200 cursor-pointer; + + svg { + @apply w-5 h-5; + } + } + + /* Level indicator for context */ + .menu-vdi__level-title { + @apply p-4 border-b border-gray-200 font-bold text-lg text-center bg-gray-50; + } + + /* Navigation items in sliding mode */ + .menu-vdi__item { + a, + button { + /* text */ + @apply font-bold text-20px text-black hover:text-light no-underline leading-snug; + /* spacing & display */ + @apply block w-full p-4; + /* interaction */ + @apply focus-visible:bg-secondary-200 hover:bg-secondary-200; + } + + a { + @apply block w-full; + } + + button { + @apply flex w-full justify-between items-center; + + /* Arrow indicator for items with children */ + svg { + @apply w-5 h-5; + } + } + } + + /* Hide submenu toggles in sliding mode as they become navigation buttons */ + .menu-vdi__toggle { + /* Override the accordion toggle behavior */ + &[aria-expanded="true"] { + svg { + @apply rotate-0; /* Don't rotate arrow */ + } + + +.menu-vdi__submenu { + @apply hidden; /* Don't show dropdown */ + } + } + } + + /* Hide traditional submenus in sliding mode */ + .menu-vdi__submenu { + @apply hidden; + } + + /* Ensure menu items in sliding viewport have proper styling */ + .menu-vdi__level-items { + @apply flex-col; + + .menu-vdi__item { + @apply w-full; + + a { + @apply p-4 block w-full no-underline; + } + + span { + @apply p-4 block w-full font-bold; + } + } + + /* Style nested items that were converted from submenus */ + .menu-vdi__nested-items { + @apply block; + + .menu-vdi__item { + @apply w-full; + + a { + @apply p-4 pl-8 block w-full no-underline; /* Add indent for nested items */ + } + } + } + } + } + + /* Show sliding menu when toggle button is expanded and menu has sliding class */ + .nav-main__toggle[aria-expanded="true"] + .menu-vdi--sliding { + @apply !block; /* Use !important to override hidden */ + } + } +} \ No newline at end of file diff --git a/styles/theme.css b/styles/theme.css new file mode 100644 index 0000000..903a707 --- /dev/null +++ b/styles/theme.css @@ -0,0 +1,22 @@ +/* Tailwind setup */ + +@import "tailwindcss"; + +/* Base styles */ +@import "./base/index.css"; +@import "./navigation/index.css"; + +/* Lineicons icon font */ +@import "./fonts/lineicons.css"; + +/* Import *-break-out utilities (replicating the non-functional "tailwind-container-break-out" plugin) */ +@import "./base/break-out.css"; + +/* Components */ +@import "./components/index.css"; + +/* Blocks */ +@import "./blocks/index.css"; + +/* Import Tailwind typography plugin */ +@plugin "@tailwindcss/typography"; diff --git a/tests/site-a11y.spec.js b/tests/site-a11y.spec.js new file mode 100644 index 0000000..0e9593c --- /dev/null +++ b/tests/site-a11y.spec.js @@ -0,0 +1,60 @@ +const { test, expect } = require('@playwright/test'); +const AxeBuilder = require('@axe-core/playwright').default; + +const domain = 'http://domain.local/'; +test.use({ + viewport: { width: 1920, height: 1080 }, +}); + +test.describe('site-test', () => { + test('Homepage Test', async ({ page }, testInfo) => { + await page.goto(domain); + + await page.screenshot({ path: 'test-results/homepage.png', fullPage: true }); + + const accessibilityScanResults = await new AxeBuilder({ page }) + .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22a', 'wcag22aa']) + .analyze(); + + await testInfo.attach('accessibility-scan-results', { + body: JSON.stringify(accessibilityScanResults, null, 2), + contentType: 'application/json' + }); + + expect(accessibilityScanResults.violations).toEqual([]); + }); + + test('Blog Index Page Test', async ({ page }, testInfo) => { + await page.goto(`${domain}news/`); + + await page.screenshot({ path: 'test-results/blog-index.png', fullPage: true }); + + const accessibilityScanResults = await new AxeBuilder({ page }) + .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22a', 'wcag22aa']) + .analyze(); + + await testInfo.attach('accessibility-scan-results', { + body: JSON.stringify(accessibilityScanResults, null, 2), + contentType: 'application/json' + }); + + expect(accessibilityScanResults.violations).toEqual([]); + }); + + test('404 Page Test', async ({ page }, testInfo) => { + await page.goto(`${domain}yaya/`); + + await page.screenshot({ path: 'test-results/404.png', fullPage: true }); + + const accessibilityScanResults = await new AxeBuilder({ page }) + .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22a', 'wcag22aa']) + .analyze(); + + await testInfo.attach('accessibility-scan-results', { + body: JSON.stringify(accessibilityScanResults, null, 2), + contentType: 'application/json' + }); + + expect(accessibilityScanResults.violations).toEqual([]); + }); +}); diff --git a/theme.json b/theme.json new file mode 100644 index 0000000..003a6e9 --- /dev/null +++ b/theme.json @@ -0,0 +1,184 @@ +{ + "$schema": "https://schemas.wp.org/trunk/theme.json", + "version": 3, + "settings": { + "layout": { + "contentSize": "100%", + "wideSize": "1536px" + }, + "color": { + "palette": [ + { + "slug": "black", + "color": "#000", + "name": "Black" + }, + { + "slug": "white", + "color": "#fff", + "name": "White" + }, + { + "slug": "theme-bg", + "color": "var(--color-background)", + "name": "Theme Background" + }, + { + "slug": "theme-text", + "color": "var(--color-text)", + "name": "Theme Text" + }, + { + "slug": "theme-primary", + "color": "var(--color-primary)", + "name": "Theme Primary" + }, + { + "slug": "theme-secondary", + "color": "var(--color-secondary)", + "name": "Theme Secondary" + }, + { + "slug": "theme-bodylinks", + "color": "var(--color-bodylinks)", + "name": "Theme Body Links" + }, + { + "slug": "theme-footerlinks", + "color": "var(--color-footlinks)", + "name": "Theme Footer Links" + }, + { + "slug": "theme-success", + "color": "var(--color-success)", + "name": "Theme Success" + }, + { + "slug": "theme-warning", + "color": "var(--color-warning)", + "name": "Theme Warning" + }, + { + "slug": "theme-danger", + "color": "var(--color-danger)", + "name": "Theme Danger" + }, + { + "slug": "theme-info", + "color": "var(--color-info)", + "name": "Theme Info" + } + ] + }, + "typography": { + "fontFamilies": [ + { + "fontFamily": "var(--font-sans)", + "slug": "theme-sans", + "name": "Theme Sans" + } + ], + "fontSizes": [ + { + "slug": "base", + "size": "var(--text-base)", + "name": "Base" + }, + { + "slug": "text-14px", + "size": "var(--text-14px)", + "name": "Text 14px" + }, + { + "slug": "text-16px", + "size": "var(--text-16px)", + "name": "Text 16px" + }, + { + "slug": "text-18px", + "size": "var(--text-18px)", + "name": "Text 18px" + }, + { + "slug": "text-20px", + "size": "var(--text-20px)", + "name": "Text 20px" + }, + { + "slug": "text-22px", + "size": "var(--text-22px)", + "name": "Text 22px" + }, + { + "slug": "text-25px", + "size": "var(--text-25px)", + "name": "Text 25px" + }, + { + "slug": "text-30px", + "size": "var(--text-30px)", + "name": "Text 30px" + }, + { + "slug": "text-35px", + "size": "var(--text-35px)", + "name": "Text 35px" + }, + { + "slug": "text-38px", + "size": "var(--text-38px)", + "name": "Text 38px" + }, + { + "slug": "text-40px", + "size": "var(--text-40px)", + "name": "Text 40px" + }, + { + "slug": "text-45px", + "size": "var(--text-45px)", + "name": "Text 45px" + }, + { + "slug": "text-50px", + "size": "var(--text-50px)", + "name": "Text 50px" + }, + { + "slug": "text-70px", + "size": "var(--text-70px)", + "name": "Text 70px" + }, + { + "slug": "text-75px", + "size": "var(--text-75px)", + "name": "Text 75px" + } + ], + "lineHeight": true + }, + "spacing": { + "padding": true, + "margin": true, + "units": [ "px", "em", "rem", "vh", "vw", "%" ] + } + }, + "styles": { + "color": { + "background": "var(--wp--preset--color--background)", + "text": "var(--wp--preset--color--text)" + }, + "elements": { + "link": { + "color": { + "text": "var(--wp--preset--color--theme-bodylinks)" + } + } + }, + "typography": { + "fontSize": "var(--wp--preset--font-size--base)", + "fontFamily": "var(--wp--preset--font-family--theme-sans)", + "lineHeight": "1.5" + } + } +} diff --git a/views/blocks/accordion/accordion.css b/views/blocks/accordion/accordion.css new file mode 100644 index 0000000..e572334 --- /dev/null +++ b/views/blocks/accordion/accordion.css @@ -0,0 +1,68 @@ +/* Accordion block styles */ + +.accordion { + border-radius: 0.25rem; + border: 1px solid var(--color-dark); + width: 100%; + + details.accBody { + border-bottom: 1px solid var(--color-dark); + max-height: 3.7rem; + overflow: hidden; + padding: 1rem; + transition: 0.75s max-height ease-in-out; + transition-behavior: allow-discrete; + + &:last-of-type { border: none; } + + summary.accHeader { + cursor: pointer; + list-style-type: none; + padding-right: 2rem; + position: relative; + + &::-webkit-details-marker { display: none; } + + h2 { + color: var(--color-dark); + cursor: pointer; + font-size: 1.25rem; + font-weight: 500; + margin: 0; + } + + svg.marker { + color: var(--color-dark); + fill: var(--color-dark); + height: 1rem; + position: absolute; + right: 0; + top: 0.25rem; + width: 1.25rem; + } + } + + div.accContent { + margin-top: 1rem; + } + + &[open] { + background-color: var(--color-dark); + border-color: var(--color-light); + color: var(--color-light); + max-height: 20rem; + transition: 0.75s max-height ease-in-out; + transition-behavior: allow-discrete; + + summary.accHeader { + h2 { color: var(--color-light); } + + svg.marker { + color: var(--color-light); + fill: var(--color-light); + transform: rotate(45deg); + } + } + } + } +} diff --git a/views/blocks/accordion/accordion.php b/views/blocks/accordion/accordion.php new file mode 100644 index 0000000..99788c6 --- /dev/null +++ b/views/blocks/accordion/accordion.php @@ -0,0 +1,44 @@ + + +
> + $item ) : ?> + +
class="accBody"> + +

+ + + Open icon + icon that represents the state of the summary + + +
+ +
+ +
+
+ +
+ diff --git a/views/blocks/accordion/block.json b/views/blocks/accordion/block.json new file mode 100644 index 0000000..40f2eab --- /dev/null +++ b/views/blocks/accordion/block.json @@ -0,0 +1,27 @@ +{ + "name": "acf/accordion", + "title": "Accordion", + "description": "Accordion block built with details and summary elements.", + "style": [ + "file:./accordion.css" + ], + "category": "vdi-block", + "icon": "block-default", + "keywords": [ + "accordion", + "faq" + ], + "acf": { + "mode": "preview", + "renderTemplate": "accordion.php" + }, + "supports": { + "align": true, + "anchor": false, + "color": true, + "html": true, + "jsx": true, + "mode": true, + "multiple": true + } +} diff --git a/views/blocks/boilerplate/block.json b/views/blocks/boilerplate/block.json new file mode 100644 index 0000000..af32025 --- /dev/null +++ b/views/blocks/boilerplate/block.json @@ -0,0 +1,26 @@ +{ + "name": "acf/boilerplate", + "title": "Block Boilerplate", + "description": "Boilerplate code to create ACF blocks.", + "style": [ + "file:./boilerplate.css" + ], + "category": "vdi-blocks", + "icon": "block-default", + "keywords": [ + "boilerplate" + ], + "acf": { + "mode": "preview", + "renderTemplate": "boilerplate.php" + }, + "supports": { + "align": true, + "anchor": true, + "color": true, + "html": false, + "jsx": false, + "mode": true, + "multiple": false + } +} diff --git a/views/blocks/boilerplate/boilerplate.css b/views/blocks/boilerplate/boilerplate.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/boilerplate/boilerplate.php b/views/blocks/boilerplate/boilerplate.php new file mode 100644 index 0000000..fc0ec89 --- /dev/null +++ b/views/blocks/boilerplate/boilerplate.php @@ -0,0 +1,23 @@ + + +
> + +
diff --git a/views/blocks/button/block.json b/views/blocks/button/block.json new file mode 100644 index 0000000..73e4641 --- /dev/null +++ b/views/blocks/button/block.json @@ -0,0 +1,24 @@ +{ + "name": "acf/button", + "title": "Button (VDI)", + "description": "A button.", + "category": "vdi-blocks", + "icon": "button", + "keywords": [ + "button" + ], + "acf": { + "mode": "preview", + "renderTemplate": "button.php" + }, + "supports": { + "align": false, + "anchor": false, + "color": false, + "html": false, + "jsx": false, + "mode": true, + "multiple": true + }, + "parent": [ "acf/buttons" ] +} diff --git a/views/blocks/button/button.php b/views/blocks/button/button.php new file mode 100644 index 0000000..ddb24b7 --- /dev/null +++ b/views/blocks/button/button.php @@ -0,0 +1,53 @@ + $classes ) + ); + + $wrapper = str_replace( 'class="', '', $wrapper ); + $wrapper = str_replace( '"', '', $wrapper ); +} else { + $wrapper = $classes; +} +?> + + diff --git a/views/blocks/buttons/block.json b/views/blocks/buttons/block.json new file mode 100644 index 0000000..321ca5f --- /dev/null +++ b/views/blocks/buttons/block.json @@ -0,0 +1,24 @@ +{ + "name": "acf/buttons", + "title": "Buttons (VDI)", + "description": "A button or group of buttons.", + "allowedBlocks": [ "acf/button" ], + "category": "vdi-blocks", + "icon": "button", + "keywords": [ + "buttons" + ], + "acf": { + "mode": "preview", + "renderTemplate": "buttons.php" + }, + "supports": { + "align": false, + "anchor": true, + "color": false, + "html": true, + "jsx": true, + "mode": false, + "multiple": true + } +} diff --git a/views/blocks/buttons/buttons.php b/views/blocks/buttons/buttons.php new file mode 100644 index 0000000..28bb5ba --- /dev/null +++ b/views/blocks/buttons/buttons.php @@ -0,0 +1,20 @@ + + +
> + +
diff --git a/views/blocks/contact-info/block.json b/views/blocks/contact-info/block.json new file mode 100644 index 0000000..427509c --- /dev/null +++ b/views/blocks/contact-info/block.json @@ -0,0 +1,27 @@ +{ + "name": "acf/contact-info", + "title": "Contact Info Block", + "description": "Show contact information with icons and optional form.", + "style": [ + "file:./contact-info.css" + ], + "category": "vdi-blocks", + "icon": "feedback", + "keywords": [ + "contact info", + "contact form" + ], + "acf": { + "mode": "preview", + "renderTemplate": "contact-info.php" + }, + "supports": { + "align": true, + "anchor": true, + "color": false, + "html": false, + "jsx": true, + "mode": true, + "multiple": false + } +} diff --git a/views/blocks/contact-info/contact-info.css b/views/blocks/contact-info/contact-info.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/contact-info/contact-info.php b/views/blocks/contact-info/contact-info.php new file mode 100644 index 0000000..c2e9a39 --- /dev/null +++ b/views/blocks/contact-info/contact-info.php @@ -0,0 +1,37 @@ + + +
> +
+
+

Contact Information

+ +
+

+

+ +

+

+ +

+

+
+
+ +
+ +
+
+
diff --git a/views/blocks/grid-cell/block.json b/views/blocks/grid-cell/block.json new file mode 100644 index 0000000..5f03d21 --- /dev/null +++ b/views/blocks/grid-cell/block.json @@ -0,0 +1,27 @@ +{ + "name": "acf/grid-cell", + "title": "Grid Cell (VDI)", + "description": "Custom grid cell block.", + "style": [ + "file:./grid-cell.css" + ], + "category": "vdi-blocks", + "icon": "grid-view", + "keywords": [ + "grid" + ], + "acf": { + "mode": "preview", + "renderTemplate": "grid-cell.php" + }, + "supports": { + "align": false, + "anchor": false, + "color": true, + "html": false, + "jsx": true, + "mode": true, + "multiple": true + }, + "parent": [ "acf/grid" ] +} diff --git a/views/blocks/grid-cell/grid-cell.css b/views/blocks/grid-cell/grid-cell.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/grid-cell/grid-cell.php b/views/blocks/grid-cell/grid-cell.php new file mode 100644 index 0000000..6050b47 --- /dev/null +++ b/views/blocks/grid-cell/grid-cell.php @@ -0,0 +1,48 @@ + trim( $className ) ) + ); +} else { + $wrapper = ''; +} +?> + +
> + +
diff --git a/views/blocks/grid/block.json b/views/blocks/grid/block.json new file mode 100644 index 0000000..b668335 --- /dev/null +++ b/views/blocks/grid/block.json @@ -0,0 +1,27 @@ +{ + "name": "acf/grid", + "title": "Grid Block (VDI)", + "description": "Custom grid block.", + "style": [ + "file:./grid.css" + ], + "allowedBlocks": [ "acf/grid-cell" ], + "category": "vdi-blocks", + "icon": "grid-view", + "keywords": [ + "grid" + ], + "acf": { + "mode": "preview", + "renderTemplate": "grid.php" + }, + "supports": { + "align": false, + "anchor": true, + "color": false, + "html": false, + "jsx": true, + "mode": true, + "multiple": true + } +} diff --git a/views/blocks/grid/grid.css b/views/blocks/grid/grid.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/grid/grid.php b/views/blocks/grid/grid.php new file mode 100644 index 0000000..4c0cef5 --- /dev/null +++ b/views/blocks/grid/grid.php @@ -0,0 +1,47 @@ + + +
+ +
diff --git a/views/blocks/homepage-hero/block.json b/views/blocks/homepage-hero/block.json new file mode 100644 index 0000000..a2760e2 --- /dev/null +++ b/views/blocks/homepage-hero/block.json @@ -0,0 +1,28 @@ +{ + "name": "acf/homepage-hero", + "title": "Homepage Hero", + "description": "Hero block for home page.", + "style": [ + "file:./homepage-hero.css" + ], + "category": "vdi-blocks", + "icon": "block-default", + "keywords": [ + "homepage-hero", + "hero", + "home" + ], + "acf": { + "mode": "preview", + "renderTemplate": "homepage-hero.php" + }, + "supports": { + "align": true, + "anchor": true, + "color": false, + "html": true, + "jsx": true, + "mode": true, + "multiple": false + } +} diff --git a/views/blocks/homepage-hero/homepage-hero.css b/views/blocks/homepage-hero/homepage-hero.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/homepage-hero/homepage-hero.php b/views/blocks/homepage-hero/homepage-hero.php new file mode 100644 index 0000000..3cad658 --- /dev/null +++ b/views/blocks/homepage-hero/homepage-hero.php @@ -0,0 +1,66 @@ + + +
> +
+
+ +

+ +

+ + + +
+ +
+ + + +
+ $cta ) : ?> + + + color="primary" + + color="primary" variant="outline" + + width="small" + > + +
+ +
+
+
diff --git a/views/blocks/media-text-innerblocks/block.json b/views/blocks/media-text-innerblocks/block.json new file mode 100644 index 0000000..9ad422f --- /dev/null +++ b/views/blocks/media-text-innerblocks/block.json @@ -0,0 +1,31 @@ +{ + "name": "acf/media-text-innerblocks", + "title": "Media with Text Block - InnerBlocks Variant", + "description": "2 column content with image and optional calls-to-action", + "style": [ + "file:./media-text-innerblocks.css" + ], + "category": "vdi-blocks", + "icon": "screenoptions", + "keywords": [ + "media", + "media-text", + "image", + "video", + "text", + "columns" + ], + "acf": { + "mode": "preview", + "renderTemplate": "media-text-innerblocks.php" + }, + "supports": { + "align": true, + "anchor": true, + "color": true, + "html": true, + "jsx": true, + "mode": true, + "multiple": true + } +} diff --git a/views/blocks/media-text-innerblocks/media-text-innerblocks.css b/views/blocks/media-text-innerblocks/media-text-innerblocks.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/media-text-innerblocks/media-text-innerblocks.php b/views/blocks/media-text-innerblocks/media-text-innerblocks.php new file mode 100644 index 0000000..4c56f05 --- /dev/null +++ b/views/blocks/media-text-innerblocks/media-text-innerblocks.php @@ -0,0 +1,53 @@ + '', + 'alt' => '', +); + +// Set classes and styles +$style = "background-color: $bgColor;"; +$clsMedia = $mediaLeft ? 'order-first' : 'order-last'; +$clsContent = $mediaLeft ? 'order-last pr-8' : 'order-first pl-8'; +$classes = 'media-cols grid grid-cols-1 lg:grid-cols-2 gap-8 items-center mb-8 p-0'; + +if ( $isDark ) { + $classes .= ' dark text-light'; +} + +// Set wrapper attributes +$wrapper = blockWrapperAttributes( $classes, $is_preview ); + +// if the video block contains an iframe, add the role="presentation" attribute +if ( $vidBlock && strpos( $vidBlock, ' + +
style=""> +
+ + + + <?php echo esc_attr( $imgBlock['alt'] ); ?> + +
+ +
+ +
+
diff --git a/views/blocks/media-text/block.json b/views/blocks/media-text/block.json new file mode 100644 index 0000000..13d7cfe --- /dev/null +++ b/views/blocks/media-text/block.json @@ -0,0 +1,31 @@ +{ + "name": "acf/media-text", + "title": "Media With Text Block", + "description": "2 column content with image and optional calls-to-action", + "style": [ + "file:./media-text.css" + ], + "category": "vdi-blocks", + "icon": "screenoptions", + "keywords": [ + "media", + "media-text", + "image", + "video", + "text", + "columns" + ], + "acf": { + "mode": "preview", + "renderTemplate": "media-text.php" + }, + "supports": { + "align": true, + "anchor": true, + "color": true, + "html": true, + "jsx": true, + "mode": true, + "multiple": true + } +} diff --git a/views/blocks/media-text/media-text.css b/views/blocks/media-text/media-text.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/media-text/media-text.php b/views/blocks/media-text/media-text.php new file mode 100644 index 0000000..dcc6e76 --- /dev/null +++ b/views/blocks/media-text/media-text.php @@ -0,0 +1,100 @@ + '', + 'alt' => '', +); +$heading = get_field( 'heading' ) ? get_field( 'heading' ) : ''; +$subHead = get_field( 'subheading' ) ? get_field( 'subheading' ) : ''; +$content = get_field( 'content' ) ? get_field( 'content' ) : ''; +$ctas = get_field( 'calls_to_action' ) ? get_field( 'calls_to_action' ) : array(); + +// Set classes and styles +$style = "background-color: $bgColor;"; +$mediaClass = $mediaLeft ? 'order-first' : 'order-last'; +$contentClass = $mediaLeft ? 'order-last pr-8' : 'order-first pl-8'; +$classes = 'media-cols grid grid-cols-1 lg:grid-cols-2 gap-8 items-center mb-8 p-0'; + +if ( $isDark ) { + $classes .= ' dark text-white'; +} + +// Set wrapper attributes +$wrapper = blockWrapperAttributes( $classes, $is_preview ); + +// if the video block contains an iframe, add the role="presentation" attribute +if ( $vidBlock && strpos( $vidBlock, ' + +
style=""> +
+ + + + <?php echo esc_attr( $imgBlock['alt'] ); ?> + +
+ +
+ +

+ + + +

+ + + +
+ + + +
+ + + + +
+ +
+
diff --git a/views/blocks/page-children/block.json b/views/blocks/page-children/block.json new file mode 100644 index 0000000..e516d3c --- /dev/null +++ b/views/blocks/page-children/block.json @@ -0,0 +1,26 @@ +{ + "name": "acf/page-children", + "title": "Page Children", + "description": "Block to display children of curent page.", + "style": [ + "file:./page-children.css" + ], + "category": "vdi-blocks", + "icon": "block-default", + "keywords": [ + "page-children" + ], + "acf": { + "mode": "preview", + "renderTemplate": "page-children.php" + }, + "supports": { + "align": false, + "anchor": false, + "color": false, + "html": false, + "jsx": false, + "mode": false, + "multiple": false + } +} diff --git a/views/blocks/page-children/page-children.css b/views/blocks/page-children/page-children.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/page-children/page-children.php b/views/blocks/page-children/page-children.php new file mode 100644 index 0000000..5193f4e --- /dev/null +++ b/views/blocks/page-children/page-children.php @@ -0,0 +1,129 @@ + 'page', + 'post_status' => 'publish', + 'posts_per_page' => -1, + 'orderby' => array( + 'menu_order' => 'ASC', + 'title' => 'ASC', + ), + 'order' => 'ASC', + 'post_parent' => $parentId, + 'fields' => 'all', + 'no_found_rows' => true, + ) +); + +// Set classes +$classes = 'page-children container relative px-4 py-8 mx-auto sm:px-6 sm:py-12 lg:px-8'; + +// Set wrapper attributes +$wrapper = blockWrapperAttributes( $classes, $is_preview ); +?> + + +
> +
+ 'page', + 'post_status' => 'publish', + 'posts_per_page' => -1, + 'orderby' => array( + 'menu_order' => 'ASC', + 'title' => 'ASC', + ), + 'order' => 'ASC', + 'post_parent' => $child->ID, // fixed depth: 2 levels total + 'fields' => 'all', + 'no_found_rows' => true, + ) + ); + + if ( count( $grandchildren ) > 0 ) { + $gcHeight = 'max-h-[300px]'; + $gcPad = ''; + $lnkArrow = ''; + } else { + $gcHeight = ''; + $gcPad = 'pb-4'; + $lnkArrow = 'icon-chevron-right-after'; + } + + $imgChild = ( get_the_post_thumbnail_url( $child->ID, 'medium_large' ) ) ? get_the_post_thumbnail_url( $child->ID, 'medium_large' ) : 'https://picsum.photos/seed/' . $child->ID . '/400/300?'; + ?> + +
+
+ <?php echo esc_attr( get_the_title( $child ) ); ?> +
+ +
+
+

+ + + post_title ); ?> + + + post_title ); ?> + +

+
+ +
+ + + post_content ) { + preg_match( '/

(.*?)<\/p>/i', apply_filters( 'the_content', $child->post_content ), $matches ); + $firstParagraph = $matches[1] ?? ''; + } + ?> +

+ +
+ +
+
+
+ +
+
+ diff --git a/views/blocks/section/block.json b/views/blocks/section/block.json new file mode 100644 index 0000000..d6ce9ab --- /dev/null +++ b/views/blocks/section/block.json @@ -0,0 +1,27 @@ +{ + "name": "acf/section", + "title": "Section", + "description": "Content section", + "style": [ + "file:./section.css" + ], + "category": "vdi-blocks", + "icon": "align-wide", + "keywords": [ + "setion", + "content" + ], + "acf": { + "mode": "preview", + "renderTemplate": "section.php" + }, + "supports": { + "align": true, + "anchor": true, + "color": true, + "html": true, + "jsx": true, + "mode": true, + "multiple": true + } +} diff --git a/views/blocks/section/section.css b/views/blocks/section/section.css new file mode 100644 index 0000000..e69de29 diff --git a/views/blocks/section/section.php b/views/blocks/section/section.php new file mode 100644 index 0000000..9659e5c --- /dev/null +++ b/views/blocks/section/section.php @@ -0,0 +1,82 @@ + + +
style=""> + + + + + + + +
+ +
+ +
diff --git a/views/components/menu-items/has-children.php b/views/components/menu-items/has-children.php new file mode 100644 index 0000000..182cc59 --- /dev/null +++ b/views/components/menu-items/has-children.php @@ -0,0 +1,68 @@ +title ) ), +); +if ( ! empty( $item->classes ) ) { + $itemClasses = array_merge( $itemClasses, $item->classes ); +} + +// Generate toggle classes +$toggleClasses = array( 'menu-vdi__toggle' ); +if ( ! empty( $item->classes ) ) { + $toggleClasses = array_merge( $toggleClasses, $item->classes ); +} +?> + + diff --git a/views/components/menu-items/index.php b/views/components/menu-items/index.php new file mode 100644 index 0000000..cf05dad --- /dev/null +++ b/views/components/menu-items/index.php @@ -0,0 +1,33 @@ + + + diff --git a/views/components/menu-items/single.php b/views/components/menu-items/single.php new file mode 100644 index 0000000..7549302 --- /dev/null +++ b/views/components/menu-items/single.php @@ -0,0 +1,32 @@ +title ) ), +); + +if ( ! empty( $item->classes ) ) { + $itemClasses = array_merge( $itemClasses, $item->classes ); +} +?> + + diff --git a/views/components/nav-aux.php b/views/components/nav-aux.php new file mode 100644 index 0000000..60f32de --- /dev/null +++ b/views/components/nav-aux.php @@ -0,0 +1,39 @@ +request ) . '/'; +?> + + diff --git a/views/components/nav-main.php b/views/components/nav-main.php new file mode 100644 index 0000000..e5626a7 --- /dev/null +++ b/views/components/nav-main.php @@ -0,0 +1,24 @@ + + + diff --git a/views/components/nav-main__toggle.php b/views/components/nav-main__toggle.php new file mode 100644 index 0000000..bf2c3f2 --- /dev/null +++ b/views/components/nav-main__toggle.php @@ -0,0 +1,46 @@ + + + diff --git a/views/forms/search.php b/views/forms/search.php new file mode 100644 index 0000000..e548be6 --- /dev/null +++ b/views/forms/search.php @@ -0,0 +1,29 @@ + + + +
+ + + + + +
+
diff --git a/views/icons/facebook.php b/views/icons/facebook.php new file mode 100644 index 0000000..82dbfe3 --- /dev/null +++ b/views/icons/facebook.php @@ -0,0 +1 @@ + diff --git a/views/icons/heart.php b/views/icons/heart.php new file mode 100644 index 0000000..0d509ff --- /dev/null +++ b/views/icons/heart.php @@ -0,0 +1,3 @@ + + + diff --git a/views/icons/instagram.php b/views/icons/instagram.php new file mode 100644 index 0000000..2f87815 --- /dev/null +++ b/views/icons/instagram.php @@ -0,0 +1 @@ + diff --git a/views/icons/linkedin.php b/views/icons/linkedin.php new file mode 100644 index 0000000..b6a19b1 --- /dev/null +++ b/views/icons/linkedin.php @@ -0,0 +1 @@ + diff --git a/views/icons/menu.php b/views/icons/menu.php new file mode 100644 index 0000000..e347ff3 --- /dev/null +++ b/views/icons/menu.php @@ -0,0 +1 @@ + diff --git a/views/icons/pinterest.php b/views/icons/pinterest.php new file mode 100644 index 0000000..85ea4d0 --- /dev/null +++ b/views/icons/pinterest.php @@ -0,0 +1 @@ + diff --git a/views/icons/search.php b/views/icons/search.php new file mode 100644 index 0000000..412f072 --- /dev/null +++ b/views/icons/search.php @@ -0,0 +1,6 @@ + + + + + + diff --git a/views/icons/shop.php b/views/icons/shop.php new file mode 100644 index 0000000..1e5dce3 --- /dev/null +++ b/views/icons/shop.php @@ -0,0 +1 @@ + diff --git a/views/icons/shopping-basket.php b/views/icons/shopping-basket.php new file mode 100644 index 0000000..70fbba8 --- /dev/null +++ b/views/icons/shopping-basket.php @@ -0,0 +1,7 @@ + + + + + + + diff --git a/views/icons/twitter-.php b/views/icons/twitter-.php new file mode 100644 index 0000000..5a1c972 --- /dev/null +++ b/views/icons/twitter-.php @@ -0,0 +1 @@ + diff --git a/views/icons/twitter.php b/views/icons/twitter.php new file mode 100644 index 0000000..d315960 --- /dev/null +++ b/views/icons/twitter.php @@ -0,0 +1 @@ + diff --git a/views/icons/user.php b/views/icons/user.php new file mode 100644 index 0000000..5e66748 --- /dev/null +++ b/views/icons/user.php @@ -0,0 +1,6 @@ + + + + + + diff --git a/views/icons/youtube.php b/views/icons/youtube.php new file mode 100644 index 0000000..34003d0 --- /dev/null +++ b/views/icons/youtube.php @@ -0,0 +1 @@ + diff --git a/views/partials/page-hero.php b/views/partials/page-hero.php new file mode 100644 index 0000000..a3b4795 --- /dev/null +++ b/views/partials/page-hero.php @@ -0,0 +1,56 @@ + + +
> + +
+ + +
+ '; + echo wp_kses_post( $heading ); + echo ''; + } else { + echo ''; + echo wp_kses_post( $heading ); + echo ''; + } + + // Intro + if ( $intro ) { + echo '

'; + echo wp_kses_post( $intro ); + echo '

'; + } + ?> +
+
+
diff --git a/views/partials/social-media.php b/views/partials/social-media.php new file mode 100644 index 0000000..1882923 --- /dev/null +++ b/views/partials/social-media.php @@ -0,0 +1,39 @@ + getFieldValue( 'social_media.facebook' ) ? getFieldValue( 'social_media.facebook' ) : '', + 'twitter' => getFieldValue( 'social_media.twitter' ) ? getFieldValue( 'social_media.twitter' ) : '', + 'pinterest' => getFieldValue( 'social_media.pinterest' ) ? getFieldValue( 'social_media.pinterest' ) : '', + 'instagram' => getFieldValue( 'social_media.instagram' ) ? getFieldValue( 'social_media.instagram' ) : '', + 'youtube' => getFieldValue( 'social_media.youtube' ) ? getFieldValue( 'social_media.youtube' ) : '', + 'linkedin' => getFieldValue( 'social_media.linkedin' ) ? getFieldValue( 'social_media.linkedin' ) : '', +); + +// Add circle class if the circle option is enabled +if ( $circle ) { + $classes .= ' circular-icon'; +} + +// Loop through the social media sites and output links +foreach ( $sites as $name => $url ) { + if ( $url ) { + ?> + + + Visit our page + + diff --git a/whitelist.php b/whitelist.php new file mode 100644 index 0000000..5748c62 --- /dev/null +++ b/whitelist.php @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +