├── .babelrc ├── .distignore ├── .editorconfig ├── .eslintrc.js ├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.md │ └── feature-request.md ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml └── workflows │ ├── ai-code-reviewer.yml │ ├── ci.yml │ ├── push-asset-readme-update.yml.yml │ ├── push-to-deploy.yml │ └── release-pr-template.yml ├── .gitignore ├── .snyk ├── .wordpress-org ├── banner-1544x500.gif ├── banner-772x250.gif ├── icon-128x128.gif ├── icon-256x256.gif ├── screenshot-1.png ├── screenshot-2.png ├── screenshot-3.png ├── screenshot-4.png └── screenshot-5.png ├── .wp-env.json ├── Gruntfile.js ├── README.md ├── admin ├── assets │ ├── css │ │ └── ehf-admin.css │ └── js │ │ └── ehf-admin.js ├── bsf-analytics │ ├── assets │ │ └── css │ │ │ ├── minified │ │ │ ├── style-rtl.min.css │ │ │ └── style.min.css │ │ │ └── unminified │ │ │ ├── style-rtl.css │ │ │ └── style.css │ ├── changelog.txt │ ├── class-bsf-analytics-loader.php │ ├── class-bsf-analytics-stats.php │ ├── class-bsf-analytics.php │ ├── classes │ │ └── class-bsf-analytics-helper.php │ ├── composer.json │ ├── modules │ │ ├── deactivation-survey │ │ │ ├── assets │ │ │ │ ├── css │ │ │ │ │ ├── feedback-rtl.css │ │ │ │ │ ├── feedback-rtl.min.css │ │ │ │ │ ├── feedback.css │ │ │ │ │ └── feedback.min.css │ │ │ │ └── js │ │ │ │ │ ├── feedback.js │ │ │ │ │ └── feedback.min.js │ │ │ └── classes │ │ │ │ └── class-deactivation-survey-feedback.php │ │ └── utm-analytics.php │ └── version.json ├── class-hfe-addons-actions.php └── class-hfe-admin.php ├── assets ├── css │ ├── admin-header-footer-elementor.css │ ├── header-footer-elementor.css │ └── style.css ├── fonts │ ├── hfe.eot │ ├── hfe.svg │ ├── hfe.ttf │ └── hfe.woff └── images │ ├── header-footer-elementor-icon.svg │ └── settings │ ├── OttoKit-Symbol-Primary.svg │ ├── aiosrs.svg │ ├── astra.svg │ ├── augmented_reality.png │ ├── build_banner.png │ ├── build_bg.png │ ├── column.png │ ├── dashboard-logo.svg │ ├── git-compare.svg │ ├── integrations.svg │ ├── layout-template.svg │ ├── logo.svg │ ├── our-team.jpeg │ ├── plugin-astra.png │ ├── plugin-st.png │ ├── plugin-uae.png │ ├── pplayer.png │ ├── pplayer.svg │ ├── rocket.svg │ ├── starter-templates.png │ ├── starter-templates.svg │ ├── stemplates.png │ ├── stemplates.svg │ ├── success_badge.svg │ ├── success_bg.png │ ├── sure-triggers.svg │ ├── surecart.png │ ├── surecart.svg │ ├── sureforms.png │ ├── sureforms.svg │ ├── template.png │ ├── theme.svg │ ├── tracking.svg │ ├── tracking_selected.svg │ ├── uae-logo-svg.svg │ ├── uael-icon.svg │ ├── user-selected.svg │ ├── user.svg │ ├── version.svg │ ├── welcome-banner.png │ └── white-logo.svg ├── bin └── gen-stubs.sh ├── build ├── 022beb5767ebf3d54c2c.woff2 ├── 0c658d1bd687fc3b8ae1.woff2 ├── 410fbc8e227942f4d606.woff2 ├── 7d00956da27af3e30b78.woff ├── 815fd49f3f94a120685f.woff ├── 8fbf595b398521a13438.woff2 ├── f2b6d272f68d05e1513a.woff ├── f5a809ac576251495a72.woff ├── main.asset.php ├── main.css ├── main.css.map ├── main.js ├── main.js.LICENSE.txt └── main.js.map ├── composer.json ├── composer.lock ├── gettext.pot ├── header-footer-elementor.php ├── inc ├── class-header-footer-elementor.php ├── class-hfe-analytics.php ├── class-hfe-elementor-canvas-compat.php ├── class-hfe-rollback.php ├── class-hfe-settings-page.php ├── class-hfe-update.php ├── compatibility │ └── class-hfe-wpml-compatibility.php ├── hfe-functions.php ├── js │ ├── frontend.js │ ├── hfe-elementor-pro-compatibility.js │ └── permalink-clear-notice.js ├── lib │ ├── astra-notices │ │ ├── class-astra-notices.php │ │ ├── composer.json │ │ ├── notices.css │ │ └── notices.js │ ├── class-uae-nps-survey.php │ ├── nps-survey │ │ ├── changelog.txt │ │ ├── classes │ │ │ └── nps-survey-script.php │ │ ├── composer.json │ │ ├── dist │ │ │ ├── main.asset.php │ │ │ ├── main.js │ │ │ ├── style-main-rtl.css │ │ │ └── style-main.css │ │ ├── nps-survey-plugin-loader.php │ │ ├── nps-survey.php │ │ └── version.json │ └── target-rule │ │ ├── class-astra-target-rules-fields.php │ │ ├── i18n │ │ ├── af.js │ │ ├── ar.js │ │ ├── az.js │ │ ├── bg.js │ │ ├── bs.js │ │ ├── ca.js │ │ ├── cs.js │ │ ├── da.js │ │ ├── de.js │ │ ├── dsb.js │ │ ├── el.js │ │ ├── en.js │ │ ├── es.js │ │ ├── et.js │ │ ├── eu.js │ │ ├── fa.js │ │ ├── fi.js │ │ ├── fr.js │ │ ├── gl.js │ │ ├── he.js │ │ ├── hi.js │ │ ├── hr.js │ │ ├── hsb.js │ │ ├── hu.js │ │ ├── hy.js │ │ ├── id.js │ │ ├── is.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── km.js │ │ ├── ko.js │ │ ├── lt.js │ │ ├── lv.js │ │ ├── mk.js │ │ ├── ms.js │ │ ├── nb.js │ │ ├── nl.js │ │ ├── pl.js │ │ ├── ps.js │ │ ├── pt-BR.js │ │ ├── pt.js │ │ ├── ro.js │ │ ├── ru.js │ │ ├── sk.js │ │ ├── sl.js │ │ ├── sr-Cyrl.js │ │ ├── sr.js │ │ ├── sv.js │ │ ├── th.js │ │ ├── tr.js │ │ ├── uk.js │ │ ├── vi.js │ │ ├── zh-CN.js │ │ └── zh-TW.js │ │ ├── select2.css │ │ ├── select2.js │ │ ├── target-rule.css │ │ ├── target-rule.js │ │ └── user-role.js ├── settings │ ├── admin-base.php │ ├── hfe-settings-api.php │ └── settings-app.php ├── widgets-css │ ├── frontend.css │ └── permalink-clear-notice.css └── widgets-manager │ ├── base │ ├── common-widget.php │ ├── hfe-helper.php │ ├── module-base.php │ └── widgets-config.php │ ├── class-extensions-loader.php │ ├── class-widgets-loader.php │ ├── extensions │ ├── class-reading-progress-bar-settings.php │ ├── class-reading-progress-bar.php │ ├── class-scroll-to-top-settings.php │ └── class-scroll-to-top.php │ ├── modules-manager.php │ └── widgets │ ├── breadcrumbs-widget │ ├── breadcrumbs-widget.php │ └── module.php │ ├── cart │ ├── cart.php │ └── module.php │ ├── copyright │ ├── copyright-shortcode.php │ ├── copyright.php │ └── module.php │ ├── index.php │ ├── infocard │ ├── infocard.php │ └── module.php │ ├── navigation-menu │ ├── menu-walker.php │ ├── module.php │ └── navigation-menu.php │ ├── page-title │ ├── module.php │ └── page-title.php │ ├── post-info │ ├── module.php │ └── post-info.php │ ├── retina │ ├── module.php │ └── retina.php │ ├── search-button │ ├── module.php │ └── search-button.php │ ├── site-logo │ ├── module.php │ └── site-logo.php │ ├── site-tagline │ ├── module.php │ └── site-tagline.php │ └── site-title │ ├── module.php │ └── site-title.php ├── jsconfig.json ├── languages ├── header-footer-elementor-de_DE-0ad70406b828ddfa033be3f6573550fd.json ├── header-footer-elementor-de_DE-1860d6c85cf93751e0a08d732e8147f8.json ├── header-footer-elementor-de_DE-4f3059777e77e324d30b247958f5533e.json ├── header-footer-elementor-de_DE-661e5decf2faf3ca4a04ac4ce62faa07.json ├── header-footer-elementor-de_DE-90e183a01507bd4371ac0db2e0c87b99.json ├── header-footer-elementor-de_DE-a0443e4d0c367013223edcde51b7c42f.json ├── header-footer-elementor-de_DE-f0dcbc1e143607d955c20c36badd8c74.json ├── header-footer-elementor-de_DE.mo ├── header-footer-elementor-de_DE.po ├── header-footer-elementor-es_ES-0ad70406b828ddfa033be3f6573550fd.json ├── header-footer-elementor-es_ES-1860d6c85cf93751e0a08d732e8147f8.json ├── header-footer-elementor-es_ES-4f3059777e77e324d30b247958f5533e.json ├── header-footer-elementor-es_ES-661e5decf2faf3ca4a04ac4ce62faa07.json ├── header-footer-elementor-es_ES-90e183a01507bd4371ac0db2e0c87b99.json ├── header-footer-elementor-es_ES-a0443e4d0c367013223edcde51b7c42f.json ├── header-footer-elementor-es_ES-f0dcbc1e143607d955c20c36badd8c74.json ├── header-footer-elementor-es_ES.mo ├── header-footer-elementor-es_ES.po ├── header-footer-elementor-fr_FR-0ad70406b828ddfa033be3f6573550fd.json ├── header-footer-elementor-fr_FR-1860d6c85cf93751e0a08d732e8147f8.json ├── header-footer-elementor-fr_FR-4f3059777e77e324d30b247958f5533e.json ├── header-footer-elementor-fr_FR-661e5decf2faf3ca4a04ac4ce62faa07.json ├── header-footer-elementor-fr_FR-90e183a01507bd4371ac0db2e0c87b99.json ├── header-footer-elementor-fr_FR-a0443e4d0c367013223edcde51b7c42f.json ├── header-footer-elementor-fr_FR-f0dcbc1e143607d955c20c36badd8c74.json ├── header-footer-elementor-fr_FR.mo ├── header-footer-elementor-fr_FR.po ├── header-footer-elementor-nl_NL-0ad70406b828ddfa033be3f6573550fd.json ├── header-footer-elementor-nl_NL-1860d6c85cf93751e0a08d732e8147f8.json ├── header-footer-elementor-nl_NL-4f3059777e77e324d30b247958f5533e.json ├── header-footer-elementor-nl_NL-661e5decf2faf3ca4a04ac4ce62faa07.json ├── header-footer-elementor-nl_NL-90e183a01507bd4371ac0db2e0c87b99.json ├── header-footer-elementor-nl_NL-a0443e4d0c367013223edcde51b7c42f.json ├── header-footer-elementor-nl_NL-f0dcbc1e143607d955c20c36badd8c74.json ├── header-footer-elementor-nl_NL.mo ├── header-footer-elementor-nl_NL.po └── header-footer-elementor.pot ├── package-lock.json ├── package.json ├── phpcs.xml.dist ├── phpstan-baseline.neon ├── phpstan.neon ├── phpunit.xml.dist ├── postcss.config.js ├── readme.txt ├── src ├── App.js ├── Components │ ├── Compare │ │ ├── FreevsPro.jsx │ │ ├── UltimateCompare.jsx │ │ └── Upgrade.jsx │ ├── Dashboard │ │ ├── Dashboard.jsx │ │ ├── ExtendWebsite.jsx │ │ ├── ExtendWebsiteWidget.jsx │ │ ├── MyAccount.jsx │ │ ├── OnboardingWidgets.jsx │ │ ├── QuickAccess.js │ │ ├── TemplateSection.js │ │ ├── UltimateFeatures.js │ │ ├── WelcomeContainer.js │ │ ├── WidgetItem.jsx │ │ ├── Widgets.jsx │ │ └── WidgetsOnboarding.jsx │ ├── HeaderLine.js │ ├── NavMenu.js │ ├── Onboarding │ │ ├── Build.jsx │ │ ├── Configure.jsx │ │ ├── Onboarding.jsx │ │ ├── Success.jsx │ │ ├── Welcome.jsx │ │ └── index.js │ ├── Settings │ │ ├── Content.jsx │ │ ├── Settings.jsx │ │ ├── Sidebar.jsx │ │ ├── ThemeSupport.jsx │ │ ├── UsageTracking.jsx │ │ └── VersionControl.jsx │ ├── Templates │ │ ├── ExploreTemplates.jsx │ │ └── Templates.jsx │ ├── UpgradeNotice.jsx │ └── Widgets │ │ ├── Features.jsx │ │ ├── Features │ │ ├── FeatureWidgets.jsx │ │ └── FeatureWidgetsOnboarding.jsx │ │ └── UltimateWidgets.jsx ├── Context │ └── SettingsContext.js ├── Screens │ └── Settings │ │ ├── Settings.js │ │ └── index.js ├── admin │ └── settings │ │ └── routes.js ├── index.js ├── router │ ├── context.js │ ├── customRouter.js │ ├── index.js │ ├── link.js │ ├── route.js │ └── utils.js └── styles.css ├── stubs-generator.php ├── tailwind.config.js ├── tests ├── e2e │ ├── config │ │ ├── bootstrap.js │ │ └── expect-extensions.js │ ├── jest.config.js │ ├── specs │ │ └── hello.test.js │ └── utils │ │ └── elementor-e2e-test-utils │ │ ├── package.json │ │ └── src │ │ ├── create-new-elementor-post.js │ │ ├── drag-and-drop.js │ │ ├── index.js │ │ ├── insert-section.js │ │ ├── insert-widget.js │ │ ├── publish-page.js │ │ └── view-page.js └── php │ └── stubs │ ├── ___elementor-stubs.php │ └── hfe-stubs.php ├── themes ├── astra │ └── class-hfe-astra-compat.php ├── bb-theme │ └── class-hfe-bb-theme-compat.php ├── default │ ├── class-global-theme-compatibility.php │ ├── class-hfe-default-compat.php │ ├── hfe-footer.php │ └── hfe-header.php ├── generatepress │ └── class-hfe-generatepress-compat.php ├── genesis │ └── class-hfe-genesis-compat.php ├── hello-elementor │ └── class-hfe-hello-elementor-compat.php ├── oceanwp │ └── class-hfe-oceanwp-compat.php └── storefront │ └── class-hfe-storefront-compat.php ├── webpack.config.js └── wpml-config.xml /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "targets": { 7 | "browsers": [">0.25%", "not dead"] 8 | }, 9 | "useBuiltIns": "usage", 10 | "corejs": 3 11 | } 12 | ], 13 | "@babel/preset-react" 14 | ], 15 | "plugins": [ 16 | "@babel/plugin-proposal-class-properties", 17 | "@babel/plugin-transform-runtime", 18 | [ 19 | "module-resolver", 20 | { 21 | "root": ["./src"], // Base folder for resolution 22 | "alias": { 23 | "@screens": "./src/Screens", // Alias for Screens folder 24 | "@components": "./src/Components", // Alias for Components folder 25 | // "@utils": "./src/Utils", 26 | "@routes": "./src/Routes" // Alias for Utilities folder 27 | } 28 | } 29 | ], 30 | [ 31 | "@wordpress/babel-plugin-makepot", 32 | { 33 | "domain": "header-footer-elementor" 34 | } 35 | ] 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /.distignore: -------------------------------------------------------------------------------- 1 | # A set of files you probably don't want in your WordPress.org distribution 2 | .distignore 3 | .editorconfig 4 | .git 5 | .gitignore 6 | .gitlab-ci.yml 7 | .travis.yml 8 | .DS_Store 9 | Thumbs.db 10 | behat.yml 11 | bin 12 | circle.yml 13 | composer.json 14 | composer.lock 15 | Gruntfile.js 16 | package.json 17 | phpunit.xml 18 | phpunit.xml.dist 19 | phpstan-baseline.neon 20 | phpstan.neon 21 | stubs-generator.php 22 | multisite.xml 23 | multisite.xml.dist 24 | phpcs.xml 25 | phpcs.xml.dist 26 | README.md 27 | wp-cli.local.yml 28 | yarn.lock 29 | tests 30 | vendor 31 | node_modules 32 | *.sql 33 | *.tar.gz 34 | *.zip 35 | package-lock.json 36 | .github 37 | .wordpress-org 38 | .eslintrc 39 | .wp-env.json 40 | jsconfig.json 41 | webpack.config.js 42 | src 43 | .babelrc 44 | .eslintrc.js 45 | .snyk 46 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | # WordPress Coding Standards 5 | # https://make.wordpress.org/core/handbook/coding-standards/ 6 | 7 | root = true 8 | 9 | [*] 10 | charset = utf-8 11 | end_of_line = lf 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | indent_style = tab 15 | indent_size = 4 16 | 17 | [{.jshintrc,*.json,*.yml}] 18 | indent_style = space 19 | indent_size = 2 20 | 21 | [{*.txt,wp-config-sample.php}] 22 | end_of_line = crlf 23 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Internal dependencies 3 | */ 4 | 5 | module.exports = { 6 | root: true, 7 | extends: [ 8 | 'plugin:@wordpress/eslint-plugin/recommended-with-formatting', 9 | 'plugin:import/recommended', 10 | 'plugin:eslint-comments/recommended', 11 | ], 12 | env: { 13 | browser: true, 14 | }, 15 | parserOptions: { 16 | requireConfigFile: false, 17 | babelOptions: { 18 | presets: [ require.resolve( '@wordpress/babel-preset-default' ) ], 19 | }, 20 | }, 21 | overrides: [ 22 | { 23 | files: [ 24 | 'tests/e2e/**/*.js', 25 | ], 26 | extends: [ 27 | 'plugin:@wordpress/eslint-plugin/test-e2e', 28 | 'plugin:jest/all', 29 | ], 30 | settings: { 31 | jest: { 32 | version: 26, 33 | }, 34 | }, 35 | rules: { 36 | 'jest/lowercase-name': [ 37 | 'error', 38 | { 39 | ignore: [ 40 | 'describe', 41 | ], 42 | }, 43 | ], 44 | 'jest/no-hooks': 'off', 45 | 'jest/prefer-expect-assertions': 'off', 46 | 'jest/prefer-inline-snapshots': 'off', 47 | }, 48 | }, 49 | ], 50 | }; 51 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: Bug Title ... 5 | labels: "bug" 6 | assignees: 'SuryawanshiPrajakta' 7 | --- 8 | 9 | ### Describe the bug: 10 | 11 | 12 | ### To reproduce: 13 | 14 | 15 | 21 | 22 | ### Expected behavior: 23 | 24 | 25 | ### Screenshots: 26 | 27 | 28 | ### Isolating the problem: 29 | 30 | 31 | - [ ] This bug happens with no other plugins activated 32 | - [ ] This bug happens with a default WordPress theme active 33 | - [ ] I can reproduce this bug consistently using the steps above 34 | 35 | ### WordPress version: 36 | 37 | 38 | ### Elementor version: 39 | 40 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: Feature Title ... 5 | labels: "enhancement" 6 | assignees: '' 7 | --- 8 | 9 | ### Is your feature request related to a problem? Please describe. 10 | 11 | 12 | ### Describe the solution you'd like 13 | 14 | 15 | ### Describe alternatives you've considered 16 | 17 | 18 | ### Additional context/screenshots 19 | 20 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Description 2 | [BSF-PR-SUMMARY] 3 | 4 | ### Screenshots 5 | 6 | 7 | ### Types of changes 8 | 9 | 10 | 11 | 12 | 13 | ### How has this been tested? 14 | 15 | 16 | ### Checklist: 17 | - [ ] My code is tested 18 | - [ ] My code passes the PHPCS tests 19 | - [ ] My code follows accessibility standards 20 | - [ ] My code has proper inline documentation 21 | - [ ] I've included any necessary tests 22 | - [ ] I've included developer documentation 23 | - [ ] I've added proper labels to this pull request 24 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | 4 | # Maintain dependencies for GitHub Actions 5 | - package-ecosystem: "github-actions" 6 | directory: "/" 7 | target-branch: "release-candidate" 8 | schedule: 9 | interval: "daily" 10 | 11 | # Maintain dependencies for npm 12 | - package-ecosystem: "npm" 13 | directory: "/" 14 | target-branch: "release-candidate" 15 | schedule: 16 | interval: "daily" 17 | 18 | # Maintain dependencies for Composer 19 | - package-ecosystem: "composer" 20 | target-branch: "release-candidate" 21 | directory: "/" 22 | schedule: 23 | interval: "daily" -------------------------------------------------------------------------------- /.github/workflows/ai-code-reviewer.yml: -------------------------------------------------------------------------------- 1 | name: BSF Code Reviewer 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize, edited] 6 | 7 | permissions: write-all 8 | 9 | jobs: 10 | CHECK_SHORTCODE: 11 | if: ${{ github.event.action == 'edited' || contains(github.event.pull_request.body, '[BSF-PR-SUMMARY]') }} 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout Repository 15 | uses: actions/checkout@v3 16 | 17 | - name: WRITE PR SUMMARY 18 | uses: brainstormforce/pull-request-reviewer@master 19 | with: 20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 21 | OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} 22 | ACTION_CONTEXT: 'CHECK_SHORTCODE' 23 | EXCLUDE_EXTENSIONS: "md, yml, lock" 24 | INCLUDE_EXTENSIONS: "php, js, jsx, ts, tsx, css, scss, html, json" 25 | EXCLUDE_PATHS: "node_modules/,vendor/" 26 | 27 | CODE_REVIEW: 28 | needs: CHECK_SHORTCODE 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Checkout Repository 32 | uses: actions/checkout@v3 33 | 34 | - name: AI CODE REVIEW 35 | uses: brainstormforce/pull-request-reviewer@master 36 | with: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} 39 | ACTION_CONTEXT: "CODE_REVIEW" 40 | JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} 41 | JIRA_USERNAME: ${{ secrets.JIRA_USERNAME }} 42 | JIRA_TOKEN: ${{ secrets.JIRA_TOKEN }} 43 | EXCLUDE_EXTENSIONS: "md, yml, lock" 44 | INCLUDE_EXTENSIONS: "php, js, jsx, ts, tsx, css, scss, html, json" 45 | EXCLUDE_PATHS: "node_modules/,vendor/" -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | CI: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | node: [ 14.15 ] 12 | php: ['7.4'] 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v3 17 | 18 | - name: Setup PHP 19 | uses: shivammathur/setup-php@v2 20 | with: 21 | php-version: ${{ matrix.php }} 22 | coverage: none 23 | tools: composer 24 | 25 | - name: Install composer dependencies 26 | run: composer config github-oauth.github.com ${{ secrets.PRIVATE_ACCESS_TOKEN }} && composer install --prefer-dist --no-suggest --no-progress 27 | 28 | - name: PHPCS check 29 | if: always() 30 | uses: chekalsky/phpcs-action@v1 31 | with: 32 | phpcs_bin_path: './vendor/bin/phpcs' 33 | 34 | - name: Use desired version of NodeJS 35 | uses: actions/setup-node@v3 36 | with: 37 | node-version: ${{ matrix.node }} 38 | cache: 'npm' 39 | 40 | - name: npm install 41 | run: npm ci 42 | 43 | - name: Build project 44 | run: npm run build 45 | 46 | - name: Lint JS 47 | run: npm run lint:js 48 | -------------------------------------------------------------------------------- /.github/workflows/push-asset-readme-update.yml.yml: -------------------------------------------------------------------------------- 1 | name: Plugin asset/readme update 2 | on: 3 | push: 4 | branches: 5 | - master 6 | jobs: 7 | master: 8 | name: Push to master 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: WordPress.org plugin asset/readme update 13 | uses: 10up/action-wordpress-plugin-asset-update@stable 14 | env: 15 | SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} 16 | SVN_USERNAME: ${{ secrets.SVN_USERNAME }} 17 | -------------------------------------------------------------------------------- /.github/workflows/push-to-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to WordPress.org 2 | on: 3 | push: 4 | tags: 5 | - "*" 6 | jobs: 7 | tag: 8 | name: New tag 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@master 12 | with: 13 | token: ${{ secrets.PRIVATE_ACCESS_TOKEN }} 14 | 15 | - name: Use Node.js 18.x 16 | uses: actions/setup-node@v3 17 | with: 18 | node-version: 18.x 19 | 20 | - name: Install Dependencies 21 | run: npm install 22 | 23 | - name: Build 24 | run: npm run build-package 25 | 26 | - name: WordPress Plugin Deploy 27 | uses: 10up/action-wordpress-plugin-deploy@master 28 | env: 29 | SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} 30 | SVN_USERNAME: ${{ secrets.SVN_USERNAME }} 31 | -------------------------------------------------------------------------------- /.github/workflows/release-pr-template.yml: -------------------------------------------------------------------------------- 1 | name: PR update 2 | 3 | on: 4 | pull_request: 5 | types: [ labeled ] 6 | 7 | jobs: 8 | update_pr: 9 | name: PR update 10 | if: ${{ github.event.label.name == 'Release PR checklist' }} 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Check Branch 14 | id: check-branch 15 | run: | 16 | if [[ ${{ github.base_ref }} == master || ${{ github.base_ref }} == dev || ${{ github.base_ref }} == next-release ]]; then 17 | echo ::set-output name=match::true 18 | fi 19 | - uses: tzkhan/pr-update-action@v2 20 | if: steps.check-branch.outputs.match == 'true' 21 | with: 22 | repo-token: "${{ secrets.GITHUB_TOKEN }}" 23 | base-branch-regex: '[A-Za-z\d-_.\\/]+' 24 | head-branch-regex: '[A-Za-z\d-_.\\/]+' 25 | title-template: 'Build: Release PR' 26 | body-template: | 27 | ### Description 28 | - Final release PR. Please check all the checklist below before merging. 29 | --- 30 | ### Checklist: 31 | - [ ] Check if astra-notice library is updated to latest 32 | - [ ] Check if Elementor & Elementor Pro compatibility tags are updated to latest 33 | - [ ] Update - Tested Upto - readme.txt 34 | - [ ] Update Readme.txt file and then run: `grunt readme` 35 | - [ ] Run to update version number : `grunt version-bump --ver=` 36 | - [ ] Generate POT file : `grunt i18n` 37 | - [ ] PHPCS - vendor/bin/phpcs 38 | - [ ] Add draft a tag GitHub 39 | - [ ] Open PR to backport branch to `next-release` 40 | --- 41 | body-update-action: 'prefix' 42 | title-update-action: 'prefix' 43 | body-uppercase-base-match: false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore PHPStorm extra directories 2 | .idea/ 3 | 4 | # OS specific files 5 | .DS_Store 6 | 7 | # Leave node_modules from git 8 | node_modules/ 9 | 10 | # sass cache 11 | .sass-cache 12 | 13 | # ignore PHPCS report files 14 | phpcs-summary.log 15 | phpcs-full.log 16 | 17 | # Org Package 18 | *.zip 19 | 20 | # Ignore Composer's directories 21 | vendor/ 22 | 23 | # E2E test artifacts. 24 | artifacts/ 25 | -------------------------------------------------------------------------------- /.snyk: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": { 3 | "npm:ansi-regex:*": [ 4 | { 5 | "reason": "Ignoring ansi-regex vulnerability introduced through grunt-rtlcss", 6 | "expires": "2024-12-31T23:59:59Z" 7 | } 8 | ] 9 | } 10 | } -------------------------------------------------------------------------------- /.wordpress-org/banner-1544x500.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/banner-1544x500.gif -------------------------------------------------------------------------------- /.wordpress-org/banner-772x250.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/banner-772x250.gif -------------------------------------------------------------------------------- /.wordpress-org/icon-128x128.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/icon-128x128.gif -------------------------------------------------------------------------------- /.wordpress-org/icon-256x256.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/icon-256x256.gif -------------------------------------------------------------------------------- /.wordpress-org/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/screenshot-1.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/screenshot-2.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/screenshot-3.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/screenshot-4.png -------------------------------------------------------------------------------- /.wordpress-org/screenshot-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/.wordpress-org/screenshot-5.png -------------------------------------------------------------------------------- /.wp-env.json: -------------------------------------------------------------------------------- 1 | { 2 | "core": null, 3 | "themes": [ 4 | "https://downloads.wordpress.org/theme/astra.zip", 5 | "https://downloads.wordpress.org/theme/twentytwentyone.zip" 6 | ], 7 | "plugins": [ 8 | ".", 9 | "https://downloads.wordpress.org/plugin/elementor.zip" 10 | ], 11 | "config": { 12 | "WP_DEBUG_LOG": true 13 | }, 14 | "port": 9091, 15 | "env": { 16 | "tests": { 17 | "port": 9092 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/minified/style-rtl.min.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"]{padding:1px 12px;border-right-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 0 12px 20px}[ID*="-optin-notice"] .button-primary{margin-left:5px} -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/minified/style.min.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"]{padding:1px 12px;border-left-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 20px 12px 0}[ID*="-optin-notice"] .button-primary{margin-right:5px} -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/unminified/style-rtl.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"] { 2 | padding: 1px 12px; 3 | border-right-color: #007cba; 4 | } 5 | 6 | [ID*="-optin-notice"] .notice-container { 7 | padding-top: 10px; 8 | padding-bottom: 12px; 9 | } 10 | 11 | [ID*="-optin-notice"] .notice-content { 12 | margin: 0; 13 | } 14 | 15 | [ID*="-optin-notice"] .notice-heading { 16 | padding: 0 0 12px 20px; 17 | } 18 | 19 | [ID*="-optin-notice"] .button-primary { 20 | margin-left: 5px; 21 | } -------------------------------------------------------------------------------- /admin/bsf-analytics/assets/css/unminified/style.css: -------------------------------------------------------------------------------- 1 | [ID*="-optin-notice"] { 2 | padding: 1px 12px; 3 | border-left-color: #007cba; 4 | } 5 | 6 | [ID*="-optin-notice"] .notice-container { 7 | padding-top: 10px; 8 | padding-bottom: 12px; 9 | } 10 | 11 | [ID*="-optin-notice"] .notice-content { 12 | margin: 0; 13 | } 14 | 15 | [ID*="-optin-notice"] .notice-heading { 16 | padding: 0 20px 12px 0; 17 | } 18 | 19 | [ID*="-optin-notice"] .button-primary { 20 | margin-right: 5px; 21 | } -------------------------------------------------------------------------------- /admin/bsf-analytics/changelog.txt: -------------------------------------------------------------------------------- 1 | v1.1.14 - 6-May-2025 2 | - New: Introduced a key 'hide_optin_checkbox' to hide checkbox from Settings > General. 3 | - Improvement: Single optin notice for all bsf products. 4 | - Improvement: Introduced delay of 7 days for next optin message if user has reqested request from product. 5 | v1.1.13 - 17-April-2025 6 | - Improvement: Ensured unique id for label's `for` attribute in deactivation survey fields by prefixing them with product slugs. 7 | - Improvement: Prevented deactivation survey from triggering when switching from a child theme to its parent. 8 | 9 | v1.1.12 - 24-March-2025 10 | - Improvement: Added `suremails` and `latepoint` slugs to UTM analytics. -------------------------------------------------------------------------------- /admin/bsf-analytics/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "brainstormforce/bsf-analytics", 3 | "description": "Library to gather non sensitive analytics data to enhance bsf products.", 4 | "type": "wordpress-plugin", 5 | "require-dev": { 6 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 7 | "wp-coding-standards/wpcs": "2.2.1", 8 | "phpcompatibility/phpcompatibility-wp": "2.1.0", 9 | "brainmaestro/composer-git-hooks": "^2.6" 10 | }, 11 | "scripts": { 12 | "format": "phpcbf --standard=phpcs.xml.dist --report-summary --report-source", 13 | "lint": "phpcs --standard=phpcs.xml.dist --report-summary --report-source", 14 | "post-install-cmd": "vendor/bin/cghooks add --ignore-lock", 15 | "post-update-cmd": "vendor/bin/cghooks update" 16 | }, 17 | "extra": { 18 | "hooks": { 19 | "pre-commit": [ 20 | "echo committing as $(git config user.name)", 21 | "sh bin/block-commits-with-merge-conflict.sh" 22 | ] 23 | } 24 | }, 25 | "config": { 26 | "allow-plugins": { 27 | "dealerdirect/phpcodesniffer-composer-installer": true 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /admin/bsf-analytics/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "bsf-analytics-ver": "1.1.14" 3 | } 4 | -------------------------------------------------------------------------------- /assets/css/admin-header-footer-elementor.css: -------------------------------------------------------------------------------- 1 | .astra-review-notice-container { 2 | display: flex; 3 | align-items: center; 4 | padding-top: 10px; 5 | } 6 | 7 | .astra-review-notice-container .dashicons { 8 | font-size: 1.4em; 9 | padding-left: 10px; 10 | } 11 | 12 | .astra-review-notice-container a { 13 | padding-left: 5px; 14 | text-decoration: none; 15 | } 16 | 17 | .astra-review-notice-container .dashicons:first-child { 18 | padding-left: 0; 19 | } 20 | 21 | .notice-image img { 22 | max-width: 90px; 23 | } 24 | 25 | .notice-content .notice-heading { 26 | padding-bottom: 5px; 27 | } 28 | 29 | .notice-content { 30 | margin-left: 15px; 31 | } 32 | 33 | .notice-container { 34 | padding-top: 10px; 35 | padding-bottom: 10px; 36 | display: flex; 37 | justify-content: left; 38 | align-items: center; 39 | } 40 | 41 | li#toplevel_page_Settings-page { 42 | display: none; 43 | } -------------------------------------------------------------------------------- /assets/css/header-footer-elementor.css: -------------------------------------------------------------------------------- 1 | .footer-width-fixer { 2 | width: 100%; 3 | } 4 | 5 | /* Container fix for genesis themes */ 6 | 7 | .ehf-template-genesis.ehf-header .site-header .wrap, 8 | .ehf-template-genesis.ehf-footer .site-footer .wrap, 9 | .ehf-template-generatepress.ehf-header .site-header .inside-header { 10 | width: 100%; 11 | padding: 0; 12 | max-width: 100%; 13 | } 14 | 15 | /* Container fix for generatepress theme */ 16 | 17 | .ehf-template-generatepress.ehf-header .site-header, 18 | .ehf-template-generatepress.ehf-footer .site-footer { 19 | width: 100%; 20 | padding: 0; 21 | max-width: 100%; 22 | background-color: transparent !important; /* override generatepress default white color for header */ 23 | } 24 | 25 | .bhf-hidden { 26 | display: none 27 | } 28 | 29 | /* Fix: Header hidden below the page content */ 30 | .ehf-header #masthead { 31 | z-index: 99; 32 | position: relative; 33 | } 34 | -------------------------------------------------------------------------------- /assets/fonts/hfe.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/fonts/hfe.eot -------------------------------------------------------------------------------- /assets/fonts/hfe.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/fonts/hfe.ttf -------------------------------------------------------------------------------- /assets/fonts/hfe.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/fonts/hfe.woff -------------------------------------------------------------------------------- /assets/images/header-footer-elementor-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | Header, Footer & Blocks for Elementor 7 | 8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /assets/images/settings/astra.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /assets/images/settings/augmented_reality.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/augmented_reality.png -------------------------------------------------------------------------------- /assets/images/settings/build_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/build_banner.png -------------------------------------------------------------------------------- /assets/images/settings/build_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/build_bg.png -------------------------------------------------------------------------------- /assets/images/settings/column.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/column.png -------------------------------------------------------------------------------- /assets/images/settings/git-compare.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/images/settings/integrations.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/images/settings/layout-template.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/images/settings/our-team.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/our-team.jpeg -------------------------------------------------------------------------------- /assets/images/settings/plugin-astra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/plugin-astra.png -------------------------------------------------------------------------------- /assets/images/settings/plugin-st.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/plugin-st.png -------------------------------------------------------------------------------- /assets/images/settings/plugin-uae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/plugin-uae.png -------------------------------------------------------------------------------- /assets/images/settings/pplayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/pplayer.png -------------------------------------------------------------------------------- /assets/images/settings/rocket.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/images/settings/starter-templates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/starter-templates.png -------------------------------------------------------------------------------- /assets/images/settings/stemplates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/stemplates.png -------------------------------------------------------------------------------- /assets/images/settings/success_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/success_bg.png -------------------------------------------------------------------------------- /assets/images/settings/surecart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/surecart.png -------------------------------------------------------------------------------- /assets/images/settings/surecart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/settings/sureforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/sureforms.png -------------------------------------------------------------------------------- /assets/images/settings/sureforms.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/settings/template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/template.png -------------------------------------------------------------------------------- /assets/images/settings/theme.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/images/settings/tracking.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/images/settings/tracking_selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/images/settings/user-selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/images/settings/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/images/settings/version.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/images/settings/welcome-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/assets/images/settings/welcome-banner.png -------------------------------------------------------------------------------- /bin/gen-stubs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Define the directories to generate stubs for 4 | DIRECTORIES=( 5 | "../elementor" 6 | ) 7 | 8 | # Output directory for stubs 9 | OUTPUT_DIR="stubs" 10 | 11 | # Create the output directory if it doesn't exist 12 | mkdir -p $OUTPUT_DIR 13 | 14 | # Temporary directory for storing problematic paths 15 | PROBLEMATIC_PATHS=() 16 | 17 | # Function to generate stubs with debugging output 18 | generate_stubs() { 19 | local DIR="$1" 20 | local OUTPUT_FILE="$OUTPUT_DIR/$(echo $DIR | sed 's/[^a-zA-Z0-9]/_/g')-stubs.php" 21 | 22 | # Generate stubs with additional debugging 23 | echo "Generating stubs for $DIR..." 24 | vendor/bin/generate-stubs "$DIR" --out="$OUTPUT_FILE" 2>&1 | tee stubs_generation.log 25 | 26 | # Check for errors in the log 27 | if grep -q "Class not found" stubs_generation.log; then 28 | echo "Error generating stubs for $DIR. Checking for problematic paths..." 29 | PROBLEMATIC_PATHS+=("$DIR") 30 | else 31 | echo "Stubs generated for $DIR and saved to $OUTPUT_FILE" 32 | fi 33 | 34 | # Clean up log file 35 | rm stubs_generation.log 36 | } 37 | 38 | # Generate stubs for each directory 39 | for DIR in "${DIRECTORIES[@]}"; do 40 | generate_stubs "$DIR" 41 | done 42 | 43 | # Output problematic paths 44 | if [ ${#PROBLEMATIC_PATHS[@]} -gt 0 ]; then 45 | echo "The following paths encountered issues and may be problematic:" 46 | for PATH in "${PROBLEMATIC_PATHS[@]}"; do 47 | echo "- $PATH" 48 | done 49 | fi 50 | 51 | echo "All stubs generated successfully in $OUTPUT_DIR directory" -------------------------------------------------------------------------------- /build/022beb5767ebf3d54c2c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/022beb5767ebf3d54c2c.woff2 -------------------------------------------------------------------------------- /build/0c658d1bd687fc3b8ae1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/0c658d1bd687fc3b8ae1.woff2 -------------------------------------------------------------------------------- /build/410fbc8e227942f4d606.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/410fbc8e227942f4d606.woff2 -------------------------------------------------------------------------------- /build/7d00956da27af3e30b78.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/7d00956da27af3e30b78.woff -------------------------------------------------------------------------------- /build/815fd49f3f94a120685f.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/815fd49f3f94a120685f.woff -------------------------------------------------------------------------------- /build/8fbf595b398521a13438.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/8fbf595b398521a13438.woff2 -------------------------------------------------------------------------------- /build/f2b6d272f68d05e1513a.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/f2b6d272f68d05e1513a.woff -------------------------------------------------------------------------------- /build/f5a809ac576251495a72.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brainstormforce/header-footer-elementor/4bb110edc074358a32042a2660afd7ab67c23b85/build/f5a809ac576251495a72.woff -------------------------------------------------------------------------------- /build/main.asset.php: -------------------------------------------------------------------------------- 1 | array('react', 'react-dom', 'wp-api-fetch', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '0fa3a1c419edee43c011'); 2 | -------------------------------------------------------------------------------- /build/main.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | Copyright (c) 2018 Jed Watson. 3 | Licensed under the MIT License (MIT), see 4 | http://jedwatson.github.io/classnames 5 | */ 6 | 7 | /*! 8 | * tabbable 6.2.0 9 | * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE 10 | */ 11 | 12 | /** 13 | * @license React 14 | * react-jsx-runtime.production.min.js 15 | * 16 | * Copyright (c) Facebook, Inc. and its affiliates. 17 | * 18 | * This source code is licensed under the MIT license found in the 19 | * LICENSE file in the root directory of this source tree. 20 | */ 21 | 22 | /** 23 | * @license lucide-react v0.417.0 - ISC 24 | * 25 | * This source code is licensed under the ISC license. 26 | * See the LICENSE file in the root directory of this source tree. 27 | */ 28 | 29 | /** 30 | * @license lucide-react v0.474.0 - ISC 31 | * 32 | * This source code is licensed under the ISC license. 33 | * See the LICENSE file in the root directory of this source tree. 34 | */ 35 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nikschavan/header-footer-elementor", 3 | "description": "Create Header and Footer using Elementor page builder.", 4 | "require": { 5 | "brainstormforce/astra-notices": "^1.1", 6 | "brainstormforce/nps-survey": "^1", 7 | "brainstormforce/bsf-analytics": "^1" 8 | }, 9 | "extra": { 10 | "installer-paths": { 11 | "inc/lib/{$name}/": [ 12 | "brainstormforce/astra-notices", 13 | "brainstormforce/nps-survey" 14 | ], 15 | "admin/{$name}/": [ 16 | "brainstormforce/bsf-analytics" 17 | ] 18 | } 19 | }, 20 | "repositories": [ 21 | { 22 | "name": "brainstormforce/bsf-core", 23 | "type": "vcs", 24 | "url": "git@github.com:brainstormforce/bsf-core.git" 25 | }, 26 | { 27 | "name": "brainstormforce/nps-survey", 28 | "type": "vcs", 29 | "url": "git@github.com:brainstormforce/nps-survey.git" 30 | }, 31 | { 32 | "name": "brainstormforce/bsf-analytics", 33 | "type": "vcs", 34 | "url": "git@github.com:brainstormforce/bsf-analytics.git" 35 | } 36 | ], 37 | "require-dev": { 38 | "squizlabs/php_codesniffer": "^3.7", 39 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", 40 | "wp-coding-standards/wpcs": "^2.3", 41 | "phpcompatibility/phpcompatibility-wp": "*", 42 | "automattic/vipwpcs": "^2.3", 43 | "phpstan/phpstan": "^1.11", 44 | "php-stubs/generator": "^0.8.4", 45 | "php-stubs/wordpress-stubs": "^6.5", 46 | "szepeviktor/phpstan-wordpress": "^1.3" 47 | }, 48 | "scripts": { 49 | "format": "phpcbf", 50 | "lint": "phpcs", 51 | "gen-stubs": "vendor/bin/generate-stubs artifact/phpstan/header-footer-elementor/ --out=tests/php/stubs/hfe-stubs.php && rm -rf artifact/phpstan", 52 | "phpstan": "vendor/bin/phpstan --memory-limit=2048M analyse", 53 | "update-stubs": "rm -f tests/php/stubs/hfe-stubs.php && bash bin/build-folder-phpstan.sh && composer gen-stubs" 54 | 55 | }, 56 | "config": { 57 | "allow-plugins": { 58 | "composer/installers": true, 59 | "dealerdirect/phpcodesniffer-composer-installer": true 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /inc/compatibility/class-hfe-wpml-compatibility.php: -------------------------------------------------------------------------------- 1 | version_check(); 48 | add_action( 'init', array( $this, 'load' ), 999 ); 49 | } 50 | 51 | /** 52 | * Version Check 53 | * 54 | * @return void 55 | */ 56 | public function version_check() { 57 | 58 | $file = realpath( dirname( __FILE__ ) . '/nps-survey/version.json' ); 59 | 60 | // Is file exist? 61 | if ( is_file( $file ) ) { 62 | 63 | $file_data = json_decode( file_get_contents( $file ), true ); //phpcs:ignore WordPressVIPMinimum.Performance.FetchingRemoteData.FileGetContentsUnknown 64 | 65 | global $nps_survey_version, $nps_survey_init; 66 | 67 | $path = realpath( dirname( __FILE__ ) . '/nps-survey/nps-survey.php' ); 68 | 69 | $version = isset( $file_data['nps-survey'] ) ? $file_data['nps-survey'] : 0; 70 | 71 | if ( null === $nps_survey_version ) { 72 | $nps_survey_version = '1.0.0'; 73 | } 74 | 75 | // Compare versions. 76 | if ( version_compare( $version, $nps_survey_version, '>=' ) ) { 77 | $nps_survey_version = $version; 78 | $nps_survey_init = $path; 79 | } 80 | } 81 | } 82 | 83 | /** 84 | * Load latest plugin 85 | * 86 | * @return void 87 | */ 88 | public function load() { 89 | 90 | global $nps_survey_version, $nps_survey_init; 91 | if ( is_file( realpath( $nps_survey_init ) ) ) { 92 | include_once realpath( $nps_survey_init ); 93 | } 94 | } 95 | } 96 | 97 | /** 98 | * Kicking this off by calling 'get_instance()' method 99 | */ 100 | Uae_Nps_Survey::get_instance(); 101 | 102 | endif; 103 | -------------------------------------------------------------------------------- /inc/lib/nps-survey/changelog.txt: -------------------------------------------------------------------------------- 1 | Version 1.0.7 - 13-01-2025 2 | - Improvement: 3 | - Enhanced core loading mechanism to prevent potential plugin conflicts. 4 | - Refactored codebase to adhere to core coding standards, improving overall readability and maintainability. 5 | - Updated popup UI to prevent external overlapping issues, ensuring better user experience. 6 | - New: 7 | - Introduced internal filters to provide flexibility in customizing rating submission data. 8 | 9 | Version 1.0.6 - 31-12-2024 10 | - Improvement: 11 | - Optimized performance by preventing unnecessary markup loading on screens where specific screen IDs are provided. 12 | - Fix: 13 | - Resolved console errors that occurred during popup dismissal, ensuring smoother user interaction. 14 | 15 | Version 1.0.5 - 19-12-2024 16 | - New: 17 | - Introduced a configuration option to display pop-up on the dashboards of specific plugins. 18 | - Improvement: 19 | - Enhanced mobile responsiveness of the popup. 20 | - Fix: 21 | - Corrected popup positioning in RTL (Right-to-Left) layouts. 22 | - Resolved overlap issues between the popup and other elements in Spectra. 23 | 24 | Version 1.0.4 - 13-12-2024 25 | - Improvement: Optimized file loading to prevent duplicate loads, enhancing performance. 26 | 27 | Version 1.0.3 - 10-12-2024 28 | - Fix: Fixed library update issue. 29 | 30 | Version 1.0.2 - 09-12-2024 31 | - Improvement: NPS popup will now be permanently dismissed when closed for the second time. 32 | - Improvement: Added an option to customize the rate button text for plugins/themes. 33 | - Fix: Resolved CSS conflicts with other plugins. 34 | 35 | Version 1.0.1 - 20-11-2024 36 | - New: Added filter to 'nps_survey_allowed_screens' to allow custom screens. 37 | - New: Added filter to 'nps_survey_build_url' update build url for themes. 38 | 39 | Version 1.0.0 - 23-09-2024 40 | - New: Initial release. 41 | 42 | -------------------------------------------------------------------------------- /inc/lib/nps-survey/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "brainstormforce/nps-survey", 3 | "type": "wordpress-plugin", 4 | "description": "NPS Survey Plugin", 5 | "require-dev": { 6 | "squizlabs/php_codesniffer": "^3.5", 7 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", 8 | "phpcompatibility/php-compatibility": "^9.3", 9 | "wp-coding-standards/wpcs": "^2.2", 10 | "phpstan/phpstan": "^1.9", 11 | "szepeviktor/phpstan-wordpress": "^1.1", 12 | "php-stubs/wordpress-stubs": "^6.1", 13 | "php-stubs/generator": "^0.8.2", 14 | "automattic/vipwpcs": "^2.3", 15 | "nunomaduro/phpinsights": "^2.10" 16 | }, 17 | "scripts": { 18 | "format": "vendor/bin/phpcbf", 19 | "lint": "vendor/bin/phpcs", 20 | "test": "vendor/bin/phpunit", 21 | "phpstan": "vendor/bin/phpstan --memory-limit=2048M analyse", 22 | "insights": "./vendor/bin/phpinsights analyse -v --no-interaction", 23 | "insights:fix": "./vendor/bin/phpinsights analyse --fix --no-interaction", 24 | "gen-stubs": "vendor/bin/generate-stubs artifact/phpstan/nps-survey/ --out=tests/php/stubs/nps-survey-stubs.php && rm -rf artifact/phpstan", 25 | "update-stubs": "rm -f tests/php/stubs/nps-survey-stubs.php && bash bin/build-folder-phpstan.sh && composer gen-stubs" 26 | }, 27 | "config": { 28 | "allow-plugins": { 29 | "dealerdirect/phpcodesniffer-composer-installer": true 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /inc/lib/nps-survey/dist/main.asset.php: -------------------------------------------------------------------------------- 1 | array('react', 'wp-api-fetch', 'wp-element', 'wp-i18n'), 'version' => '098e9bb53b4690172575'); 2 | -------------------------------------------------------------------------------- /inc/lib/nps-survey/nps-survey-plugin-loader.php: -------------------------------------------------------------------------------- 1 | 1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/bs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bs",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/ca.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/cs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadejte o jeden znak méně.":n<=4?"Prosím, zadejte o "+e(n,!0)+" znaky méně.":"Prosím, zadejte o "+n+" znaků méně."},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadejte ještě jeden znak.":n<=4?"Prosím, zadejte ještě další "+e(n,!0)+" znaky.":"Prosím, zadejte ještě dalších "+n+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku.":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky.":"Můžete zvolit maximálně "+n+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/da.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Angiv venligst "+t+" tegn mindre"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Angiv venligst "+t+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/de.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/dsb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/dsb",[],function(){var e=["znamuško","znamušce","znamuška","znamuškow"],t=["zapisk","zapiska","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Pšosym lašuj "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Pšosym zapódaj nanejmjenjej "+r+" "+n(r,e)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(e){return"Móžoš jano "+e.maximum+" "+n(e.maximum,t)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/el.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/en.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/es.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/et.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/eu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/fa.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/fi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/fr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Supprimez "+t+" caractère"+(t>1)?"s":""},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Saisissez au moins "+t+" caractère"+(t>1)?"s":""},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1)?"s":""},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/gl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var t=e.input.length-e.maximum;return t===1?"Elimine un carácter":"Elimine "+t+" caracteres"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t===1?"Engada un carácter":"Engada "+t+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return e.maximum===1?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/he.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/hi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/hr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/hsb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hsb",[],function(){var e=["znamješko","znamješce","znamješka","znamješkow"],t=["zapisk","zapiskaj","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Prošu zhašej "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Prošu zapodaj znajmjeńša "+r+" "+n(r,e)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(e){return"Móžeš jenož "+e.maximum+" "+n(e.maximum,t)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/hu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/hy.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Խնդրում ենք հեռացնել "+t+" նշան";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Խնդրում ենք մուտքագրել "+t+" կամ ավել նշաններ";return n},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(e){var t="Դուք կարող եք ընտրել առավելագույնը "+e.maximum+" կետ";return t},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/id.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/is.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/it.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/ja.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/km.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/lt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/lv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/mk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/ms.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/nb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn "+t+" tegn til";return n+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/nl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/pl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/ps.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="د مهربانۍ لمخي "+t+" توری ړنګ کړئ";return t!=1&&(n=n.replace("توری","توري")),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لږ تر لږه "+t+" يا ډېر توري وليکئ";return n},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(e){var t="تاسو يوازي "+e.maximum+" قلم په نښه کولای سی";return e.maximum!=1&&(t=t.replace("قلم","قلمونه")),t},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/pt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"caractere",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/ro.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+" sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/ru.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/sk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/sl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Prosim zbrišite "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Prosim vpišite še "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var t="Označite lahko največ "+e.maximum+" predmet";return e.maximum==2?t+="a":e.maximum!=1&&(t+="e"),t},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/sr-Cyrl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/sr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/sv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/th.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/tr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/uk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/vi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+" ký tự";return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/lib/target-rule/i18n/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /inc/settings/admin-base.php: -------------------------------------------------------------------------------- 1 | 14 |
15 |
16 |
17 | 20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /inc/settings/settings-app.php: -------------------------------------------------------------------------------- 1 | 13 | 14 |
15 | 16 |
17 | -------------------------------------------------------------------------------- /inc/widgets-manager/base/common-widget.php: -------------------------------------------------------------------------------- 1 | reflection = new \ReflectionClass( $this ); 86 | 87 | add_action( 'elementor/widgets/register', [ $this, 'init_widgets' ] ); 88 | } 89 | 90 | /** 91 | * Init Widgets 92 | * 93 | * @since 2.2.1 94 | */ 95 | public function init_widgets() { 96 | 97 | $widget_manager = \Elementor\Plugin::instance()->widgets_manager; 98 | 99 | foreach ( $this->get_widgets() as $widget ) { 100 | if ( HFE_Helper::is_widget_active( $widget ) ) { 101 | $class_name = $this->reflection->getNamespaceName() . '\\' . ucfirst( $widget ); 102 | 103 | if ( $this->is_widget() ) { 104 | $widget_manager->register( new $class_name() ); 105 | } 106 | } 107 | } 108 | } 109 | 110 | /** 111 | * Get Widgets 112 | * 113 | * @since 2.2.1 114 | * 115 | * @return array 116 | */ 117 | public function get_widgets() { 118 | return []; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /inc/widgets-manager/class-extensions-loader.php: -------------------------------------------------------------------------------- 1 | include_extensions_files(); 66 | } 67 | 68 | /** 69 | * Returns Script array. 70 | * 71 | * @return array() 72 | * @since 1.3.0 73 | */ 74 | public static function get_extensions_list() { 75 | $extensions_list = [ 76 | 'Scroll_To_Top' => 'scroll-to-top', 77 | 'Reading_Progress_Bar' => 'reading-progress-bar', 78 | ]; 79 | 80 | return $extensions_list; 81 | } 82 | 83 | /** 84 | * Include Extensions files 85 | * 86 | * Load Extensions files 87 | * 88 | * @since 2.2.1 89 | * @access public 90 | * @return void 91 | */ 92 | public function include_extensions_files() { 93 | $extensions_list = $this->get_extensions_list(); 94 | 95 | if ( ! empty( $extensions_list ) ) { 96 | foreach ( $extensions_list as $handle => $data ) { 97 | if ( HFE_Helper::is_widget_active( $handle ) ) { 98 | require_once HFE_DIR . '/inc/widgets-manager/extensions/class-' . $data . '.php'; 99 | } 100 | } 101 | } 102 | } 103 | 104 | } 105 | 106 | /** 107 | * Initiate the class. 108 | */ 109 | Extensions_Loader::instance(); 110 | -------------------------------------------------------------------------------- /inc/widgets-manager/widgets/breadcrumbs-widget/module.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | Generally-applicable sniffs for WordPress plugins 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | warning 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | . 40 | 41 | 42 | 43 | 44 | */node_modules/* 45 | */vendor/* 46 | */src/* 47 | */inc/lib/** 48 | */admin/bsf-analytics/* 49 | */stubs/* 50 | 51 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | # Start command: composer update --classmap-authoritative && vendor/bin/phpstan analyze 2 | 3 | includes: 4 | - phpstan-baseline.neon # Baseline to ignore error temporary 5 | # https://github.com/phpstan/phpstan/blob/master/conf/bleedingEdge.neon 6 | # - vendor/phpstan/phpstan/conf/bleedingEdge.neon 7 | # - phar://phpstan.phar/conf/bleedingEdge.neon 8 | - vendor/szepeviktor/phpstan-wordpress/extension.neon 9 | # - vendor/php-stubs/wordpress-stubs/wordpress-stubs.php 10 | parameters: 11 | level: 9 12 | inferPrivatePropertyTypeFromConstructor: true 13 | treatPhpDocTypesAsCertain: false 14 | scanFiles: 15 | bootstrapFiles: 16 | - vendor/php-stubs/wordpress-stubs/wordpress-stubs.php 17 | - tests/php/stubs/___elementor-stubs.php 18 | - tests/php/stubs/hfe-stubs.php 19 | paths: 20 | - header-footer-elementor.php 21 | - admin 22 | - assets 23 | - inc 24 | - languages 25 | - themes 26 | ignoreErrors: 27 | - '#Call to an undefined method [a-zA-Z0-9\\_]+\:\:add_control\(\).$#' 28 | - '#Call to an undefined method [^\s]+\.$#' 29 | - '#Call to method [^\s]+ on an unknown class Elementor\\[^\s]+\.$#' 30 | - '#Cannot access [^\s]+#' 31 | - '#Parameter [^\s]+#' 32 | - '#Function [^\s]+ not found.#' 33 | - '#Access to an undefined property [^\s]+#' 34 | - '#Static property [^\s]+#' 35 | - '#Call to static method [^\s]+#' 36 | - '#Offset [^\s]+#' 37 | - '#Access to [^\s]+#' 38 | - '#Strict comparison using \=\=\= between ''no'' and true will always evaluate to false.#' 39 | 40 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | ./tests/ 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, // Enables Tailwind CSS 4 | autoprefixer: {}, // Enables Autoprefixer for cross-browser support 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import "@fontsource/figtree"; // Defaults to weight 400 3 | import "@fontsource/figtree/400.css"; // Specify weight 4 | import "@fontsource/figtree/400-italic.css"; // Specify weight and style 5 | import CustomRouter from "router/customRouter"; 6 | import { Loader } from "@bsf/force-ui"; 7 | import UpgradeNotice from "@components/UpgradeNotice"; 8 | 9 | 10 | const App = () => { 11 | const [loaded, setLoaded] = useState(false); 12 | const [showTopBar, setShowTopBar] = useState(true); // State to manage the visibility of the top bar 13 | 14 | // scroll top on route change 15 | window.onhashchange = () => { 16 | window.scrollTo(0, 0); 17 | }; 18 | 19 | // Simulate loading (replace with actual loading logic if needed) 20 | useEffect(() => { 21 | setTimeout(() => { 22 | setLoaded(true); 23 | }, 1000); // Simulating a load delay of 1 second 24 | }, []); 25 | 26 | if (!loaded) { 27 | return ( 28 |
32 | 33 |
34 | ); 35 | } 36 | 37 | return ( 38 |
39 | {/* {showTopBar && ( 40 | setShowTopBar(false)} /> // Pass a prop to handle closing 41 | )} */} 42 | 43 |
44 | ); 45 | }; 46 | 47 | export default App; 48 | -------------------------------------------------------------------------------- /src/Components/Compare/Upgrade.jsx: -------------------------------------------------------------------------------- 1 | import { Container } from "@bsf/force-ui"; 2 | import ExtendWebsite from "@components/Dashboard/ExtendWebsite"; 3 | import QuickAccess from "@components/Dashboard/QuickAccess"; 4 | import NavMenu from "@components/NavMenu"; 5 | import UpgradeNotice from "@components/UpgradeNotice"; 6 | import React from 'react' 7 | import FreevsPro from "./FreevsPro"; 8 | import UltimateCompare from "./UltimateCompare"; 9 | import UltimateFeatures from "@components/Dashboard/UltimateFeatures"; 10 | 11 | 12 | const Upgrade = () => { 13 | return ( 14 | <> 15 | 16 |
17 | 28 | 34 | 35 | 36 | 40 | 41 |
42 | 43 |
44 |
45 | 46 |
47 | 48 |
49 |
50 |
51 | 52 | ) 53 | } 54 | 55 | export default Upgrade 56 | -------------------------------------------------------------------------------- /src/Components/HeaderLine.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | Title 4 | } from '@bsf/force-ui'; 5 | import { __ } from '@wordpress/i18n'; 6 | 7 | const HeaderLine = () => { 8 | return ( 9 | 18 | ); 19 | }; 20 | 21 | export default HeaderLine; 22 | -------------------------------------------------------------------------------- /src/Components/Onboarding/Configure.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { __ } from "@wordpress/i18n"; 3 | import FeatureWidgetsOnboarding from '@components/Widgets/Features/FeatureWidgetsOnboarding'; 4 | 5 | const Configure = ({ setCurrentStep }) => { 6 | return ( 7 | <FeatureWidgetsOnboarding setCurrentStep={setCurrentStep} /> 8 | ) 9 | } 10 | 11 | export default Configure 12 | -------------------------------------------------------------------------------- /src/Components/Onboarding/Onboarding.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import OB from './index' 3 | 4 | const Onboarding = () => { 5 | return ( 6 | <> 7 | <OB /> 8 | </> 9 | ) 10 | } 11 | 12 | export default Onboarding 13 | -------------------------------------------------------------------------------- /src/Components/Settings/Content.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Content = ({ selectedItem }) => { 4 | return ( 5 | <div className="p-6" style={{ marginLeft: '4px' }}> 6 | <div>{selectedItem?.content}</div> 7 | </div> 8 | ) 9 | } 10 | 11 | export default Content 12 | -------------------------------------------------------------------------------- /src/Components/Settings/Sidebar.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | 3 | const Sidebar = ({ items, onSelectItem }) => { 4 | const [selectedItemId, setSelectedItemId] = useState(null); // State to track selected item 5 | 6 | const handleSelectItem = (item) => { 7 | setSelectedItemId(item.id); // Update selected item 8 | onSelectItem(item); // Trigger onSelectItem callback 9 | }; 10 | 11 | return ( 12 | <div style={{ padding: "1rem", width: "100%" }}> 13 | {/* Loop through items to render main title, icon, and title */} 14 | {items.map((item) => ( 15 | <div key={item.id} className="mb-2"> 16 | {/* Main Title for each section */} 17 | {item.main && ( 18 | <p className="text-sm text-text-tertiary font-normal mb-2"> 19 | {item.main} 20 | </p> 21 | )} 22 | 23 | {/* Each item with icon and title */} 24 | <div 25 | className={`h-10 flex items-center justify-start gap-2 px-2 rounded-md cursor-pointer ${selectedItemId === item.id ? 'bg-gray-100' : 'bg-background-primary'}`} 26 | style={{ 27 | backgroundColor: selectedItemId === item.id ? '#F9FAFB' : '', // Apply background color when selected 28 | }} 29 | onClick={() => handleSelectItem(item)} 30 | > 31 | <span> 32 | {selectedItemId === item.id ? item.selected : item.icon} 33 | </span> 34 | <p className="m-0 text-base font-normal">{item.title}</p> 35 | </div> 36 | </div> 37 | ))} 38 | </div> 39 | ); 40 | }; 41 | 42 | export default Sidebar; 43 | -------------------------------------------------------------------------------- /src/Components/Templates/Templates.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Container } from "@bsf/force-ui"; 3 | import NavMenu from '@components/NavMenu'; 4 | import ExploreTemplates from './ExploreTemplates'; 5 | 6 | const Templates = () => { 7 | return ( 8 | <> 9 | <NavMenu /> 10 | <div className=""> 11 | <Container 12 | align="stretch" 13 | className="p-2" 14 | containerType="flex" 15 | direction="row" 16 | gap="sm" 17 | justify="center" 18 | style={{ 19 | width: "100%", 20 | }} 21 | > 22 | <Container.Item 23 | className="p-2" 24 | alignSelf="auto" 25 | order="none" 26 | shrink={1} 27 | style={{ 28 | width: "90%", 29 | }} 30 | > 31 | {/* <WelcomeContainer /> 32 | <Widgets /> */} 33 | <ExploreTemplates /> 34 | </Container.Item> 35 | </Container> 36 | </div> 37 | </> 38 | ) 39 | } 40 | 41 | export default Templates 42 | -------------------------------------------------------------------------------- /src/Components/UpgradeNotice.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { __ } from "@wordpress/i18n"; 3 | 4 | const UpgradeNotice = ({ onClose }) => { 5 | return ( 6 | <div 7 | className="uae-upgrade p-3 d font-medium" 8 | style={{ 9 | backgroundColor: "#E9E4FF", 10 | textAlign: "center", 11 | fontSize: "0.82rem", 12 | zIndex: "9", 13 | position: "relative", 14 | }} 15 | > 16 | <button 17 | onClick={onClose} // Call the passed onClose function when clicked 18 | style={{ 19 | position: "absolute", 20 | top: "5px", 21 | right: "10px", 22 | background: "none", 23 | border: "none", 24 | fontSize: "24px", 25 | cursor: "pointer", 26 | color: "#000", 27 | width: "32px", // Explicit width 28 | height: "32px", // Explicit height for square dimensions 29 | display: "flex", // Flexbox for centering 30 | alignItems: "center", // Vertical centering 31 | justifyContent: "center", // Horizontal centering 32 | }} 33 | aria-label={__("Close Upgrade Notice", "header-footer-elementor")} 34 | > 35 | × 36 | </button> 37 | <strong> 38 | {__( 39 | "Unlock Ultimate Addons For Elementor! ", 40 | "header-footer-elementor" 41 | )} 42 | </strong> 43 | <span> 44 | {__( 45 | "Get exclusive features and unbeatable performance. ", 46 | "header-footer-elementor" 47 | )}{" "} 48 | <a 49 | href="https://ultimateelementor.com/pricing/?utm_source=uae-lite-navbar&utm_medium=upgrade-now&utm_campaign=uae-lite-upgrade" 50 | target="_blank" 51 | style={{ color: "#000000" }} 52 | > 53 | {__("Upgrade now", "header-footer-elementor")} 54 | </a> 55 | </span> 56 | </div> 57 | ); 58 | }; 59 | 60 | export default UpgradeNotice; 61 | -------------------------------------------------------------------------------- /src/Components/Widgets/Features.jsx: -------------------------------------------------------------------------------- 1 | import NavMenu from '@components/NavMenu' 2 | import { Container } from "@bsf/force-ui"; 3 | import React from 'react' 4 | import TemplateSection from '@components/Dashboard/TemplateSection'; 5 | import QuickAccess from '@components/Dashboard/QuickAccess'; 6 | import UltimateWidgets from './UltimateWidgets'; 7 | import FeatureWidgets from './Features/FeatureWidgets' 8 | import UltimateFeatures from '@components/Dashboard/UltimateFeatures'; 9 | import ExtendWebsite from '@components/Dashboard/ExtendWebsite'; 10 | 11 | const Features = () => { 12 | return ( 13 | <> 14 | <NavMenu /> 15 | <div> 16 | <Container 17 | align="stretch" 18 | className="p-6 flex flex-col lg:flex-row box-border" 19 | containerType="flex" 20 | direction="row" 21 | gap="sm" 22 | justify="start" 23 | style={{ 24 | width: "100%", 25 | }} 26 | > 27 | <Container.Item 28 | className="p-2 hfe-65-width" 29 | alignSelf="auto" 30 | order="none" 31 | shrink={1} 32 | > 33 | <FeatureWidgets /> 34 | </Container.Item> 35 | <Container.Item 36 | className="p-2 hfe-35-width" 37 | shrink={1} 38 | > 39 | <UltimateFeatures /> 40 | <div className='pt-5'> 41 | <ExtendWebsite/> 42 | </div> 43 | <div className='pt-4'> 44 | <QuickAccess /> 45 | </div> 46 | </Container.Item> 47 | </Container> 48 | </div> 49 | </> 50 | ) 51 | } 52 | 53 | export default Features -------------------------------------------------------------------------------- /src/Context/SettingsContext.js: -------------------------------------------------------------------------------- 1 | import React, { createContext, useState, useEffect } from 'react'; 2 | import axios from 'axios'; 3 | import { toast, Toaster } from '@bsf/force-ui'; 4 | import { __ } from '@wordpress/i18n'; // Import localization function 5 | 6 | // Create the Settings Context 7 | export const SettingsContext = createContext(); -------------------------------------------------------------------------------- /src/Screens/Settings/Settings.js: -------------------------------------------------------------------------------- 1 | import React, { useContext, useEffect, useState } from 'react'; 2 | import { __ } from '@wordpress/i18n'; // Import localization function 3 | import { SettingsContext } from '@context/SettingsContext.js'; 4 | import { 5 | Button, 6 | Switch, 7 | Select, 8 | Label, 9 | Skeleton, 10 | Toaster, 11 | toast, 12 | } from '@bsf/force-ui'; 13 | 14 | function Settings() { 15 | const { settings, saveSettings } = useContext(SettingsContext); 16 | 17 | const { 18 | status = 'idle', 19 | error = null, 20 | } = settings || {}; 21 | 22 | // Show toast for API errors 23 | useEffect(() => { 24 | if (status === 'failed' && error) { 25 | toast.error(__('Error loading settings'), { 26 | description: error, 27 | }); 28 | } 29 | }, [status, error]); 30 | 31 | 32 | // Handle loading state 33 | if (status === 'loading') { 34 | return <Skeleton variant="rectangular" className="w-full h-full" />; 35 | } 36 | 37 | return ( 38 | <div className="flex flex-col items-center justify-center min-h-screen p-6 bg-gray-100"> 39 | {/* Toaster to display toast notifications */} 40 | <Toaster dismissAfter={3000} /> 41 | 42 | {/* Header */} 43 | <div className="flex items-center justify-between w-[696px] h-[40px] mb-4 gap-2 mx-auto"> 44 | <h2 className="text-xl font-bold"> 45 | {__('General Settings')} 46 | </h2> 47 | <Button variant="primary"> 48 | {__('Save')} 49 | </Button> 50 | </div> 51 | </div> 52 | ); 53 | } 54 | 55 | export default Settings; 56 | -------------------------------------------------------------------------------- /src/Screens/Settings/index.js: -------------------------------------------------------------------------------- 1 | export { default as Settings } from './Settings.js'; 2 | -------------------------------------------------------------------------------- /src/admin/settings/routes.js: -------------------------------------------------------------------------------- 1 | export const routes = { 2 | dashboard: { 3 | path: "dashboard", 4 | }, 5 | widgets: { 6 | path: "widgets", 7 | }, 8 | templates: { 9 | path: "templates", 10 | }, 11 | settings: { 12 | path: "settings", 13 | }, 14 | onboarding: { 15 | path: "onboarding", 16 | }, 17 | upgrade: { 18 | path: "upgrade", 19 | }, 20 | headerFooterBuilder: { 21 | path: "elementor-hf" 22 | }, 23 | onboardingsuccess: { 24 | path: "onboardingsuccess" 25 | } 26 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { createRoot } from "react-dom/client"; // Import from react-dom/client for React 18 2 | import domReady from "@wordpress/dom-ready"; 3 | import App from "./App"; 4 | import NavMenu from "@components/NavMenu"; 5 | import "./styles.css"; 6 | 7 | domReady(() => { 8 | const rootElement = document.getElementById("hfe-settings-app"); 9 | if (rootElement) { 10 | const root = createRoot(rootElement); // Use createRoot() for React 18 11 | root.render(<App />); 12 | } 13 | 14 | if ( 15 | "yes" === hfe_admin_data.show_view_all || 16 | window.location.href === hfeSettingsData.header_footer_builder || 17 | "yes" === hfeSettingsData.is_hfe_post 18 | ) { 19 | const navMenuElement = document.getElementById( 20 | "hfe-admin-top-bar-root" 21 | ); 22 | if (navMenuElement) { 23 | const newDiv = document.createElement("div"); 24 | newDiv.id = "hfe-settings-app"; 25 | navMenuElement.appendChild(newDiv); 26 | 27 | const navMenuRoot = createRoot(newDiv); 28 | navMenuRoot.render(<NavMenu />); 29 | } 30 | } 31 | }); 32 | -------------------------------------------------------------------------------- /src/router/context.js: -------------------------------------------------------------------------------- 1 | import { createBrowserHistory } from "history"; 2 | import { locationToRoute } from "./utils"; 3 | 4 | export const history = createBrowserHistory(); 5 | export const RouterContext = wp.element.createContext({ 6 | route: locationToRoute(history.location), 7 | }); 8 | -------------------------------------------------------------------------------- /src/router/customRouter.js: -------------------------------------------------------------------------------- 1 | import { Router, Route, Link } from './index'; 2 | import Dashboard from '@components/Dashboard/Dashboard'; 3 | import Features from '@components/Widgets/Features'; 4 | import Templates from '@components/Templates/Templates'; 5 | import Settings from '@components/Settings/Settings'; 6 | import { routes } from 'admin/settings/routes'; 7 | import Upgrade from '@components/Compare/Upgrade'; 8 | import Onboarding from '@components/Onboarding/Onboarding'; 9 | import Success from '@components/Onboarding/Success'; 10 | 11 | 12 | const CustomRouter = () => ( 13 | <Router routes={routes} defaultRoute={routes?.dashboard?.path}> 14 | <Route path={routes.dashboard.path}><Dashboard /></Route> 15 | <Route path={routes.onboarding.path}><Onboarding /></Route> 16 | <Route path={routes.widgets.path}><Features /></Route> 17 | <Route path={routes.templates.path}><Templates /></Route> 18 | <Route path={routes.settings.path}><Settings /></Route> 19 | <Route path={routes.upgrade.path}><Upgrade /></Route> 20 | <Route path={routes.onboardingsuccess.path}><Success /></Route> 21 | </Router> 22 | ); 23 | 24 | export default CustomRouter; 25 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import { Component } from "@wordpress/element"; 2 | import { locationToRoute } from "./utils"; 3 | import { history, RouterContext } from "./context"; 4 | import { Route } from "./route"; 5 | import { Link } from "./link"; 6 | import { match } from "path-to-regexp"; 7 | 8 | class Router extends Component { 9 | constructor(props) { 10 | super(props); 11 | 12 | // Convert our routes into an array for easy 404 checking 13 | this.routes = Object.keys(props.routes).map( 14 | (key) => props.routes[key].path 15 | ); 16 | 17 | // Listen for path changes from the history API 18 | this.unlisten = history.listen(this.handleRouteChange); 19 | 20 | const route = locationToRoute(history.location); 21 | const { search } = history.location; 22 | 23 | // Define the initial RouterContext value 24 | this.state = { 25 | route, 26 | defaultRoute: props?.defaultRoute 27 | ? `${search}#${props?.defaultRoute}` 28 | : `${search}#/`, 29 | }; 30 | } 31 | 32 | componentWillUnmount() { 33 | // Stop listening for changes if the Router component unmounts 34 | this.unlisten(); 35 | } 36 | 37 | handleRouteChange = (location) => { 38 | localStorage.setItem('hfeSelectedItemId', '1'); 39 | const route = locationToRoute(location?.location); 40 | this.setState({ route: route }); 41 | }; 42 | 43 | render() { 44 | // Define our variables 45 | const { children, NotFound } = this.props; 46 | const { route, defaultRoute } = this.state; 47 | 48 | if (!route.hash) { 49 | history.push(defaultRoute); 50 | return <div></div>; 51 | } 52 | 53 | let matched = false; 54 | // match route 55 | (this.routes || []).forEach((name) => { 56 | const checkMatch = match(route.hash.substr(1)); 57 | const isMatched = checkMatch(`${route.hash.substr(1)}`); 58 | if (!isMatched) { 59 | return; 60 | } 61 | matched = { 62 | name, 63 | data: isMatched, 64 | }; 65 | }); 66 | 67 | const routerContextValue = { route, matched }; 68 | 69 | // Check if 404 if no route matched 70 | const is404 = !matched; 71 | 72 | return ( 73 | <RouterContext.Provider value={routerContextValue}> 74 | {is404 ? <div>Not found</div> : children} 75 | </RouterContext.Provider> 76 | ); 77 | } 78 | } 79 | export { history, RouterContext, Router, Route, Link }; 80 | -------------------------------------------------------------------------------- /src/router/link.js: -------------------------------------------------------------------------------- 1 | const { useContext } = wp.element; 2 | import { RouterContext, history } from "./context"; 3 | import classNames from "classnames"; 4 | import { match } from "path-to-regexp"; 5 | 6 | export function Link(props) { 7 | const { to, onClick, children, activeClassName } = props; 8 | const { route } = useContext(RouterContext); 9 | 10 | let state = { ...props }; 11 | delete state.activeClassName; 12 | 13 | const isActive = () => { 14 | const checkMatch = match(`${to}`); 15 | return checkMatch(`${route.hash.substr(1)}`); 16 | }; 17 | 18 | const handleClick = (e) => { 19 | e.preventDefault(); 20 | 21 | if (route.path === to && ! e.target.classList.contains('hfe-user-icon')) { 22 | return; 23 | } 24 | // Trigger onClick prop manually. 25 | if (onClick) { 26 | onClick(e); 27 | } 28 | 29 | if (to === "elementor-hf" && hfeSettingsData.header_footer_builder ) { 30 | window.location.href = hfeSettingsData.header_footer_builder; 31 | return; 32 | } 33 | 34 | const { search } = history.location; 35 | const expectedPage = "admin.php?page=hfe"; 36 | const currentHash = window.location.hash; 37 | 38 | // Verify if the current URL is as expected 39 | if (!search.includes(expectedPage) || !currentHash.includes(to)) { 40 | // Redirect to the expected URL 41 | window.location.href = `${hfeSettingsData.hfe_settings_url}#${to}`; 42 | return; 43 | } 44 | 45 | if (!to.includes('settings')) { 46 | // Remove &tab from the URL. 47 | const newSearch = search.replace(/&tab=[^&]*/, ''); 48 | // Use history API to navigate page. 49 | history.push(`${newSearch}#${to}`); 50 | } else { 51 | const changeSearch = search + '&tab=1'; 52 | 53 | if (e.target.classList.contains('hfe-user-icon') && window.location.hash.includes('settings')) { 54 | window.location.href = `${changeSearch}#${to}`; 55 | } else { 56 | // Use history API to navigate page. 57 | history.push(`${search}#${to}`); 58 | } 59 | } 60 | 61 | }; 62 | 63 | return ( 64 | <a 65 | {...state} 66 | className={classNames({ [activeClassName]: isActive() }, props.className)} 67 | onClick={handleClick} 68 | > 69 | {children} 70 | </a> 71 | ); 72 | } 73 | -------------------------------------------------------------------------------- /src/router/route.js: -------------------------------------------------------------------------------- 1 | import { RouterContext } from "./context"; 2 | const { useContext } = wp.element; 3 | import { match } from "path-to-regexp"; 4 | let prev = ""; 5 | 6 | export function Route({ path, onRoute, children }) { 7 | // Extract route from RouterContext 8 | const { route } = useContext(RouterContext); 9 | 10 | const checkMatch = match(`${path}`); 11 | const matched = checkMatch(`${route.hash.substr(1)}`); 12 | 13 | if (!matched) { 14 | return null; 15 | } 16 | 17 | if (onRoute) { 18 | if (prev !== matched.path) { 19 | onRoute(); 20 | } 21 | prev = matched.path; 22 | } 23 | 24 | return <div>{wp.element.cloneElement(children, { route: matched })}</div>; 25 | } 26 | -------------------------------------------------------------------------------- /src/router/utils.js: -------------------------------------------------------------------------------- 1 | import qs from "querystringify"; 2 | export function locationToRoute(location) { 3 | // location comes from the history package 4 | return { 5 | path: location.pathname, 6 | hash: location.hash, 7 | query: qs.parse(location.search), 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /stubs-generator.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * 4 | * This file contains the implementation of the add function. 5 | * 6 | * @package header-footer-elementor 7 | */ 8 | 9 | return [ 10 | 'packages' => [ 11 | 'wordpress' => [ 12 | 'source' => 'https://github.com/WordPress/WordPress.git', 13 | 'tags' => [ 'v6.4.3' ], 14 | 'output' => __DIR__ . '/stubs/wordpress', 15 | ], 16 | ], 17 | ]; 18 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const withTW = require("@bsf/force-ui/withTW"); 2 | // figma colr 3 | module.exports = withTW({ 4 | content: ["./src/**/*.{js, jsx}"], 5 | theme: { 6 | extend: { 7 | colors: { 8 | "button-primary": "#2563EB", 9 | "button-primary-hover": "#1D4ED8", 10 | 11 | "brand-primary-600": "#9333EA", 12 | "brand-800": "#6B21A8", 13 | "brand-50": "#EFF6FF", 14 | 15 | "border-interactive": "#2563EB", 16 | "border-subtle": "#E5E7EB", 17 | 18 | focus: "#9333EA", 19 | "focus-border": "#D8B4FE", 20 | 21 | "toggle-on": "#6B21A8", 22 | "toggle-on-border": "#C084FC", 23 | "toggle-on-hover": "#A855F7", 24 | 25 | "background-primary": "#FFFFFF", 26 | "background-secondary": "#F3F4F6", 27 | 28 | "field-border": "#E5E7EB", 29 | "field-label": "#111827", 30 | "field-primary-background": "#F9FAFB", 31 | "field-secondary-background": "#FFFFFF", 32 | 33 | "icon-primary": "#111827", 34 | "icon-secondary": "#4B5563", 35 | 36 | "background-gray": "#F9FAFB", 37 | }, 38 | fontSize: { 39 | xxs: "0.6875rem", // 11px 40 | }, 41 | lineHeight: { 42 | 2.6: "0.6875rem", // 11px 43 | 9.5: "2.375rem", // 38px 44 | }, 45 | boxShadow: { 46 | "content-wrapper": 47 | "0px 1px 1px 0px #0000000F, 0px 1px 2px 0px #0000001A", 48 | "container-item": "0px 1.5px 1px 0px rgba(0, 0, 0, 0.05)", // Custom shadow 49 | }, 50 | spacing: { 51 | "slide-over-container": "566px", 52 | }, 53 | fontFamily: { 54 | figtree: ["Figtree", "sans-serif"], 55 | }, 56 | }, 57 | }, 58 | plugins: [], 59 | corePlugins: { 60 | preflight: false, 61 | }, 62 | important: ":is(#hfe-settings-app, [data-floating-ui-portal])", 63 | }); 64 | -------------------------------------------------------------------------------- /tests/e2e/config/expect-extensions.js: -------------------------------------------------------------------------------- 1 | /** 2 | * `expect` extension to count the number of elements with a given selector on the page. 3 | */ 4 | // eslint-disable-next-line jest/require-hook -- This is ignore for now is coming after updating the eslint-plugin to v9.2.0. 5 | expect.extend( { 6 | async countToBe( selector, expected ) { 7 | const count = await page.$$eval( selector, ( els ) => els.length ); 8 | 9 | if ( count !== expected ) { 10 | return { 11 | pass: false, 12 | message: () => 13 | `Expected ${ expected } elements for selector ${ selector }. Received ${ count }.`, 14 | }; 15 | } 16 | 17 | return { 18 | pass: true, 19 | message: () => 20 | `Expected ${ expected } elements for selector ${ selector }.`, 21 | }; 22 | }, 23 | 24 | async cssValueToBe( css, expected ) { 25 | const value = await page.$eval( 26 | css.selector, 27 | ( el, prop, pseudoEl ) => 28 | window 29 | .getComputedStyle( el, pseudoEl || null ) 30 | .getPropertyValue( prop ), 31 | css.property, 32 | ); 33 | 34 | const sanitizedValue = sanitizeValue( css.property, value ); 35 | 36 | if ( sanitizedValue !== expected ) { 37 | return { 38 | pass: false, 39 | message: () => 40 | `Expected ${ expected } for ${ css.property } of ${ css.selector }. Received ${ sanitizedValue }.`, 41 | }; 42 | } 43 | 44 | return { 45 | pass: true, 46 | message: () => 47 | `Expected ${ expected } for ${ css.property } of ${ css.selector }.`, 48 | }; 49 | }, 50 | } ); 51 | 52 | /** 53 | * Sanitize the given css value for the property. 54 | * 55 | * @param {string} cssProperty CSS Property 56 | * @param {string} cssValue CSS Value for the property. 57 | * @return {string} Sanitized CSS Value. 58 | */ 59 | const sanitizeValue = ( cssProperty, cssValue ) => { 60 | const SANITIZERS = { 61 | 'font-family': sanitizeFontFamily, 62 | }; 63 | 64 | const sanitizer = SANITIZERS[ `${ cssProperty }` ]; 65 | 66 | if ( typeof sanitizer === 'function' ) { 67 | return sanitizer( cssValue ); 68 | } 69 | 70 | return cssValue; 71 | }; 72 | 73 | /** 74 | * Sanitize font family string. 75 | * 76 | * @param {string} fontFamily Font family string. 77 | * @return {string} Sanitized font family. 78 | */ 79 | const sanitizeFontFamily = ( fontFamily ) => { 80 | return fontFamily.replace( /\\/g, '' ).replace( /"/g, "'" ); 81 | }; 82 | -------------------------------------------------------------------------------- /tests/e2e/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ...require( '@wordpress/scripts/config/jest-e2e.config' ), 3 | transform: { 4 | '^.+\\.[jt]sx?$': 5 | '<rootDir>/../../node_modules/@wordpress/scripts/config/babel-transform', 6 | }, 7 | transformIgnorePatterns: [ 'node_modules' ], 8 | setupFilesAfterEnv: [ 9 | '<rootDir>/config/bootstrap.js', 10 | '@wordpress/jest-puppeteer-axe', 11 | 'expect-puppeteer', 12 | ], 13 | testPathIgnorePatterns: [ '.git', 'node_modules' ], 14 | reporters: [ 15 | [ 'jest-silent-reporter', { useDots: true } ], 16 | '<rootDir>/../../node_modules/@wordpress/scripts/config/jest-github-actions-reporter', 17 | ], 18 | }; 19 | -------------------------------------------------------------------------------- /tests/e2e/specs/hello.test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { 5 | createNewElementorPost, 6 | insertSection, 7 | insertWidget, 8 | publishPage, 9 | viewPage, 10 | } from '../utils/elementor-e2e-test-utils/src'; 11 | 12 | describe( 'Hello World', () => { 13 | it( 'elementor Hello, World!', async () => { 14 | await createNewElementorPost( 'page' ); 15 | await insertSection(); 16 | await insertWidget( { 17 | widgetName: 'Retina Image', 18 | section: 1, 19 | column: 1, 20 | } ); 21 | 22 | await publishPage(); 23 | await viewPage(); 24 | 25 | await expect( true ).toBe( true ); 26 | } ); 27 | } ); 28 | -------------------------------------------------------------------------------- /tests/e2e/utils/elementor-e2e-test-utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@brainstormforce/elementor-e2e-test-utils", 3 | "version": "1.0.0", 4 | "description": "End-To-End (E2E) test utils for Elementor Website Builder.", 5 | "author": "Brainstorm Force", 6 | "license": "GPL-2.0-or-later", 7 | "keywords": [ 8 | "wordpress", 9 | "elementor", 10 | "e2e", 11 | "utils" 12 | ], 13 | "files": [ 14 | "src" 15 | ], 16 | "main": "src/index.js", 17 | "module": "src/index.js", 18 | "dependencies": { 19 | "@wordpress/e2e-test-utils": "^5.4.3" 20 | }, 21 | "peerDependencies": { 22 | "jest": ">=26", 23 | "puppeteer": ">=1.19.0" 24 | }, 25 | "publishConfig": { 26 | "access": "public" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tests/e2e/utils/elementor-e2e-test-utils/src/create-new-elementor-post.js: -------------------------------------------------------------------------------- 1 | import { createNewPost } from '@wordpress/e2e-test-utils'; 2 | 3 | export async function createNewElementorPost( 4 | postType, 5 | title, 6 | content, 7 | excerpt, 8 | ) { 9 | await createNewPost( { 10 | postType, 11 | title, 12 | content, 13 | excerpt, 14 | } ); 15 | 16 | // Wait for the editor to be ready. 17 | await page.waitForSelector( '#elementor-switch-mode-button' ); 18 | 19 | // Click on `Edit With Elementor` button 20 | const editWithElementorButton = await page.$( 21 | '#elementor-switch-mode-button', 22 | ); 23 | await editWithElementorButton.click(); 24 | 25 | await page.waitForSelector( '#elementor-panel-saver-button-publish' ); 26 | } 27 | -------------------------------------------------------------------------------- /tests/e2e/utils/elementor-e2e-test-utils/src/index.js: -------------------------------------------------------------------------------- 1 | export * from './create-new-elementor-post'; 2 | export * from './drag-and-drop'; 3 | export * from './insert-section'; 4 | export * from './insert-widget'; 5 | export * from './publish-page'; 6 | export * from './view-page'; 7 | -------------------------------------------------------------------------------- /tests/e2e/utils/elementor-e2e-test-utils/src/insert-section.js: -------------------------------------------------------------------------------- 1 | export async function insertSection( layout = 2 ) { 2 | await page.waitForSelector( '#elementor-preview-iframe' ); 3 | const elementHandle = await page.$( '#elementor-preview-iframe' ); 4 | const frame = await elementHandle.contentFrame(); 5 | 6 | await frame.waitForSelector( '.elementor-add-section-button' ); 7 | const insertSectionButton = await frame.$( 8 | '.elementor-add-section-button', 9 | ); 10 | await insertSectionButton.evaluate( ( b ) => b.click() ); 11 | 12 | await frame.waitForSelector( '.elementor-select-preset-list' ); 13 | const selectSectionPreset = await frame.$( 14 | `.elementor-select-preset-list .elementor-preset:nth-child(${ layout })`, 15 | ); 16 | await selectSectionPreset.evaluate( ( b ) => b.click() ); 17 | } 18 | -------------------------------------------------------------------------------- /tests/e2e/utils/elementor-e2e-test-utils/src/insert-widget.js: -------------------------------------------------------------------------------- 1 | import { dragAndDrop } from './drag-and-drop'; 2 | 3 | const SEARCHBOX_SELECTOR = '#elementor-panel-elements-search-input'; 4 | 5 | export async function insertWidget( { widgetName, section, column } ) { 6 | await page.waitForSelector( '#elementor-preview-iframe' ); 7 | const elementHandle = await page.$( '#elementor-preview-iframe' ); 8 | const frame = await elementHandle.contentFrame(); 9 | const sectionSelector = `.elementor-section-wrap .elementor-section:nth-child(${ section }) > .elementor-container > .elementor-element:nth-child(${ column }) .elementor-first-add`; 10 | const dragableWidgetSelector = 11 | '.elementor-element-wrapper:nth-child(1) .elementor-element'; 12 | 13 | // Click add-widget button. 14 | await frame.waitForSelector( sectionSelector ); 15 | const columnToInsertWidget = await frame.$( sectionSelector ); 16 | await columnToInsertWidget.evaluate( ( b ) => b.click() ); 17 | 18 | await page.focus( SEARCHBOX_SELECTOR ); 19 | await page.keyboard.type( widgetName ); 20 | 21 | await dragAndDrop( page, dragableWidgetSelector, sectionSelector ); 22 | } 23 | -------------------------------------------------------------------------------- /tests/e2e/utils/elementor-e2e-test-utils/src/publish-page.js: -------------------------------------------------------------------------------- 1 | export async function publishPage() { 2 | const publishButton = await page.$( 3 | '#elementor-panel-saver-button-publish', 4 | ); 5 | publishButton.evaluate( ( b ) => b.click() ); 6 | 7 | await page.waitForSelector( '#elementor-toast' ); 8 | } 9 | -------------------------------------------------------------------------------- /tests/e2e/utils/elementor-e2e-test-utils/src/view-page.js: -------------------------------------------------------------------------------- 1 | export async function viewPage() { 2 | const elementorMenu = await page.$( '#elementor-panel-header-menu-button' ); 3 | elementorMenu.evaluate( ( b ) => b.click() ); 4 | 5 | const viewPageButton = await page.$( 6 | '.elementor-panel-menu-item-view-page a', 7 | ); 8 | viewPageButton.evaluate( ( b ) => b.click() ); 9 | } 10 | -------------------------------------------------------------------------------- /themes/astra/class-hfe-astra-compat.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * HFE_Astra_Compat setup 4 | * 5 | * @package header-footer-elementor 6 | */ 7 | 8 | /** 9 | * Astra theme compatibility. 10 | */ 11 | class HFE_Astra_Compat { 12 | 13 | /** 14 | * Instance of HFE_Astra_Compat. 15 | * 16 | * @var HFE_Astra_Compat 17 | */ 18 | private static $instance; 19 | 20 | /** 21 | * Initiator 22 | * 23 | * @return HFE_Astra_Compat 24 | */ 25 | public static function instance() { 26 | if ( ! isset( self::$instance ) ) { 27 | self::$instance = new HFE_Astra_Compat(); 28 | 29 | add_action( 'wp', [ self::$instance, 'hooks' ] ); 30 | } 31 | 32 | return self::$instance; 33 | } 34 | 35 | /** 36 | * Run all the Actions / Filters. 37 | * 38 | * @return void 39 | */ 40 | public function hooks() { 41 | if ( hfe_header_enabled() ) { 42 | add_action( 'template_redirect', [ $this, 'astra_setup_header' ], 10 ); 43 | add_action( 'astra_header', 'hfe_render_header' ); 44 | } 45 | 46 | if ( hfe_footer_enabled() ) { 47 | add_action( 'template_redirect', [ $this, 'astra_setup_footer' ], 10 ); 48 | add_action( 'astra_footer', 'hfe_render_footer' ); 49 | } 50 | 51 | if ( hfe_is_before_footer_enabled() ) { 52 | add_action( 'astra_footer_before', 'hfe_render_before_footer' ); 53 | } 54 | } 55 | 56 | /** 57 | * Disable header from the theme. 58 | * 59 | * @return void 60 | */ 61 | public function astra_setup_header() { 62 | remove_action( 'astra_header', 'astra_header_markup' ); 63 | 64 | // Remove the new header builder action. 65 | if ( class_exists( 'Astra_Builder_Helper' ) && Astra_Builder_Helper::$is_header_footer_builder_active ) { 66 | remove_action( 'astra_header', [ Astra_Builder_Header::get_instance(), 'prepare_header_builder_markup' ] ); 67 | } 68 | } 69 | 70 | /** 71 | * Disable footer from the theme. 72 | * 73 | * @return void 74 | */ 75 | public function astra_setup_footer() { 76 | remove_action( 'astra_footer', 'astra_footer_markup' ); 77 | 78 | // Remove the new footer builder action. 79 | if ( class_exists( 'Astra_Builder_Helper' ) && Astra_Builder_Helper::$is_header_footer_builder_active ) { 80 | remove_action( 'astra_footer', [ Astra_Builder_Footer::get_instance(), 'footer_markup' ] ); 81 | } 82 | } 83 | } 84 | 85 | HFE_Astra_Compat::instance(); 86 | -------------------------------------------------------------------------------- /themes/default/class-hfe-default-compat.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * HFE_Default_Compat setup 4 | * 5 | * @package header-footer-elementor 6 | */ 7 | 8 | namespace HFE\Themes; 9 | 10 | /** 11 | * Astra theme compatibility. 12 | */ 13 | class HFE_Default_Compat { 14 | 15 | /** 16 | * Initiator 17 | */ 18 | public function __construct() { 19 | add_action( 'wp', [ $this, 'hooks' ] ); 20 | } 21 | 22 | /** 23 | * Run all the Actions / Filters. 24 | * 25 | * @return void 26 | * 27 | * // phpcs:ignore 28 | */ 29 | // phpcs:ignore 30 | public function hooks(): void { 31 | if ( hfe_header_enabled() ) { 32 | // Replace header.php template. 33 | add_action( 'get_header', [ $this, 'override_header' ] ); 34 | 35 | // Display HFE's header in the replaced header. 36 | add_action( 'hfe_header', 'hfe_render_header' ); 37 | } 38 | 39 | if ( hfe_footer_enabled() || hfe_is_before_footer_enabled() ) { 40 | // Replace footer.php template. 41 | add_action( 'get_footer', [ $this, 'override_footer' ] ); 42 | } 43 | 44 | if ( hfe_footer_enabled() ) { 45 | // Display HFE's footer in the replaced header. 46 | add_action( 'hfe_footer', 'hfe_render_footer' ); 47 | } 48 | 49 | if ( hfe_is_before_footer_enabled() ) { 50 | add_action( 'hfe_footer_before', [ 'Header_Footer_Elementor', 'get_before_footer_content' ] ); 51 | } 52 | } 53 | 54 | /** 55 | * Function for overriding the header in the elmentor way. 56 | * 57 | * @since 1.2.0 58 | * 59 | * // phpcs:ignore 60 | * @return void 61 | */ 62 | // phpcs:ignore 63 | public function override_header(): void { 64 | require HFE_DIR . 'themes/default/hfe-header.php'; 65 | $templates = []; 66 | $templates[] = 'header.php'; 67 | // Avoid running wp_head hooks again. 68 | remove_all_actions( 'wp_head' ); 69 | ob_start(); 70 | locate_template( $templates, true ); 71 | ob_get_clean(); 72 | } 73 | 74 | /** 75 | * Function for overriding the footer in the elmentor way. 76 | * 77 | * @since 1.2.0 78 | * 79 | * @return void 80 | * 81 | * // phpcs:ignore 82 | */ 83 | // phpcs:ignore 84 | public function override_footer(): void { 85 | require HFE_DIR . 'themes/default/hfe-footer.php'; 86 | $templates = []; 87 | $templates[] = 'footer.php'; 88 | // Avoid running wp_footer hooks again. 89 | remove_all_actions( 'wp_footer' ); 90 | ob_start(); 91 | locate_template( $templates, true ); 92 | ob_get_clean(); 93 | } 94 | } 95 | 96 | new HFE_Default_Compat(); 97 | -------------------------------------------------------------------------------- /themes/default/hfe-footer.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * Footer file in case of the elementor way 4 | * 5 | * @package header-footer-elementor 6 | * @since 1.2.0 7 | */ 8 | 9 | ?> 10 | 11 | <?php do_action( 'hfe_footer_before' ); ?> 12 | <?php do_action( 'hfe_footer' ); ?> 13 | </div><!-- #page --> 14 | <?php wp_footer(); ?> 15 | </body> 16 | </html> 17 | -------------------------------------------------------------------------------- /themes/default/hfe-header.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * Header file in case of the elementor way 4 | * 5 | * @package header-footer-elementor 6 | * @since 1.2.0 7 | */ 8 | 9 | ?><!DOCTYPE html> 10 | <html <?php language_attributes(); ?>> 11 | <head> 12 | <meta charset="<?php bloginfo( 'charset' ); ?>" /> 13 | <meta name="viewport" content="width=device-width, initial-scale=1" /> 14 | <link rel="profile" href="http://gmpg.org/xfn/11" /> 15 | <link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" /> 16 | <?php wp_head(); ?> 17 | </head> 18 | 19 | <body <?php body_class(); ?>> 20 | <?php do_action( 'wp_body_open' ); ?> 21 | <div id="page" class="hfeed site"> 22 | 23 | <?php do_action( 'hfe_header' ); ?> 24 | -------------------------------------------------------------------------------- /themes/generatepress/class-hfe-generatepress-compat.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * GeneratepressCompatibility. 4 | * 5 | * @package header-footer-elementor 6 | */ 7 | 8 | /** 9 | * HFE_GeneratePress_Compat setup 10 | * 11 | * @since 1.0 12 | */ 13 | class HFE_GeneratePress_Compat { 14 | 15 | /** 16 | * Instance of HFE_GeneratePress_Compat 17 | * 18 | * @var HFE_GeneratePress_Compat|null 19 | */ 20 | private static $instance = null; 21 | 22 | /** 23 | * Initiator 24 | * 25 | * @return HFE_GeneratePress_Compat 26 | */ 27 | // phpcs:ignore 28 | public static function instance(): HFE_GeneratePress_Compat { 29 | if ( ! isset( self::$instance ) ) { 30 | self::$instance = new HFE_GeneratePress_Compat(); 31 | 32 | add_action( 'wp', [ self::$instance, 'hooks' ] ); 33 | } 34 | 35 | return self::$instance; 36 | } 37 | 38 | /** 39 | * Run all the Actions / Filters. 40 | * // phpcs:ignore 41 | * @return void 42 | */ 43 | // phpcs:ignore 44 | public function hooks(): void { 45 | if ( hfe_header_enabled() ) { 46 | add_action( 'template_redirect', [ $this, 'generatepress_setup_header' ] ); 47 | add_action( 'generate_header', 'hfe_render_header' ); 48 | } 49 | 50 | if ( hfe_is_before_footer_enabled() ) { 51 | add_action( 'generate_footer', [ 'Header_Footer_Elementor', 'get_before_footer_content' ], 5 ); 52 | } 53 | 54 | if ( hfe_footer_enabled() ) { 55 | add_action( 'template_redirect', [ $this, 'generatepress_setup_footer' ] ); 56 | add_action( 'generate_footer', 'hfe_render_footer' ); 57 | } 58 | } 59 | 60 | /** 61 | * Disable header from the theme. 62 | * // phpcs:ignore 63 | * @return void 64 | */ 65 | // phpcs:ignore 66 | public function generatepress_setup_header(): void { 67 | remove_action( 'generate_header', 'generate_construct_header' ); 68 | } 69 | 70 | /** 71 | * Disable footer from the theme. 72 | * 73 | * // phpcs:ignore 74 | * @return void 75 | */ 76 | // phpcs:ignore 77 | public function generatepress_setup_footer(): void { 78 | remove_action( 'generate_footer', 'generate_construct_footer_widgets', 5 ); 79 | remove_action( 'generate_footer', 'generate_construct_footer' ); 80 | } 81 | } 82 | 83 | HFE_GeneratePress_Compat::instance(); 84 | -------------------------------------------------------------------------------- /themes/hello-elementor/class-hfe-hello-elementor-compat.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * HFE_Hello_Elementor_Compat setup 4 | * 5 | * @package header-footer-elementor 6 | */ 7 | 8 | /** 9 | * Hello Elementor compatibility. 10 | */ 11 | class HFE_Hello_Elementor_Compat { 12 | 13 | /** 14 | * Instance of HFE_Hello_Elementor_Compat. 15 | * 16 | * @var HFE_Hello_Elementor_Compat|null 17 | */ 18 | private static $instance = null; 19 | 20 | /** 21 | * Initiator 22 | * 23 | * @return HFE_Hello_Elementor_Compat 24 | */ 25 | // phpcs:ignore 26 | public static function instance(): HFE_Hello_Elementor_Compat { 27 | if ( ! isset( self::$instance ) ) { 28 | self::$instance = new HFE_Hello_Elementor_Compat(); 29 | 30 | if ( ! class_exists( 'HFE_Default_Compat' ) ) { 31 | require_once HFE_DIR . 'themes/default/class-hfe-default-compat.php'; 32 | } 33 | } 34 | 35 | return self::$instance; 36 | } 37 | } 38 | 39 | HFE_Hello_Elementor_Compat::instance(); 40 | -------------------------------------------------------------------------------- /themes/oceanwp/class-hfe-oceanwp-compat.php: -------------------------------------------------------------------------------- 1 | <?php 2 | /** 3 | * HFE_OceanWP_Compat setup 4 | * 5 | * @package header-footer-elementor 6 | */ 7 | 8 | /** 9 | * OceanWP theme compatibility. 10 | */ 11 | class HFE_OceanWP_Compat { 12 | 13 | /** 14 | * Instance of HFE_OceanWP_Compat. 15 | * 16 | * @var HFE_OceanWP_Compat 17 | */ 18 | private static $instance; 19 | 20 | /** 21 | * Initiator 22 | */ 23 | public static function instance() { 24 | if ( ! isset( self::$instance ) ) { 25 | self::$instance = new HFE_OceanWP_Compat(); 26 | 27 | add_action( 'wp', [ self::$instance, 'hooks' ] ); 28 | } 29 | 30 | return self::$instance; 31 | } 32 | 33 | /** 34 | * Run all the Actions / Filters. 35 | */ 36 | public function hooks() { 37 | if ( hfe_header_enabled() ) { 38 | add_action( 'template_redirect', [ $this, 'setup_header' ], 10 ); 39 | add_action( 'ocean_header', 'hfe_render_header' ); 40 | } 41 | 42 | if ( hfe_is_before_footer_enabled() ) { 43 | add_action( 'ocean_footer', [ 'Header_Footer_Elementor', 'get_before_footer_content' ], 5 ); 44 | } 45 | 46 | if ( hfe_footer_enabled() ) { 47 | add_action( 'template_redirect', [ $this, 'setup_footer' ], 10 ); 48 | add_action( 'ocean_footer', 'hfe_render_footer' ); 49 | } 50 | } 51 | 52 | /** 53 | * Disable header from the theme. 54 | */ 55 | public function setup_header() { 56 | remove_action( 'ocean_top_bar', 'oceanwp_top_bar_template' ); 57 | remove_action( 'ocean_header', 'oceanwp_header_template' ); 58 | remove_action( 'ocean_page_header', 'oceanwp_page_header_template' ); 59 | } 60 | 61 | /** 62 | * Disable footer from the theme. 63 | */ 64 | public function setup_footer() { 65 | remove_action( 'ocean_footer', 'oceanwp_footer_template' ); 66 | } 67 | 68 | } 69 | 70 | HFE_OceanWP_Compat::instance(); 71 | --------------------------------------------------------------------------------