jigsaw_engine 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +18 -0
- data/Rakefile +6 -0
- data/app/assets/stylesheets/jigsaw/grid_resize.css +21 -0
- data/app/assets/stylesheets/jigsaw/layout_editor.css +356 -0
- data/app/components/custom_module_component.rb +38 -0
- data/app/controllers/jigsaw/application_controller.rb +5 -0
- data/app/controllers/jigsaw/dashboard_controller.rb +8 -0
- data/app/controllers/jigsaw/layout_templates_controller.rb +73 -0
- data/app/controllers/jigsaw/pages_controller.rb +114 -0
- data/app/controllers/jigsaw/slot_templates_controller.rb +71 -0
- data/app/controllers/jigsaw/slots_controller.rb +54 -0
- data/app/helpers/jigsaw/custom_module_helper.rb +7 -0
- data/app/helpers/jigsaw/pages_helper.rb +7 -0
- data/app/javascript/jigsaw/components/ui/button.js +53 -0
- data/app/javascript/jigsaw/components/ui/dropdown-menu.js +157 -0
- data/app/javascript/jigsaw/components/ui/sheet.js +122 -0
- data/app/javascript/jigsaw/components/ui/utils.js +8 -0
- data/app/javascript/jigsaw/controllers/custom_module_controller.js +75 -0
- data/app/javascript/jigsaw/controllers/custom_page_controller.js +23 -0
- data/app/javascript/jigsaw/controllers/flyout_resize_controller.js +60 -0
- data/app/javascript/jigsaw/controllers/grid_resize_controller.js +228 -0
- data/app/javascript/jigsaw/controllers/layout_editor_controller.js +502 -0
- data/app/javascript/jigsaw/controllers/module_editor_controller.js +146 -0
- data/app/javascript/jigsaw/controllers/monaco_editor_controller.js +49 -0
- data/app/javascript/jigsaw/lib/generate_layout_css.js +52 -0
- data/app/javascript/seeds/blocks/authentication-forms-1/config.json +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-1/data.js +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-1/render.jsx +80 -0
- data/app/javascript/seeds/blocks/authentication-forms-2/config.json +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-2/data.js +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-2/render.jsx +90 -0
- data/app/javascript/seeds/blocks/authentication-forms-3/config.json +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-3/data.js +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-3/render.jsx +94 -0
- data/app/javascript/seeds/blocks/authentication-forms-4/config.json +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-4/data.js +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-4/render.jsx +97 -0
- data/app/javascript/seeds/blocks/authentication-forms-5/config.json +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-5/data.js +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-5/render.jsx +82 -0
- data/app/javascript/seeds/blocks/authentication-forms-6/config.json +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-6/data.js +1 -0
- data/app/javascript/seeds/blocks/authentication-forms-6/render.jsx +34 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-1/render.jsx +98 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-10/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-10/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-10/render.jsx +181 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-11/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-11/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-11/render.jsx +184 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-12/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-12/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-12/render.jsx +180 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-13/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-13/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-13/render.jsx +151 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-14/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-14/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-14/render.jsx +169 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-15/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-15/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-15/render.jsx +115 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-16/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-16/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-16/render.jsx +128 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-17/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-17/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-17/render.jsx +84 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-18/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-18/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-18/render.jsx +139 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-19/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-19/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-19/render.jsx +146 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-2/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-2/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-2/render.jsx +163 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-20/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-20/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-20/render.jsx +71 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-3/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-3/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-3/render.jsx +122 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-4/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-4/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-4/render.jsx +136 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-5/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-5/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-5/render.jsx +294 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-6/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-6/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-6/render.jsx +139 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-7/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-7/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-7/render.jsx +219 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-8/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-8/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-8/render.jsx +249 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-9/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-9/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/charts-9/render.jsx +213 -0
- data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-1/render.jsx +434 -0
- data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-2/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-2/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-2/render.jsx +332 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-1/render.jsx +121 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-2/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-2/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-2/render.jsx +99 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-3/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-3/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-3/render.jsx +176 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-1/render.jsx +20 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-2/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-2/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-2/render.jsx +22 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-3/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-3/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-3/render.jsx +22 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sidebar-layouts-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sidebar-layouts-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sidebar-layouts-1/render.jsx +20 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-1/render.jsx +98 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-2/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-2/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-2/render.jsx +116 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-3/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-3/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-3/render.jsx +104 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-1/render.jsx +147 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-2/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-2/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-2/render.jsx +120 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-3/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-3/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-3/render.jsx +62 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-4/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-4/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-4/render.jsx +49 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-5/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-5/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-5/render.jsx +106 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-6/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-6/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-6/render.jsx +79 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-7/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-7/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-7/render.jsx +57 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-8/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-8/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-8/render.jsx +234 -0
- data/app/javascript/seeds/blocks/dashboard-ui/tables-1/config.json +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/tables-1/data.js +1 -0
- data/app/javascript/seeds/blocks/dashboard-ui/tables-1/render.jsx +295 -0
- data/app/javascript/seeds/blocks/datepicker-1/config.json +1 -0
- data/app/javascript/seeds/blocks/datepicker-1/data.js +1 -0
- data/app/javascript/seeds/blocks/datepicker-1/render.jsx +14 -0
- data/app/javascript/seeds/blocks/datepicker-2/config.json +1 -0
- data/app/javascript/seeds/blocks/datepicker-2/data.js +1 -0
- data/app/javascript/seeds/blocks/datepicker-2/render.jsx +29 -0
- data/app/javascript/seeds/blocks/datepicker-3/config.json +1 -0
- data/app/javascript/seeds/blocks/datepicker-3/data.js +1 -0
- data/app/javascript/seeds/blocks/datepicker-3/render.jsx +163 -0
- data/app/javascript/seeds/blocks/datepicker-4/config.json +1 -0
- data/app/javascript/seeds/blocks/datepicker-4/data.js +1 -0
- data/app/javascript/seeds/blocks/datepicker-4/render.jsx +192 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-1/render.jsx +723 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-2/render.jsx +508 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-3/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-3/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-3/render.jsx +632 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-4/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-4/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-4/render.jsx +1013 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-5/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-5/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/checkout-page-5/render.jsx +520 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-1/render.jsx +121 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-2/render.jsx +126 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-3/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-3/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-3/render.jsx +81 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-4/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-4/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-category-4/render.jsx +85 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-1/render.jsx +80 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-2/render.jsx +226 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-3/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-3/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-3/render.jsx +315 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-4/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-4/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-4/render.jsx +269 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-5/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-5/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-5/render.jsx +265 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-6/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-6/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-6/render.jsx +477 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-7/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-7/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-detail-7/render.jsx +405 -0
- data/app/javascript/seeds/blocks/ecommerce/product-features-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-features-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-features-1/render.jsx +71 -0
- data/app/javascript/seeds/blocks/ecommerce/product-features-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-features-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-features-2/render.jsx +135 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-1/render.jsx +87 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-2/render.jsx +151 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-3/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-3/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-3/render.jsx +313 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-4/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-4/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-4/render.jsx +223 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-5/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-5/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-5/render.jsx +200 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-6/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-6/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-6/render.jsx +177 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-7/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-7/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-7/render.jsx +175 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-8/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-8/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-list-8/render.jsx +231 -0
- data/app/javascript/seeds/blocks/ecommerce/product-quickview-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-quickview-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-quickview-1/render.jsx +64 -0
- data/app/javascript/seeds/blocks/ecommerce/product-quickview-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-quickview-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/product-quickview-2/render.jsx +62 -0
- data/app/javascript/seeds/blocks/ecommerce/promo-sections-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/promo-sections-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/promo-sections-1/render.jsx +75 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-1/render.jsx +197 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-2/render.jsx +143 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-3/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-3/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-3/render.jsx +225 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-4/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-4/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/shopping-cart-4/render.jsx +93 -0
- data/app/javascript/seeds/blocks/ecommerce/store-navigation-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce/store-navigation-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce/store-navigation-1/render.jsx +290 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-1/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-1/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-1/render.jsx +86 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-2/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-2/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-2/render.jsx +119 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-3/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-3/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-3/render.jsx +97 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-4/config.json +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-4/data.js +1 -0
- data/app/javascript/seeds/blocks/ecommerce-charts-4/render.jsx +108 -0
- data/app/javascript/seeds/blocks/line-charts-1/config.json +1 -0
- data/app/javascript/seeds/blocks/line-charts-1/data.js +1 -0
- data/app/javascript/seeds/blocks/line-charts-1/render.jsx +230 -0
- data/app/javascript/seeds/blocks/line-charts-2/config.json +1 -0
- data/app/javascript/seeds/blocks/line-charts-2/data.js +1 -0
- data/app/javascript/seeds/blocks/line-charts-2/render.jsx +118 -0
- data/app/javascript/seeds/blocks/line-charts-3/config.json +1 -0
- data/app/javascript/seeds/blocks/line-charts-3/data.js +1 -0
- data/app/javascript/seeds/blocks/line-charts-3/render.jsx +134 -0
- data/app/javascript/seeds/blocks/line-charts-4/config.json +1 -0
- data/app/javascript/seeds/blocks/line-charts-4/data.js +1 -0
- data/app/javascript/seeds/blocks/line-charts-4/render.jsx +115 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-1/render.jsx +31 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-10/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-10/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-10/render.jsx +76 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-2/render.jsx +78 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-3/render.jsx +50 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-4/render.jsx +24 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-5/render.jsx +66 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-6/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-6/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-6/render.jsx +69 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-7/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-7/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-7/render.jsx +43 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-8/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-8/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-8/render.jsx +63 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-9/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-9/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/call-to-action-9/render.jsx +27 -0
- data/app/javascript/seeds/blocks/marketing/changelog-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-1/render.jsx +106 -0
- data/app/javascript/seeds/blocks/marketing/changelog-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-2/render.jsx +157 -0
- data/app/javascript/seeds/blocks/marketing/changelog-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-3/render.jsx +204 -0
- data/app/javascript/seeds/blocks/marketing/changelog-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/changelog-4/render.jsx +199 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-1/render.jsx +155 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-10/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-10/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-10/render.jsx +83 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-11/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-11/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-11/render.jsx +338 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-12/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-12/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-12/render.jsx +96 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-13/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-13/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-13/render.jsx +77 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-2/render.jsx +117 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-3/render.jsx +105 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-4/render.jsx +127 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-5/render.jsx +78 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-6/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-6/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-6/render.jsx +79 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-7/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-7/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-7/render.jsx +138 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-8/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-8/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-8/render.jsx +215 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-9/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-9/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/feature-section-9/render.jsx +81 -0
- data/app/javascript/seeds/blocks/marketing/footers-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-1/render.jsx +106 -0
- data/app/javascript/seeds/blocks/marketing/footers-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-2/render.jsx +76 -0
- data/app/javascript/seeds/blocks/marketing/footers-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-3/render.jsx +160 -0
- data/app/javascript/seeds/blocks/marketing/footers-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-4/render.jsx +167 -0
- data/app/javascript/seeds/blocks/marketing/footers-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/footers-5/render.jsx +223 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-1/render.jsx +49 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-10/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-10/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-10/render.jsx +147 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-11/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-11/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-11/render.jsx +218 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-12/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-12/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-12/render.jsx +287 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-13/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-13/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-13/render.jsx +113 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-14/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-14/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-14/render.jsx +249 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-2/render.jsx +94 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-3/render.jsx +51 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-4/render.jsx +153 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-5/render.jsx +210 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-6/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-6/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-6/render.jsx +191 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-7/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-7/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-7/render.jsx +306 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-8/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-8/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-8/render.jsx +103 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-9/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-9/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/hero-section-9/render.jsx +354 -0
- data/app/javascript/seeds/blocks/marketing/integrations-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-1/render.jsx +483 -0
- data/app/javascript/seeds/blocks/marketing/integrations-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-2/render.jsx +468 -0
- data/app/javascript/seeds/blocks/marketing/integrations-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-3/render.jsx +441 -0
- data/app/javascript/seeds/blocks/marketing/integrations-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-4/render.jsx +433 -0
- data/app/javascript/seeds/blocks/marketing/integrations-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-5/render.jsx +477 -0
- data/app/javascript/seeds/blocks/marketing/integrations-6/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-6/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/integrations-6/render.jsx +468 -0
- data/app/javascript/seeds/blocks/marketing/navbars-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/navbars-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/navbars-1/render.jsx +133 -0
- data/app/javascript/seeds/blocks/marketing/navbars-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/navbars-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/navbars-2/render.jsx +95 -0
- data/app/javascript/seeds/blocks/marketing/navbars-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/navbars-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/navbars-3/render.jsx +246 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-1/render.jsx +45 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-2/render.jsx +55 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/newsletter-sections-3/render.jsx +29 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-1/render.jsx +110 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-2/render.jsx +71 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-3/render.jsx +124 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-4/render.jsx +205 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-5/render.jsx +143 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-6/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-6/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-6/render.jsx +195 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-7/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-7/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/pricing-table-7/render.jsx +351 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-1/render.jsx +71 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-2/render.jsx +125 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-3/render.jsx +136 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-4/render.jsx +107 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/team-sections-5/render.jsx +124 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-1/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-1/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-1/render.jsx +112 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-10/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-10/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-10/render.jsx +106 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-11/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-11/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-11/render.jsx +79 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-12/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-12/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-12/render.jsx +173 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-13/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-13/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-13/render.jsx +121 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-14/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-14/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-14/render.jsx +158 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-15/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-15/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-15/render.jsx +109 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-2/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-2/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-2/render.jsx +81 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-3/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-3/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-3/render.jsx +149 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-4/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-4/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-4/render.jsx +148 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-5/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-5/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-5/render.jsx +153 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-6/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-6/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-6/render.jsx +155 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-7/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-7/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-7/render.jsx +102 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-8/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-8/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-8/render.jsx +161 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-9/config.json +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-9/data.js +1 -0
- data/app/javascript/seeds/blocks/marketing/testimonials-9/render.jsx +195 -0
- data/app/javascript/seeds/blocks/project-management-charts-1/config.json +1 -0
- data/app/javascript/seeds/blocks/project-management-charts-1/data.js +1 -0
- data/app/javascript/seeds/blocks/project-management-charts-1/render.jsx +172 -0
- data/app/javascript/seeds/blocks/project-management-charts-2/config.json +1 -0
- data/app/javascript/seeds/blocks/project-management-charts-2/data.js +1 -0
- data/app/javascript/seeds/blocks/project-management-charts-2/render.jsx +147 -0
- data/app/javascript/seeds/blocks/switch-cards-1/config.json +1 -0
- data/app/javascript/seeds/blocks/switch-cards-1/data.js +1 -0
- data/app/javascript/seeds/blocks/switch-cards-1/render.jsx +116 -0
- data/app/javascript/seeds/blocks/theme-switchers-1/config.json +1 -0
- data/app/javascript/seeds/blocks/theme-switchers-1/data.js +1 -0
- data/app/javascript/seeds/blocks/theme-switchers-1/render.jsx +22 -0
- data/app/javascript/seeds/blocks/theme-switchers-2/config.json +1 -0
- data/app/javascript/seeds/blocks/theme-switchers-2/data.js +1 -0
- data/app/javascript/seeds/blocks/theme-switchers-2/render.jsx +51 -0
- data/app/javascript/seeds/blocks/theme-switchers-3/config.json +1 -0
- data/app/javascript/seeds/blocks/theme-switchers-3/data.js +1 -0
- data/app/javascript/seeds/blocks/theme-switchers-3/render.jsx +37 -0
- data/app/javascript/seeds/examples/blog-cards-1/config.json +1 -0
- data/app/javascript/seeds/examples/blog-cards-1/data.js +1 -0
- data/app/javascript/seeds/examples/blog-cards-1/render.jsx +81 -0
- data/app/javascript/seeds/examples/blog-cards-2/config.json +1 -0
- data/app/javascript/seeds/examples/blog-cards-2/data.js +1 -0
- data/app/javascript/seeds/examples/blog-cards-2/render.jsx +78 -0
- data/app/javascript/seeds/examples/blog-cards-3/config.json +1 -0
- data/app/javascript/seeds/examples/blog-cards-3/data.js +1 -0
- data/app/javascript/seeds/examples/blog-cards-3/render.jsx +80 -0
- data/app/javascript/seeds/examples/blog-cards-4/config.json +1 -0
- data/app/javascript/seeds/examples/blog-cards-4/data.js +1 -0
- data/app/javascript/seeds/examples/blog-cards-4/render.jsx +32 -0
- data/app/javascript/seeds/examples/chat-bubbles-1/config.json +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-1/data.js +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-1/render.jsx +154 -0
- data/app/javascript/seeds/examples/chat-bubbles-2/config.json +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-2/data.js +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-2/render.jsx +88 -0
- data/app/javascript/seeds/examples/chat-bubbles-3/config.json +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-3/data.js +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-3/render.jsx +90 -0
- data/app/javascript/seeds/examples/chat-bubbles-4/config.json +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-4/data.js +1 -0
- data/app/javascript/seeds/examples/chat-bubbles-4/render.jsx +169 -0
- data/app/javascript/seeds/examples/payment-methods-1/config.json +1 -0
- data/app/javascript/seeds/examples/payment-methods-1/data.js +1 -0
- data/app/javascript/seeds/examples/payment-methods-1/render.jsx +128 -0
- data/app/javascript/seeds/examples/payment-methods-2/config.json +1 -0
- data/app/javascript/seeds/examples/payment-methods-2/data.js +1 -0
- data/app/javascript/seeds/examples/payment-methods-2/render.jsx +80 -0
- data/app/javascript/seeds/examples/payment-methods-3/config.json +1 -0
- data/app/javascript/seeds/examples/payment-methods-3/data.js +1 -0
- data/app/javascript/seeds/examples/payment-methods-3/render.jsx +1 -0
- data/app/javascript/seeds/examples/product-cards-1/config.json +1 -0
- data/app/javascript/seeds/examples/product-cards-1/data.js +1 -0
- data/app/javascript/seeds/examples/product-cards-1/render.jsx +48 -0
- data/app/javascript/seeds/examples/product-cards-2/config.json +1 -0
- data/app/javascript/seeds/examples/product-cards-2/data.js +1 -0
- data/app/javascript/seeds/examples/product-cards-2/render.jsx +53 -0
- data/app/javascript/seeds/examples/product-cards-3/config.json +1 -0
- data/app/javascript/seeds/examples/product-cards-3/data.js +1 -0
- data/app/javascript/seeds/examples/product-cards-3/render.jsx +102 -0
- data/app/javascript/seeds/examples/product-cards-4/config.json +1 -0
- data/app/javascript/seeds/examples/product-cards-4/data.js +1 -0
- data/app/javascript/seeds/examples/product-cards-4/render.jsx +40 -0
- data/app/javascript/seeds/examples/product-cards-5/config.json +1 -0
- data/app/javascript/seeds/examples/product-cards-5/data.js +1 -0
- data/app/javascript/seeds/examples/product-cards-5/render.jsx +79 -0
- data/app/javascript/seeds/examples/product-cards-6/config.json +1 -0
- data/app/javascript/seeds/examples/product-cards-6/data.js +1 -0
- data/app/javascript/seeds/examples/product-cards-6/render.jsx +180 -0
- data/app/javascript/seeds/examples/product-cards-7/config.json +1 -0
- data/app/javascript/seeds/examples/product-cards-7/data.js +1 -0
- data/app/javascript/seeds/examples/product-cards-7/render.jsx +181 -0
- data/app/javascript/seeds/examples/product-list-1/config.json +1 -0
- data/app/javascript/seeds/examples/product-list-1/data.js +1 -0
- data/app/javascript/seeds/examples/product-list-1/render.jsx +114 -0
- data/app/javascript/seeds/examples/review-cards-1/config.json +1 -0
- data/app/javascript/seeds/examples/review-cards-1/data.js +1 -0
- data/app/javascript/seeds/examples/review-cards-1/render.jsx +54 -0
- data/app/javascript/seeds/examples/review-cards-2/config.json +1 -0
- data/app/javascript/seeds/examples/review-cards-2/data.js +1 -0
- data/app/javascript/seeds/examples/review-cards-2/render.jsx +68 -0
- data/app/javascript/seeds/examples/review-cards-3/config.json +1 -0
- data/app/javascript/seeds/examples/review-cards-3/data.js +1 -0
- data/app/javascript/seeds/examples/review-cards-3/render.jsx +101 -0
- data/app/javascript/seeds/examples/social-media-post-1/config.json +1 -0
- data/app/javascript/seeds/examples/social-media-post-1/data.js +1 -0
- data/app/javascript/seeds/examples/social-media-post-1/render.jsx +162 -0
- data/app/javascript/seeds/examples/social-media-post-2/config.json +1 -0
- data/app/javascript/seeds/examples/social-media-post-2/data.js +1 -0
- data/app/javascript/seeds/examples/social-media-post-2/render.jsx +172 -0
- data/app/javascript/seeds/examples/social-media-post-3/config.json +1 -0
- data/app/javascript/seeds/examples/social-media-post-3/data.js +1 -0
- data/app/javascript/seeds/examples/social-media-post-3/render.jsx +270 -0
- data/app/javascript/seeds/examples/social-media-post-4/config.json +1 -0
- data/app/javascript/seeds/examples/social-media-post-4/data.js +1 -0
- data/app/javascript/seeds/examples/social-media-post-4/render.jsx +188 -0
- data/app/javascript/seeds/examples/stat-cards-1/config.json +1 -0
- data/app/javascript/seeds/examples/stat-cards-1/data.js +1 -0
- data/app/javascript/seeds/examples/stat-cards-1/render.jsx +31 -0
- data/app/javascript/seeds/examples/stat-cards-2/config.json +1 -0
- data/app/javascript/seeds/examples/stat-cards-2/data.js +1 -0
- data/app/javascript/seeds/examples/stat-cards-2/render.jsx +42 -0
- data/app/javascript/seeds/examples/stat-cards-3/config.json +1 -0
- data/app/javascript/seeds/examples/stat-cards-3/data.js +1 -0
- data/app/javascript/seeds/examples/stat-cards-3/render.jsx +114 -0
- data/app/javascript/seeds/examples/stat-cards-4/config.json +1 -0
- data/app/javascript/seeds/examples/stat-cards-4/data.js +1 -0
- data/app/javascript/seeds/examples/stat-cards-4/render.jsx +117 -0
- data/app/javascript/seeds/examples/task-cards-1/config.json +1 -0
- data/app/javascript/seeds/examples/task-cards-1/data.js +1 -0
- data/app/javascript/seeds/examples/task-cards-1/render.jsx +133 -0
- data/app/javascript/seeds/examples/task-cards-2/config.json +1 -0
- data/app/javascript/seeds/examples/task-cards-2/data.js +1 -0
- data/app/javascript/seeds/examples/task-cards-2/render.jsx +122 -0
- data/app/javascript/seeds/examples/welcome-cards-1/config.json +1 -0
- data/app/javascript/seeds/examples/welcome-cards-1/data.js +1 -0
- data/app/javascript/seeds/examples/welcome-cards-1/render.jsx +40 -0
- data/app/javascript/seeds/examples/welcome-cards-2/config.json +1 -0
- data/app/javascript/seeds/examples/welcome-cards-2/data.js +1 -0
- data/app/javascript/seeds/examples/welcome-cards-2/render.jsx +58 -0
- data/app/javascript/seeds/examples/welcome-cards-3/config.json +1 -0
- data/app/javascript/seeds/examples/welcome-cards-3/data.js +1 -0
- data/app/javascript/seeds/examples/welcome-cards-3/render.jsx +91 -0
- data/app/javascript/seeds/ide-editor/config.json +4 -0
- data/app/javascript/seeds/ide-editor/data.js +16 -0
- data/app/javascript/seeds/ide-editor/render.jsx +132 -0
- data/app/javascript/seeds/ide-file-tree/config.json +4 -0
- data/app/javascript/seeds/ide-file-tree/data.js +50 -0
- data/app/javascript/seeds/ide-file-tree/render.jsx +426 -0
- data/app/javascript/seeds/ide-preview/config.json +4 -0
- data/app/javascript/seeds/ide-preview/data.js +4 -0
- data/app/javascript/seeds/ide-preview/render.jsx +49 -0
- data/app/javascript/seeds/ide-terminal/config.json +4 -0
- data/app/javascript/seeds/ide-terminal/data.js +4 -0
- data/app/javascript/seeds/ide-terminal/render.jsx +247 -0
- data/app/javascript/seeds/main-menu/config.json +9 -0
- data/app/javascript/seeds/main-menu/data.js +6 -0
- data/app/javascript/seeds/main-menu/render.jsx +70 -0
- data/app/models/concerns/jigsaw/grid_configurable.rb +89 -0
- data/app/models/concerns/jigsaw/slot_compilable.rb +69 -0
- data/app/models/jigsaw/application_record.rb +5 -0
- data/app/models/jigsaw/layout.rb +61 -0
- data/app/models/jigsaw/layout_template.rb +16 -0
- data/app/models/jigsaw/page.rb +35 -0
- data/app/models/jigsaw/schemas/layout_config.json +54 -0
- data/app/models/jigsaw/slot.rb +109 -0
- data/app/models/jigsaw/slot_template.rb +29 -0
- data/app/views/jigsaw/dashboard/index.html.ruby +23 -0
- data/app/views/jigsaw/layout_templates/_form.html.ruby +69 -0
- data/app/views/jigsaw/layout_templates/edit.html.ruby +72 -0
- data/app/views/jigsaw/layout_templates/index.html.ruby +48 -0
- data/app/views/jigsaw/layout_templates/new.html.ruby +19 -0
- data/app/views/jigsaw/pages/_form.html.ruby +75 -0
- data/app/views/jigsaw/pages/edit.html.ruby +104 -0
- data/app/views/jigsaw/pages/index.html.ruby +65 -0
- data/app/views/jigsaw/pages/new.html.ruby +34 -0
- data/app/views/jigsaw/pages/show.html.ruby +28 -0
- data/app/views/jigsaw/slot_templates/edit.html.ruby +42 -0
- data/app/views/jigsaw/slot_templates/index.html.ruby +73 -0
- data/app/views/jigsaw/slot_templates/new.html.ruby +21 -0
- data/app/views/jigsaw/slot_templates/show.html.ruby +38 -0
- data/app/views/jigsaw/slots/_shared/_menu.html.ruby +7 -0
- data/app/views/jigsaw/slots/edit.html.ruby +52 -0
- data/app/views/jigsaw/slots/index.html.ruby +17 -0
- data/app/views/layouts/jigsaw/application.html.ruby +31 -0
- data/config/importmap.rb +35 -0
- data/config/routes.rb +27 -0
- data/db/migrate/20260505185636_create_jigsaw_custom_pages.rb +12 -0
- data/db/migrate/20260505185637_create_jigsaw_data_functions.rb +15 -0
- data/db/migrate/20260505185638_create_jigsaw_render_functions.rb +15 -0
- data/db/migrate/20260505185639_create_jigsaw_page_modules.rb +15 -0
- data/db/migrate/20260505185640_create_jigsaw_layouts.rb +14 -0
- data/db/migrate/20260506000001_remove_slot_from_jigsaw_page_modules.rb +5 -0
- data/db/migrate/20260506000002_make_page_module_functions_optional.rb +6 -0
- data/db/migrate/20260506000003_inline_functions_on_page_modules.rb +55 -0
- data/db/migrate/20260507000001_move_layout_fk_to_layouts_table.rb +30 -0
- data/db/migrate/20260507000002_move_page_modules_to_layouts.rb +30 -0
- data/db/migrate/20260508000001_rename_custom_pages_to_pages.rb +18 -0
- data/db/migrate/20260508000002_rename_page_modules_to_slots.rb +7 -0
- data/db/migrate/20260509000001_create_jigsaw_templates.rb +13 -0
- data/db/migrate/20260509000002_create_jigsaw_template_layouts.rb +12 -0
- data/db/migrate/20260509000003_create_jigsaw_template_slots.rb +22 -0
- data/db/migrate/20260509000004_add_template_linking_to_layouts.rb +6 -0
- data/db/migrate/20260509000005_add_linked_to_template_to_slots.rb +5 -0
- data/db/migrate/20260510000001_refactor_templates_to_layout_and_slot_templates.rb +104 -0
- data/db/seeds/01_pages.rb +69 -0
- data/db/seeds/02_main_menu_slot.rb +15 -0
- data/db/seeds/03_webcontainer_ide.rb +51 -0
- data/db/seeds.rb +120 -0
- data/lib/jigsaw/engine.rb +29 -0
- data/lib/jigsaw/grid_layout_generator.rb +55 -0
- data/lib/jigsaw/jsx_compiler.rb +21 -0
- data/lib/jigsaw/version.rb +3 -0
- data/lib/jigsaw/version.rb.erb +3 -0
- data/lib/jigsaw.rb +11 -0
- data/lib/jigsaw_engine.rb +4 -0
- data/lib/tasks/kube_tasks.rake +4 -0
- data/lib/tasks/shadcn.rake +171 -0
- metadata +1033 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
i"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { motion, AnimatePresence } from "motion/react";
|
|
5
|
+
import { Button } from "@/components/ui/button";
|
|
6
|
+
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
|
7
|
+
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
8
|
+
|
|
9
|
+
const testimonials = [
|
|
10
|
+
{
|
|
11
|
+
quote:
|
|
12
|
+
"I can't recommend Credenza enough! Their lending solutions have made it easier for us to manage customer applications and approvals, resulting in faster turnaround times and happier clients.",
|
|
13
|
+
name: "William Ashford",
|
|
14
|
+
position: "Co-Founder, Asterisk Inc",
|
|
15
|
+
avatar: "https://i.pravatar.cc/150?img=12",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
quote:
|
|
19
|
+
"Exceptional service from start to finish. The team understood our needs and delivered a solution that exceeded our expectations.",
|
|
20
|
+
name: "Sarah Chen",
|
|
21
|
+
position: "CEO, TechFlow",
|
|
22
|
+
avatar: "https://i.pravatar.cc/150?img=5",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
quote:
|
|
26
|
+
"A game-changer for our operations. We've seen measurable improvements in efficiency and client satisfaction since we started working with them.",
|
|
27
|
+
name: "Marcus Webb",
|
|
28
|
+
position: "Operations Director, NexGen",
|
|
29
|
+
avatar: "https://i.pravatar.cc/150?img=33",
|
|
30
|
+
},
|
|
31
|
+
] as const;
|
|
32
|
+
|
|
33
|
+
export default function TestimonialsTwoColumn() {
|
|
34
|
+
const [active, setActive] = useState(0);
|
|
35
|
+
const current = testimonials[active];
|
|
36
|
+
|
|
37
|
+
const goPrev = () =>
|
|
38
|
+
setActive((i) => (i === 0 ? testimonials.length - 1 : i - 1));
|
|
39
|
+
const goNext = () =>
|
|
40
|
+
setActive((i) => (i === testimonials.length - 1 ? 0 : i + 1));
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<section className="py-16">
|
|
44
|
+
<div className="mx-auto max-w-6xl px-4 lg:px-8">
|
|
45
|
+
<div className="grid gap-12 lg:grid-cols-2">
|
|
46
|
+
<div className="space-y-4">
|
|
47
|
+
<h2 className="text-3xl leading-tight font-bold">
|
|
48
|
+
What Our Clients Are Saying
|
|
49
|
+
</h2>
|
|
50
|
+
<p className="text-muted-foreground leading-relaxed">
|
|
51
|
+
We take pride in delivering exceptional solutions that deliver
|
|
52
|
+
great results. But don't just take our word for it.
|
|
53
|
+
</p>
|
|
54
|
+
<Button variant="outline">
|
|
55
|
+
View All Testimonials
|
|
56
|
+
<ChevronRight />
|
|
57
|
+
</Button>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div className="relative">
|
|
61
|
+
<AnimatePresence mode="wait" initial={false}>
|
|
62
|
+
<motion.div
|
|
63
|
+
key={active}
|
|
64
|
+
initial={{ opacity: 0, y: 3 }}
|
|
65
|
+
animate={{ opacity: 1, y: 0 }}
|
|
66
|
+
exit={{ opacity: 0, y: -3 }}
|
|
67
|
+
transition={{ duration: 0.3, ease: "easeInOut" }}
|
|
68
|
+
>
|
|
69
|
+
<blockquote className="md:text-xl/relaxed">
|
|
70
|
+
“{current.quote}”
|
|
71
|
+
</blockquote>
|
|
72
|
+
<div className="mt-6 flex items-center gap-3">
|
|
73
|
+
<Avatar>
|
|
74
|
+
<AvatarImage src={current.avatar} alt={current.name} />
|
|
75
|
+
<AvatarFallback>{current.name.slice(0, 2)}</AvatarFallback>
|
|
76
|
+
</Avatar>
|
|
77
|
+
<div>
|
|
78
|
+
<p className="font-medium">{current.name}</p>
|
|
79
|
+
<p className="text-muted-foreground text-sm">
|
|
80
|
+
{current.position}
|
|
81
|
+
</p>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</motion.div>
|
|
85
|
+
</AnimatePresence>
|
|
86
|
+
<div className="mt-8 flex justify-end gap-2">
|
|
87
|
+
<Button
|
|
88
|
+
variant="secondary"
|
|
89
|
+
size="icon"
|
|
90
|
+
onClick={goPrev}
|
|
91
|
+
aria-label="Previous testimonial"
|
|
92
|
+
>
|
|
93
|
+
<ChevronLeft />
|
|
94
|
+
</Button>
|
|
95
|
+
<Button
|
|
96
|
+
variant="secondary"
|
|
97
|
+
size="icon"
|
|
98
|
+
onClick={goNext}
|
|
99
|
+
aria-label="Next testimonial"
|
|
100
|
+
>
|
|
101
|
+
<ChevronRight />
|
|
102
|
+
</Button>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</section>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function(shared, config) { return config }
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import Image from "next/image";
|
|
5
|
+
|
|
6
|
+
const testimonials = [
|
|
7
|
+
{
|
|
8
|
+
quote:
|
|
9
|
+
"Exceptional service and dedication. The team brought our vision to life and exceeded all expectations.",
|
|
10
|
+
name: "Alex Turner",
|
|
11
|
+
role: "CEO at VentureLabs",
|
|
12
|
+
image: "https://i.pravatar.cc/100?img=1",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
quote:
|
|
16
|
+
"Creative solutions, fast delivery, and outstanding professionalism. Highly recommend working with them.",
|
|
17
|
+
name: "Julia Williams",
|
|
18
|
+
role: "Marketing Director at Creatify",
|
|
19
|
+
image: "https://i.pravatar.cc/100?img=2",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
quote:
|
|
23
|
+
"An innovative approach and seamless communication. We achieved our goals sooner thanks to their expertise.",
|
|
24
|
+
name: "Samuel Lee",
|
|
25
|
+
role: "Product Owner at NexGen",
|
|
26
|
+
image: "https://i.pravatar.cc/100?img=3",
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export default function TestimonialsMinimal() {
|
|
31
|
+
const [active, setActive] = useState(0);
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<div className="mx-auto w-full max-w-xl px-6 py-16">
|
|
35
|
+
<div className="relative mb-12 min-h-[80px]">
|
|
36
|
+
{testimonials.map((t, i) => (
|
|
37
|
+
<p
|
|
38
|
+
key={i}
|
|
39
|
+
className={`text-foreground absolute inset-0 text-xl leading-relaxed font-light transition-all duration-500 ease-out md:text-2xl ${
|
|
40
|
+
active === i
|
|
41
|
+
? "blur-0 translate-y-0 opacity-100"
|
|
42
|
+
: "pointer-events-none translate-y-4 opacity-0 blur-sm"
|
|
43
|
+
} `}
|
|
44
|
+
>
|
|
45
|
+
"{t.quote}"
|
|
46
|
+
</p>
|
|
47
|
+
))}
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div className="flex items-center gap-6">
|
|
51
|
+
<div className="flex -space-x-2">
|
|
52
|
+
{testimonials.map((t, i) => (
|
|
53
|
+
<button
|
|
54
|
+
key={i}
|
|
55
|
+
onClick={() => setActive(i)}
|
|
56
|
+
className={`ring-background relative h-10 w-10 overflow-hidden rounded-full ring-2 transition-all duration-300 ease-out ${active === i ? "z-10 scale-110" : "grayscale hover:scale-105 hover:grayscale-0"} `}
|
|
57
|
+
>
|
|
58
|
+
<Image src={t.image} alt={t.name} fill className="object-cover" />
|
|
59
|
+
</button>
|
|
60
|
+
))}
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<div className="bg-border h-8 w-px" />
|
|
64
|
+
|
|
65
|
+
<div className="relative min-h-[44px] flex-1">
|
|
66
|
+
{testimonials.map((t, i) => (
|
|
67
|
+
<div
|
|
68
|
+
key={i}
|
|
69
|
+
className={`absolute inset-0 flex flex-col justify-center transition-all duration-400 ease-out ${active === i ? "translate-x-0 opacity-100" : "pointer-events-none -translate-x-2 opacity-0"} `}
|
|
70
|
+
>
|
|
71
|
+
<span className="text-foreground text-sm font-medium">
|
|
72
|
+
{t.name}
|
|
73
|
+
</span>
|
|
74
|
+
<span className="text-muted-foreground text-xs">{t.role}</span>
|
|
75
|
+
</div>
|
|
76
|
+
))}
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function(shared, config) { return config }
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
i"use client";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { motion } from "motion/react";
|
|
5
|
+
import { Card, CardContent } from "@/components/ui/card";
|
|
6
|
+
import { Badge } from "@/components/ui/badge";
|
|
7
|
+
|
|
8
|
+
const testimonials = [
|
|
9
|
+
{
|
|
10
|
+
text: "The professionalism and swift, solution-oriented approach of your team have dramatically increased our project efficiency.",
|
|
11
|
+
image: "https://i.pravatar.cc/100?img=30",
|
|
12
|
+
name: "Olivia Carter",
|
|
13
|
+
role: "Project Manager",
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
text: "Your technical expertise and continuous support have become invaluable. The user-friendly solutions made our work so much easier.",
|
|
17
|
+
image: "https://i.pravatar.cc/100?img=22",
|
|
18
|
+
name: "James Smith",
|
|
19
|
+
role: "Software Developer",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
text: "The robust and flexible infrastructure fully met our needs. We felt in control of the entire process.",
|
|
23
|
+
image: "https://i.pravatar.cc/100?img=41",
|
|
24
|
+
name: "Sophia Lee",
|
|
25
|
+
role: "Operations Director",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
text: "Your outstanding customer service and professional team exceeded our expectations in every way.",
|
|
29
|
+
image: "https://i.pravatar.cc/100?img=27",
|
|
30
|
+
name: "Michael Johnson",
|
|
31
|
+
role: "General Manager",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
text: "Thanks to the fast integration and simple interface, our team adapted quickly and now works seamlessly together.",
|
|
35
|
+
image: "https://i.pravatar.cc/100?img=19",
|
|
36
|
+
name: "Ava Williams",
|
|
37
|
+
role: "Customer Relations Specialist",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
text: "The support we received helped us achieve significant improvements in our business processes. Thank you!",
|
|
41
|
+
image: "https://i.pravatar.cc/100?img=17",
|
|
42
|
+
name: "Emma Brown",
|
|
43
|
+
role: "HR Specialist",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
text: "It's a joy to work with such functional features and a responsive team.",
|
|
47
|
+
image: "https://i.pravatar.cc/100?img=23",
|
|
48
|
+
name: "William Davis",
|
|
49
|
+
role: "Marketing Director",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
text: "Your comprehensive reporting and analytics tools have sped up our decision-making.",
|
|
53
|
+
image: "https://i.pravatar.cc/100?img=36",
|
|
54
|
+
name: "Emily Wilson",
|
|
55
|
+
role: "Sales Manager",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
text: "Your solution-driven approach and effective communication made you a vital partner in our digital transformation.",
|
|
59
|
+
image: "https://i.pravatar.cc/100?img=26",
|
|
60
|
+
name: "Benjamin Miller",
|
|
61
|
+
role: "E-commerce Manager",
|
|
62
|
+
},
|
|
63
|
+
] as const;
|
|
64
|
+
|
|
65
|
+
const firstColumn = testimonials.slice(0, 3);
|
|
66
|
+
const secondColumn = testimonials.slice(3, 6);
|
|
67
|
+
const thirdColumn = testimonials.slice(6, 9);
|
|
68
|
+
|
|
69
|
+
function TestimonialsColumn(props: {
|
|
70
|
+
className?: string;
|
|
71
|
+
testimonials: readonly (typeof testimonials)[number][];
|
|
72
|
+
duration?: number;
|
|
73
|
+
}) {
|
|
74
|
+
return (
|
|
75
|
+
<div className={props.className}>
|
|
76
|
+
<motion.div
|
|
77
|
+
animate={{ translateY: "-50%" }}
|
|
78
|
+
transition={{
|
|
79
|
+
duration: props.duration ?? 10,
|
|
80
|
+
repeat: Infinity,
|
|
81
|
+
ease: "linear",
|
|
82
|
+
repeatType: "loop",
|
|
83
|
+
}}
|
|
84
|
+
className="bg-background flex flex-col gap-4 pb-6"
|
|
85
|
+
>
|
|
86
|
+
{[
|
|
87
|
+
...new Array(2).fill(0).map((_, index) => (
|
|
88
|
+
<React.Fragment key={index}>
|
|
89
|
+
{props.testimonials.map(({ text, image, name, role }, i) => (
|
|
90
|
+
<Card className="w-full max-w-xs shadow-none">
|
|
91
|
+
<CardContent className="flex flex-col gap-5">
|
|
92
|
+
<div>{text}</div>
|
|
93
|
+
<div className="flex items-center gap-3">
|
|
94
|
+
<img
|
|
95
|
+
width={40}
|
|
96
|
+
height={40}
|
|
97
|
+
src={image}
|
|
98
|
+
alt={name}
|
|
99
|
+
className="rounded-full"
|
|
100
|
+
/>
|
|
101
|
+
<div className="flex flex-col space-y-0.5">
|
|
102
|
+
<span className="leading-5 font-medium tracking-tight">
|
|
103
|
+
{name}
|
|
104
|
+
</span>
|
|
105
|
+
<span className="text-sm leading-5 tracking-tight opacity-60">
|
|
106
|
+
{role}
|
|
107
|
+
</span>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</CardContent>
|
|
111
|
+
</Card>
|
|
112
|
+
))}
|
|
113
|
+
</React.Fragment>
|
|
114
|
+
)),
|
|
115
|
+
]}
|
|
116
|
+
</motion.div>
|
|
117
|
+
</div>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export default function Testimonials() {
|
|
122
|
+
return (
|
|
123
|
+
<section className="py-10">
|
|
124
|
+
<div className="mx-auto max-w-7xl">
|
|
125
|
+
<header className="flex mb-12 flex-col items-center justify-center space-y-2">
|
|
126
|
+
<Badge variant="outline">Testimonials</Badge>
|
|
127
|
+
<h2 className="text-4xl lg:text-4xl font-bold leading-tight">What our users say</h2>
|
|
128
|
+
<p className="text-center text-muted-foreground">
|
|
129
|
+
See what our customers have to say about us.
|
|
130
|
+
</p>
|
|
131
|
+
</header>
|
|
132
|
+
|
|
133
|
+
<div className="flex max-h-[740px] justify-center gap-4 overflow-hidden mask-[linear-gradient(to_bottom,transparent,black_25%,black_75%,transparent)]">
|
|
134
|
+
<TestimonialsColumn testimonials={firstColumn} duration={15} />
|
|
135
|
+
<TestimonialsColumn
|
|
136
|
+
testimonials={secondColumn}
|
|
137
|
+
className="hidden md:block"
|
|
138
|
+
duration={19}
|
|
139
|
+
/>
|
|
140
|
+
<TestimonialsColumn
|
|
141
|
+
testimonials={thirdColumn}
|
|
142
|
+
className="hidden lg:block"
|
|
143
|
+
duration={17}
|
|
144
|
+
/>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
</section>
|
|
148
|
+
);
|
|
149
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function(shared, config) { return config }
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { motion } from "motion/react";
|
|
5
|
+
import { Card, CardContent } from "@/components/ui/card";
|
|
6
|
+
import { Badge } from "@/components/ui/badge";
|
|
7
|
+
import { Button } from "@/components/ui/button";
|
|
8
|
+
|
|
9
|
+
const testimonials = [
|
|
10
|
+
{
|
|
11
|
+
text: "The professionalism and swift, solution-oriented approach of your team have dramatically increased our project efficiency.",
|
|
12
|
+
image: "https://i.pravatar.cc/100?img=30",
|
|
13
|
+
name: "Olivia Carter",
|
|
14
|
+
role: "Project Manager",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
text: "Your technical expertise and continuous support have become invaluable. The user-friendly solutions made our work so much easier.",
|
|
18
|
+
image: "https://i.pravatar.cc/100?img=22",
|
|
19
|
+
name: "James Smith",
|
|
20
|
+
role: "Software Developer",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
text: "The robust and flexible infrastructure fully met our needs. We felt in control of the entire process.",
|
|
24
|
+
image: "https://i.pravatar.cc/100?img=41",
|
|
25
|
+
name: "Sophia Lee",
|
|
26
|
+
role: "Operations Director",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
text: "Your outstanding customer service and professional team exceeded our expectations in every way.",
|
|
30
|
+
image: "https://i.pravatar.cc/100?img=27",
|
|
31
|
+
name: "Michael Johnson",
|
|
32
|
+
role: "General Manager",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
text: "Thanks to the fast integration and simple interface, our team adapted quickly and now works seamlessly together.",
|
|
36
|
+
image: "https://i.pravatar.cc/100?img=19",
|
|
37
|
+
name: "Ava Williams",
|
|
38
|
+
role: "Customer Relations Specialist",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
text: "The support we received helped us achieve significant improvements in our business processes. Thank you!",
|
|
42
|
+
image: "https://i.pravatar.cc/100?img=17",
|
|
43
|
+
name: "Emma Brown",
|
|
44
|
+
role: "HR Specialist",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
text: "It's a joy to work with such functional features and a responsive team.",
|
|
48
|
+
image: "https://i.pravatar.cc/100?img=23",
|
|
49
|
+
name: "William Davis",
|
|
50
|
+
role: "Marketing Director",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
text: "Your comprehensive reporting and analytics tools have sped up our decision-making.",
|
|
54
|
+
image: "https://i.pravatar.cc/100?img=36",
|
|
55
|
+
name: "Emily Wilson",
|
|
56
|
+
role: "Sales Manager",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
text: "Your solution-driven approach and effective communication made you a vital partner in our digital transformation.",
|
|
60
|
+
image: "https://i.pravatar.cc/100?img=26",
|
|
61
|
+
name: "Benjamin Miller",
|
|
62
|
+
role: "E-commerce Manager",
|
|
63
|
+
},
|
|
64
|
+
] as const;
|
|
65
|
+
|
|
66
|
+
const firstColumn = testimonials.slice(0, 4);
|
|
67
|
+
const secondColumn = testimonials.slice(4, 8);
|
|
68
|
+
|
|
69
|
+
function TestimonialsColumn(props: {
|
|
70
|
+
className?: string;
|
|
71
|
+
testimonials: readonly (typeof testimonials)[number][];
|
|
72
|
+
duration?: number;
|
|
73
|
+
}) {
|
|
74
|
+
return (
|
|
75
|
+
<div className={props.className}>
|
|
76
|
+
<motion.div
|
|
77
|
+
animate={{ translateY: "-50%" }}
|
|
78
|
+
transition={{
|
|
79
|
+
duration: props.duration ?? 10,
|
|
80
|
+
repeat: Infinity,
|
|
81
|
+
ease: "linear",
|
|
82
|
+
repeatType: "loop",
|
|
83
|
+
}}
|
|
84
|
+
className="flex flex-col gap-4"
|
|
85
|
+
>
|
|
86
|
+
{[
|
|
87
|
+
...new Array(2).fill(0).map((_, index) => (
|
|
88
|
+
<React.Fragment key={index}>
|
|
89
|
+
{props.testimonials.map(({ text, image, name, role }, i) => (
|
|
90
|
+
<Card className="w-full max-w-xs shadow-none">
|
|
91
|
+
<CardContent className="flex flex-col gap-5">
|
|
92
|
+
<div>{text}</div>
|
|
93
|
+
<div className="flex items-center gap-3">
|
|
94
|
+
<img
|
|
95
|
+
width={40}
|
|
96
|
+
height={40}
|
|
97
|
+
src={image}
|
|
98
|
+
alt={name}
|
|
99
|
+
className="rounded-full"
|
|
100
|
+
/>
|
|
101
|
+
<div className="flex flex-col space-y-0.5">
|
|
102
|
+
<span className="leading-5 font-medium tracking-tight">
|
|
103
|
+
{name}
|
|
104
|
+
</span>
|
|
105
|
+
<span className="text-sm leading-5 tracking-tight opacity-60">
|
|
106
|
+
{role}
|
|
107
|
+
</span>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</CardContent>
|
|
111
|
+
</Card>
|
|
112
|
+
))}
|
|
113
|
+
</React.Fragment>
|
|
114
|
+
)),
|
|
115
|
+
]}
|
|
116
|
+
</motion.div>
|
|
117
|
+
</div>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export default function Testimonials() {
|
|
122
|
+
return (
|
|
123
|
+
<section className="bg-background py-20">
|
|
124
|
+
<div className="mx-auto max-w-7xl px-4 md:px-6">
|
|
125
|
+
<div className="grid gap-12 lg:grid-cols-[1fr_1.2fr] lg:items-center">
|
|
126
|
+
<div className="flex max-w-2xl mx-auto flex-col justify-center space-y-4">
|
|
127
|
+
<Badge variant="secondary">Community</Badge>
|
|
128
|
+
<h2 className="text-4xl lg:text-4xl font-bold leading-tight">
|
|
129
|
+
We believe in the power of community
|
|
130
|
+
</h2>
|
|
131
|
+
<p className="text-muted-foreground leading-relaxed">
|
|
132
|
+
Our goal is to create a product and service that you're satisfied
|
|
133
|
+
with and use it every day. This is why we're constantly working on
|
|
134
|
+
our services to make it better every day and really listen to what
|
|
135
|
+
our users has to say.
|
|
136
|
+
</p>
|
|
137
|
+
<Button className="w-fit">Read more testimonials</Button>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<div className="flex max-h-[740px] justify-center gap-4 overflow-hidden mask-[linear-gradient(to_bottom,transparent,black_25%,black_75%,transparent)]">
|
|
141
|
+
<TestimonialsColumn testimonials={firstColumn} duration={15} />
|
|
142
|
+
<TestimonialsColumn testimonials={secondColumn} duration={19} />
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
</section>
|
|
147
|
+
);
|
|
148
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function(shared, config) { return config }
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Star } from "lucide-react";
|
|
4
|
+
import { motion } from "motion/react";
|
|
5
|
+
import { Card, CardContent } from "@/components/ui/card";
|
|
6
|
+
import { Badge } from "@/components/ui/badge";
|
|
7
|
+
import { Button } from "@/components/ui/button";
|
|
8
|
+
|
|
9
|
+
const testimonials = [
|
|
10
|
+
{
|
|
11
|
+
text: "The professionalism and swift, solution-oriented approach of your team have dramatically increased our project efficiency.",
|
|
12
|
+
image: "https://i.pravatar.cc/100?img=30",
|
|
13
|
+
name: "Olivia Carter",
|
|
14
|
+
role: "Project Manager",
|
|
15
|
+
rating: 5,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
text: "Your technical expertise and continuous support have become invaluable. The user-friendly solutions made our work so much easier.",
|
|
19
|
+
image: "https://i.pravatar.cc/100?img=22",
|
|
20
|
+
name: "James Smith",
|
|
21
|
+
role: "Software Developer",
|
|
22
|
+
rating: 5,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
text: "The robust and flexible infrastructure fully met our needs. We felt in control of the entire process.",
|
|
26
|
+
image: "https://i.pravatar.cc/100?img=41",
|
|
27
|
+
name: "Sophia Lee",
|
|
28
|
+
role: "Operations Director",
|
|
29
|
+
rating: 4,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
text: "Your outstanding customer service and professional team exceeded our expectations in every way.",
|
|
33
|
+
image: "https://i.pravatar.cc/100?img=27",
|
|
34
|
+
name: "Michael Johnson",
|
|
35
|
+
role: "General Manager",
|
|
36
|
+
rating: 5,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
text: "Thanks to the fast integration and simple interface, our team adapted quickly and now works seamlessly together.",
|
|
40
|
+
image: "https://i.pravatar.cc/100?img=19",
|
|
41
|
+
name: "Ava Williams",
|
|
42
|
+
role: "Customer Relations Specialist",
|
|
43
|
+
rating: 5,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
text: "The support we received helped us achieve significant improvements in our business processes. Thank you!",
|
|
47
|
+
image: "https://i.pravatar.cc/100?img=17",
|
|
48
|
+
name: "Emma Brown",
|
|
49
|
+
role: "HR Specialist",
|
|
50
|
+
rating: 4,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
text: "It's a joy to work with such functional features and a responsive team.",
|
|
54
|
+
image: "https://i.pravatar.cc/100?img=23",
|
|
55
|
+
name: "William Davis",
|
|
56
|
+
role: "Marketing Director",
|
|
57
|
+
rating: 5,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
text: "Your comprehensive reporting and analytics tools have sped up our decision-making.",
|
|
61
|
+
image: "https://i.pravatar.cc/100?img=36",
|
|
62
|
+
name: "Emily Wilson",
|
|
63
|
+
role: "Sales Manager",
|
|
64
|
+
rating: 4,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
text: "Your solution-driven approach and effective communication made you a vital partner in our digital transformation.",
|
|
68
|
+
image: "https://i.pravatar.cc/100?img=26",
|
|
69
|
+
name: "Benjamin Miller",
|
|
70
|
+
role: "E-commerce Manager",
|
|
71
|
+
rating: 5,
|
|
72
|
+
},
|
|
73
|
+
] as const;
|
|
74
|
+
|
|
75
|
+
function StarRating({ rating }: { rating: number }) {
|
|
76
|
+
return (
|
|
77
|
+
<div className="flex gap-0.5" aria-label={`${rating} out of 5 stars`}>
|
|
78
|
+
{[1, 2, 3, 4, 5].map((star) => (
|
|
79
|
+
<Star
|
|
80
|
+
key={star}
|
|
81
|
+
className={
|
|
82
|
+
star <= rating
|
|
83
|
+
? "size-4 fill-amber-500 text-amber-500"
|
|
84
|
+
: "fill-muted text-muted size-4"
|
|
85
|
+
}
|
|
86
|
+
/>
|
|
87
|
+
))}
|
|
88
|
+
</div>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export default function Testimonials() {
|
|
93
|
+
return (
|
|
94
|
+
<section className="py-12 lg:py-24">
|
|
95
|
+
<div className="mx-auto max-w-7xl px-4">
|
|
96
|
+
<header className="flex max-w-2xl flex-col justify-center space-y-4">
|
|
97
|
+
<Badge variant="secondary">Community</Badge>
|
|
98
|
+
<h2 className="text-4xl lg:text-4xl font-bold leading-tight">
|
|
99
|
+
We believe in the power of community
|
|
100
|
+
</h2>
|
|
101
|
+
<p className="text-muted-foreground leading-relaxed">
|
|
102
|
+
Our goal is to create a product and service that you're satisfied
|
|
103
|
+
with and use it every day. This is why we're constantly working on
|
|
104
|
+
our services to make it better every day and really listen to what
|
|
105
|
+
our users has to say.
|
|
106
|
+
</p>
|
|
107
|
+
<Button className="w-fit">Read more testimonials</Button>
|
|
108
|
+
</header>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div className="mt-10 mask-x-from-75% mask-x-to-90%">
|
|
112
|
+
<motion.div
|
|
113
|
+
animate={{ translateX: "-50%" }}
|
|
114
|
+
transition={{
|
|
115
|
+
duration: 15,
|
|
116
|
+
repeat: Infinity,
|
|
117
|
+
ease: "linear",
|
|
118
|
+
repeatType: "loop",
|
|
119
|
+
}}
|
|
120
|
+
className="flex gap-4"
|
|
121
|
+
>
|
|
122
|
+
{testimonials.map(({ text, image, name, role, rating }, i) => (
|
|
123
|
+
<Card key={i} className="w-72 shrink-0 shadow-none">
|
|
124
|
+
<CardContent className="flex flex-col gap-5">
|
|
125
|
+
<div className="space-y-3">
|
|
126
|
+
<StarRating rating={rating} />
|
|
127
|
+
<p className="text-muted-foreground">{text}</p>
|
|
128
|
+
</div>
|
|
129
|
+
<div className="flex items-center gap-3">
|
|
130
|
+
<img
|
|
131
|
+
width={40}
|
|
132
|
+
height={40}
|
|
133
|
+
src={image}
|
|
134
|
+
alt={name}
|
|
135
|
+
className="rounded-full"
|
|
136
|
+
/>
|
|
137
|
+
<div className="flex flex-col space-y-0.5">
|
|
138
|
+
<span className="leading-5 font-medium tracking-tight">
|
|
139
|
+
{name}
|
|
140
|
+
</span>
|
|
141
|
+
<span className="text-sm leading-5 tracking-tight opacity-60">
|
|
142
|
+
{role}
|
|
143
|
+
</span>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
</CardContent>
|
|
147
|
+
</Card>
|
|
148
|
+
))}
|
|
149
|
+
</motion.div>
|
|
150
|
+
</div>
|
|
151
|
+
</section>
|
|
152
|
+
);
|
|
153
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function(shared, config) { return config }
|