Compare commits

..

274 Commits
dev ... main

Author SHA1 Message Date
apurvab 915aff6074 chore:Add js file for customer login 2024-05-09 14:49:14 +05:30
apurvab a02efb48b2 fix: Add fade class to pop up 2024-05-09 14:47:03 +05:30
apurvab 9994587440 fix:change stling of pop up 2024-05-09 14:01:38 +05:30
apurvab cdb6ee6b15 fix:Change styling of size dropdown 2024-05-09 13:54:38 +05:30
apurvab d410e38714 refactor: Make size visible on cart 2024-05-09 13:51:11 +05:30
apurvab 79a29aea2f fix:change model name on profile 2024-05-02 16:36:52 +05:30
apurvab 19cbc3eefc fix:Add custom scrollbar 2024-05-02 12:48:50 +05:30
apurvabangali f6aeae158d fix: change styling on pop up 2024-04-30 17:59:01 +05:30
apurvabangali 10fb36a888 fix: edit pop-up on homepage 2024-04-30 17:11:10 +05:30
apurvabangali 7df21e3c07 fix: edit styling on pop up 2024-04-30 16:16:55 +05:30
apurvabangali 85035f2768 WIP 2024-04-29 16:05:20 +05:30
jatin 4417b040d1 chore: add google tag manager scripts 2024-04-10 12:12:32 +05:30
jatiny e2272beca1 Merge pull request 'chore: fix video slider, add image gallery' (#26) from jatiny/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#26
2024-03-11 13:33:42 +00:00
jatin fc98ddc47c chore: fix video slider, add image gallery 2024-03-11 19:02:56 +05:30
jatiny 50eaf4d138 Merge pull request 'chore: impl video instead of image slider' (#25) from jatiny/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#25
2024-03-11 12:30:44 +00:00
jatiny 893f5195f7 Merge branch 'main' into main 2024-03-11 12:29:35 +00:00
jatin 3f160fe2d4 chore: impl video instead of image slider 2024-03-11 17:58:54 +05:30
abhisheks 2be47bb9bd Merge pull request 'chore: add scripts for hotjar and tawkto chatbot' (#24) from jatiny/theme-elegance:feat/add_scripts into main
Reviewed-on: brooksbingham/theme-elegance#24
Reviewed-by: @abhisheks
2024-03-11 10:26:24 +00:00
jatin e8ea43a702 chore: add scripts for hotjar and tawkto chatbot 2024-03-11 15:49:49 +05:30
abhisheks f027dc66f1 refactor: show step edit icon only if step is complete 2024-02-05 14:00:07 +05:30
abhisheks 105e21dba6 refactor: set justify around for my account page items 2024-01-19 12:31:09 +05:30
abhisheks f30766bc04 refactor: show payment method automatically when only option is available 2024-01-12 11:59:14 +05:30
abhisheks b0ddbb6c23 refactor: remove carrier delay text from shipping checkout step 2024-01-12 11:13:27 +05:30
abhisheks d5459b64d2 refactor: update styles for 'optional' text below form fields 2024-01-05 12:27:27 +05:30
abhisheks 7547d850cc refactor: add padding for select input type 2024-01-05 11:39:17 +05:30
abhisheks 58ae059a6e refactor: add styles for disabled button 2024-01-04 15:40:51 +05:30
abhisheks 9efbfd3852 reactor: update button styles and place order text 2024-01-04 12:20:00 +05:30
abhisheks f35d1ac87d refactor: show toast when add to cart is pressed 2024-01-03 16:22:49 +05:30
abhisheks 325de097d0 chore: add jquery toast plugin 2024-01-03 16:22:35 +05:30
abhisheks 67af6e19bf refactor: remove bg from image slider 2024-01-03 14:24:31 +05:30
abhisheks 8e2f8aa91f refactor: add affirmation for contact form submission 2024-01-03 14:23:29 +05:30
abhisheks ff02287a26 fix: back to top works now 2024-01-03 14:16:13 +05:30
abhisheks 8c45f661f8 refactor: update year in the footer 2024-01-03 14:09:09 +05:30
abhisheks a63d05a30e refactor: reduce header logo size 2023-12-22 12:36:00 +05:30
abhisheks b1fb6f8d02 refactor: tweak logo size on header and footer 2023-12-22 12:34:30 +05:30
abhisheks d5361f2120 refactor: show product price instead of total price in order confirmation table 2023-12-22 12:34:12 +05:30
abhisheks 2e2c0259e9 refactor: update main menu popover position 2023-12-20 14:05:12 +05:30
abhisheks 28ca0ffb12 refactor: align text to center on mobile screen 2023-12-20 14:00:14 +05:30
abhisheks a36655ef84 refactor: update cart touchspin style 2023-12-20 13:58:06 +05:30
abhisheks fbc0ff69c4 refactor: update cart page styles 2023-12-20 13:53:44 +05:30
abhisheks 0a1add6881 refactor: update reset password page styles 2023-12-20 12:12:27 +05:30
abhisheks 0d44432e6d refactor: design forgot password page 2023-12-20 12:03:03 +05:30
abhisheks a9a1c780db refactor: temporarily remove details button and update styles of order history page 2023-12-20 11:33:14 +05:30
abhisheks 7a6702dfbf refactor: update my-accounts address section page 2023-12-15 21:00:15 +05:30
abhisheks 6adb6d24e9 chore: disable bodymeasurement section on my-accounts page temporarily 2023-12-15 20:53:20 +05:30
abhisheks 26ca21d57a refactor: update contact us page field padding 2023-12-15 20:47:34 +05:30
abhisheks 448196b73f refactor: style contact us page 2023-12-15 20:44:34 +05:30
abhisheks a9fe9fe13f refactor: style hero title again 2023-12-15 19:17:24 +05:30
abhisheks 83bd57bcb2 refactor: update hero styles 2023-12-15 19:11:25 +05:30
abhisheks 10a02a9aea refactor: update hero section title styles for mobile device 2023-12-15 19:07:54 +05:30
abhisheks b1c22902e1 chore: config tooltip plugin 2023-12-14 20:01:24 +05:30
abhisheks f049ff98c9 refactor: setup tooltipster plugin 2023-12-14 19:52:21 +05:30
abhisheks fbd64038d5 chore: install tooltipster package 2023-12-14 19:52:06 +05:30
abhisheks c3aad31794 refactor: hide filters options if no facets are found 2023-12-14 16:56:42 +05:30
abhisheks 22742e7420 refactor: align left and right column buttons on cart page 2023-12-14 16:26:49 +05:30
abhisheks eb7f48ff0c refactor: add product custmizations modal on cart page 2023-12-14 16:15:24 +05:30
abhisheks d970b53502 refactor: override thob modules template 2023-12-14 16:15:04 +05:30
abhisheks 8e2c81f267 chore: hide customizations modal on confirmation page temporarily 2023-12-14 16:14:18 +05:30
abhisheks bdba795292 refactor: make checkout steps editable 2023-12-14 12:45:12 +05:30
abhisheks 76d5cea40b refactor: update styles for empty cart 2023-12-12 16:21:36 +05:30
abhisheks 2421b14372 Merge pull request 'refactor: hide checkout summary accordion content by default' (#22) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#22
2023-12-12 10:25:35 +00:00
abhisheks 48ef5bb6ec Merge branch 'main' into main 2023-12-12 10:25:27 +00:00
abhisheks 986a76a716 refactor: hide checkout summary accordion content by default 2023-12-12 12:31:49 +05:30
abhisheks a971a7f12b Merge pull request 'fix: update main menu styles' (#21) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#21
2023-12-11 15:37:05 +00:00
abhisheks 09b8fed5e4 Merge branch 'main' into main 2023-12-11 15:36:58 +00:00
abhisheks 637fd09f47 fix: update main menu styles 2023-12-11 21:06:24 +05:30
abhisheks 8004a70de6 Merge pull request 'refactor: update mobile view styles' (#20) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#20
2023-12-11 14:24:38 +00:00
abhisheks 7799872499 Merge branch 'main' into main 2023-12-11 14:24:31 +00:00
abhisheks 82bcb9eda0 fix: spacing between main menu and shopping cart for mobile view 2023-12-11 19:54:04 +05:30
abhisheks 354bcc9603 refactor: update main menu mobile view 2023-12-11 19:51:01 +05:30
abhisheks 1f194bb00e refactor: center align copyright text on mobile and update social medial links 2023-12-11 19:34:52 +05:30
abhisheks ed7c97d210 Merge pull request 'chore:push assets' (#19) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#19
2023-12-11 13:58:38 +00:00
abhisheks 51ea15892d Merge branch 'main' into main 2023-12-11 13:58:30 +00:00
abhisheks 73945604ab chore:push assets 2023-12-11 19:28:10 +05:30
abhisheks ce4daa4401 Merge pull request 'refactor: update styles for checkout cart summary' (#18) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#18
2023-12-11 13:57:24 +00:00
abhisheks 9a75069ebe Merge branch 'main' into main 2023-12-11 13:57:18 +00:00
abhisheks 5b55367824 refactor: update styles for checkout cart summary 2023-12-11 19:27:01 +05:30
abhisheks 7dbebfb260 Merge pull request 'refactor: update hero section, footer and checkout page's cart summary styles' (#17) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#17
2023-12-11 12:37:13 +00:00
abhisheks 45bd4a3288 Merge branch 'main' into main 2023-12-11 12:37:07 +00:00
abhisheks 2bc3226863 chore: push theme.css 2023-12-11 18:06:07 +05:30
abhisheks 6a8b361951 refactor: update cart summary section on checkout page 2023-12-11 18:05:59 +05:30
abhisheks 1b3ab1de39 chore: push assets 2023-12-11 17:26:24 +05:30
abhisheks 9b2b69f24b refactor: make footer responsive 2023-12-11 17:26:15 +05:30
abhisheks bcf8a02213 refactor: update accordion plugin 2023-12-11 17:25:41 +05:30
abhisheks f76e01989c refactor: update hero banner text styles 2023-12-11 16:39:44 +05:30
abhisheks 624d3c9d4f Merge pull request 'refactor: minor styling changes and fixes' (#16) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#16
2023-12-11 10:59:16 +00:00
abhisheks c4a72e0bb7 Merge branch 'main' into main 2023-12-11 10:59:08 +00:00
abhisheks 49b1d80b9e chore: push theme.css 2023-12-11 16:28:34 +05:30
abhisheks d8a0130c14 refactor: add chevron icon and reposition 'All products' link 2023-12-11 16:27:59 +05:30
abhisheks abb29ba152 refactor: update hero banner styles for smaller screens 2023-12-11 16:09:24 +05:30
abhisheks 7281d23cf8 refactor: implement main menu popover for smaller and medium devices 2023-12-11 15:43:08 +05:30
abhisheks 55918f8441 refactor: show cart icon on mobile and tablet devices 2023-12-11 15:42:02 +05:30
abhisheks cad2d48351 refactor: make login form responsive 2023-12-09 12:37:25 +05:30
abhisheks ff7c18e35c refactor: add hover styles for login button 2023-12-09 12:36:41 +05:30
abhisheks 4f7eb431b9 Merge pull request 'chore: push theme.css file' (#15) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#15
2023-12-09 05:55:07 +00:00
abhisheks a37ce7e027 Merge branch 'main' into main 2023-12-09 05:54:58 +00:00
abhisheks c04d030b58 chore: push theme.css file 2023-12-09 11:24:44 +05:30
abhisheks 747e385b4c Merge pull request 'refactor: update footer icons and form fields styles' (#14) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#14
2023-12-09 05:52:01 +00:00
abhisheks 059771727e Merge branch 'main' into main 2023-12-09 05:51:53 +00:00
abhisheks 55a6da8492 fix: radio buttons on forms are now aligned to the left 2023-12-09 11:21:01 +05:30
abhisheks 6ca1e490f8 refactor: update page header styles 2023-12-09 11:20:18 +05:30
abhisheks d93203e68a refactor: add spacing between form fields for customer and login form 2023-12-09 11:19:52 +05:30
abhisheks 3fe21584c7 refactor: update footer social media icons 2023-12-09 11:19:14 +05:30
abhisheks 12e5e9d89d Merge pull request 'refactor: update product description layout and bodymeasurement section' (#13) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#13
2023-12-08 14:58:03 +00:00
abhisheks a4201ee7d7 Merge branch 'main' into main 2023-12-08 14:57:54 +00:00
abhisheks 215d5e32c4 refactor: update top margin for product actions section 2023-12-08 18:41:41 +05:30
abhisheks 1fc7e5a1a7 refactor: update product description layout 2023-12-08 18:40:21 +05:30
abhisheks a9218a4d48 refactor: override bodymeasurements customer account template 2023-12-08 17:13:10 +05:30
abhisheks b404359d9d Merge pull request 'refactor: update product'page, footer and pagination styles' (#12) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#12
2023-12-08 11:22:04 +00:00
abhisheks 245e0c93dd refactor: show account-links in the footer 2023-12-08 16:29:44 +05:30
abhisheks e59b67fc1b refactor: add spacer element between pagination page numbers 2023-12-08 15:59:40 +05:30
abhisheks 1805b69840 refactor: update 'same category products's section header styles 2023-12-08 15:48:50 +05:30
abhisheks a5dcebc7d9 refactor: update related products section styles 2023-12-08 15:46:41 +05:30
abhisheks 92f5487996 refactor: update viewed products sections layout and heading styles 2023-12-08 15:46:29 +05:30
abhisheks 7aba8afa0f refactor; update product action buttons styles 2023-12-08 15:37:10 +05:30
abhisheks 59a7a34670 refactor: update thob's 'Customise in 3D' button style 2023-12-08 15:23:36 +05:30
abhisheks 799f3e3f62 refactor: add spacing between product details section 2023-12-08 14:51:27 +05:30
abhisheks 3a1bcb48cc refactor: add spacing and highlight product description header 2023-12-08 14:05:01 +05:30
abhisheks 4cdb938483 Merge pull request 'refactor: minor changes and updates' (#11) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#11
2023-12-06 22:21:36 +00:00
abhisheks ecce063f4e Merge branch 'main' into main 2023-12-06 22:21:28 +00:00
abhisheks f6d5c5a792 refactor: temporarily hide item details section on checkout page 2023-12-07 03:50:57 +05:30
abhisheks 3edef5858c refactor: hide payment order confirmation block 2023-12-07 03:50:34 +05:30
abhisheks 47dff02012 Merge pull request 'refactor: update cart product line styles' (#10) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#10
2023-12-06 21:44:01 +00:00
abhisheks 6cd1aad41b Merge branch 'main' into main 2023-12-06 21:43:53 +00:00
abhisheks 7b3f1731df refactor: update cart product line styles 2023-12-07 03:13:28 +05:30
abhisheks d636f4c1c1 Merge pull request 'refactor: update checkout page styles and minor changes' (#9) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#9
2023-12-06 21:29:18 +00:00
abhisheks 18cc2c1cc0 refactor: remove static customise in 3d button 2023-12-07 02:57:00 +05:30
abhisheks 353bdfe820 refactor: update cart summary totals spacing 2023-12-07 02:49:20 +05:30
abhisheks e27b0a0cf5 refactor: add spacing between table rows for orders history 2023-12-07 02:38:51 +05:30
abhisheks 9d9ccbc331 refactor: update order confirmation page 2023-12-07 02:26:14 +05:30
abhisheks d8cf51fd5b Merge remote-tracking branch 'upstream/main' 2023-12-06 23:01:23 +05:30
Dinesh Salunke 3b7f88956a refactor: remove the modal dialog when adding a product to cart 2023-12-06 19:05:27 +05:30
Dinesh Salunke 086352ed5a refactor: add the subcatogeies section on the category page 2023-12-06 18:35:14 +05:30
abhisheks 062e5a46d3 refactor: udpate Address checkout step styles 2023-12-06 17:37:42 +05:30
abhisheks 57225936e4 refactor: hide personal info step content if step is completed 2023-12-06 17:37:27 +05:30
abhisheks b0c137a7ea refactor: make focus ring transparent for all radio buttons 2023-12-06 17:37:00 +05:30
Dinesh Salunke fdf2bd8199 fix: no wrap for the sorting dropdown 2023-12-06 15:44:07 +05:30
Dinesh Salunke b67831e3e3 refactor: use the correct label and remove flex-1 2023-12-06 13:23:03 +05:30
Dinesh Salunke 1cd345090e refactor: putting the themejs 2023-12-06 13:18:24 +05:30
Dinesh Salunke 361568a853 fix: everything on the cart page now works 2023-12-06 13:18:14 +05:30
Dinesh Salunke d6ccccdfa7 refactor: move the blockcart code from theme to blockcart file 2023-12-06 13:17:49 +05:30
Dinesh Salunke e81cdd9d00 refactor: add the ps required class for the cart details actions 2023-12-05 19:24:59 +05:30
Dinesh Salunke 2f71a0f0d7 fix: reflect the changes on cart update 2023-12-05 18:49:34 +05:30
Dinesh Salunke 599e9fafb8 refactor: minor styling on the checkout steps 2023-12-05 18:47:21 +05:30
Dinesh Salunke 7f57f035ac refactor: remove code which hides the quickview modal
its ok to remove this since we don't use quickview
2023-12-05 18:42:11 +05:30
Dinesh Salunke 79c48434bc refactor: update the styling of the buttons 2023-12-05 16:40:26 +05:30
Dinesh Salunke c5fd398c42 Merge branch 'main' of https://git.bopconsultancy.com/brooksbingham/theme-elegance 2023-12-05 16:30:45 +05:30
Dinesh Salunke 1d6e2a217a refactor: add flex and wrap for featured products 2023-12-05 16:30:43 +05:30
dineshsalunke 02c06a307e Merge pull request 'minor cleanup and bug fix' (#8) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#8
2023-12-05 11:00:03 +00:00
dineshsalunke 9a986b625e Merge branch 'main' into main 2023-12-05 10:59:55 +00:00
Dinesh Salunke f499d818d1 chore: add the build script for theme js 2023-12-05 15:00:52 +05:30
Dinesh Salunke 49f81fb95f fix: add missing closing tag 2023-12-05 13:35:11 +05:30
Dinesh Salunke 0f44dee241 refactor: remove commented code 2023-12-05 13:35:00 +05:30
Dinesh Salunke d06e3d8369 Merge branch 'main' of https://git.bopconsultancy.com/brooksbingham/theme-elegance 2023-12-05 12:19:47 +05:30
Dinesh Salunke af0dda90db fix: pagination now works
id selector for the pagination div was in correctly set.
pagination is a client side handled using ajax, which relies on the id of the div being correctly set
2023-12-05 12:19:44 +05:30
Dinesh Salunke 1c4f82f2d4 fix: highlight the currently selected page on the pagination 2023-12-05 12:17:42 +05:30
Jatin 29ad5b7173 Merge branch 'main' of https://git.bopconsultancy.com/brooksbingham/theme-elegance 2023-12-04 20:20:14 +05:30
Jatin d975069771 refactor: use col for the product additional info section 2023-12-04 20:19:28 +05:30
abhisheks e92622b360 fix: add null check in cart-detailed-totals template 2023-12-01 20:53:17 +05:30
abhisheks 8be6271f08 refactor: add custom module templates for payment checkout step 2023-12-01 20:44:32 +05:30
abhisheks 396fd2c141 wip: update checkout steps styles 2023-12-01 19:35:23 +05:30
abhisheks 9348891e8b Merge pull request 'refactor: update product and my-account page styles' (#7) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#7
2023-11-30 16:31:46 +00:00
abhisheks 6dbaef394c refactor: conditionally show product features section 2023-11-30 21:58:53 +05:30
abhisheks 85f4791aee fix: update product features styles 2023-11-30 21:52:36 +05:30
abhisheks 944dccb70b fix: update condition in cart summary subtotals template 2023-11-30 21:49:38 +05:30
abhisheks 00eb3abc94 refactor: update my-account styles 2023-11-30 21:49:06 +05:30
Dinesh Salunke 5c3be1cc19 Merge branch 'main' of https://git.bopconsultancy.com/brooksbingham/theme-elegance 2023-11-27 16:07:31 +05:30
abhisheks 4e88488ba2 Merge pull request 'refactor: udpate new products,my-accounts, order history and addresses page' (#6) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#6
2023-11-27 05:33:14 +00:00
abhisheks 0316955017 refactor: add basic layout and update icons for addresses page 2023-11-27 10:50:20 +05:30
abhisheks 5e612c5b4f refactor: update orders history page 2023-11-26 18:25:46 +05:30
abhisheks c72869ec3f fix: product images are resized automatically while while switching 2023-11-26 18:25:22 +05:30
Dinesh Salunke 17e80bd6c3 refactor: initial styling for the checkout page 2023-11-26 15:13:59 +05:30
abhisheks accf657ee6 refactor: update my-account page 2023-11-26 11:51:14 +05:30
abhisheks 1badadaa3c refactor:override hook for wishlist module 2023-11-26 11:50:56 +05:30
abhisheks c3124f5ea2 refactor: add icons for account links 2023-11-26 11:50:29 +05:30
abhisheks 54e6b7d13d Merge remote-tracking branch 'upstream/main' 2023-11-23 12:58:50 +05:30
abhisheks b4a583a57e refactor: update new products module 2023-11-22 16:55:00 +05:30
dineshsalunke 293367ba11 Merge pull request 'refactor: udpate product's page styles' (#5) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#5
2023-11-22 11:12:17 +00:00
abhisheks 1d6f7e98f3 Merge remote-tracking branch 'upstream/main' 2023-11-22 16:26:38 +05:30
dineshsalunke c0aad51432 Merge pull request 'fix: offcanvas menu for product filters' (#4) from tejasc/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#4
2023-11-22 10:55:15 +00:00
dineshsalunke 33f1d0d99f Merge branch 'main' into main 2023-11-22 10:55:10 +00:00
abhisheks 16d5b7f54c refactor: udpate product's page style 2023-11-22 16:21:29 +05:30
abhisheks fd550d0e20 refactor: udpate product details styles 2023-11-22 16:21:01 +05:30
Tejas Chari 874564ab87 chore: removed the z index on the header 2023-11-22 16:19:50 +05:30
Tejas Chari 3e9543a0b7 chore: fixed the width for the offcanvas 2023-11-22 16:19:20 +05:30
abhisheks 58c4ff0b27 refactor: remove product price margin-top 2023-11-22 16:19:14 +05:30
abhisheks 8db275f9bd refactor: udpate add to cart flex gap 2023-11-22 16:18:38 +05:30
Tejas Chari f1e44f1de1 chore: added shadows for the sort by dropdown 2023-11-22 16:17:52 +05:30
Tejas Chari 98c89e4d8d chore: added duration for the offcanvas animation 2023-11-22 16:17:04 +05:30
abhisheks 2f45a731c1 refactor: add global list style 2023-11-22 16:16:54 +05:30
dineshsalunke b0436f56b9 Merge pull request 'refactor: conditionally display product price' (#3) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#3
2023-11-22 10:46:23 +00:00
Tejas Chari 9b039a52d8 chore: removed commented code in templates 2023-11-22 15:27:21 +05:30
Tejas Chari d23729846a feat: hide filters button on the offcanvas menu 2023-11-22 15:24:12 +05:30
Tejas Chari 1d40c4f141 refactor: fixed the alignment of the product top bar for sort by and filter button 2023-11-22 13:56:12 +05:30
Tejas Chari f07f5ad4e2 chore: updated the product list top bar 2023-11-22 13:49:09 +05:30
Tejas Chari e707255653 fix: centered the text of each filter and updated the paddings and margins 2023-11-22 13:29:07 +05:30
Tejas Chari 202a4a0a38 Merge branch 'main' of https://git.bopconsultancy.com/tejasc/theme-elegance 2023-11-22 13:07:35 +05:30
Tejas Chari 42224b883b fix: offcanvas menu show/hide and overlay issue 2023-11-22 13:02:51 +05:30
Tejas Chari ac4e31fdf4 fix: sort option not getting created again 2023-11-22 10:50:29 +05:30
abhisheks 20aae25995 Merge branch 'main' into main 2023-11-21 11:24:00 +00:00
abhisheks 1144cd4758 refactor: conditionally display product price 2023-11-21 16:53:22 +05:30
dineshsalunke 3398569665 Merge pull request 'feat: offcanvas menu for product filters' (#2) from tejasc/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#2
2023-11-21 10:55:02 +00:00
dineshsalunke 61979e0b82 Merge branch 'main' into main 2023-11-21 10:54:53 +00:00
Dinesh Salunke 2d2ea8f10a refactor: remove the livereload script 2023-11-21 16:20:00 +05:30
Tejas Chari b95409bcd7 Merge branch 'main' of https://git.bopconsultancy.com/brooksbingham/theme-elegance 2023-11-21 13:39:26 +05:30
Tejas Chari 2c937230bf chore: updated the template files to add the accordion 2023-11-08 13:22:53 +05:30
Tejas Chari d6c622a60a feat: created a jQuery accordion plugin for the filters 2023-11-08 13:22:17 +05:30
Dinesh Salunke 4eae501213 refactor: add some margin 2023-11-08 10:51:19 +05:30
Tejas Chari 3d1ef1b400 refactor: added a off menu canvas for mobiule screens for product filters 2023-11-07 20:28:13 +05:30
Tejas Chari b7aa9bf7b6 chore: added tailwing plugin for forms 2023-11-07 20:27:26 +05:30
Tejas Chari bf0238948d feat: added logic for showing/hiding sections for filters in theme.js 2023-11-07 20:27:10 +05:30
Dinesh Salunke c3c5380c3b refactor: cart page styling 2023-11-07 19:52:29 +05:30
Dinesh Salunke 70768fe587 refactor: update the styling for the image slider 2023-11-07 12:04:16 +05:30
Dinesh Salunke 1147c59fb7 refactor: remove the breadcrumb from the index.tpl 2023-11-07 12:04:01 +05:30
Dinesh Salunke aae3c415fc refactor: replace grid with flex 2023-11-07 12:03:47 +05:30
Dinesh Salunke e1335d23eb chore: remove the redundant modules 2023-11-07 11:49:58 +05:30
Tejas Chari 49e7942400 refactor: added a filter button to expose an off canvas menu for the product filters 2023-11-06 20:53:03 +05:30
Tejas Chari 8b3d7f5b65 chore: added node package for jquery-offcanvas and completed the dev build 2023-11-06 20:51:33 +05:30
Tejas Chari 65c6b8d2a5 chore: updated theme css and js 2023-11-06 20:49:55 +05:30
Tejas Chari a9722c6037 chore: added elegance stylesheet to templates partials 2023-11-06 20:49:21 +05:30
Tejas Chari 2278c54cb1 fix: use the appropriate variable 2023-11-06 18:51:41 +05:30
Tejas Chari 12fd0c1038 Merge remote-tracking branch 'upstream/main' 2023-11-06 18:16:04 +05:30
Dinesh Salunke 0921021a15 refactor: add the classic theme js files for time being 2023-11-06 18:15:17 +05:30
Tejas Chari b866e6cb47 Merge remote-tracking branch 'upstream/main' 2023-11-06 17:55:08 +05:30
Dinesh Salunke 982255b0b4 refactor: add build for theme js 2023-11-06 17:46:41 +05:30
Dinesh Salunke f838fde911 refactor: add some default styling for theme 2023-11-06 16:47:47 +05:30
Dinesh Salunke 7c50dcaae2 refactor: make the link list responsive 2023-11-06 16:47:11 +05:30
Dinesh Salunke 255a7592a3 refactor: style the footer 2023-11-06 16:46:46 +05:30
dineshsalunke 587c9ce147 Merge pull request 'refactor: udpate product's page' (#1) from abhisheks/theme-elegance:main into main
Reviewed-on: brooksbingham/theme-elegance#1
2023-11-06 09:09:35 +00:00
dineshsalunke 9abd1621eb Merge branch 'main' into main 2023-11-06 09:09:29 +00:00
Dinesh Salunke 91726b1ea3 refactor: style the footer 2023-11-06 14:39:05 +05:30
Dinesh Salunke 5ce5059fac chore: updated the theme 2023-11-06 14:38:56 +05:30
Dinesh Salunke 41b1d12cbf refactor: style the login and registration forms 2023-11-06 14:38:40 +05:30
Dinesh Salunke 2ab758654b refactor: reset the styling for the customer account links 2023-11-06 14:38:22 +05:30
Dinesh Salunke 7e92214b03 refactor: base styling for a and icons 2023-11-06 14:37:56 +05:30
Dinesh Salunke c30e5568ba refactor: use the primary color for a hover 2023-11-06 14:37:36 +05:30
Dinesh Salunke 440be0218e refactor: add some basic styling for the form fields and errors 2023-11-06 14:37:17 +05:30
Dinesh Salunke 8a849a7941 refactor: add spacer in the breadcrumb 2023-11-06 14:36:54 +05:30
Dinesh Salunke 93f15c1620 refactor: style the link block 2023-11-06 14:36:23 +05:30
Dinesh Salunke d25067a064 refactor: style the customer sign in for the header 2023-11-06 14:36:07 +05:30
abhisheks dcdf4afeb2 refactor: update margin for product's add to cart button 2023-11-06 14:35:25 +05:30
abhisheks e7a24bcdc2 refactor: add template hook for block assurance module 2023-11-06 14:35:05 +05:30
Tejas Chari 464b78793f chore: fixed facets for mobile screens, undo commit on footer.tpl 2023-11-06 12:55:55 +05:30
abhisheks 66a727d140 refactor: add gap in related products section on product's page 2023-11-04 22:35:52 +05:30
abhisheks 9825bb64b6 refactor: move product availability section above add to cart action 2023-11-04 22:32:13 +05:30
abhisheks 75824cc24a Merge remote-tracking branch 'upstream/main' 2023-11-04 22:09:43 +05:30
Dinesh Salunke db088ec76b refactor: update the theme 2023-11-04 08:21:36 +05:30
Dinesh Salunke e2d1a51653 refactor: add seperator in the bread crub 2023-11-04 08:21:26 +05:30
Dinesh Salunke 6684988922 refactor: update the theme 2023-11-03 19:57:51 +05:30
Dinesh Salunke 6cafbe1ca5 refactor: add filters on the products list 2023-11-03 19:57:40 +05:30
abhisheks 85902f6777 refactor: update product add to cart 2023-11-03 19:29:48 +05:30
abhisheks fe32610ac6 refactor: update related products grid and margin top 2023-11-03 19:29:34 +05:30
abhisheks b80661de56 refactor: update product prices section 2023-11-03 19:03:11 +05:30
abhisheks 8cff94ff99 Merge remote-tracking branch 'upstream/main' 2023-11-03 18:37:51 +05:30
Dinesh Salunke 681dff1dbd Merge remote-tracking branch 'abhishek/main' 2023-11-03 18:29:53 +05:30
Dinesh Salunke 83b50d7c44 refactor: increase the gap in products list 2023-11-03 18:29:02 +05:30
Dinesh Salunke d1e91c3121 refactor: increase the gap in products list 2023-11-03 18:28:55 +05:30
Dinesh Salunke 83a427381d refactor: simplify the product card 2023-11-03 18:28:36 +05:30
Dinesh Salunke 46491a333c refactor: add top margin to the pagination 2023-11-03 18:28:26 +05:30
Dinesh Salunke 372a7544c0 refactor: update the themes 2023-11-03 18:27:51 +05:30
abhisheks 6b2ec4a5c8 refactor: update products details tabs trigger 2023-11-03 18:16:31 +05:30
abhisheks 85edb09ac3 refactor: update product template 2023-11-03 18:12:06 +05:30
abhisheks 7be614b92a refactor: show only one product detail tab content for now 2023-11-03 18:11:53 +05:30
Dinesh Salunke 5501562c98 refactor: add styling to the menu list item 2023-11-03 18:04:20 +05:30
Dinesh Salunke 32fce4c534 refactor: update the theme 2023-11-03 18:04:04 +05:30
Dinesh Salunke 211582e6c6 refactor: use lighter color for body font 2023-11-03 18:03:59 +05:30
abhisheks 7056019bcc refactor: update product add to cart template 2023-11-03 17:45:44 +05:30
abhisheks b5f236857c refactor: update product images preview styles 2023-11-03 17:44:55 +05:30
abhisheks 03d5f057ec refactor: update product price styles 2023-11-03 17:43:54 +05:30
abhisheks 0a732ef6e4 refactor: add custom hook to add actions on product page 2023-11-03 17:43:36 +05:30
Dinesh Salunke 64f76a536b refactor: cleanup and move the sorting dropdown to right 2023-11-03 16:28:47 +05:30
Dinesh Salunke 4106adbd65 refactor: dropdown for the sort order working 2023-11-03 16:28:34 +05:30
Dinesh Salunke c3bae354aa refactor: updated the themes 2023-11-03 16:27:59 +05:30
Dinesh Salunke c996722a9a refactor: use normal weight as default 2023-11-03 16:27:51 +05:30
138 changed files with 14273 additions and 2047 deletions

1
_dev/custom.css Normal file
View File

@ -0,0 +1 @@
@import "./node_modules/jquery-offcanvas/dist/jquery-offcanvas.min.css"

139
_dev/elegance.css Normal file → Executable file
View File

@ -4,13 +4,142 @@
body { body {
@apply bg-white; @apply bg-white;
@apply text-gray-700; @apply text-gray-600;
@apply font-medium; @apply font-light;
} }
.icon-tabler { a {
@apply text-gray-600;
}
a:hover {
@apply text-blue-900;
@apply underline;
@apply underline-offset-2;
}
.ti, .icon-tabler {
stroke-width: 1px; stroke-width: 1px;
fill: none; fill: none;
@apply text-gray-700; @apply text-gray-500;
@apply stroke-gray-700; @apply stroke-gray-500;
} }
a:hover .ti, a:hover .icon-tabler {
@apply stroke-blue-900;
}
ul {
@apply !list-inside;
}
input[type="radio"],input[type="checkbox"] {
@apply focus:ring-transparent;
}
.wrapper {
max-width: 50rem;
width: 100%;
margin: 0 auto;
}
.tabs {
position: relative;
height: 14.75rem;
}
.tabs::before,
.tabs::after {
content: "";
display: table;
}
.tabs::after {
clear: both;
}
.tab {
float: left;
}
.tab-switch {
display: none;
}
.tab-label {
position: relative;
display: block;
line-height: 2.75em;
height: 3em;
padding: 0 1.618em;
color: #000000;
cursor: pointer;
top: 0;
transition: all 0.25s;
border-bottom: #000000;
width: 120px;
text-align: center;
}
.tab-label:hover {
top: -0.25rem;
transition: top 0.25s;
}
.tab-content {
height: 12rem;
position: absolute;
z-index: 1;
top: 2.75em;
left: 0;
padding: 1.618rem;
background: #fff;
color: #2c3e50;
opacity: 0;
transition: all 0.35s;
}
.tab-switch:checked + .tab-label {
background: #fff;
color: #ffffff;
border-bottom: 0;
transition: all 0.35s;
z-index: 1;
top: -0.0625rem;
background-color: rgb(23 37 84);
}
.tab-switch:checked + label + .tab-content {
z-index: 2;
opacity: 1;
transition: all 0.35s;
}
.mainBody::-webkit-scrollbar {
-webkit-appearance: none;
}
.mainBody::-webkit-scrollbar:vertical {
width: 11px;
}
.mainBody::-webkit-scrollbar-thumb {
border-radius: 8px;
border: 2px solid white; /* should match background, can't be transparent */
background-color: rgba(0, 0, 0, .5);
}
.mainBody::-webkit-scrollbar-track {
background-color: #fff;
border-radius: 8px;
}
.mainBody {
height: 250px;
background-color: #ddd;
padding: 24px;
overflow: scroll;
border: 2px solid #000;
}
.pop-up{
display: none;
overflow-y:auto;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 70%;
background-color: white;
padding: 20px; z-index: 9999;
box-shadow: 0 0 0 9999px #000000b0;
}

400
_dev/js/cart.js Normal file
View File

@ -0,0 +1,400 @@
import $ from "jquery";
import prestashop from "prestashop";
import debounce from "./components/debounce";
prestashop.cart = prestashop.cart || {};
prestashop.cart.active_inputs = null;
const spinnerSelector = 'input[name="product-quantity-spin"]';
let hasError = false;
let isUpdateOperation = false;
let errorMsg = "";
const CheckUpdateQuantityOperations = {
switchErrorStat: () => {
/**
* if errorMsg is not empty or if notifications are shown, we have error to display
* if hasError is true, quantity was not updated : we don't disable checkout button
*/
const $checkoutBtn = $(prestashop.themeSelectors.checkout.btn);
if (
$(prestashop.themeSelectors.notifications.dangerAlert).length ||
(errorMsg !== "" && !hasError)
) {
$checkoutBtn.addClass("disabled");
}
if (errorMsg !== "") {
const strError = `
<article class="alert alert-danger" role="alert" data-alert="danger">
<ul>
<li>${errorMsg}</li>
</ul>
</article>
`;
$(prestashop.themeSelectors.notifications.container).html(strError);
errorMsg = "";
isUpdateOperation = false;
if (hasError) {
// if hasError is true, quantity was not updated : allow checkout
$checkoutBtn.removeClass("disabled");
}
} else if (!hasError && isUpdateOperation) {
hasError = false;
isUpdateOperation = false;
$(prestashop.themeSelectors.notifications.container).html("");
$checkoutBtn.removeClass("disabled");
}
},
checkUpdateOperation: (resp) => {
/**
* resp.hasError can be not defined but resp.errors not empty: quantity is updated but order cannot be placed
* when resp.hasError=true, quantity is not updated
*/
const { hasError: hasErrorOccurred, errors: errorData } = resp;
hasError = hasErrorOccurred ?? false;
const errors = errorData ?? "";
// 1.7.2.x returns errors as string, 1.7.3.x returns array
if (errors instanceof Array) {
errorMsg = errors.join(" ");
} else {
errorMsg = errors;
}
isUpdateOperation = true;
},
};
/**
* Attach Bootstrap TouchSpin event handlers
*/
function createSpin() {
$.each($(spinnerSelector), (index, spinner) => {
$(spinner).TouchSpin({
min: parseInt($(spinner).attr("min"), 10),
max: 1000000,
});
});
$(prestashop.themeSelectors.touchspin).off("touchstart.touchspin");
CheckUpdateQuantityOperations.switchErrorStat();
}
const preventCustomModalOpen = (event) => {
if (window.shouldPreventModal) {
event.preventDefault();
return false;
}
return true;
};
$(function () {
const productLineInCartSelector =
prestashop.themeSelectors.cart.productLineQty;
const promises = [];
prestashop.on("updatedCart", () => {
window.shouldPreventModal = false;
$(prestashop.themeSelectors.product.customizationModal).on(
"show.bs.modal",
(modalEvent) => {
preventCustomModalOpen(modalEvent);
},
);
createSpin();
});
createSpin();
const $body = $("body");
function isTouchSpin(namespace) {
return namespace === "on.startupspin" || namespace === "on.startdownspin";
}
function shouldIncreaseProductQuantity(namespace) {
return namespace === "on.startupspin";
}
function findCartLineProductQuantityInput($target) {
const $input = $target
.parents(prestashop.themeSelectors.cart.touchspin)
.find(productLineInCartSelector);
if ($input.is(":focus")) {
return null;
}
return $input;
}
function camelize(subject) {
const actionTypeParts = subject.split("-");
let i;
let part;
let camelizedSubject = "";
for (i = 0; i < actionTypeParts.length; i += 1) {
part = actionTypeParts[i];
if (i !== 0) {
part = part.substring(0, 1).toUpperCase() + part.substring(1);
}
camelizedSubject += part;
}
return camelizedSubject;
}
function parseCartAction($target, namespace) {
if (!isTouchSpin(namespace)) {
return {
url: $target.attr("href"),
type: camelize($target.data("link-action")),
};
}
const $input = findCartLineProductQuantityInput($target);
if (!$input) {
return false;
}
let cartAction = {};
if (shouldIncreaseProductQuantity(namespace)) {
cartAction = {
url: $input.data("up-url"),
type: "increaseProductQuantity",
};
} else {
cartAction = {
url: $input.data("down-url"),
type: "decreaseProductQuantity",
};
}
return cartAction;
}
const abortPreviousRequests = () => {
let promise;
while (promises.length > 0) {
promise = promises.pop();
promise.abort();
}
};
const getTouchSpinInput = ($button) =>
$($button.parents(prestashop.themeSelectors.cart.touchspin).find("input"));
$(prestashop.themeSelectors.product.customizationModal).on(
"show.bs.modal",
(modalEvent) => {
preventCustomModalOpen(modalEvent);
},
);
const handleCartAction = (event) => {
abortPreviousRequests();
window.shouldPreventModal = true;
event.preventDefault();
const $target = $(event.currentTarget);
const { dataset } = event.currentTarget;
const cartAction = parseCartAction($target, event.namespace);
const requestData = {
ajax: "1",
action: "update",
};
if (!cartAction) {
return;
}
$.ajax({
url: cartAction.url,
method: "POST",
data: requestData,
dataType: "json",
beforeSend(jqXHR) {
promises.push(jqXHR);
},
})
.then((resp) => {
const $quantityInput = getTouchSpinInput($target);
CheckUpdateQuantityOperations.checkUpdateOperation(resp);
$quantityInput.val(resp.quantity);
// Refresh cart preview
prestashop.emit("updateCart", {
reason: dataset,
resp,
});
})
.fail((resp) => {
prestashop.emit("handleError", {
eventType: "updateProductInCart",
resp,
cartAction: cartAction.type,
});
});
};
$body.on("click", prestashop.themeSelectors.cart.actions, handleCartAction);
function sendUpdateQuantityInCartRequest(
updateQuantityInCartUrl,
requestData,
$target,
) {
abortPreviousRequests();
window.shouldPreventModal = true;
return $.ajax({
url: updateQuantityInCartUrl,
method: "POST",
data: requestData,
dataType: "json",
beforeSend(jqXHR) {
promises.push(jqXHR);
},
})
.then((resp) => {
CheckUpdateQuantityOperations.checkUpdateOperation(resp);
$target.val(resp.quantity);
const dataset = $target && $target.dataset ? $target.dataset : resp;
// Refresh cart preview
prestashop.emit("updateCart", {
reason: dataset,
resp,
});
})
.fail((resp) => {
prestashop.emit("handleError", {
eventType: "updateProductQuantityInCart",
resp,
});
});
}
function getQuantityChangeType($quantity) {
return $quantity > 0 ? "up" : "down";
}
function getRequestData(quantity) {
return {
ajax: "1",
qty: Math.abs(quantity),
action: "update",
op: getQuantityChangeType(quantity),
};
}
function updateProductQuantityInCart(event) {
const $target = $(event.currentTarget);
const updateQuantityInCartUrl = $target.data("update-url");
const baseValue = $target.attr("value");
// There should be a valid product quantity in cart
const targetValue = $target.val();
/* eslint-disable */
if (
targetValue != parseInt(targetValue, 10) ||
targetValue < 0 ||
isNaN(targetValue)
) {
window.shouldPreventModal = false;
$target.val(baseValue);
return;
}
/* eslint-enable */
// There should be a new product quantity in cart
const qty = targetValue - baseValue;
if (qty === 0) {
return;
}
if (targetValue === "0") {
$target
.closest(".product-line-actions")
.find('[data-link-action="delete-from-cart"]')
.click();
} else {
$target.attr("value", targetValue);
sendUpdateQuantityInCartRequest(
updateQuantityInCartUrl,
getRequestData(qty),
$target,
);
}
}
$body.on(
"touchspin.on.stopspin",
spinnerSelector,
debounce(updateProductQuantityInCart),
);
$body.on("focusout keyup", productLineInCartSelector, (event) => {
if (event.type === "keyup") {
if (event.keyCode === 13) {
isUpdateOperation = true;
updateProductQuantityInCart(event);
}
return false;
}
if (!isUpdateOperation) {
updateProductQuantityInCart(event);
}
return false;
});
const $timeoutEffect = 400;
$body.on(
"hidden.bs.collapse",
prestashop.themeSelectors.cart.promoCode,
() => {
$(prestashop.themeSelectors.cart.displayPromo).show($timeoutEffect);
},
);
$body.on("click", prestashop.themeSelectors.cart.promoCodeButton, (event) => {
event.preventDefault();
$(prestashop.themeSelectors.cart.promoCode).collapse("toggle");
});
$body.on("click", prestashop.themeSelectors.cart.displayPromo, (event) => {
$(event.currentTarget).hide($timeoutEffect);
});
$body.on("click", prestashop.themeSelectors.cart.discountCode, (event) => {
event.stopPropagation();
const $code = $(event.currentTarget);
const $discountInput = $(prestashop.themeSelectors.cart.discountName);
$discountInput.val($code.text());
// Show promo code field
$(prestashop.themeSelectors.cart.promoCode).collapse("show");
$(prestashop.themeSelectors.cart.displayPromo).hide($timeoutEffect);
return false;
});
});

83
_dev/js/checkout.js Normal file
View File

@ -0,0 +1,83 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
import prestashop from 'prestashop';
function setUpCheckout() {
$(prestashop.themeSelectors.checkout.termsLink).on('click', (event) => {
event.preventDefault();
let url = $(event.target).attr('href');
if (url) {
// TODO: Handle request if no pretty URL
url += '?content_only=1';
$.get(url, (content) => {
$(prestashop.themeSelectors.modal)
.find(prestashop.themeSelectors.modalContent)
.html($(content).find('.page-cms').contents());
}).fail((resp) => {
prestashop.emit('handleError', {eventType: 'clickTerms', resp});
});
}
$(prestashop.themeSelectors.modal).modal('show');
});
$(prestashop.themeSelectors.checkout.giftCheckbox).on('click', () => {
$('#gift').slideToggle();
});
}
function toggleImage() {
// Arrow show/hide details Checkout page
$(prestashop.themeSelectors.checkout.imagesLink).on('click', function () {
const icon = $(this).find('i.material-icons');
if (icon.text() === 'expand_more') {
icon.text('expand_less');
} else {
icon.text('expand_more');
}
});
}
$(function() {
if ($('body#checkout').length === 1) {
setUpCheckout();
toggleImage();
}
$('.tabs').simpletabs()
prestashop.on('updatedDeliveryForm', (params) => {
if (typeof params.deliveryOption === 'undefined' || params.deliveryOption.length === 0) {
return;
}
// Hide all carrier extra content ...
$(prestashop.themeSelectors.checkout.carrierExtraContent).hide();
// and show the one related to the selected carrier
params.deliveryOption.next(prestashop.themeSelectors.checkout.carrierExtraContent).slideDown();
});
});

View File

@ -0,0 +1,91 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import prestashop from 'prestashop';
import $ from 'jquery';
import 'jquery-toast-plugin';
import 'jquery-toast-plugin/dist/jquery.toast.min.css';
$(() => {
prestashop.blockcart = prestashop.blockcart || {};
const showModal = prestashop.blockcart.showModal
|| function (modal) {
const $body = $('body');
$body.append(modal);
$('#blockcart-modal').modal();
console.log('called');
$body.one('click', '#blockcart-modal', (event) => {
if (event.target.id === 'blockcart-modal') {
$.modal.close();
}
});
};
prestashop.on('updateCart', (event) => {
const refreshURL = $('.blockcart').data('refresh-url');
let requestData = {};
if (
event
&& event.reason
&& typeof event.resp !== 'undefined'
&& !event.resp.hasError
) {
requestData = {
id_customization: event.reason.idCustomization,
id_product_attribute: event.reason.idProductAttribute,
id_product: event.reason.idProduct,
action: event.reason.linkAction,
};
}
if (event && event.resp && event.resp.hasError) {
prestashop.emit('showErrorNextToAddtoCartButton', {
errorMessage: event.resp.errors.join('<br/>'),
});
}
$.post(refreshURL, requestData)
.then((resp) => {
$('.blockcart').replaceWith($(resp.preview).find('.blockcart'));
if (resp.modal) {
$.toast({
heading: 'Added to Cart',
text: 'You can checkout or continue shopping.',
position: {
top: '100px',
right: '20px',
},
bgColor: '#ffffff',
textColor: '#111827',
loaderBg: '#172554',
class: 'rounded-none border border-gray-200',
});
}
})
.fail((resp) => {
prestashop.emit('handleError', {
eventType: 'updateShoppingCart',
resp,
});
});
});
});

View File

@ -1,11 +1,11 @@
<?php
/** /**
* 2007-2019 PrestaShop and Contributors * Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
* *
* NOTICE OF LICENSE * NOTICE OF LICENSE
* *
* This source file is subject to the Academic Free License 3.0 (AFL-3.0) * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt. * that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL: * It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0 * https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to * If you did not receive a copy of the license and are unable to
@ -16,20 +16,18 @@
* *
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your * versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information. * needs please refer to https://devdocs.prestashop.com/ for more information.
* *
* @author PrestaShop SA <contact@prestashop.com> * @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors * @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/ */
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); export default function debounce(func, timeout = 300) {
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); let timer;
header("Cache-Control: no-store, no-cache, must-revalidate"); return (...args) => {
header("Cache-Control: post-check=0, pre-check=0", false); clearTimeout(timer);
header("Pragma: no-cache"); timer = setTimeout(() => { func.apply(this, args); }, timeout);
};
header("Location: ../"); }
exit;

View File

@ -0,0 +1,59 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
export default class DropDown {
constructor(el) {
this.el = el;
}
init() {
this.el.on('show.bs.dropdown', (e, el) => {
if (el) {
$(`#${el}`).find('.dropdown-menu').first().stop(true, true)
.slideDown();
} else {
$(e.target).find('.dropdown-menu').first().stop(true, true)
.slideDown();
}
});
this.el.on('hide.bs.dropdown', (e, el) => {
if (el) {
$(`#${el}`).find('.dropdown-menu').first().stop(true, true)
.slideUp();
} else {
$(e.target).find('.dropdown-menu').first().stop(true, true)
.slideUp();
}
});
this.el.find('select.link').each((idx, el) => {
$(el).on('change', function () {
window.location = $(this).val();
});
});
}
}

View File

@ -0,0 +1,55 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
export default class Form {
init() {
this.parentFocus();
this.togglePasswordVisibility();
}
parentFocus() {
$('.js-child-focus').on('focus', function () {
$(this).closest('.js-parent-focus').addClass('focus');
});
$('.js-child-focus').on('focusout', function () {
$(this).closest('.js-parent-focus').removeClass('focus');
});
}
togglePasswordVisibility() {
$('button[data-action="show-password"]').on('click', function () {
const elm = $(this).closest('.input-group').children('input.js-visible-password');
if (elm.attr('type') === 'password') {
elm.attr('type', 'text');
$(this).text($(this).data('textHide'));
} else {
elm.attr('type', 'password');
$(this).text($(this).data('textShow'));
}
});
}
}

View File

@ -0,0 +1,47 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
export default class ProductMinitature {
init() {
$('.js-product-miniature').each((index, element) => {
// Limit number of shown colors
if ($(element).find('.color').length > 5) {
let count = 0;
$(element)
.find('.color')
.each((colorIndex, colorElement) => {
if (colorIndex > 4) {
$(colorElement).hide();
count += 1;
}
});
$(element).find('.js-count').append(`+${count}`);
}
});
}
}

View File

@ -0,0 +1,97 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
// eslint-disable-next-line
import 'velocity-animate';
// import updateSources from 'update-sources';
export default class ProductSelect {
init() {
const MAX_THUMBS = 5;
const $arrows = $('.js-modal-arrows');
const $thumbnails = $('.js-modal-product-images');
$('body')
.on('click', '.js-modal-thumb', (event) => {
// Swap active classes on thumbnail
if ($('.js-modal-thumb').hasClass('selected')) {
$('.js-modal-thumb').removeClass('selected');
}
$(event.currentTarget).addClass('selected');
// Get data from thumbnail and update cover src, alt and title
$(prestashop.themeSelectors.product.modalProductCover).attr('src', $(event.target).data('image-large-src'));
$(prestashop.themeSelectors.product.modalProductCover).attr('title', $(event.target).attr('title'));
$(prestashop.themeSelectors.product.modalProductCover).attr('alt', $(event.target).attr('alt'));
// Get data from thumbnail and update cover sources
// updateSources(
// $(prestashop.themeSelectors.product.modalProductCover),
// $(event.target).data('image-large-sources'),
// );
})
.on('click', 'aside#thumbnails', (event) => {
if (event.target.id === 'thumbnails') {
$('#product-modal').modal('hide');
}
});
if ($('.js-modal-product-images li').length <= MAX_THUMBS) {
$arrows.css('opacity', '.2');
} else {
$arrows.on('click', (event) => {
if ($(event.target).hasClass('arrow-up') && $thumbnails.position().top < 0) {
this.move('up');
$('.js-modal-arrow-down').css('opacity', '1');
} else if (
$(event.target).hasClass('arrow-down')
&& $thumbnails.position().top + $thumbnails.height() > $('.js-modal-mask').height()
) {
this.move('down');
$('.js-modal-arrow-up').css('opacity', '1');
}
});
}
}
move(direction) {
const THUMB_MARGIN = 10;
const $thumbnails = $('.js-modal-product-images');
const thumbHeight = $('.js-modal-product-images li img').height() + THUMB_MARGIN;
const currentPosition = $thumbnails.position().top;
$thumbnails.velocity(
{
translateY: direction === 'up' ? currentPosition + thumbHeight : currentPosition - thumbHeight,
},
() => {
if ($thumbnails.position().top >= 0) {
$('.js-modal-arrow-up').css('opacity', '.2');
} else if ($thumbnails.position().top + $thumbnails.height() <= $('.js-modal-mask').height()) {
$('.js-modal-arrow-down').css('opacity', '.2');
}
},
);
}
}

View File

@ -0,0 +1,80 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
import prestashop from 'prestashop';
import DropDown from './drop-down';
export default class TopMenu extends DropDown {
init() {
let elmtClass;
const self = this;
this.el.find('li').on('mouseenter mouseleave', (e) => {
if (this.el.parent().hasClass('mobile')) {
return;
}
const currentTargetClass = $(e.currentTarget).attr('class');
if (elmtClass !== currentTargetClass) {
const classesSelected = Array.prototype.slice
.call(e.currentTarget.classList)
.map((elem) => (typeof elem === 'string' ? `.${elem}` : false));
elmtClass = classesSelected.join('');
if (elmtClass && $(e.target).data('depth') === 0) {
$(`${elmtClass} .js-sub-menu`).css({
top: $(`${elmtClass}`).height() + $(`${elmtClass}`).position().top,
});
}
}
});
$('#menu-icon').on('click', () => {
$('#mobile_top_menu_wrapper').toggle();
self.toggleMobileMenu();
});
this.el.on('click', (e) => {
if (this.el.parent().hasClass('mobile')) {
return;
}
e.stopPropagation();
});
prestashop.on('responsive update', () => {
$('.js-sub-menu').removeAttr('style');
self.toggleMobileMenu();
});
super.init();
}
toggleMobileMenu() {
$('#header').toggleClass('is-open');
if ($('#mobile_top_menu_wrapper').is(':visible')) {
$('#notifications, #wrapper, #footer').hide();
} else {
$('#notifications, #wrapper, #footer').show();
}
}
}

View File

@ -0,0 +1,43 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
export default function updateSources(img, sources) {
if (sources === undefined) {
return;
}
// Get source siblings of the img tag
const imgSiblingWebp = $(img).siblings('source[type="image/webp"]');
const imgSiblingAvif = $(img).siblings('source[type="image/avif"]');
// Update them if they exist and we have a source for them
if (sources.webp !== undefined && imgSiblingWebp.length) {
imgSiblingWebp.attr('srcset', sources.webp);
}
if (sources.avif !== undefined && imgSiblingAvif.length) {
imgSiblingAvif.attr('srcset', sources.avif);
}
}

View File

@ -0,0 +1,198 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import {sprintf} from 'sprintf-js';
const {passwordPolicy: PasswordPolicyMap} = prestashop.themeSelectors;
const PASSWORD_POLICY_ERROR = 'The password policy elements are undefined.';
const getPasswordStrengthFeedback = (
strength,
) => {
switch (strength) {
case 0:
return {
color: 'bg-danger',
};
case 1:
return {
color: 'bg-danger',
};
case 2:
return {
color: 'bg-warning',
};
case 3:
return {
color: 'bg-success',
};
case 4:
return {
color: 'bg-success',
};
default:
throw new Error('Invalid password strength indicator.');
}
};
const watchPassword = async (
elementInput,
feedbackContainer,
hints,
) => {
const {prestashop} = window;
const passwordValue = elementInput.value;
const elementIcon = feedbackContainer.querySelector(PasswordPolicyMap.requirementScoreIcon);
const result = await prestashop.checkPasswordScore(passwordValue);
const feedback = getPasswordStrengthFeedback(result.score);
const passwordLength = passwordValue.length;
const popoverContent = [];
$(elementInput).popover('dispose');
feedbackContainer.style.display = passwordValue === '' ? 'none' : 'block';
if (result.feedback.warning !== '') {
if (result.feedback.warning in hints) {
popoverContent.push(hints[result.feedback.warning]);
}
}
result.feedback.suggestions.forEach((suggestion) => {
if (suggestion in hints) {
popoverContent.push(hints[suggestion]);
}
});
$(elementInput).popover({
html: true,
placement: 'top',
content: popoverContent.join('<br/>'),
}).popover('show');
const passwordLengthValid = passwordLength >= parseInt(elementInput.dataset.minlength, 10)
&& passwordLength <= parseInt(elementInput.dataset.maxlength, 10);
const passwordScoreValid = parseInt(elementInput.dataset.minscore, 10) <= result.score;
feedbackContainer.querySelector(PasswordPolicyMap.requirementLengthIcon).classList.toggle(
'text-success',
passwordLengthValid,
);
elementIcon.classList.toggle(
'text-success',
passwordScoreValid,
);
// Change input border color depending on the validity
elementInput
.classList.remove('border-success', 'border-danger');
elementInput
.classList.add(passwordScoreValid && passwordLengthValid ? 'border-success' : 'border-danger');
elementInput
.classList.add('form-control', 'border');
const percentage = (result.score * 20) + 20;
const progressBar = feedbackContainer.querySelector(PasswordPolicyMap.progressBar);
// increase and decrease progress bar
if (progressBar) {
progressBar.style.width = `${percentage}%`;
progressBar.classList.remove('bg-success', 'bg-danger', 'bg-warning');
progressBar.classList.add(feedback.color);
}
};
// Not testable because it manipulates SVG elements, unsupported by JSDom
const usePasswordPolicy = (selector) => {
const elements = document.querySelectorAll(selector);
elements.forEach((element) => {
const inputColumn = element?.querySelector(PasswordPolicyMap.inputColumn);
const elementInput = element?.querySelector('input');
const templateElement = document.createElement('div');
const feedbackTemplate = document.querySelector(PasswordPolicyMap.template);
let feedbackContainer;
if (feedbackTemplate && element && inputColumn && elementInput) {
templateElement.innerHTML = feedbackTemplate.innerHTML;
inputColumn.append(templateElement);
feedbackContainer = element.querySelector(PasswordPolicyMap.container);
if (feedbackContainer) {
const hintElement = document.querySelector(PasswordPolicyMap.hint);
if (hintElement) {
const hints = JSON.parse(hintElement.innerHTML);
// eslint-disable-next-line max-len
const passwordRequirementsLength = feedbackContainer.querySelector(PasswordPolicyMap.requirementLength);
// eslint-disable-next-line max-len
const passwordRequirementsScore = feedbackContainer.querySelector(PasswordPolicyMap.requirementScore);
const passwordLengthText = passwordRequirementsLength?.querySelector('span');
const passwordRequirementsText = passwordRequirementsScore?.querySelector('span');
if (passwordLengthText && passwordRequirementsLength && passwordRequirementsLength.dataset.translation) {
passwordLengthText.innerText = sprintf(
passwordRequirementsLength.dataset.translation,
elementInput.dataset.minlength,
elementInput.dataset.maxlength,
);
}
if (passwordRequirementsText && passwordRequirementsScore && passwordRequirementsScore.dataset.translation) {
passwordRequirementsText.innerText = sprintf(
passwordRequirementsScore.dataset.translation,
hints[elementInput.dataset.minscore],
);
}
// eslint-disable-next-line max-len
elementInput.addEventListener('keyup', () => watchPassword(elementInput, feedbackContainer, hints));
elementInput.addEventListener('blur', () => {
$(elementInput).popover('dispose');
});
}
}
}
if (element) {
return {
element,
};
}
return {
error: new Error(PASSWORD_POLICY_ERROR),
};
});
};
export default usePasswordPolicy;

43
_dev/js/customer.js Normal file
View File

@ -0,0 +1,43 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
import prestashop from 'prestashop';
function initRmaItemSelector() {
$(`${prestashop.themeSelectors.order.returnForm} table thead input[type=checkbox]`).on('click', function () {
const checked = $(this).prop('checked');
$(`${prestashop.themeSelectors.order.returnForm} table tbody input[type=checkbox]`).each((_, checkbox) => {
$(checkbox).prop('checked', checked);
});
});
}
function setupCustomerScripts() {
if ($('body#order-detail')) {
initRmaItemSelector();
}
}
$(document).ready(setupCustomerScripts);

1
_dev/js/facets.js Normal file
View File

@ -0,0 +1 @@
import $ from "jquery";

25
_dev/js/lib/bootstrap-filestyle.min.js vendored Normal file

File diff suppressed because one or more lines are too long

25
_dev/js/lib/jquery.scrollbox.min.js vendored Normal file

File diff suppressed because one or more lines are too long

270
_dev/js/listing.js Normal file
View File

@ -0,0 +1,270 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
import prestashop from 'prestashop';
// eslint-disable-next-line
import "velocity-animate";
import updateSources from './components/update-sources';
import ProductMinitature from './components/product-miniature';
$(document).ready(() => {
const move = (direction) => {
const THUMB_MARGIN = 20;
const $thumbnails = $('.js-qv-product-images');
const thumbHeight = $('.js-qv-product-images li img').height() + THUMB_MARGIN;
const currentPosition = $thumbnails.position().top;
$thumbnails.velocity(
{
translateY:
direction === 'up'
? currentPosition + thumbHeight
: currentPosition - thumbHeight,
},
() => {
if ($thumbnails.position().top >= 0) {
$('.arrow-up').css('opacity', '.2');
} else if (
$thumbnails.position().top + $thumbnails.height()
<= $('.js-qv-mask').height()
) {
$('.arrow-down').css('opacity', '.2');
}
},
);
};
const productConfig = (qv) => {
const MAX_THUMBS = 4;
const $arrows = $(prestashop.themeSelectors.product.arrows);
const $thumbnails = qv.find('.js-qv-product-images');
$(prestashop.themeSelectors.product.thumb).on('click', (event) => {
// Swap active classes on thumbnail
if ($(prestashop.themeSelectors.product.thumb).hasClass('selected')) {
$(prestashop.themeSelectors.product.thumb).removeClass('selected');
}
$(event.currentTarget).addClass('selected');
// Get data from thumbnail and update cover src, alt and title
$(prestashop.themeSelectors.product.cover).attr(
'src',
$(event.target).data('image-large-src'),
);
$(prestashop.themeSelectors.product.cover).attr(
'alt',
$(event.target).attr('alt'),
);
$(prestashop.themeSelectors.product.cover).attr(
'title',
$(event.target).attr('title'),
);
// Get data from thumbnail and update cover sources
updateSources(
$(prestashop.themeSelectors.product.cover),
$(event.target).data('image-large-sources'),
);
});
if ($thumbnails.find('li').length <= MAX_THUMBS) {
$arrows.hide();
} else {
$arrows.on('click', (event) => {
if (
$(event.target).hasClass('arrow-up')
&& $('.js-qv-product-images').position().top < 0
) {
move('up');
$(prestashop.themeSelectors.arrowDown).css('opacity', '1');
} else if (
$(event.target).hasClass('arrow-down')
&& $thumbnails.position().top + $thumbnails.height()
> $('.js-qv-mask').height()
) {
move('down');
$(prestashop.themeSelectors.arrowUp).css('opacity', '1');
}
});
}
qv.find(prestashop.selectors.quantityWanted).TouchSpin({
verticalbuttons: true,
min: 1,
max: 1000000,
});
$(prestashop.themeSelectors.touchspin).off('touchstart.touchspin');
};
prestashop.on('clickQuickView', (elm) => {
const data = {
action: 'quickview',
id_product: elm.dataset.idProduct,
id_product_attribute: elm.dataset.idProductAttribute,
};
$.post(prestashop.urls.pages.product, data, null, 'json')
.then((resp) => {
$('body').append(resp.quickview_html);
const productModal = $(
`#quickview-modal-${resp.product.id}-${resp.product.id_product_attribute}`,
);
productModal.modal('show');
productConfig(productModal);
productModal.on('hidden.bs.modal', () => {
productModal.remove();
});
})
.fail((resp) => {
prestashop.emit('handleError', {
eventType: 'clickQuickView',
resp,
});
});
});
$('body').on(
'click',
prestashop.themeSelectors.listing.searchFilterToggler,
() => {
$(prestashop.themeSelectors.listing.searchFiltersWrapper).removeClass(
'hidden-sm-down',
);
$(prestashop.themeSelectors.contentWrapper).addClass('hidden-sm-down');
$(prestashop.themeSelectors.footer).addClass('hidden-sm-down');
},
);
$(
`${prestashop.themeSelectors.listing.searchFilterControls} ${prestashop.themeSelectors.clear}`,
).on('click', () => {
$(prestashop.themeSelectors.listing.searchFiltersWrapper).addClass(
'hidden-sm-down',
);
$(prestashop.themeSelectors.contentWrapper).removeClass('hidden-sm-down');
$(prestashop.themeSelectors.footer).removeClass('hidden-sm-down');
});
$(`${prestashop.themeSelectors.listing.searchFilterControls} .ok`).on(
'click',
() => {
$(prestashop.themeSelectors.listing.searchFiltersWrapper).addClass(
'hidden-sm-down',
);
$(prestashop.themeSelectors.contentWrapper).removeClass('hidden-sm-down');
$(prestashop.themeSelectors.footer).removeClass('hidden-sm-down');
},
);
const parseSearchUrl = function (event) {
if (event.target.dataset.searchUrl !== undefined) {
return event.target.dataset.searchUrl;
}
if ($(event.target).parent()[0].dataset.searchUrl === undefined) {
throw new Error('Can not parse search URL');
}
return $(event.target).parent()[0].dataset.searchUrl;
};
function updateProductListDOM(data) {
$(prestashop.themeSelectors.listing.searchFilters).replaceWith(
data.rendered_facets,
);
$(prestashop.themeSelectors.listing.activeSearchFilters).replaceWith(
data.rendered_active_filters,
);
$(prestashop.themeSelectors.listing.listTop).replaceWith(
data.rendered_products_top,
);
const renderedProducts = $(data.rendered_products);
const productSelectors = $(prestashop.themeSelectors.listing.product);
if (productSelectors.length > 0) {
productSelectors
.removeClass()
.addClass(productSelectors.first().attr('class'));
} else {
productSelectors
.removeClass()
.addClass(renderedProducts.first().attr('class'));
}
$(prestashop.themeSelectors.listing.list).replaceWith(renderedProducts);
$(prestashop.themeSelectors.listing.listBottom).replaceWith(
data.rendered_products_bottom,
);
if (data.rendered_products_header) {
$(prestashop.themeSelectors.listing.listHeader).replaceWith(
data.rendered_products_header,
);
}
const productMinitature = new ProductMinitature();
productMinitature.init();
}
$('body').on(
'change',
`${prestashop.themeSelectors.listing.searchFilters} input[data-search-url]`,
(event) => {
prestashop.emit('updateFacets', parseSearchUrl(event));
},
);
$('body').on(
'click',
prestashop.themeSelectors.listing.searchFiltersClearAll,
(event) => {
prestashop.emit('updateFacets', parseSearchUrl(event));
},
);
$('body').on(
'click',
prestashop.themeSelectors.listing.searchLink,
(event) => {
event.preventDefault();
prestashop.emit('updateFacets', $(event.target).closest('a').get(0).href);
},
);
window.addEventListener('popstate', (e) => {
if (e.state && e.state.current_url) {
window.location.href = e.state.current_url;
}
});
$('body').on(
'change',
`${prestashop.themeSelectors.listing.searchFilters} select`,
(event) => {
const form = $(event.target).closest('form');
prestashop.emit('updateFacets', `?${form.serialize()}`);
},
);
prestashop.on('updateProductList', (data) => {
updateProductListDOM(data);
window.scrollTo(0, 0);
});
});

191
_dev/js/product.js Normal file
View File

@ -0,0 +1,191 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
import prestashop from 'prestashop';
import ProductSelect from './components/product-select';
import updateSources from './components/update-sources';
$(document).ready(() => {
function coverImage() {
const productCover = $(prestashop.themeSelectors.product.cover);
const modalProductCover = $(prestashop.themeSelectors.product.modalProductCover);
let thumbSelected = $(prestashop.themeSelectors.product.selected);
const swipe = (selectedThumb, thumbParent) => {
const newSelectedThumb = thumbParent.find(prestashop.themeSelectors.product.thumb);
// Swap active classes on thumbnail
selectedThumb.removeClass('selected');
newSelectedThumb.addClass('selected');
// Update sources of both cover and modal cover
modalProductCover.prop('src', newSelectedThumb.data('image-large-src'));
productCover.prop('src', newSelectedThumb.data('image-medium-src'));
// Get data from thumbnail and update cover src, alt and title
productCover.attr('title', newSelectedThumb.attr('title'));
modalProductCover.attr('title', newSelectedThumb.attr('title'));
productCover.attr('alt', newSelectedThumb.attr('alt'));
modalProductCover.attr('alt', newSelectedThumb.attr('alt'));
// Get data from thumbnail and update cover sources
updateSources(productCover, newSelectedThumb.data('image-medium-sources'));
updateSources(modalProductCover, newSelectedThumb.data('image-large-sources'));
};
$(prestashop.themeSelectors.product.thumb).on('click', (event) => {
thumbSelected = $(prestashop.themeSelectors.product.selected);
swipe(thumbSelected, $(event.target).closest(prestashop.themeSelectors.product.thumbContainer));
});
productCover.swipe({
swipe: (event, direction) => {
thumbSelected = $(prestashop.themeSelectors.product.selected);
const parentThumb = thumbSelected.closest(prestashop.themeSelectors.product.thumbContainer);
if (direction === 'right') {
if (parentThumb.prev().length > 0) {
swipe(thumbSelected, parentThumb.prev());
} else if (parentThumb.next().length > 0) {
swipe(thumbSelected, parentThumb.next());
}
} else if (direction === 'left') {
if (parentThumb.next().length > 0) {
swipe(thumbSelected, parentThumb.next());
} else if (parentThumb.prev().length > 0) {
swipe(thumbSelected, parentThumb.prev());
}
}
},
allowPageScroll: 'vertical',
});
}
function imageScrollBox() {
if ($('#main .js-qv-product-images li').length > 2) {
$('#main .js-qv-mask').addClass('scroll');
$('.scroll-box-arrows').addClass('scroll');
$('#main .js-qv-mask').scrollbox({
direction: 'h',
distance: 113,
autoPlay: false,
});
$('.scroll-box-arrows .left').click(() => {
$('#main .js-qv-mask').trigger('backward');
});
$('.scroll-box-arrows .right').click(() => {
$('#main .js-qv-mask').trigger('forward');
});
} else {
$('#main .js-qv-mask').removeClass('scroll');
$('.scroll-box-arrows').removeClass('scroll');
}
}
function createInputFile() {
$(prestashop.themeSelectors.fileInput).on('change', (event) => {
const target = $(event.currentTarget)[0];
const file = (target) ? target.files[0] : null;
if (target && file) {
$(target).prev().text(file.name);
}
});
}
function createProductSpin() {
const $quantityInput = $(prestashop.selectors.quantityWanted);
$quantityInput.TouchSpin({
verticalbuttons: true,
verticalupclass: 'material-icons touchspin-up',
verticaldownclass: 'material-icons touchspin-down',
buttondown_class: 'btn btn-touchspin js-touchspin',
buttonup_class: 'btn btn-touchspin js-touchspin',
min: parseInt($quantityInput.attr('min'), 10),
max: 1000000,
});
$(prestashop.themeSelectors.touchspin).off('touchstart.touchspin');
$quantityInput.on('focusout', () => {
if ($quantityInput.val() === '' || $quantityInput.val() < $quantityInput.attr('min')) {
$quantityInput.val($quantityInput.attr('min'));
$quantityInput.trigger('change');
}
});
$('body').on('change keyup', prestashop.selectors.quantityWanted, (e) => {
if ($quantityInput.val() !== '') {
$(e.currentTarget).trigger('touchspin.stopspin');
prestashop.emit('updateProduct', {
eventType: 'updatedProductQuantity',
event: e,
});
}
});
}
function addJsProductTabActiveSelector() {
const nav = $(prestashop.themeSelectors.product.tabs);
nav.on('show.bs.tab', (e) => {
const target = $(e.target);
target.addClass(prestashop.themeSelectors.product.activeNavClass);
$(target.attr('href')).addClass(prestashop.themeSelectors.product.activeTabClass);
});
nav.on('hide.bs.tab', (e) => {
const target = $(e.target);
target.removeClass(prestashop.themeSelectors.product.activeNavClass);
$(target.attr('href')).removeClass(prestashop.themeSelectors.product.activeTabClass);
});
}
createProductSpin();
createInputFile();
coverImage();
imageScrollBox();
addJsProductTabActiveSelector();
prestashop.on('updatedProduct', (event) => {
createInputFile();
coverImage();
if (event && event.product_minimal_quantity) {
const minimalProductQuantity = parseInt(event.product_minimal_quantity, 10);
const quantityInputSelector = prestashop.selectors.quantityWanted;
const quantityInput = $(quantityInputSelector);
// @see http://www.virtuosoft.eu/code/bootstrap-touchspin/ about Bootstrap TouchSpin
quantityInput.trigger('touchspin.updatesettings', {
min: minimalProductQuantity,
});
}
imageScrollBox();
$($(prestashop.themeSelectors.product.activeTabs).attr('href')).addClass('active').removeClass('fade');
$(prestashop.themeSelectors.product.imagesModal).replaceWith(event.product_images_modal);
const productSelect = new ProductSelect();
productSelect.init();
});
});

80
_dev/js/responsive.js Normal file
View File

@ -0,0 +1,80 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import $ from 'jquery';
import prestashop from 'prestashop';
prestashop.responsive = prestashop.responsive || {};
prestashop.responsive.current_width = window.innerWidth;
prestashop.responsive.min_width = 768;
prestashop.responsive.mobile = prestashop.responsive.current_width < prestashop.responsive.min_width;
function swapChildren(obj1, obj2) {
const temp = obj2.children().detach();
obj2.empty().append(obj1.children().detach());
obj1.append(temp);
}
function toggleMobileStyles() {
if (prestashop.responsive.mobile) {
$("*[id^='_desktop_']").each((idx, el) => {
const target = $(`#${el.id.replace('_desktop_', '_mobile_')}`);
if (target.length) {
swapChildren($(el), target);
}
});
} else {
$("*[id^='_mobile_']").each((idx, el) => {
const target = $(`#${el.id.replace('_mobile_', '_desktop_')}`);
if (target.length) {
swapChildren($(el), target);
}
});
}
prestashop.emit('responsive update', {
mobile: prestashop.responsive.mobile,
});
}
$(window).on('resize', () => {
const cw = prestashop.responsive.current_width;
const mw = prestashop.responsive.min_width;
const w = window.innerWidth;
const toggle = (cw >= mw && w < mw) || (cw < mw && w >= mw);
prestashop.responsive.current_width = w;
prestashop.responsive.mobile = prestashop.responsive.current_width < prestashop.responsive.min_width;
if (toggle) {
toggleMobileStyles();
}
});
$(document).ready(() => {
if (prestashop.responsive.mobile) {
toggleMobileStyles();
}
});

109
_dev/js/selectors.js Normal file
View File

@ -0,0 +1,109 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
import prestashop from 'prestashop';
import $ from 'jquery';
const passwordPolicy = {
template: '#password-feedback',
hint: '.js-hint-password',
container: '.password-strength-feedback',
strengthText: '.password-strength-text',
requirementScore: '.password-requirements-score',
requirementLength: '.password-requirements-length',
requirementScoreIcon: '.password-requirements-score i',
requirementLengthIcon: '.password-requirements-length i',
progressBar: '.progress-bar',
inputColumn: '.js-input-column',
};
prestashop.themeSelectors = {
product: {
tabs: '.tabs .nav-link',
activeNavClass: 'js-product-nav-active',
activeTabClass: 'js-product-tab-active',
activeTabs: '.tabs .nav-link.active, .js-product-nav-active',
imagesModal: '.js-product-images-modal',
thumb: '.js-thumb',
thumbContainer: '.thumb-container, .js-thumb-container',
arrows: '.js-arrows',
selected: '.selected, .js-thumb-selected',
modalProductCover: '.js-modal-product-cover',
cover: '.js-qv-product-cover',
customizationModal: '.js-customization-modal',
},
listing: {
searchFilterToggler: '#search_filter_toggler, .js-search-toggler',
searchFiltersWrapper: '#search_filters_wrapper',
searchFilterControls: '#search_filter_controls',
searchFilters: '#search_filters',
activeSearchFilters: '#js-active-search-filters',
listTop: '#js-product-list-top',
product: '.js-product',
list: '#js-product-list',
listBottom: '#js-product-list-bottom',
listHeader: '#js-product-list-header',
searchFiltersClearAll: '.js-search-filters-clear-all',
searchLink: '.js-search-link',
},
order: {
returnForm: '#order-return-form, .js-order-return-form',
},
arrowDown: '.arrow-down, .js-arrow-down',
arrowUp: '.arrow-up, .js-arrow-up',
clear: '.clear',
fileInput: '.js-file-input',
contentWrapper: '#content-wrapper, .js-content-wrapper',
footer: '#footer, .js-footer',
modalContent: '.js-modal-content',
modal: '#modal, .js-checkout-modal',
touchspin: '.js-touchspin',
checkout: {
termsLink: '.js-terms a',
giftCheckbox: '.js-gift-checkbox',
imagesLink: '.card-block .cart-summary-products p a, .js-show-details',
carrierExtraContent: '.carrier-extra-content, .js-carrier-extra-content',
btn: '.checkout a',
},
cart: {
productLineQty: '.js-cart-line-product-quantity',
quickview: '.quickview',
touchspin: '.bootstrap-touchspin',
promoCode: '#promo-code',
displayPromo: '.display-promo',
promoCodeButton: '.promo-code-button',
discountCode: '.js-discount .code',
discountName: '[name=discount_name]',
actions: '[data-link-action="delete-from-cart"], [data-link-action="remove-voucher"]',
},
notifications: {
dangerAlert: '#notifications article.alert-danger',
container: '#notifications .notifications-container',
},
passwordPolicy,
};
$(document).ready(() => {
prestashop.emit('themeSelectorsInit');
});

77
_dev/js/tabs.js Normal file
View File

@ -0,0 +1,77 @@
import $ from 'jquery'
var simpletabspluginname = 'simpletabs'
function SimpleTabsPlugin(element, options) {
this.$el = $(element)
this.$tabs = []
this.init()
}
$.extend(SimpleTabsPlugin.prototype, {
init() {
var self = this
this.$tabs = []
this.$el.find('ul > li > a').each(function() {
var $a = $(this)
var id = $a.attr('href')
if ( id.startsWith('#') ) {
id = id.replace('#', '')
var exists = self.$tabs.find(function(element) {
return element === id
})
var contentselector = '#' + id + '.tabs-content'
var content = self.$el.find(contentselector)
if ( exists ) {
exists.tab = $a
exists.content = content
} else {
self.$tabs.push({
id: id,
tab: $a,
content: content
})
}
}
})
self.$tabs.forEach(function(element) {
if (!element.tab.hasClass('active')) {
self.hide(element.id)
} else {
self.show(element.id)
}
element.tab.click(function(event) {
event.preventDefault()
self.show(element.id)
})
})
},
show(id) {
var self = this
this.$tabs.forEach(function( element ) {
self.hide(element.id)
if ( element.id === id ) {
element.tab.addClass('active').addClass('font-bold')
element.content.removeClass('hidden')
}
})
},
hide(id) {
this.$tabs.forEach(function( element ) {
if ( element.id === id ) {
element.tab.removeClass('active').removeClass('font-bold')
element.content.addClass('hidden')
}
})
},
})
$.fn.simpletabs = function(options) {
this.each(function() {
if ( !$.data(this, 'plugin_' + simpletabspluginname)) {
$.data(this, 'plugin_' + simpletabspluginname, new SimpleTabsPlugin(this, options))
}
})
}

195
_dev/js/theme.js Normal file
View File

@ -0,0 +1,195 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
/* eslint-disable */
// import 'bootstrap/dist/js/bootstrap.min';
import "jquery-modal";
import "jquery-offcanvas/dist/jquery.offcanvas.min.css";
import "tooltipster";
import "tooltipster/dist/css/tooltipster.bundle.min.css";
import "tooltipster/dist/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.css";
import touchspin from "bootstrap-touchspin";
import "jquery-touchswipe";
import "./selectors";
import "./tabs.js";
import "./responsive";
import "./checkout";
import "./customer";
import "./listing";
import "./product";
import "./cart";
import "./facets";
import prestashop from "prestashop";
import EventEmitter from "events";
import DropDown from "./components/drop-down";
import Form from "./components/form";
import usePasswordPolicy from "./components/usePasswordPolicy";
import ProductMinitature from "./components/product-miniature";
import ProductSelect from "./components/product-select";
import TopMenu from "./components/top-menu";
import "./components/block-cart";
import $ from "jquery";
import jo from "jquery-offcanvas";
jo(window, $);
touchspin(window, $);
/* eslint-enable */
// "inherit" EventEmitter
// eslint-disable-next-line
for (const i in EventEmitter.prototype) {
prestashop[i] = EventEmitter.prototype[i];
}
$(() => {
const dropDownEl = $('.js-dropdown');
const form = new Form();
const topMenuEl = $('.js-top-menu ul[data-depth="0"]');
const dropDown = new DropDown(dropDownEl);
const topMenu = new TopMenu(topMenuEl);
const productMinitature = new ProductMinitature();
const productSelect = new ProductSelect();
dropDown.init();
form.init();
topMenu.init();
productMinitature.init();
productSelect.init();
usePasswordPolicy('.field-password-policy');
$('.carousel[data-touch="true"]').swipe({
swipe(event, direction) {
if (direction === 'left') {
$(this).carousel('next');
}
if (direction === 'right') {
$(this).carousel('prev');
}
},
allowPageScroll: 'vertical',
});
$('#product-list-top-filters').offcanvas({
duration: 100,
effect: 'slide-in-over',
overlay: true,
classes: {
element: 'absolute top-0 z-50',
},
});
$('#show-filters').on('click.offcanvas', () => {
$('#product-list-top-filters').offcanvas('show');
});
$('#hide-filters').on('click.offcanvas', () => {
$('#product-list-top-filters').offcanvas('hide');
});
$('#product-list-top-filters').on('shown.offcanvas', () => {
$('#product-list-top-filters').show();
});
$('#product-list-top-filters').on('hide.offcanvas', () => {
$('#product-list-top-filters').hide();
});
function ThAccordion() {}
$.extend(ThAccordion.prototype, {
init() {},
});
$.fn.thaccordion = function () {
const selectors = {
root: '.th-accordion',
item: '.th-accordion-item',
trigger: '.th-accordion-item-trigger',
svg: '.th-accordion-item-trigger-svg',
content: '.th-accordion-item-content',
};
let selection = null;
const items = this.find(selectors.item);
const rotateClass = 'rotate-90 duration-500';
function collapseAll() {
items.each(function () {
$(this).find(selectors.content).hide(500);
$(this).find(selectors.svg).removeClass(rotateClass);
});
}
function close() {
$(selection).find(selectors.content).hide(500);
$(selection).find(selectors.svg).removeClass('rotate-90');
}
function open() {
collapseAll();
$(selection).find(selectors.content).show(500);
$(selection).find(selectors.svg).addClass(rotateClass);
}
function isOpen(item) {
return $(item).find(selectors.content).is(':visible');
}
collapseAll();
items.each(function () {
const self = this;
$(this)
.find(selectors.trigger)
.on('click', () => {
if (selection === self) {
if (isOpen(selection)) {
close();
} else {
open();
}
} else {
selection = self;
if (!isOpen(selection)) {
open();
}
}
});
});
};
$('.th-accordion').thaccordion();
$('.tooltip').tooltipster({
theme: 'tooltipster-shadow',
triggerOpen: {
click: true,
mouseenter: true,
touchstart: true,
},
delayTouch: [0, 2000],
});
$('.toggle-main-menu').on('click', () => {
$('.mobile-main-menu').toggle();
});
});

View File

@ -5,11 +5,28 @@
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"livereload": "^0.9.3", "livereload": "^0.9.3",
"tailwindcss": "^3.3.5" "tailwindcss": "^3.3.5",
"vite": "^4.5.0"
}, },
"scripts": { "scripts": {
"dev:tailwind": "tailwindcss -i ./elegance.css -o ../assets/css/theme.css --watch", "dev:tailwind": "tailwindcss -i ./elegance.css -o ../assets/css/theme.css --watch",
"dev:livereload": "livereload \"../templates/, ../modules/, ../assets/\"", "dev:livereload": "livereload \"../templates/, ../modules/, ../assets/\"",
"dev": "yarn run dev:livereload & yarn run dev:tailwind" "dev:js": "vite build --watch",
"dev": "yarn run dev:livereload & yarn run dev:tailwind & yarn run dev:js",
"build:js": "vite build"
},
"dependencies": {
"@tailwindcss/forms": "^0.5.6",
"bootstrap-touchspin": "^4.7.3",
"events": "^3.3.0",
"jquery": "3.5.1",
"jquery-modal": "^0.9.2",
"jquery-offcanvas": "^3.4.7",
"jquery-toast-plugin": "^1.3.2",
"jquery-touchswipe": "^1.6.19",
"postcss-import": "^15.1.0",
"sprintf-js": "^1.1.3",
"tooltipster": "^4.2.8",
"velocity-animate": "^1.5.2"
} }
} }

6
_dev/postcss.config.js Normal file
View File

@ -0,0 +1,6 @@
module.exports = {
plugins: {
"postcss-import": {},
tailwindcss: {},
},
};

View File

@ -4,9 +4,8 @@ module.exports = {
theme: { theme: {
fontFamily: { fontFamily: {
sans: ["Cairo"], sans: ["Cairo"],
serif: ["Cairo"] serif: ["Cairo"],
}
}, },
plugins: [], },
} plugins: [require("@tailwindcss/forms")],
};

28
_dev/vite.config.js Normal file
View File

@ -0,0 +1,28 @@
import { defineConfig } from "vite";
export default defineConfig({
build: {
sourcemap: "inline",
minify: false,
lib: {
entry: "./js/theme.js",
name: "theme",
formats: ["iife"],
fileName: function () {
return "theme.js";
},
},
outDir: "../assets/js/",
rollupOptions: {
external: ["$", "jquery", "prestashop"],
output: {
globals: {
$: "$",
jquery: "jQuery",
prestashop: "prestashop",
},
},
},
write: true,
},
});

822
_dev/yarn-error.log Normal file
View File

@ -0,0 +1,822 @@
Arguments:
/Users/dineshsalunke/.local/share/nvm/v16.20.0/bin/node /Users/dineshsalunke/.local/share/nvm/v16.20.0/bin/yarn add update-sources
PATH:
/Users/dineshsalunke/.bun/bin:/Users/dineshsalunke/.local/bin:/Users/dineshsalunke/.local/share/nvm/v16.20.0/bin:/Users/dineshsalunke/.cargo/bin:/opt/homebrew/bin:/bin:/Users/dineshsalunke/go/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/go/bin
Yarn version:
1.22.19
Node version:
16.20.0
Platform:
darwin arm64
Trace:
Error: https://registry.yarnpkg.com/update-sources: Not found
at Request.params.callback [as _callback] (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:66145:18)
at Request.self.callback (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:140890:22)
at Request.emit (node:events:513:28)
at Request.<anonymous> (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:141862:10)
at Request.emit (node:events:513:28)
at IncomingMessage.<anonymous> (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:141784:12)
at Object.onceWrapper (node:events:627:28)
at IncomingMessage.emit (node:events:525:35)
at endReadableNT (node:internal/streams/readable:1358:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
npm manifest:
{
"name": "elegance",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"devDependencies": {
"livereload": "^0.9.3",
"tailwindcss": "^3.3.5",
"vite": "^4.5.0"
},
"scripts": {
"dev:tailwind": "tailwindcss -i ./elegance.css -o ../assets/css/theme.css --watch",
"dev:livereload": "livereload \"../templates/, ../modules/, ../assets/\"",
"dev:js": "vite dev",
"dev": "yarn run dev:livereload & yarn run dev:tailwind & yarn run dev:js"
},
"dependencies": {
"bootstrap-touchspin": "^4.7.3",
"events": "^3.3.0",
"jquery": "^3.7.1",
"jquery-touchswipe": "^1.6.19",
"sprintf-js": "^1.1.3",
"velocity-animate": "^1.5.2"
}
}
yarn manifest:
No manifest
Lockfile:
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@alloc/quick-lru@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
"@esbuild/android-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
"@esbuild/android-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
"@esbuild/android-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
"@esbuild/darwin-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
"@esbuild/darwin-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
"@esbuild/freebsd-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
"@esbuild/freebsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
"@esbuild/linux-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
"@esbuild/linux-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
"@esbuild/linux-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
"@esbuild/linux-loong64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
"@esbuild/linux-mips64el@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
"@esbuild/linux-ppc64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
"@esbuild/linux-riscv64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
"@esbuild/linux-s390x@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
"@esbuild/linux-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
"@esbuild/netbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
"@esbuild/openbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
"@esbuild/sunos-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
"@esbuild/win32-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
"@esbuild/win32-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
"@esbuild/win32-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@jridgewell/gen-mapping@^0.3.2":
version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
dependencies:
"@jridgewell/set-array" "^1.0.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping" "^0.3.9"
"@jridgewell/resolve-uri@^3.1.0":
version "3.1.1"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
"@jridgewell/set-array@^1.0.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
version "1.4.15"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@^0.3.9":
version "0.3.20"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
dependencies:
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.3":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
dependencies:
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
any-promise@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
arg@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bootstrap-touchspin@^4.7.3:
version "4.7.3"
resolved "https://registry.yarnpkg.com/bootstrap-touchspin/-/bootstrap-touchspin-4.7.3.tgz#0316a3e7a390eb8811996cc14ab13ff0efb647de"
integrity sha512-VVyPKI05ybS4ciB0OJ8g4Jx4SU3rlrWa/ItSxIi7BWNVa0jUYt3eujeOiBWpkuEGukECwiAbwuzh3a+xLtxueQ==
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
braces@^3.0.2, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
camelcase-css@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
chokidar@^3.5.0, chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.6.0"
optionalDependencies:
fsevents "~2.3.2"
commander@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
didyoumean@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
dlv@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
esbuild@^0.18.10:
version "0.18.20"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6"
integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
optionalDependencies:
"@esbuild/android-arm" "0.18.20"
"@esbuild/android-arm64" "0.18.20"
"@esbuild/android-x64" "0.18.20"
"@esbuild/darwin-arm64" "0.18.20"
"@esbuild/darwin-x64" "0.18.20"
"@esbuild/freebsd-arm64" "0.18.20"
"@esbuild/freebsd-x64" "0.18.20"
"@esbuild/linux-arm" "0.18.20"
"@esbuild/linux-arm64" "0.18.20"
"@esbuild/linux-ia32" "0.18.20"
"@esbuild/linux-loong64" "0.18.20"
"@esbuild/linux-mips64el" "0.18.20"
"@esbuild/linux-ppc64" "0.18.20"
"@esbuild/linux-riscv64" "0.18.20"
"@esbuild/linux-s390x" "0.18.20"
"@esbuild/linux-x64" "0.18.20"
"@esbuild/netbsd-x64" "0.18.20"
"@esbuild/openbsd-x64" "0.18.20"
"@esbuild/sunos-x64" "0.18.20"
"@esbuild/win32-arm64" "0.18.20"
"@esbuild/win32-ia32" "0.18.20"
"@esbuild/win32-x64" "0.18.20"
events@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
fast-glob@^3.3.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.2"
merge2 "^1.3.0"
micromatch "^4.0.4"
fastq@^1.6.0:
version "1.15.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
dependencies:
reusify "^1.0.4"
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
dependencies:
to-regex-range "^5.0.1"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
glob-parent@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
dependencies:
is-glob "^4.0.3"
glob@7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
hasown@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
dependencies:
function-bind "^1.1.2"
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
dependencies:
binary-extensions "^2.0.0"
is-core-module@^2.13.0:
version "2.13.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
dependencies:
hasown "^2.0.0"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
jiti@^1.19.1:
version "1.21.0"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
jquery-touchswipe@^1.6.19:
version "1.6.19"
resolved "https://registry.yarnpkg.com/jquery-touchswipe/-/jquery-touchswipe-1.6.19.tgz#dfd5ddaec0b78212dd500d29707129b9c7fd6cd4"
integrity sha512-b0BGje9reNRU3u6ksAK9QqnX7yBRgLNe/wYG7DOfyDlhBlYjayIT8bSOHmcuvptIDW/ubM9CTW/mnZf9Rohuow==
jquery@^3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
lilconfig@^2.0.5, lilconfig@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
livereload-js@^3.3.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.4.1.tgz#ba90fbc708ed1b9a024bb89c4ee12c96ea03d66f"
integrity sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==
livereload@^0.9.3:
version "0.9.3"
resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1"
integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==
dependencies:
chokidar "^3.5.0"
livereload-js "^3.3.1"
opts ">= 1.2.0"
ws "^7.4.3"
merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.4, micromatch@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
dependencies:
braces "^3.0.2"
picomatch "^2.3.1"
minimatch@^3.0.4:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
mz@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
dependencies:
any-promise "^1.0.0"
object-assign "^4.0.1"
thenify-all "^1.0.0"
nanoid@^3.3.6:
version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
object-assign@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-hash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
"opts@>= 1.2.0":
version "2.0.2"
resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1"
integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
pirates@^4.0.1:
version "4.0.6"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
postcss-import@^15.1.0:
version "15.1.0"
resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70"
integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==
dependencies:
postcss-value-parser "^4.0.0"
read-cache "^1.0.0"
resolve "^1.1.7"
postcss-js@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2"
integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==
dependencies:
camelcase-css "^2.0.1"
postcss-load-config@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd"
integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==
dependencies:
lilconfig "^2.0.5"
yaml "^2.1.1"
postcss-nested@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c"
integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==
dependencies:
postcss-selector-parser "^6.0.11"
postcss-selector-parser@^6.0.11:
version "6.0.13"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b"
integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss-value-parser@^4.0.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.4.23, postcss@^8.4.27:
version "8.4.31"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
dependencies:
nanoid "^3.3.6"
picocolors "^1.0.0"
source-map-js "^1.0.2"
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
read-cache@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
dependencies:
pify "^2.3.0"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
dependencies:
picomatch "^2.2.1"
resolve@^1.1.7, resolve@^1.22.2:
version "1.22.8"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rollup@^3.27.1:
version "3.29.4"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981"
integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
optionalDependencies:
fsevents "~2.3.2"
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
dependencies:
queue-microtask "^1.2.2"
source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
sprintf-js@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
sucrase@^3.32.0:
version "3.34.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==
dependencies:
"@jridgewell/gen-mapping" "^0.3.2"
commander "^4.0.0"
glob "7.1.6"
lines-and-columns "^1.1.6"
mz "^2.7.0"
pirates "^4.0.1"
ts-interface-checker "^0.1.9"
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
tailwindcss@^3.3.5:
version "3.3.5"
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.5.tgz#22a59e2fbe0ecb6660809d9cc5f3976b077be3b8"
integrity sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==
dependencies:
"@alloc/quick-lru" "^5.2.0"
arg "^5.0.2"
chokidar "^3.5.3"
didyoumean "^1.2.2"
dlv "^1.1.3"
fast-glob "^3.3.0"
glob-parent "^6.0.2"
is-glob "^4.0.3"
jiti "^1.19.1"
lilconfig "^2.1.0"
micromatch "^4.0.5"
normalize-path "^3.0.0"
object-hash "^3.0.0"
picocolors "^1.0.0"
postcss "^8.4.23"
postcss-import "^15.1.0"
postcss-js "^4.0.1"
postcss-load-config "^4.0.1"
postcss-nested "^6.0.1"
postcss-selector-parser "^6.0.11"
resolve "^1.22.2"
sucrase "^3.32.0"
thenify-all@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
dependencies:
thenify ">= 3.1.0 < 4"
"thenify@>= 3.1.0 < 4":
version "3.3.1"
resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
dependencies:
any-promise "^1.0.0"
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"
ts-interface-checker@^0.1.9:
version "0.1.13"
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
util-deprecate@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
velocity-animate@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105"
integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==
vite@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26"
integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==
dependencies:
esbuild "^0.18.10"
postcss "^8.4.27"
rollup "^3.27.1"
optionalDependencies:
fsevents "~2.3.2"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
ws@^7.4.3:
version "7.5.9"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
yaml@^2.1.1:
version "2.3.3"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9"
integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==

View File

@ -7,6 +7,116 @@
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
"@esbuild/android-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
"@esbuild/android-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
"@esbuild/android-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
"@esbuild/darwin-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
"@esbuild/darwin-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
"@esbuild/freebsd-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
"@esbuild/freebsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
"@esbuild/linux-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
"@esbuild/linux-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
"@esbuild/linux-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
"@esbuild/linux-loong64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
"@esbuild/linux-mips64el@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
"@esbuild/linux-ppc64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
"@esbuild/linux-riscv64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
"@esbuild/linux-s390x@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
"@esbuild/linux-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
"@esbuild/netbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
"@esbuild/openbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
"@esbuild/sunos-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
"@esbuild/win32-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
"@esbuild/win32-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
"@esbuild/win32-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@jridgewell/gen-mapping@^0.3.2": "@jridgewell/gen-mapping@^0.3.2":
version "0.3.3" version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
@ -60,6 +170,13 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@tailwindcss/forms@^0.5.6":
version "0.5.6"
resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.6.tgz#29c6c2b032b363e0c5110efed1499867f6d7e868"
integrity sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==
dependencies:
mini-svg-data-uri "^1.2.3"
any-promise@^1.0.0: any-promise@^1.0.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@ -88,6 +205,11 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bootstrap-touchspin@^4.7.3:
version "4.7.3"
resolved "https://registry.yarnpkg.com/bootstrap-touchspin/-/bootstrap-touchspin-4.7.3.tgz#0316a3e7a390eb8811996cc14ab13ff0efb647de"
integrity sha512-VVyPKI05ybS4ciB0OJ8g4Jx4SU3rlrWa/ItSxIi7BWNVa0jUYt3eujeOiBWpkuEGukECwiAbwuzh3a+xLtxueQ==
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -148,6 +270,39 @@ dlv@^1.1.3:
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
esbuild@^0.18.10:
version "0.18.20"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6"
integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
optionalDependencies:
"@esbuild/android-arm" "0.18.20"
"@esbuild/android-arm64" "0.18.20"
"@esbuild/android-x64" "0.18.20"
"@esbuild/darwin-arm64" "0.18.20"
"@esbuild/darwin-x64" "0.18.20"
"@esbuild/freebsd-arm64" "0.18.20"
"@esbuild/freebsd-x64" "0.18.20"
"@esbuild/linux-arm" "0.18.20"
"@esbuild/linux-arm64" "0.18.20"
"@esbuild/linux-ia32" "0.18.20"
"@esbuild/linux-loong64" "0.18.20"
"@esbuild/linux-mips64el" "0.18.20"
"@esbuild/linux-ppc64" "0.18.20"
"@esbuild/linux-riscv64" "0.18.20"
"@esbuild/linux-s390x" "0.18.20"
"@esbuild/linux-x64" "0.18.20"
"@esbuild/netbsd-x64" "0.18.20"
"@esbuild/openbsd-x64" "0.18.20"
"@esbuild/sunos-x64" "0.18.20"
"@esbuild/win32-arm64" "0.18.20"
"@esbuild/win32-ia32" "0.18.20"
"@esbuild/win32-x64" "0.18.20"
events@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
fast-glob@^3.3.0: fast-glob@^3.3.0:
version "3.3.1" version "3.3.1"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
@ -270,6 +425,31 @@ jiti@^1.19.1:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
jquery-modal@^0.9.2:
version "0.9.2"
resolved "https://registry.yarnpkg.com/jquery-modal/-/jquery-modal-0.9.2.tgz#dbc046ec93440c46466fa8e21a6fc38c102a3ded"
integrity sha512-Bx6jTBuiUbdywriWd0UAZK9v7FKEDCOD5uRh47qd4coGvx+dG4w8cOGe4TG2OoR1dNrXn6Aqaeu8MAA+Oz7vOw==
jquery-offcanvas@^3.4.7:
version "3.4.7"
resolved "https://registry.yarnpkg.com/jquery-offcanvas/-/jquery-offcanvas-3.4.7.tgz#dde1f492f5904ff76bdd98ba42f1e514fa52ed70"
integrity sha512-5E3ITQNKgyzJfXqa80Nm9QBCVng4IpbrlGqAuCMSll7yPjoqJgTBl4akZE5rZXJrIpPrp1wPIjPF8tAyuhTD6g==
jquery-toast-plugin@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/jquery-toast-plugin/-/jquery-toast-plugin-1.3.2.tgz#9bef5a7d7590403e0d56b1d73a05b9842d67fa05"
integrity sha512-0j/nfqA2FHFuJXp8QL33EVVCY//TDVfq4LULhTbasZYl2aZlX6YiSF5IGrI31dQiS9S4JkXBUfX3rMJcfl/u/g==
jquery-touchswipe@^1.6.19:
version "1.6.19"
resolved "https://registry.yarnpkg.com/jquery-touchswipe/-/jquery-touchswipe-1.6.19.tgz#dfd5ddaec0b78212dd500d29707129b9c7fd6cd4"
integrity sha512-b0BGje9reNRU3u6ksAK9QqnX7yBRgLNe/wYG7DOfyDlhBlYjayIT8bSOHmcuvptIDW/ubM9CTW/mnZf9Rohuow==
jquery@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5"
integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==
lilconfig@^2.0.5, lilconfig@^2.1.0: lilconfig@^2.0.5, lilconfig@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
@ -308,6 +488,11 @@ micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.2" braces "^3.0.2"
picomatch "^2.3.1" picomatch "^2.3.1"
mini-svg-data-uri@^1.2.3:
version "1.4.4"
resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939"
integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==
minimatch@^3.0.4: minimatch@^3.0.4:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@ -430,7 +615,7 @@ postcss-value-parser@^4.0.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.4.23: postcss@^8.4.23, postcss@^8.4.27:
version "8.4.31" version "8.4.31"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
@ -472,6 +657,13 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rollup@^3.27.1:
version "3.29.4"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981"
integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
optionalDependencies:
fsevents "~2.3.2"
run-parallel@^1.1.9: run-parallel@^1.1.9:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
@ -484,6 +676,11 @@ source-map-js@^1.0.2:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
sprintf-js@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
sucrase@^3.32.0: sucrase@^3.32.0:
version "3.34.0" version "3.34.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
@ -551,6 +748,11 @@ to-regex-range@^5.0.1:
dependencies: dependencies:
is-number "^7.0.0" is-number "^7.0.0"
tooltipster@^4.2.8:
version "4.2.8"
resolved "https://registry.yarnpkg.com/tooltipster/-/tooltipster-4.2.8.tgz#ad1970dd71ad853034e64e3fdd1745f7f3485071"
integrity sha512-Znmbt5UMzaiFCRlVaRtfRZYQqxrmNlj1+3xX/aT0OiA3xkQZhXYGbLJmZPigx0YiReYZpO7Lm2XKbUxXsiU/pg==
ts-interface-checker@^0.1.9: ts-interface-checker@^0.1.9:
version "0.1.13" version "0.1.13"
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
@ -561,6 +763,22 @@ util-deprecate@^1.0.2:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
velocity-animate@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105"
integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==
vite@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26"
integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==
dependencies:
esbuild "^0.18.10"
postcss "^8.4.27"
rollup "^3.27.1"
optionalDependencies:
fsevents "~2.3.2"
wrappy@1: wrappy@1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"

1481
assets/css/theme.css Normal file → Executable file

File diff suppressed because it is too large Load Diff

10
assets/js/style.css Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -56,6 +56,9 @@ global_settings:
- name: displayAfterWrapper - name: displayAfterWrapper
title: Display after wrapper title: Display after wrapper
description: Display after wrapper description: Display after wrapper
- name: displayCustomProductActions
title: Display Actions below Add to Cart
description: Display actions below product's add to cart button
modules_to_hook: modules_to_hook:
displayMainMenu: displayMainMenu:
- ps_mainmenu - ps_mainmenu
@ -76,10 +79,6 @@ global_settings:
- ps_facetedsearch - ps_facetedsearch
displaySearch: displaySearch:
- ps_searchbar - ps_searchbar
displayProductAdditionalInfo:
- ps_sharebuttons
displayReassurance:
- blockreassurance
displayOrderConfirmation2: displayOrderConfirmation2:
- ps_featuredproducts - ps_featuredproducts
displayCrossSellingShoppingCart: displayCrossSellingShoppingCart:

View File

@ -0,0 +1,43 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License version 3.0
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<div class="w-full flex justify-around">
{foreach from=$blocks item=$block key=$key}
<div{if $block['type_link'] !== $LINK_TYPE_NONE && !empty($block['link'])} style="cursor:pointer;" onclick="window.open('{$block['link']}')"{/if} class='flex flex-wrap md:flex-nowrap gap-2 items-center justify-center'>
<span class="item-product w-5 h-5">
{if $block['icon'] != 'undefined'}
{if $block['custom_icon']}
<img {if $block['is_svg']}class="svg" {/if}src="{$block['custom_icon']}">
{elseif $block['icon']}
<img class="svg" src="{$block['icon']}">
{/if}
{/if}&nbsp;
</span>
{if empty($block['description'])}
<p class="block-title text-sm" >{$block['title']}</p>
{else}
<div class='flex flex-col items-center md:items-start'>
<span class="block-title text-sm" >{$block['title']}</span>
<p class='text-xs'>{$block['description'] nofilter}</p>
</div>
{/if}
</div>
{/foreach}
</div>

View File

@ -0,0 +1,26 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License version 3.0
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<a class="w-full md:w-1/3 lg:w-1/5 flex flex-col p-4 border-gray-500" id="wishlist-link" href="{$url}">
<span class="flex flex-col items-center font-semibolds text-lg">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-heart" width="32" height="32" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.5 12.572l-7.5 7.428l-7.5 -7.428a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572" /></svg>
{$wishlistsTitlePage}
</span>
</a>

View File

@ -0,0 +1,25 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License version 3.0
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<a class="w-full md:w-1/3 lg:w-1/4 flex flex-col p-4 border-gray-500" id="wishlist-link" disabled>
<span class="flex flex-col items-center font-semibolds text-lg">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ruler-measure" width="32" height="32" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.875 12c.621 0 1.125 .512 1.125 1.143v5.714c0 .631 -.504 1.143 -1.125 1.143h-15.875a1 1 0 0 1 -1 -1v-5.857c0 -.631 .504 -1.143 1.125 -1.143h15.75z" /><path d="M9 12v2" /><path d="M6 12v3" /><path d="M12 12v3" /><path d="M18 12v3" /><path d="M15 12v2" /><path d="M3 3v4" /><path d="M3 5h18" /><path d="M21 3v4" /></svg>
Body Measurements
</span>
</a>

View File

@ -22,93 +22,89 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="contact-form"> <section class="mx-auto max-w-6xl">
<form action="{$urls.pages.contact}" method="post" {if $contact.allow_file_upload}enctype="multipart/form-data"{/if}> <form class="w-full flex flex-col gap-4" action="{$urls.pages.contact}" method="post" {if $contact.allow_file_upload}enctype="multipart/form-data"{/if}>
{if $notifications}
<div class="col-xs-12 alert {if $notifications.nw_error}alert-danger{else}alert-success{/if}">
<ul>
{foreach $notifications.messages as $notif}
<li>{$notif}</li>
{/foreach}
</ul>
</div>
{/if}
{if !$notifications || $notifications.nw_error} {if !$notifications || $notifications.nw_error}
<section class="form-fields">
<div class="form-group row"> <div class="form-group row">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<h3>{l s='Contact us' d='Shop.Theme.Global'}</h3> <h3 class="text-xl font-medium">{l s='Contact us' d='Shop.Theme.Global'}</h3>
</div> </div>
</div> </div>
<section class="form-fields w-full flex max-md:flex-col flex-wrap">
<div class="form-group row"> <div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2">
<label class="col-md-3 form-control-label">{l s='Subject' d='Shop.Forms.Labels'}</label> <label class="col-md-3 font-medium">{l s='Subject' d='Shop.Forms.Labels'}</label>
<div class="col-md-6"> <select name="id_contact" class="dropdown-toggle relative py-1 px-4 pr-8 w-full leading-1 border border-gray-300 text-left">
<select name="id_contact" class="form-control form-control-select">
{foreach from=$contact.contacts item=contact_elt} {foreach from=$contact.contacts item=contact_elt}
<option value="{$contact_elt.id_contact}">{$contact_elt.name}</option> <option value="{$contact_elt.id_contact}">{$contact_elt.name}</option>
{/foreach} {/foreach}
</select> </select>
</div> </div>
</div>
<div class="form-group row"> <div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2">
<label class="col-md-3 form-control-label">{l s='Email address' d='Shop.Forms.Labels'}</label> <label class="col-md-3 font-medium">{l s='Email address' d='Shop.Forms.Labels'}</label>
<div class="col-md-6">
<input <input
class="form-control" class="form-control px-4 py-1 border border-gray-300 w-full"
name="from" name="from"
type="email" type="email"
value="{$contact.email}" value="{$contact.email}"
placeholder="{l s='your@email.com' d='Shop.Forms.Help'}" placeholder="{l s='your@email.com' d='Shop.Forms.Help'}"
> >
</div> </div>
</div>
{if $contact.orders} {if $contact.orders}
<div class="form-group row"> <div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2">
<label class="col-md-3 form-control-label">{l s='Order reference' d='Shop.Forms.Labels'}</label> <label class="col-md-3 font-medium">
<div class="col-md-6"> {l s='Order reference' d='Shop.Forms.Labels'}
<select name="id_order" class="form-control form-control-select">
<i class="text-xs font-light">
{l s='( optional )' d='Shop.Forms.Help'}
</i>
</label>
<div class="flex flex-col">
<select name="id_order" class="dropdown-toggle relative w-full py-1 px-4 pr-8 leading-1 border border-gray-300 text-left">
<option value="">{l s='Select reference' d='Shop.Forms.Help'}</option> <option value="">{l s='Select reference' d='Shop.Forms.Help'}</option>
{foreach from=$contact.orders item=order} {foreach from=$contact.orders item=order}
<option value="{$order.id_order}">{$order.reference}</option> <option value="{$order.id_order}">{$order.reference}</option>
{/foreach} {/foreach}
</select> </select>
</div> </div>
<span class="col-md-3 form-control-comment">
{l s='optional' d='Shop.Forms.Help'}
</span>
</div> </div>
{/if} {/if}
{if $contact.allow_file_upload} <div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2">
<div class="form-group row"> <label class="col-md-3 font-medium">{l s='Message' d='Shop.Forms.Labels'}</label>
<label class="col-md-3 form-control-label">{l s='Attachment' d='Shop.Forms.Labels'}</label>
<div class="col-md-6">
<input type="file" name="fileUpload" class="filestyle" data-buttonText="{l s='Choose file' d='Shop.Theme.Actions'}">
</div>
<span class="col-md-3 form-control-comment">
{l s='optional' d='Shop.Forms.Help'}
</span>
</div>
{/if}
<div class="form-group row">
<label class="col-md-3 form-control-label">{l s='Message' d='Shop.Forms.Labels'}</label>
<div class="col-md-9"> <div class="col-md-9">
<textarea <textarea
class="form-control" class="form-control px-4 py-1 border border-gray-300 w-full"
name="message" name="message"
placeholder="{l s='How can we help?' d='Shop.Forms.Help'}" placeholder="{l s='How can we help?' d='Shop.Forms.Help'}"
rows="3" rows="1"
>{if $contact.message}{$contact.message}{/if}</textarea> >{if $contact.message}{$contact.message}{/if}</textarea>
</div> </div>
</div> </div>
{if $contact.allow_file_upload}
<div class="form-group flex flex-col gap-2 px-2 my-2 w-full md:w-1/2">
<label class="col-md-3 font-medium">{l s='Attachment' d='Shop.Forms.Labels'}
<i class="text-xs font-light">
{l s='( optional )' d='Shop.Forms.Help'}
</i>
</label>
<div class="flex flex-col w-full">
<input type="file" name="fileUpload"
class="form-control text-sm text-blue-950
border border-gray-300 w-full
file:mr-4 file:py-1.5 file:px-4
file:rounded-full file:border-0
file:text-sm file:font-semibold
file:bg-transparent file:text-blue-950
hover:file:text-blue-900"
data-buttonText="{l s='Choose file' d='Shop.Theme.Actions'}">
</div>
</div>
{/if}
{if isset($id_module)} {if isset($id_module)}
<div class="form-group row"> <div class="form-group row">
<div class="offset-md-3"> <div class="offset-md-3">
@ -127,9 +123,12 @@
</style> </style>
<input type="text" name="url" value=""/> <input type="text" name="url" value=""/>
<input type="hidden" name="token" value="{$token}" /> <input type="hidden" name="token" value="{$token}" />
<input class="btn btn-primary" type="submit" name="submitMessage" value="{l s='Send' d='Shop.Theme.Actions'}"> <input class="uppercase font-medium py-2 text-center w-full bg-blue-950 hover:bg-blue-900 text-gray-50" type="submit" name="submitMessage" value="{l s='Send' d='Shop.Theme.Actions'}">
</footer> </footer>
{else}
<div class="flex w-full justify-center font-semibold text-center">
{l s='Thank You for contacting us, we will get back to you shortly.' d='Shop.Theme.Global'}
</div>
{/if} {/if}
</form> </form>
</section> </section>

View File

@ -26,7 +26,7 @@
<h2 class="h2 products-section-title text-uppercase"> <h2 class="h2 products-section-title text-uppercase">
{l s='Best Sellers' d='Shop.Theme.Catalog'} {l s='Best Sellers' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products"> <div class="products flex flex-wrap">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -0,0 +1,24 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License version 3.0
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<div class="px-4">
<div class='w-full mt-2 p-2 bg-blue-100 border border-blue-300'>
<span>{l s='You pay for the merchandise upon delivery.' d='Modules.Cashondelivery.Shop'}</span>
</div>
</div>

View File

@ -22,15 +22,15 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="featured-products clearfix mt-3"> <section class="flex flex-col gap-8 mt-24">
<h2> <span class="text-2xl font-bold">
{if $products|@count == 1} {if $products|@count == 1}
{l s='%s other product in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'} {l s='%s other product in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'}
{else} {else}
{l s='%s other products in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'} {l s='%s other products in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'}
{/if} {/if}
</h2> </span>
<div class="products"> <div class="products flex flex-wrap">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -0,0 +1,38 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
<div class="px-4">
<div class='flex flex-col gap-2 w-full mt-2 p-2 bg-blue-100 border border-blue-300'>
<span>{l s='Please send us your check following these rules:' d='Modules.Checkpayment.Shop'}</span>
<dl>
<dt class="font-semibold">{l s='Amount' d='Modules.Checkpayment.Shop'}</dt>
<dd class="text-sm mb-3">{$checkTotal} {$checkTaxLabel}</dd>
<dt class="font-semibold">{l s='Payee:' d='Modules.Checkpayment.Shop'}</dt>
<dd class="text-sm mb-3">{$checkOrder}</dd>
<dt class="font-semibold">{l s='Send your check to this address:' d='Modules.Checkpayment.Shop'}</dt>
<dd class="text-sm">{$checkAddress nofilter}</dd>
</dl>
</div>
</div>

View File

@ -24,39 +24,26 @@
*} *}
<div class="contact-rich"> <div class="contact-rich">
<h4>{l s='Store information' d='Shop.Theme.Global'}</h4> <h4 class="text-2xl font-bold">{l s='Store information' d='Shop.Theme.Global'}</h4>
<div class="block"> <div class="mx-auto max-w-6xl">
<div class="icon"><i class="material-icons">&#xE55F;</i></div> <h4 class="text-xl font-medium mt-6">
<div class="data">{$contact_infos.address.formatted nofilter}</div> Our Stylists
</div> </h4>
{if $contact_infos.phone} <p>
<hr/> Our Stylists are here for you. We have helped dress some of the biggest names in Hollywood and Professional
<div class="block"> sports. Our staff of highly experienced tailors and stylists understand the demands placed on you to always look
<div class="icon"><i class="material-icons">&#xE0CD;</i></div> your very best.
<div class="data"> </p>
{l s='Call us:' d='Shop.Theme.Global'}<br/> <p class="mt-3">
<a href="tel:{$contact_infos.phone}">{$contact_infos.phone}</a> Your personal stylist is ready to assist you in all your clothing needs.
</div> </p>
</div> <h4 class="text-xl font-medium mt-6">Customer Service</h4>
{/if} <p> Let us show you how custom works.
{if $contact_infos.fax} We will walk you through your first order.
<hr/> Just drop us a line at
<div class="block"> <a href="mailto:customerservice@brooksbingham.com" class="underline underline-offset-2">customerservice@brooksbingham.com</a>
<div class="icon"><i class="material-icons">&#xE0DF;</i></div> , and we will get in touch with you.
<div class="data"> </p>
{l s='Fax:' d='Shop.Theme.Global'}<br/> </div>
{$contact_infos.fax} <hr class="my-8"/>
</div>
</div>
{/if}
{if $contact_infos.email}
<hr/>
<div class="block">
<div class="icon"><i class="material-icons">&#xE158;</i></div>
<div class="data email">
{l s='Email us:' d='Shop.Theme.Global'}<br/>
</div>
<a href="mailto:{$contact_infos.email}">{$contact_infos.email}</a>
</div>
{/if}
</div> </div>

View File

@ -25,7 +25,7 @@
<section class="featured-products clearfix mt-3"> <section class="featured-products clearfix mt-3">
<h2>{l s='Customers who bought this product also bought:' d='Shop.Theme.Catalog'}</h2> <h2>{l s='Customers who bought this product also bought:' d='Shop.Theme.Catalog'}</h2>
<div class="products"> <div class="products flex flex-wrap">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -23,29 +23,43 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="block_myaccount_infos" class="col-md-3 links wrapper"> {*Mobile View*}
<p class="h3 myaccount-title hidden-sm-down"> <div id="block_myaccount_infos" class=" md:hidden th-accordion">
<a class="text-uppercase" href="{$urls.pages.my_account}" rel="nofollow"> <div class="flex flex-col gap-4 th-accordion-item">
{l s='Your account' d='Shop.Theme.Customeraccount'} <div class="title clearfix th-accordion-item-trigger flex items-center gap-2" data-target="#footer_account_list" data-toggle="collapse">
</a> <svg xmlns="http://www.w3.org/2000/svg" class="icon th-accordion-item-trigger-svg icon-tabler stroke-[3px] icon-tabler-chevron-right" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 6l6 6l-6 6" /></svg>
</p> <span class="font-bold">{l s='Your account' d='Shop.Theme.Customeraccount'}</span>
<div class="title clearfix hidden-md-up" data-target="#footer_account_list" data-toggle="collapse">
<span class="h3">{l s='Your account' d='Shop.Theme.Customeraccount'}</span>
<span class="float-xs-right">
<span class="navbar-toggler collapse-icons">
<i class="material-icons add">&#xE313;</i>
<i class="material-icons remove">&#xE316;</i>
</span>
</span>
</div> </div>
<ul class="account-list collapse" id="footer_account_list"> <ul class="account-list th-accordion-item-content pl-6" id="footer_account_list">
{foreach from=$my_account_urls item=my_account_url} {foreach from=$my_account_urls item=my_account_url}
<li> <li class="flex">
<a href="{$my_account_url.url}" title="{$my_account_url.title}" rel="nofollow"> <a href="{$my_account_url.url}" class="text-sm font-normal leading-6" title="{$my_account_url.title}" rel="nofollow">
{$my_account_url.title} {$my_account_url["title"]}
</a> </a>
</li> </li>
{/foreach} {/foreach}
{hook h='displayMyAccountBlock'} <a href="{$logout_url}" class="text-sm font-normal leading-6" title="logout" rel="nofollow">
Sign out
</a>
</ul>
</div>
</div>
{*Desktop View*}
<div id="block_myaccount_infos" class="flex max-md:hidden flex-col gap-4">
<div class="title clearfix" data-target="#footer_account_list" data-toggle="collapse">
<span class="font-bold">{l s='Your account' d='Shop.Theme.Customeraccount'}</span>
</div>
<ul class="account-list" id="footer_account_list">
{foreach from=$my_account_urls item=my_account_url}
<li class="flex">
<a href="{$my_account_url.url}" class="text-sm font-normal leading-6" title="{$my_account_url.title}" rel="nofollow">
{$my_account_url["title"]}
</a>
</li>
{/foreach}
<a href="{$logout_url}" class="text-sm font-normal leading-6" title="logout" rel="nofollow">
Sign out
</a>
</ul> </ul>
</div> </div>

View File

@ -22,16 +22,20 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="_desktop_user_info" class="relative"> <div id="_desktop_user_info" class="relative max-md:hidden">
<div class="flex max-w-[200px] justify-end"> <div class="flex max-w-[200px] justify-end mx-4">
{if $logged} {if $logged}
<a <a
class="logout hidden-sm-down" class="logout hidden-sm-down mr-4"
href="{$logout_url}" href="{$logout_url}"
rel="nofollow" rel="nofollow"
> >
<i class="material-icons">&#xE7FF;</i> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-logout" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
{l s='Sign out' d='Shop.Theme.Actions'} <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2"></path>
<path d="M9 12h12l-3 -3"></path>
<path d="M18 15l3 -3"></path>
</svg>
</a> </a>
<a <a
class="account" class="account"
@ -39,8 +43,12 @@
title="{l s='View my customer account' d='Shop.Theme.Customeraccount'}" title="{l s='View my customer account' d='Shop.Theme.Customeraccount'}"
rel="nofollow" rel="nofollow"
> >
<i class="material-icons hidden-md-up logged">&#xE7FF;</i> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-user-circle" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
<span class="hidden-sm-down">{$customerName}</span> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path>
<path d="M12 10m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
<path d="M6.168 18.849a4 4 0 0 1 3.832 -2.849h4a4 4 0 0 1 3.834 2.855"></path>
</svg>
</a> </a>
{else} {else}
<a <a

View File

@ -26,12 +26,13 @@
<h2 class="products-section-title text-2xl font-bold"> <h2 class="products-section-title text-2xl font-bold">
{l s='Popular Products' d='Shop.Theme.Catalog'} {l s='Popular Products' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products grid grid-cols-1 md:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-8"> <div class="products flex flex-wrap">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}
</div> </div>
<a class="all-product-link text-2xl font-bold" href="{$allProductsLink}"> <a class="all-product-link text-2xl font-bold w-full flex items-center justify-end" href="{$allProductsLink}">
{l s='All products' d='Shop.Theme.Catalog'} {l s='All products' d='Shop.Theme.Catalog'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon stroke-gray-600 stroke-[3px] icon-tabler icon-tabler-chevron-right" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 6l6 6l-6 6" /></svg>
</a> </a>
</section> </section>

View File

@ -24,37 +24,11 @@
*} *}
{if $homeslider.slides} {if $homeslider.slides}
<div id="carousel" data-ride="carousel" class="carousel slide" data-interval="{$homeslider.speed}" data-wrap="{(string)$homeslider.wrap}" data-pause="{$homeslider.pause}"> <a href="https://brooksbingham.com/17-custom-made">
<ul class="carousel-inner" role="listbox"> <div class="mb-12 w-full lg:h-[90vh]" style="clip-path: inset(4px)">
{foreach from=$homeslider.slides item=slide name='homeslider'} <video autoplay muted loop class="w-full h-auto object-cover" style="background-color: rgba(0, 0, 0, 0)">
<li class="carousel-item {if $smarty.foreach.homeslider.first}active{/if}" role="option" aria-hidden="{if $smarty.foreach.homeslider.first}false{else}true{/if}"> <source src="{$urls.img_ps_url}cms/hero.mp4" type="video/mp4" >
<a href="{$slide.url}"> </video>
<figure class="relative">
<img src="{$slide.image_url}" alt="{$slide.legend|escape}">
{if $slide.title || $slide.description}
<figcaption class="caption absolute right-0 bottom-0">
<h2 class="display-1 text-uppercase">{$slide.title}</h2>
<div class="caption-description">{$slide.description nofilter}</div>
</figcaption>
{/if}
</figure>
</a>
</li>
{/foreach}
</ul>
<div class="direction" aria-label="{l s='Carousel buttons' d='Shop.Theme.Global'}">
<a class="left carousel-control" href="#carousel" role="button" data-slide="prev">
<span class="icon-prev hidden-xs" aria-hidden="true">
<i class="material-icons">&#xE5CB;</i>
</span>
<span class="sr-only">{l s='Previous' d='Shop.Theme.Global'}</span>
</a>
<a class="right carousel-control" href="#carousel" role="button" data-slide="next">
<span class="icon-next" aria-hidden="true">
<i class="material-icons">&#xE5CC;</i>
</span>
<span class="sr-only">{l s='Next' d='Shop.Theme.Global'}</span>
</a>
</div>
</div> </div>
</a>
{/if} {/if}

View File

@ -1,49 +0,0 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<div id="_desktop_language_selector">
<div class="language-selector-wrapper">
<span id="language-selector-label" class="hidden-md-up">{l s='Language:' d='Shop.Theme.Global'}</span>
<div class="language-selector dropdown js-dropdown">
<button data-toggle="dropdown" class="hidden-sm-down btn-unstyle" aria-haspopup="true" aria-expanded="false" aria-label="{l s='Language dropdown' d='Shop.Theme.Global'}">
<span class="expand-more">{$current_language.name_simple}</span>
<i class="material-icons expand-more">&#xE5C5;</i>
</button>
<ul class="dropdown-menu hidden-sm-down" aria-labelledby="language-selector-label">
{foreach from=$languages item=language}
<li {if $language.id_lang == $current_language.id_lang} class="current" {/if}>
<a href="{url entity='language' id=$language.id_lang}" class="dropdown-item" data-iso-code="{$language.iso_code}">{$language.name_simple}</a>
</li>
{/foreach}
</ul>
<select class="link hidden-md-up" aria-labelledby="language-selector-label">
{foreach from=$languages item=language}
<option value="{url entity='language' id=$language.id_lang}"{if $language.id_lang == $current_language.id_lang} selected="selected"{/if} data-iso-code="{$language.iso_code}">
{$language.name_simple}
</option>
{/foreach}
</select>
</div>
</div>
</div>

View File

@ -22,16 +22,35 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="container">
{*Mobile View*}
<div class="flex flex-wrap flex-1 flex-col md:flex-row th-accordion">
{foreach $linkBlocks as $linkBlock} {foreach $linkBlocks as $linkBlock}
<div class="flex flex-col mb-4"> <div class="flex md:hidden flex-col mb-4 md:w-1/3 th-accordion-item">
<div class="font-bold flex gap-2 items-center mb-4 th-accordion-item-trigger">
<svg xmlns="http://www.w3.org/2000/svg" class="icon th-accordion-item-trigger-svg icon-tabler stroke-[3px] icon-tabler-chevron-right" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 6l6 6l-6 6" /></svg>
{$linkBlock.title}
</div>
<ul class="flex flex-col th-accordion-item-content pl-6">
{foreach $linkBlock.links as $link}
<li class="flex">
<a id="{$link.id}-{$linkBlock.id}" class="text-sm font-normal leading-6 {$link.class}" href="{$link.url}" title="{$link.description}" {if !empty($link.target)} target="{$link.target}" {/if}>
{$link.title}
</a>
</li>
{/foreach}
</ul>
</div>
{*Desktop View*}
<div class="flex max-md:hidden flex-col mb-4 md:w-1/3">
<div class="font-bold mb-4"> <div class="font-bold mb-4">
{$linkBlock.title} {$linkBlock.title}
</div> </div>
<ul> <ul class="flex flex-col">
{foreach $linkBlock.links as $link} {foreach $linkBlock.links as $link}
<li> <li class="flex">
<a id="{$link.id}-{$linkBlock.id}" class="{$link.class}" href="{$link.url}" title="{$link.description}" {if !empty($link.target)} target="{$link.target}" {/if}> <a id="{$link.id}-{$linkBlock.id}" class="text-sm font-normal leading-6 {$link.class}" href="{$link.url}" title="{$link.description}" {if !empty($link.target)} target="{$link.target}" {/if}>
{$link.title} {$link.title}
</a> </a>
</li> </li>

View File

@ -1,9 +1,9 @@
{assign var=_counter value=0} {assign var=_counter value=0}
{function name="menu" nodes=[] depth=0 parent=null} {function name="menu" nodes=[] depth=0 parent=null}
{if $nodes|count} {if $nodes|count}
<ul class="flex flex-1 items-center justify-center top-menu" {if $depth == 0}id="top-menu"{/if} data-depth="{$depth}"> <ul class="flex flex-1 items-end lg:items-center justify-center top-menu max-lg:flex-col max-md:items-end" {if $depth == 0}id="top-menu"{/if} data-depth="{$depth}">
{foreach from=$nodes item=node} {foreach from=$nodes item=node}
<li class="{$node.type}{if $node.current} current {/if} px-2 py-2" id="{$node.page_identifier}"> <li class="{$node.type}{if $node.current} current {/if} px-2 py-2 font-medium hover:text-gray-950" id="{$node.page_identifier}">
{assign var=_counter value=$_counter+1} {assign var=_counter value=$_counter+1}
<a <a
class="{if $depth >= 0}dropdown-item{/if}{if $depth === 1} dropdown-submenu{/if}" class="{if $depth >= 0}dropdown-item{/if}{if $depth === 1} dropdown-submenu{/if}"
@ -13,12 +13,13 @@
{$node.label} {$node.label}
</a> </a>
</li> </li>
<hr class=" last:hidden w-full lg:hidden"/>
{/foreach} {/foreach}
</ul> </ul>
{/if} {/if}
{/function} {/function}
<button class="absolute right-4 top-1/2 block -translate-y-1/2 p-3 ring-primary focus:ring-2 lg:hidden"> <button class="toggle-main-menu absolute right-4 top-1/2 block -translate-y-1/2 ring-primary focus:ring-2 lg:hidden">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-menu-2" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-menu-2" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M4 6l16 0"></path> <path d="M4 6l16 0"></path>
@ -26,6 +27,6 @@
<path d="M4 18l16 0"></path> <path d="M4 18l16 0"></path>
</svg> </svg>
</button> </button>
<nav class="absolute right-4 top-full w-full max-w-[250px] justify-center rounded-lg bg-white py-5 px-6 shadow lg:static lg:flex lg:w-full lg:max-w-full lg:bg-transparent lg:py-0 lg:shadow-none hidden" id="_desktop_top_menu"> <nav class="mobile-main-menu absolute z-10 right-4 top-[70%] w-full max-w-[160px] border border-gray-100 justify-center rounded-lg bg-white p-4 md:p-2 drop-shadow-lg lg:static lg:border-none lg:flex lg:w-full lg:max-w-full lg:bg-transparent lg:py-0 lg:shadow-none hidden" id="_desktop_top_menu">
{menu nodes=$menu.children} {menu nodes=$menu.children}
</nav> </nav>

View File

@ -22,18 +22,17 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="featured-products flex flex-col gap-8">
<section class="featured-products clearfix mt-3"> <h2 class="products-section-title text-2xl font-bold">
<h2 class="h2 products-section-title text-uppercase">
{l s='New products' d='Shop.Theme.Catalog'} {l s='New products' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products"> <div class="products flex flex-wrap">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}
</div> </div>
<a class="all-product-link float-xs-left float-md-right h4" href="{$allNewProductsLink}"> <a class="all-product-link text-2xl font-bold" href="{$allNewProductsLink}">
{l s='All new products' d='Shop.Theme.Catalog'}<i class="material-icons">&#xE315;</i> {l s='All new products' d='Shop.Theme.Catalog'}
</a> </a>
</section> </section>

View File

@ -1,35 +0,0 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;

View File

@ -1,35 +0,0 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;

View File

@ -1,39 +0,0 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<div class="block-contact col-md-2 links wrapper">
<h3 class="h3 hidden-sm-down">{$title}</h3>
<div>
{if $rss_links}
<ul>
{foreach from=$rss_links item='rss_link'}
<li><a href="{$rss_link['link']}" title="{$rss_link['title']}" target="_blank">{$rss_link['title']}</a></li>
{/foreach}
</ul>
{else}
<p>{l s='No RSS feed added' d='Shop.Theme.Catalog'}</p>
{/if}
</div>
</div>

View File

@ -1,35 +0,0 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;

View File

@ -1,37 +0,0 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
{block name='social_sharing'}
{if $social_share_links}
<div class="social-sharing">
<span>{l s='Share' d='Shop.Theme.Actions'}</span>
<ul>
{foreach from=$social_share_links item='social_share_link'}
<li class="{$social_share_link.class} icon-gray"><a href="{$social_share_link.url}" class="text-hide" title="{$social_share_link.label}" target="_blank">{$social_share_link.label}</a></li>
{/foreach}
</ul>
</div>
{/if}
{/block}

View File

@ -27,7 +27,7 @@
<h2 class="h2 products-section-title text-uppercase"> <h2 class="h2 products-section-title text-uppercase">
{l s='On sale' d='Shop.Theme.Catalog'} {l s='On sale' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products"> <div class="products flex flex-wrap">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -22,9 +22,9 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="featured-products clearfix mt-3"> <section class="featured-products w-full flex flex-col gap-8 mt-24">
<h2>{l s='Viewed products' d='Shop.Theme.Catalog'}</h2> <h2 class="text-2xl font-bold">{l s='Viewed products' d='Shop.Theme.Catalog'}</h2>
<div class="products"> <div class="products flex flex-wrap">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -1,5 +1,5 @@
{** {**
* 2007-2019 PrestaShop and Contributors * 2007-2020 PrestaShop and Contributors
* *
* NOTICE OF LICENSE * NOTICE OF LICENSE
* *
@ -11,24 +11,20 @@
* obtain it through the world-wide-web, please send an email * obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately. * to license@prestashop.com so we can send you a copy immediately.
* *
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com> * @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors * @copyright 2007-2020 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{block name='block_social'}
<div class="block-social col-lg-4 col-md-12 col-sm-12"> <dl>
<ul> <dt class="font-semibold">{l s='Amount' d='Modules.Wirepayment.Shop'}</dt>
{foreach from=$social_links item='social_link'} <dd class="text-sm mb-3">{$total}</dd>
<li class="{$social_link.class}"><a href="{$social_link.url}" target="_blank">{$social_link.label}</a></li> <dt class="font-semibold">{l s='Name of account owner' d='Modules.Wirepayment.Shop'}</dt>
{/foreach} <dd class="text-sm mb-3">{$bankwireOwner}</dd>
</ul> <dt class="font-semibold">{l s='Please include these details' d='Modules.Wirepayment.Shop'}</dt>
</div> <dd class="text-sm mb-3">{$bankwireDetails nofilter}</dd>
{/block} <dt class="font-semibold">{l s='Bank name' d='Modules.Wirepayment.Shop'}</dt>
<dd class="text-sm">{$bankwireAddress nofilter}</dd>
</dl>

View File

@ -0,0 +1,32 @@
{**
* 2007-2020 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<div class="px-4">
<div class='flex flex-col gap-2 w-full mt-2 p-2 bg-blue-100 border border-blue-300'>
<div class="flex flex-col gap-1">
<span>{l s='Please transfer the invoice amount to our bank account. You will receive our order confirmation by email containing bank details and order number.' d='Modules.Wirepayment.Shop'}</span>
{if $bankwireReservationDays}
<span>{l s='Goods will be reserved %s days for you and we\'ll process the order immediately after receiving the payment.' sprintf=[$bankwireReservationDays] d='Modules.Wirepayment.Shop'}</span>
{/if}
<span>{l s='Payment is made by transfer of the invoice amount to the following account:' d='Modules.Wirepayment.Shop'}</span>
</div>
{include file='module:ps_wirepayment/views/templates/hook/_partials/payment_infos.tpl'}
{$bankwireCustomText nofilter}
</div>
</div>

View File

@ -0,0 +1,3 @@
<a href="{$configure_link}" class="uppercase py-2 flex-1 text-center border border-blue-950 hover:text-blue-900 hover:border-blue-900 hover:no-underline text-blue-950 font-medium max-h-[40px]">
Customize in 3D
</a>

View File

@ -0,0 +1,20 @@
<table class="w-full striped">
<thead>
<tr>
<th>Particular</th>
<th>Value</th>
</tr>
</thead>
<tbody>
{foreach from=$line_items item="line_item"}
<tr class="even:bg-blue-500/10">
<td class="py-1 pl-2">
{$line_item["label"]}
</td>
<td class="py-1 pr-2">
{$line_item["value"]}
</td>
</tr>
{/foreach}
</tbody>
</table>

View File

@ -0,0 +1,24 @@
$(document).ready(function() {
//Check if the dialog should be shown based on the flag in local storage
if (!localStorage.getItem('tbm_dialog_closed')) {
$('#tbm-not-set-modal').modal('show');
}
//Handle click event for the close link
$('#close-tbm-modal').click(function() {
//Set flag in local storage when the close link is clicked
localStorage.setItem('tbm_dialog_closed', 'true');
});
//Handle click event for the "Set Measurements" button
$('#set-measurements-tbm-modal').click(function() {
//Set flag in local storage when the "Set Measurements" button is clicked
localStorage.setItem('tbm_dialog_closed', 'true');
});
//Listen for click event on logout button
$('.logout').click(function() {
//Clear the local storage item
localStorage.removeItem('tbm_dialog_closed');
});
});

View File

@ -0,0 +1,272 @@
$(document).ready(function() {
$('#photos-completed-button').click(function(event){
event.preventDefault();
var accessCode = $('#product-additional-info-access-code').val();
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=getCustomerMeasurementsForMirrorSize',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'getCustomerMeasurementsForMirrorSize',
accessCode: accessCode,
},
success: function(response) {
console.log(response);
// window.location.reload();
},
error: function(xhr, status, error) {
console.error(xhr.responseText);
}
});
});
$('#set-measurements-button').click(function(event) {
// Prevent the default behavior of the anchor tag
event.preventDefault();
// Toggle the visibility of the modal
$('#measurements-modal').toggle();
});
$(document).click(function(event) {
// Check if the click target is not within the modal
if (!$(event.target).closest('#measurements-modal').length && !$(event.target).is('#set-measurements-button')) {
// Hide the modal
$('#measurements-modal').hide();
}
});
});
$('#closebutton').click(function() {
$('#measurements-modal').hide();
});
$('#closemirrorbutton').click(function() {
$('#measurements-modal').hide();
});
// Add click event handler to the "Photos Completed" button
$('#photos-completed-button').click(function(event) {
// Perform some action here
alert('Photos Completed button clicked!');
});
$('#submit-measurements-button').click(function(event) {
event.preventDefault();
var measurements = [];
$('.modal-set-measurements .form-group').each(function() {
var attributeId = $(this).find('input').attr('id');
var value = $(this).find('input').val();
console.log("Attribute id: ",attributeId)
console.log("value: ",value)
measurements.push({
"attributeId": attributeId,
"value": value
});
});
console.log("measurements: ",measurements)
var formId = $('#current_form_id').val();
var formLabel = $('#current_form_label').val();
var productId = $('#product-additional-info-product-id').val();
var categoryId = $('#product-additional-info-category-id').val();
var productAttributeId = $('#product-additional-info-product-attribute-id').val();
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=saveProductMeasurements',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'saveProductMeasurements',
formId: formId,
formLabel: formLabel,
measurements: JSON.stringify(measurements),
productId: productId,
categoryId: categoryId,
productAttributeId: productAttributeId,
},
success: function(response) {
console.log(response);
window.location.reload();
},
error: function(xhr, status, error) {
console.error(xhr.responseText);
}
});
});
$('.add-to-cart').click( (event) => {
console.log("inside add to cart click...");
var productId = $('#product-additional-info-product-id').val();
var categoryId = $('#product-additional-info-category-id').val();
var productAttributeId = $('#product-additional-info-product-attribute-id').val();
if(!productId && !categoryId){
return;
}
event.preventDefault();
event.stopImmediatePropagation();
var formId = $('#current_form_id').val();
var formLabel = $('#current_form_label').val();
var measurements = [];
$('.modal-set-measurements .form-group').each(function() {
var attributeId = $(this).find('input').attr('id');
var value = $(this).find('input').val();
measurements.push({
"attributeId": attributeId,
"value": value
});
});
//first check if the measurements are set by the customer
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=customerHasMeasurements',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'customerHasMeasurements',
productId: productId,
categoryId: categoryId,
}
}).done(function (response){
console.log('has measurements response....');
if(!response.hasMeasurements){
console.log("Set measurements first...");
$('#measurements-modal').modal('show');
}else{
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=saveProductMeasurements',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'saveProductMeasurements',
formId: formId,
formLabel: formLabel,
measurements: JSON.stringify(measurements),
productId: productId,
categoryId: categoryId,
productAttributeId: productAttributeId,
},
success: function(response) {
console.log(response);
console.log("Proceed to add to cart....");
console.log(event.currentTarget)
const $form = $(event.currentTarget.form);
const query = `${$form.serialize()}&add=1&action=update`;
console.log("Form: ", $form.serialize());
console.log("Query: ", query);
const actionURL = $form.attr('action');
console.log("actionURL: ", actionURL);
const addToCartButton = $(event.currentTarget);
addToCartButton.prop('disabled', true);
const isQuantityInputValid = ($input) => {
let validInput = true;
$input.each((index, input) => {
const $currentInput = $(input);
const minimalValue = parseInt($currentInput.attr('min'), 10);
if (minimalValue && $currentInput.val() < minimalValue) {
onInvalidQuantity($currentInput);
validInput = false;
}
});
return validInput;
};
let onInvalidQuantity = ($input) => {
$input
.parents(prestashop.selectors.product.addToCart)
.first()
.find(prestashop.selectors.product.minimalQuantity)
.addClass('error');
$input
.parent()
.find('label')
.addClass('error');
};
const $quantityInput = $form.find('input[min]');
if (!isQuantityInputValid($quantityInput)) {
onInvalidQuantity($quantityInput);
return;
}
$.post(actionURL, query, null, 'json')
.then((resp) => {
console.log('Resp: ', resp);
if (!resp.hasError) {
prestashop.emit('updateCart', {
reason: {
idProduct: resp.id_product,
idProductAttribute: resp.id_product_attribute,
idCustomization: resp.id_customization,
linkAction: 'add-to-cart',
cart: resp.cart,
},
resp,
});
} else {
prestashop.emit('handleError', {
eventType: 'addProductToCart',
resp,
});
}
})
.fail((resp) => {
prestashop.emit('handleError', {
eventType: 'addProductToCart',
resp,
});
})
.always(() => {
setTimeout(() => {
addToCartButton.prop('disabled', false);
}, 1000);
});
},
error: function(xhr, status, error) {
console.error(xhr.responseText);
}
});
}
});
});

View File

@ -0,0 +1,88 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
{extends file='customer/page.tpl'}
{block name='page_title'}
{l s='thob - Manual Body Measurements' mod='thobbodymeasurements'}
{/block}
{block name='page_content'}
<div class="bg-white-400 shadow-md">
<section class=" h-34 p-10 flex flex-col">
{if isset($selectedForm)}
<h2 class="text-lg font-bold">{l s='Form:' mod='thobbodymeasurements'} {$selectedForm.label_form}</h2>
<form action="#" method="post" class="flex flex-col items-center justify-center ">
{foreach from=$selectedForm.attributes item=attribute}
<section class="flex flex-row p-4">
<div class=" flex flex-row gap-4">
<div class="w-24 lg:pr-4 text-end mt-2">
<label for="{$attribute.id}" class="text-base font-semibold mt-1 ">{$attribute.name}:</label>
</div>
<div class="lg:w-[500px]">
<input
type="text"
id="{$attribute.id}"
name="{$attribute.id}"
class=" lg:w-[450px] p-2"
pattern="[0-9]+"
title="Please enter a positive number"
required
{if isset($customerMeasurements) && isset($customerMeasurements[$attribute.id])}
value="{$customerMeasurements[$attribute.id]}"
{else}
placeholder="Enter measurement"
{/if}
/>
</div>
<div class="mt-1 w-24 mt-2 text-start ">
{$attribute.unit}
</div>
</div>
<input type="hidden" name="selected_form_id" id="selected_form_id" class="form-control" value="{$selectedForm.id_form}">
<input type="hidden" name="selected_form_label" id="selected_form_label" class="form-control" value="{$selectedForm.label_form}">
</section>
{/foreach}
<div class="lg:pr-11">
<button name="measurements_submit_form" type="submit" class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light">{l s='Save Measurements' mod='thobbodymeasurements'}</button>
</div>
</form>
{else}
<form action="#" method="post" class="form-horizontal mx-auto">
<div class="flex lg:flex-row flex-col gap-4 justify-center">
<label for="form_select" class="form-control-label col-md-3 font-medium text-lg mt-1 ">{l s='Select a Form:' mod='thobbodymeasurements'}</label>
<div class="">
<select name="form_select" id="form_select" class="form-control p-2 form-control-select w-[220px] h-[40px] rounded">
{foreach from=$currentForms item=form}
<option value="{$form.id_form}">{$form.label_form}</option>
{/foreach}
</select>
</div>
</div>
<div class="lg:pl-32 p-4">
<div class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light w-32">
<button type="submit" class="">{l s='Select Form' mod='thobbodymeasurements'}</button>
</div>
</div>
</form>
{/if}
</section>
</div>
{/block}

View File

@ -0,0 +1,7 @@
<a class="w-full md:w-1/3 lg:w-1/5 flex flex-col p-4 border-gray-500" id="tbm-link" href="{$front_controller}">
<span class="flex flex-col items-center font-semibolds text-lg">
<svg xmlns="http://www.w3.org/2000/svg" width=32 height=32 viewBox="0 0 32 32" id="measurements" stroke="currentColor"><path d="M29.5,1h-5A2.5,2.5,0,0,0,22,3.5V22H3.5A2.5,2.5,0,0,0,1,24.5v5A2.5,2.5,0,0,0,3.5,32h26A2.5,2.5,0,0,0,32,29.5V3.5A2.5,2.5,0,0,0,29.5,1ZM31,29.5A1.5,1.5,0,0,1,29.5,31H3.5A1.5,1.5,0,0,1,2,29.5v-5A1.5,1.5,0,0,1,3.5,23H4v3.5a.5.5,0,0,0,1,0V23H7v1.5a.5.5,0,0,0,1,0V23h2v1.5a.5.5,0,0,0,1,0V23h2v3.5a.5.5,0,0,0,1,0V23h2v1.5a.5.5,0,0,0,1,0V23h2v1.5a.5.5,0,0,0,1,0V23h2v3.5a.5.5,0,0,0,1,0V23h3.5a.5.5,0,0,0,0-1H23V20h1.5a.5.5,0,0,0,0-1H23V17h1.5a.5.5,0,0,0,0-1H23V14h3.5a.5.5,0,0,0,0-1H23V11h1.5a.5.5,0,0,0,0-1H23V8h1.5a.5.5,0,0,0,0-1H23V5h3.5a.5.5,0,0,0,0-1H23V3.5A1.5,1.5,0,0,1,24.5,2h5A1.5,1.5,0,0,1,31,3.5Z"></path></svg>
Body Measurements
</span>
</a>

View File

@ -0,0 +1,17 @@
<div class="modal fade" id="tbm-not-set-modal" tabindex="-1" role="dialog" aria-labelledby="tbm-not-set-label" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title font-semibold" id="tbm-not-set-label">{l s='thob Body Measurements'}</h5>
</div>
<div class="modal-body p-8">
<p>{l s='Please fill your personal body measurements to have the best custom shopping experience.'}</p>
</div>
<div class="modal-footer text-end">
<a id="set-measurements-tbm-modal" href="{$front_controller}" class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light">{l s='Set Measurements'}</a>
<a id="close-tbm-modal" href="" class=" hover:text-white hover:no-underline px-6 py-2 bg-gray-700 text-white text-base font-light">{l s='Close'}</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,22 @@
{if $measurements}
<div class="block w-full overflow-auto scrolling-touch table-striped p-1">
<table class="w-full max-w-full mb-4 bg-transparent">
<thead>
<tr>
<th>Attribute</th>
<th>Value</th>
<th>Unit</th>
</tr>
</thead>
<tbody>
{foreach from=$measurements item="measurement"}
<tr>
<td style="text-align:left;">{$measurement.label}</td>
<td style="text-align:left;">{$measurement.value}</td>
<td style="text-align:left;">{$measurement.unit}</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
{/if}

View File

@ -0,0 +1,89 @@
<input type="hidden" id="product-additional-info-product-id" value="{$productId}">
<input type="hidden" id="product-additional-info-category-id" value="{$categoryId}">
<input type="hidden" id="product-additional-info-product-attribute-id" value="{$productAttributeId}">
<input type="hidden" id="product-additional-info-access-code" value="{$accessCode}">
<a href="#" class="product-set-measurements-btn" id="set-measurements-button" data-toggle="modal" data-target="#measurements-modal">
Set Measurements
</a>
<!-- Modal -->
<div class="">
<div class="modal modal-set-measurements lg:w-[600px] mainBody pop-up" id="measurements-modal" tabindex="-1" role="dialog" >
<div class="wrapper">
<div class="tabs">
<div class="tab">
<input type="radio" name="css-tabs" id="tab-1" checked class="tab-switch">
<label for="tab-1" class="tab-label">Custom</label>
<div class="tab-content my-12">
{if isset($currentForm)}
<h2 class="font-semibold mb-4">{$currentForm.label_form}</h2>
<section class="form-fields">
{foreach from=json_decode($currentForm.attributes, true) item=$attribute}
<div class="mb-4 flex flex-row form-group ">
<div class="w-24 pr-8">
<label for="{$attribute.id}" class="form-control-label md:w-1/4 pr-4 pl-4 required">{$attribute.name}</label>
</div>
<div class=" js-input-column">
<input
type="text"
id="{$attribute.id}"
name="{$attribute.id}"
class=" block appearance-none md:w-56 w-24 py-1 px-2 mb-1 text-base leading-normal bg-white text-gray-800 border border-gray-200 rounded"
pattern="[0-9]+"
title="Please enter a positive number"
required
{if isset($customerMeasurements) && isset($customerMeasurements[$attribute.id])}
value="{$customerMeasurements[$attribute.id]}"
{/if}>
</div>
<div class="md:w-1/4 pr-4 pl-4 form-control-comment w-24">
<small class="block mt-1 text-gray-700 ">{$attribute.unit}</small>
</div>
</div>
{/foreach}
<input type="hidden" name="current_form_id" id="current_form_id" class="block appearance-none w-full py-1 px-2 mb-1 text-base leading-normal bg-white text-gray-800 border border-gray-200 rounded" value="{$currentForm.id_form}">
<input type="hidden" name="current_form_label" id="current_form_label" class="block appearance-none w-full py-1 px-2 mb-1 text-base leading-normal bg-white text-gray-800 border border-gray-200 rounded" value="{$currentForm.label_form}">
</section>
<button type="submit" class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light" id="submit-measurements-button">{l s='Submit' mod='thobbodymeasurements'}</button>
{else}
<p>No form data available.</p>
{/if}
<button type="button" class="hover:text-white hover:no-underline px-6 py-2 bg-gray-700 text-white text-base font-light" id="closebutton" data-dismiss="modal">Close</button>
</div>
</div>
<div class="tab mb-8">
<input type="radio" name="css-tabs" id="tab-2" class="tab-switch">
<label for="tab-2" class="tab-label">Mirror</label>
<div class="tab-content gap-mb-8">
<div class="tab-pane mb-8" id="mirror-size-measurements" role="tabpanel" aria-labelledby="mirror-size-measurements-tab">
{if $qrCode}
<img src="{$qrCode}" alt="Mirror Size QR Code" class="mx-auto max-w-full h-64">
<p class="mt-3"> Scan the above QR code to begin our easy 2 photo custom measurement collection.</p>
<p class="mt-3"> Click on 'Photos Completed' button once your above process is finished. </p>
<button type="button" class=" mt-3 mb-8 inline-block text-center select-none font-normal whitespace-no-wrap px-6 py-2 leading-normal no-underline bg-green-500 text-white hover:green-600" id="photos-completed-button" name="photos-completed-button">Photos Completed</button>
<button type="button" class=" mt-3 mb-8 hover:text-white hover:no-underline px-6 py-2 bg-gray-700 text-white text-base font-light " id="closemirrorbutton" data-dismiss="modal">Close</button>
{/if}
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -23,7 +23,7 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<nav data-depth="{$breadcrumb.count}" class="breadcrumb hidden md:flex my-8 w-full"> <nav data-depth="{$breadcrumb.count}" class="breadcrumb hidden md:flex my-8 w-full">
<ol itemscope itemtype="http://schema.org/BreadcrumbList" class="hidden md:flex w-full gap-4"> <ol itemscope itemtype="http://schema.org/BreadcrumbList" class="hidden md:flex w-full ">
{block name='breadcrumb'} {block name='breadcrumb'}
{foreach from=$breadcrumb.links item=path name=breadcrumb} {foreach from=$breadcrumb.links item=path name=breadcrumb}
{block name='breadcrumb_item'} {block name='breadcrumb_item'}
@ -31,6 +31,9 @@
<a itemprop="item" href="{$path.url}"> <a itemprop="item" href="{$path.url}">
<span itemprop="name">{$path.title}</span> <span itemprop="name">{$path.title}</span>
</a> </a>
{if !$smarty.foreach.breadcrumb.last}
<span class="mx-4">/</span>
{/if}
<meta itemprop="position" content="{$smarty.foreach.breadcrumb.iteration}"> <meta itemprop="position" content="{$smarty.foreach.breadcrumb.iteration}">
</li> </li>
{/block} {/block}

View File

@ -27,13 +27,30 @@
{hook h='displayFooterBefore'} {hook h='displayFooterBefore'}
{/block} {/block}
</div> </div>
<div class="container mx-auto"> <div class="container mx-auto flex flex-col gap-8">
<div class="flex items-center"> <div class="flex flex-col lg:flex-row gap-8">
<div class="w-48 h-48 flex flex-col justify-center"> <div class="w-32 max-sm:hidden flex flex-row justify-center items-center">
<a class="w-24 h-24" href="{$urls.base_url}"> <a class="w-full" href="{$urls.base_url}">
<img class="logo w-full aspect-square object-fit" src="{$shop.logo}" alt="{$shop.name}"> <img class="logo w-full" src="{$shop.logo}" alt="{$shop.name}">
</a>
</div>
<div class="w-full flex flex-1 flex-col lg:flex-row">
{block name='hook_footer'}
{hook h='displayFooter'}
{/block}
</div>
<div class="flex justify-center items-center gap-4">
<a class="p-4" href="https://www.facebook.com/BrooksBinghamClothing?mibextid=ZbWKwL" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-facebook" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3" /></svg>
</a>
<a class="p-4" href="https://instagram.com/brooksbingham?igshid=YTQwZjQ0NmI0OA==" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-instagram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M4 4m0 4a4 4 0 0 1 4 -4h8a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-8a4 4 0 0 1 -4 -4z"></path>
<path d="M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
<path d="M16.5 7.5l0 .01"></path>
</svg>
</a> </a>
<div class="h-96">
</div> </div>
</div> </div>
<div class="flex"> <div class="flex">
@ -41,13 +58,9 @@
{hook h='displayFooterAfter'} {hook h='displayFooterAfter'}
{/block} {/block}
</div> </div>
<div class="container"> <div class="flex py-8 max-md:justify-center">
<div class="flex justify-center py-8"> <a href="{$urls.base_url}">
{block name='copyright_link'} <span class="text-sm">© 2024 Brooksbingham Clothing</span>
<a class="_blank" href="https://www.prestashop.com" target="_blank" rel="nofollow">
{l s='%copyright% %year% - Ecommerce software by %prestashop%' sprintf=['%prestashop%' => 'PrestaShop™', '%year%' => 'Y'|date, '%copyright%' => '©'] d='Shop.Theme.Global'}
</a> </a>
{/block}
</div>
</div> </div>
</div> </div>

View File

@ -23,11 +23,11 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{if $errors|count} {if $errors|count}
<div class="help-block"> <div class="help-block mb-4">
{block name='form_errors'} {block name='form_errors'}
<ul> <ul>
{foreach $errors as $error} {foreach $errors as $error}
<li class="alert alert-danger">{$error|nl2br nofilter}</li> <li class="alert alert-danger px-4 py-2 border border-red-100 bg-red-50 text-red-900">{$error|nl2br nofilter}</li>
{/foreach} {/foreach}
</ul> </ul>
{/block} {/block}

View File

@ -30,18 +30,18 @@
{else} {else}
<div class="form-group row {if !empty($field.errors)}has-error{/if}"> <div class="form-group {if !empty($field.errors)}has-error{/if} flex flex-col">
<label class="col-md-3 form-control-label{if $field.required} required{/if}"> <label class="font-medium form-control-label{if $field.required} required{/if} mb-1">
{if $field.type !== 'checkbox'} {if $field.type !== 'checkbox'}
{$field.label} {$field.label}
{/if} {/if}
</label> </label>
<div class="col-md-6{if ($field.type === 'radio-buttons')} form-control-valign{/if}"> <div class="flex gap-1 {if ($field.type === 'radio-buttons')}flex gap-2 items-center{else}flex-col{/if}">
{if $field.type === 'select'} {if $field.type === 'select'}
{block name='form_field_item_select'} {block name='form_field_item_select'}
<select class="form-control form-control-select" name="{$field.name}" {if $field.required}required{/if}> <select class="form-control form-control-select px-2 py-1 border-gray-300 w-full" name="{$field.name}" {if $field.required}required{/if}>
<option value disabled selected>{l s='-- please choose --' d='Shop.Forms.Labels'}</option> <option value disabled selected>{l s='-- please choose --' d='Shop.Forms.Labels'}</option>
{foreach from=$field.availableValues item="label" key="value"} {foreach from=$field.availableValues item="label" key="value"}
<option value="{$value}" {if $value eq $field.value} selected {/if}>{$label}</option> <option value="{$value}" {if $value eq $field.value} selected {/if}>{$label}</option>
@ -53,7 +53,7 @@
{block name='form_field_item_country'} {block name='form_field_item_country'}
<select <select
class="form-control form-control-select js-country" class="form-control form-control-select js-country px-2 py-1 border-gray-300 w-full"
name="{$field.name}" name="{$field.name}"
{if $field.required}required{/if} {if $field.required}required{/if}
> >
@ -87,10 +87,9 @@
{elseif $field.type === 'checkbox'} {elseif $field.type === 'checkbox'}
{block name='form_field_item_checkbox'} {block name='form_field_item_checkbox'}
<span class="custom-checkbox"> <span class="custom-checkbox flex gap-2">
<label> <input class="my-0.5" name="{$field.name}" type="checkbox" value="1" {if $field.value}checked="checked"{/if} {if $field.required}required{/if}>
<input name="{$field.name}" type="checkbox" value="1" {if $field.value}checked="checked"{/if} {if $field.required}required{/if}> <label class="font-light text-sm" for="{$field.name}">
<span><i class="material-icons rtl-no-flip checkbox-checked">&#xE5CA;</i></span>
{$field.label nofilter} {$field.label nofilter}
</label> </label>
</span> </span>
@ -132,9 +131,9 @@
{elseif $field.type === 'password'} {elseif $field.type === 'password'}
{block name='form_field_item_password'} {block name='form_field_item_password'}
<div class="input-group js-parent-focus"> <div class="input-group js-parent-focus relative">
<input <input
class="form-control js-child-focus js-visible-password" class="form-control js-child-focus js-visible-password px-2 py-1 border border-gray-300 w-full"
name="{$field.name}" name="{$field.name}"
title="{l s='At least 5 characters long' d='Shop.Forms.Help'}" title="{l s='At least 5 characters long' d='Shop.Forms.Help'}"
type="password" type="password"
@ -142,17 +141,6 @@
pattern=".{literal}{{/literal}5,{literal}}{/literal}" pattern=".{literal}{{/literal}5,{literal}}{/literal}"
{if $field.required}required{/if} {if $field.required}required{/if}
> >
<span class="input-group-btn">
<button
class="btn"
type="button"
data-action="show-password"
data-text-show="{l s='Show' d='Shop.Theme.Actions'}"
data-text-hide="{l s='Hide' d='Shop.Theme.Actions'}"
>
{l s='Show' d='Shop.Theme.Actions'}
</button>
</span>
</div> </div>
{/block} {/block}
@ -160,7 +148,7 @@
{block name='form_field_item_other'} {block name='form_field_item_other'}
<input <input
class="form-control" class="form-control px-2 py-1 border border-gray-300 w-full"
name="{$field.name}" name="{$field.name}"
type="{$field.type}" type="{$field.type}"
value="{$field.value}" value="{$field.value}"
@ -183,7 +171,7 @@
</div> </div>
<div class="col-md-3 form-control-comment"> <div class="col-md-3 form-control-comment text-sm text-gray-600">
{block name='form_field_comment'} {block name='form_field_comment'}
{if (!$field.required && !in_array($field.type, ['radio-buttons', 'checkbox']))} {if (!$field.required && !in_array($field.type, ['radio-buttons', 'checkbox']))}
{l s='Optional' d='Shop.Forms.Labels'} {l s='Optional' d='Shop.Forms.Labels'}

View File

@ -1,5 +1,5 @@
{** {**
* 2007-2019 PrestaShop and Contributors * 2007-2019 PrestaShop and Contributorslivereload
* *
* NOTICE OF LICENSE * NOTICE OF LICENSE
* *
@ -58,6 +58,7 @@
{block name='stylesheets'} {block name='stylesheets'}
{include file="_partials/stylesheets.tpl" stylesheets=$stylesheets} {include file="_partials/stylesheets.tpl" stylesheets=$stylesheets}
{/block} {/block}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.36.0/tabler-icons.min.css">
{block name='javascript_head'} {block name='javascript_head'}
{include file="_partials/javascript.tpl" javascript=$javascript.head vars=$js_custom_vars} {include file="_partials/javascript.tpl" javascript=$javascript.head vars=$js_custom_vars}
@ -75,13 +76,46 @@
} }
} }
} }
</script> </script>
{** TODO: Remove this before going live *} {literal}
<script>document.write('<script src="http://' <!-- Hotjar Tracking Code for brooksbingham.com -->
+ location.host.split(':')[0] <script>
+ ':35729/livereload.js"></' (function(h,o,t,j,a,r){
+ 'script>')</script> h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
h._hjSettings={hjid:1840785,hjsv:6};
a=o.getElementsByTagName('head')[0];
r=o.createElement('script');r.async=1;
r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
a.appendChild(r);
})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
</script>
{/literal}
{literal}
<!--Start of Tawk.to Script-->
<script type="text/javascript">
var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
(function(){
var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
s1.async=true;
s1.src='https://embed.tawk.to/5dcb9e0bd96992700fc72d14/1dphord7t';
s1.charset='UTF-8';
s1.setAttribute('crossorigin','*');
s0.parentNode.insertBefore(s1,s0);
})();
</script>
<!--End of Tawk.to Script-->
{/literal}
{literal}
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5RQJPSV4');</script>
<!-- End Google Tag Manager -->
{/literal}
{block name='hook_header'} {block name='hook_header'}
{$HOOK_HEADER nofilter} {$HOOK_HEADER nofilter}
{/block} {/block}

View File

@ -26,7 +26,7 @@
{block name='header_top'} {block name='header_top'}
<div class="container mx-auto"> <div class="container mx-auto">
<div class="relative -mx-4 flex items-center justify-between h-24"> <div class="relative -mx-4 flex items-center justify-between h-24">
<div class="w-12 max-w-full "> <div class="w-40 max-md:pl-4 max-w-full ">
<a class="block w-full " href="{$urls.base_url}"> <a class="block w-full " href="{$urls.base_url}">
<img class="w-full" src="{$shop.logo}" alt="{$shop.name}"/> <img class="w-full" src="{$shop.logo}" alt="{$shop.name}"/>
</a> </a>
@ -35,7 +35,7 @@
<div class="w-full"> <div class="w-full">
{hook h='displayMainMenu'} {hook h='displayMainMenu'}
</div> </div>
<div class="relative right-16 hidden items-center justify-end sm:flex lg:right-0"> <div class="relative right-12 items-center justify-end sm:flex lg:right-0">
{hook h='displayTop'} {hook h='displayTop'}
</div> </div>
</div> </div>

View File

@ -22,7 +22,7 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<nav class="pagination flex justify-between"> <nav class="pagination flex justify-between mt-16">
<div class="flex"> <div class="flex">
{block name='pagination_summary'} {block name='pagination_summary'}
{l s='Showing %from%-%to% of %total% item(s)' d='Shop.Theme.Catalog' sprintf=['%from%' => $pagination.items_shown_from ,'%to%' => $pagination.items_shown_to, '%total%' => $pagination.total_items]} {l s='Showing %from%-%to% of %total% item(s)' d='Shop.Theme.Catalog' sprintf=['%from%' => $pagination.items_shown_from ,'%to%' => $pagination.items_shown_to, '%total%' => $pagination.total_items]}
@ -34,14 +34,17 @@
{if $pagination.should_be_displayed} {if $pagination.should_be_displayed}
<ul class="flex gap-4"> <ul class="flex gap-4">
{foreach from=$pagination.pages item="page"} {foreach from=$pagination.pages item="page"}
<li {if $page.current} class="current" {/if}> <li {if $page.current} class="current font-bold" {/if}>
<a <a
rel="{if $page.type === 'previous'}prev{elseif $page.type === 'next'}next{else}nofollow{/if}" rel="{if $page.type === 'previous'}prev{elseif $page.type === 'next'}next{else}nofollow{/if}"
href="{$page.url}" href="{$page.url}"
class="flex items-center {if $page.type === 'previous'}previous {elseif $page.type === 'next'}next {/if}{['disabled' => !$page.clickable, 'js-search-link' => true]|classnames}" disabled
class="flex items-center {if $page.type === 'previous'}previous {elseif $page.type === 'next'}next {/if}{['disabled' => !$page.clickable, 'js-search-link' => true]|classnames} {if $page.type == 'spacer'} pointer-events-none{/if}"
> >
{if $page.type === 'previous'} {if $page.type === 'previous'}
{l s='Previous' d='Shop.Theme.Actions'} {l s='Previous' d='Shop.Theme.Actions'}
{elseif $page.type === 'spacer'}
...
{elseif $page.type === 'next'} {elseif $page.type === 'next'}
{l s='Next' d='Shop.Theme.Actions'} {l s='Next' d='Shop.Theme.Actions'}
{else} {else}

View File

@ -26,6 +26,8 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@200;300;400;500;600;700;800;900;1000&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@200;300;400;500;600;700;800;900;1000&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.36.0/tabler-icons.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.36.0/tabler-icons.min.css">
<link rel="stylesheet" href="/themes/elegance/assets/js/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.2/jquery.modal.min.css" />
{foreach $stylesheets.external as $stylesheet} {foreach $stylesheets.external as $stylesheet}
<link rel="stylesheet" href="{$stylesheet.uri}" type="text/css" media="{$stylesheet.media}"> <link rel="stylesheet" href="{$stylesheet.uri}" type="text/css" media="{$stylesheet.media}">
{/foreach} {/foreach}

View File

@ -0,0 +1,9 @@
{**
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*}
<div id="js-product-list-footer">
{if !empty($category.additional_description) && $listing.pagination.items_shown_from == 1}
{$category.additional_description nofilter}
{/if}
</div>

View File

@ -22,20 +22,11 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="js-product-list-header"> <div id="js-product-list-header" class="mb-8 flex flex-col gap-4">
{if $listing.pagination.items_shown_from == 1} {if isset($subcategories) && $subcategories|@count> 0}
<div class="block-category card card-block"> <div class="flex">
<h1 class="h1">{$category.name}</h1> <h2 class="tex-4xl font-bold">Categories</h2>
<div class="block-category-inner">
{if $category.description}
<div id="category-description" class="text-muted">{$category.description nofilter}</div>
{/if}
{if $category.image.large.url}
<div class="category-cover">
<img src="{$category.image.large.url}" alt="{if !empty($category.image.legend)}{$category.image.legend}{else}{$category.name}{/if}">
</div>
{/if}
</div>
</div> </div>
{include file='catalog/_partials/subcategories.tpl' subcategories=$subcategories}
{/if} {/if}
</div> </div>

View File

@ -24,145 +24,56 @@
*} *}
{if $facets|count} {if $facets|count}
<div id="search_filters"> <div id="search_filters">
{block name='facets_title'} <div class="th-accordion">
<p class="text-uppercase h6 hidden-sm-down">{l s='Filter By' d='Shop.Theme.Actions'}</p>
{/block}
{block name='facets_clearall_button'}
{if $activeFilters|count}
<div id="_desktop_search_filters_clear_all" class="hidden-sm-down clear-all-wrapper">
<button data-search-url="{$clear_all_link}" class="btn btn-tertiary js-search-filters-clear-all">
<i class="material-icons">&#xE14C;</i>
{l s='Clear all' d='Shop.Theme.Actions'}
</button>
</div>
{/if}
{/block}
{foreach from=$facets item="facet"} {foreach from=$facets item="facet"}
{if !$facet.displayed} {if !$facet.displayed}
{continue} {continue}
{/if} {/if}
{if $facet.widgetType === 'dropdown'}
<section class="facet clearfix"> <div class="th-accordion-item border-t border-gray-200 px-4 py-4">
<p class="h6 facet-title hidden-sm-down">{$facet.label}</p> <h3 class="-mx-2 -my-3 flow-root">
{assign var=_expand_id value=10|mt_rand:100000} <!-- Expand/collapse section button -->
{assign var=_collapse value=true} <button id="show-filters-{$facet.label}" data-filter-name="{$facet.label}" type="button" class="th-accordion-item-trigger flex w-full items-center justify-between bg-white px-2 py-3 text-gray-400 hover:text-gray-500" aria-controls="filter-section-mobile-0" aria-expanded="false">
{foreach from=$facet.filters item="filter"} <span class="font-medium text-gray-900">
{if $filter.active}{assign var=_collapse value=false}{/if}
{/foreach}
<div class="title hidden-md-up" data-target="#facet_{$_expand_id}" data-toggle="collapse"{if !$_collapse} aria-expanded="true"{/if}>
<p class="h6 facet-title">{$facet.label}</p>
<span class="float-xs-right">
<span class="navbar-toggler collapse-icons">
<i class="material-icons add">&#xE313;</i>
<i class="material-icons remove">&#xE316;</i>
</span>
</span>
</div>
{if $facet.widgetType !== 'dropdown'}
{block name='facet_item_other'}
<ul id="facet_{$_expand_id}" class="collapse{if !$_collapse} in{/if}">
{foreach from=$facet.filters key=filter_key item="filter"}
{if !$filter.displayed}
{continue}
{/if}
<li>
<label class="facet-label{if $filter.active} active {/if}" for="facet_input_{$_expand_id}_{$filter_key}">
{if $facet.multipleSelectionAllowed}
<span class="custom-checkbox">
<input
id="facet_input_{$_expand_id}_{$filter_key}"
data-search-url="{$filter.nextEncodedFacetsURL}"
type="checkbox"
{if $filter.active }checked{/if}
>
{if isset($filter.properties.color)}
<span class="color" style="background-color:{$filter.properties.color}"></span>
{elseif isset($filter.properties.texture)}
<span class="color texture" style="background-image:url({$filter.properties.texture})"></span>
{else}
<span {if !$js_enabled} class="ps-shown-by-js" {/if}><i class="material-icons rtl-no-flip checkbox-checked">&#xE5CA;</i></span>
{/if}
</span>
{else}
<span class="custom-radio">
<input
id="facet_input_{$_expand_id}_{$filter_key}"
data-search-url="{$filter.nextEncodedFacetsURL}"
type="radio"
name="filter {$facet.label}"
{if $filter.active }checked{/if}
>
<span {if !$js_enabled} class="ps-shown-by-js" {/if}></span>
</span>
{/if}
<a
href="{$filter.nextEncodedFacetsURL}"
class="_gray-darker search-link js-search-link"
rel="nofollow"
>
{$filter.label}
{if $filter.magnitude}
<span class="magnitude">({$filter.magnitude})</span>
{/if}
</a>
</label>
</li>
{/foreach}
</ul>
{/block}
{else}
{block name='facet_item_dropdown'}
<ul id="facet_{$_expand_id}" class="collapse{if !$_collapse} in{/if}">
<li>
<div class="col-sm-12 col-xs-12 col-md-12 facet-dropdown dropdown">
<a class="select-title" rel="nofollow" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{$active_found = false} {$active_found = false}
<span>
{foreach from=$facet.filters item="filter"} {foreach from=$facet.filters item="filter"}
{if $filter.active} {if $filter.active}
{$filter.label} {$filter.label}
{if $filter.magnitude}
({$filter.magnitude})
{/if}
{$active_found = true} {$active_found = true}
{/if} {/if}
{/foreach} {/foreach}
{if !$active_found} {if !$active_found}
{l s='(no filter)' d='Shop.Theme.Global'} {$facet.label}
{/if} {/if}
</span> </span>
<i class="material-icons float-xs-right">&#xE5C5;</i> <span class="ml-6 flex items-center">
</a> <!-- Expand icon, show/hide based on section open state. -->
<div class="dropdown-menu"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M6 9l6 6l6 -6"></path>
</svg>
</span>
</button>
</h3>
<!-- Filter section, show/hide based on section state. -->
<div class="th-accordion-item-content pt-6 hidden" id="filter-section-{$facet.label}" data-filter-name="{$facet.label}">
<div class="flex flex-wrap w-full">
{foreach from=$facet.filters item="filter"} {foreach from=$facet.filters item="filter"}
{if !$filter.active} {if !$filter.active}
<a <a
rel="nofollow" rel="nofollow"
href="{$filter.nextEncodedFacetsURL}" href="{$filter.nextEncodedFacetsURL}"
class="select-list" class="select-list text-sm w-1/2 p-2 text-center"
> >
{$filter.label} {$filter.label}
{if $filter.magnitude}
({$filter.magnitude})
{/if}
</a> </a>
{/if} {/if}
{/foreach} {/foreach}
</div> </div>
</div> </div>
</li> </div>
</ul>
{/block}
{/if} {/if}
</section>
{/foreach} {/foreach}
</div> </div>
</div>
{/if} {/if}

View File

@ -23,70 +23,40 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{block name='product_miniature_item'} {block name='product_miniature_item'}
<article class="product-miniature js-product-miniature flex flex-col shrink-0" data-id-product="{$product.id_product}" data-id-product-attribute="{$product.id_product_attribute}" itemscope itemtype="http://schema.org/Product"> <a href="{$product.url}" class="group w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-col p-4">
<div class="thumbnail-container flex flex-col gap-4">
{block name='product_thumbnail'} {block name='product_thumbnail'}
{if $product.cover} {if $product.cover}
<a href="{$product.url}" class="thumbnail product-thumbnail w-full aspect-[342/513] bg-gray-100"> <div class="thumbnail product-thumbnail w-full aspect-[342/513] bg-gray-100">
<img <img
src="{$product.cover.bySize.home_default.url}" src="{$product.cover.bySize.home_default.url}"
alt="{if !empty($product.cover.legend)}{$product.cover.legend}{else}{$product.name|truncate:30:'...'}{/if}" alt="{if !empty($product.cover.legend)}{$product.cover.legend}{else}{$product.name|truncate:30:'...'}{/if}"
data-full-size-image-url="{$product.cover.large.url}" data-full-size-image-url="{$product.cover.large.url}"
class="object-cover w-full h-full" class="object-cover w-full h-full"
/> />
</a> </div>
{else} {else}
<a href="{$product.url}" class="thumbnail product-thumbnail w-full aspect-[342/513]"> <div class="thumbnail product-thumbnail w-full aspect-[342/513]">
<img class="object-fit w-full h-full" src="{$urls.no_picture_image.bySize.home_default.url}" /> <img class="object-fit w-full h-full" src="{$urls.no_picture_image.bySize.home_default.url}" />
</a>
{/if}
{/block}
<div class="product-description flex flex-col">
{block name='product_price_and_shipping'}
{if $product.show_price}
<div class="product-price-and-shipping flex flex-col">
{if $product.has_discount}
{hook h='displayProductPriceBlock' product=$product type="old_price"}
<span class="regular-price">{$product.regular_price}</span>
{if $product.discount_type === 'percentage'}
<span class="discount-percentage discount-product">{$product.discount_percentage}</span>
{elseif $product.discount_type === 'amount'}
<span class="discount-amount discount-product">{$product.discount_amount_to_display}</span>
{/if}
{/if}
{hook h='displayProductPriceBlock' product=$product type="before_price"}
<span itemprop="price" class="price text-base font-medium">{$product.price}</span>
{hook h='displayProductPriceBlock' product=$product type='unit_price'}
{hook h='displayProductPriceBlock' product=$product type='weight'}
</div> </div>
{/if} {/if}
{/block} {/block}
<div class="product-description flex flex-col pt-4 group-hover:text-blue-900 gap-1">
{block name='product_price_and_shipping'}
<div class="flex w-full justify-between items-center">
{if $product.has_discount}
<span class="regular-price line-through leading-none font-medium">{$product.regular_price}</span>
{/if}
{if $product.show_price}
<div class="font-bold text-lg">
<span>{$product.price}</span>
</div>
{/if}
</div>
{/block}
{block name='product_name'} {block name='product_name'}
<h2 class="h3 product-title text-lg font-medium" itemprop="name"><a href="{$product.url}">{$product.name|truncate:30:'...'}</a></h2> <span class="text-lg font-light" itemprop="name">{$product.name|truncate:30:'...'}</span>
{/block}
{block name='product_reviews'}
{hook h='displayProductListReviews' product=$product}
{/block} {/block}
</div> </div>
</a>
<!-- @todo: use include file='catalog/_partials/product-flags.tpl'} -->
<div class="highlighted-informations{if !$product.main_variants} no-variants{/if} hidden-sm-down">
{block name='product_variants'}
{if $product.main_variants}
{include file='catalog/_partials/variant-links.tpl' variants=$product.main_variants}
{/if}
{/block}
</div>
</div>
</article>
{/block} {/block}

View File

@ -22,57 +22,65 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="product-add-to-cart"> <div class="product-add-to-cart flex flex-col gap-3 mt-8 mb-4">
{if !$configuration.is_catalog} {if !$configuration.is_catalog}
<span class="control-label">{l s='Quantity' d='Shop.Theme.Catalog'}</span>
{block name='product_availability'}
<span id="product-availability" class='flex w-full justify-center items-center gap-1 text-xl'>
{if $product.show_availability && $product.availability_message}
{if $product.availability == 'available'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-box-seam" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3l8 4.5v9l-8 4.5l-8 -4.5v-9l8 -4.5"></path>
<path d="M12 12l8 -4.5"></path>
<path d="M8.2 9.8l7.6 -4.6"></path>
<path d="M12 12v9"></path>
<path d="M12 12l-8 -4.5"></path>
</svg>
{elseif $product.availability == 'last_remaining_items'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-hourglass" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M6.5 7h11"></path>
<path d="M6.5 17h11"></path>
<path d="M6 20v-2a6 6 0 1 1 12 0v2a1 1 0 0 1 -1 1h-10a1 1 0 0 1 -1 -1z"></path>
<path d="M6 4v2a6 6 0 1 0 12 0v-2a1 1 0 0 0 -1 -1h-10a1 1 0 0 0 -1 1z"></path>
</svg>
{else}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-package-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M8.812 4.793l3.188 -1.793l8 4.5v8.5m-2.282 1.784l-5.718 3.216l-8 -4.5v-9l2.223 -1.25"></path>
<path d="M14.543 10.57l5.457 -3.07"></path>
<path d="M12 12v9"></path>
<path d="M12 12l-8 -4.5"></path>
<path d="M16 5.25l-4.35 2.447m-2.564 1.442l-1.086 .611"></path>
<path d="M3 3l18 18"></path>
</svg>
{/if}
{$product.availability_message}
{/if}
</span>
{/block}
{block name='product_quantity'} {block name='product_quantity'}
<div class="product-quantity clearfix"> <div class="flex w-full flex-col gap-4">
<div class="qty">
<input
type="number"
name="qty"
id="quantity_wanted"
value="{$product.quantity_wanted}"
class="input-group"
min="{$product.minimal_quantity}"
aria-label="{l s='Quantity' d='Shop.Theme.Actions'}"
>
</div>
<div class="add"> <div class="add">
<button <button
class="btn btn-primary add-to-cart" class="add-to-cart w-full uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900"
data-button-action="add-to-cart" data-button-action="add-to-cart"
type="submit" type="submit"
{if !$product.add_to_cart_url} {if !$product.add_to_cart_url}
disabled disabled
{/if} {/if}
> >
<i class="material-icons shopping-cart">&#xE547;</i> {l s='ADD TO CART' d='Shop.Theme.Actions'}
{l s='Add to cart' d='Shop.Theme.Actions'}
</button> </button>
</div> </div>
{hook h='displayCustomProductActions'}
{hook h='displayProductActions' product=$product} {hook h='displayProductActions' product=$product}
</div> </div>
{/block} {/block}
{block name='product_availability'}
<span id="product-availability">
{if $product.show_availability && $product.availability_message}
{if $product.availability == 'available'}
<i class="material-icons rtl-no-flip product-available">&#xE5CA;</i>
{elseif $product.availability == 'last_remaining_items'}
<i class="material-icons product-last-items">&#xE002;</i>
{else}
<i class="material-icons product-unavailable">&#xE14B;</i>
{/if}
{$product.availability_message}
{/if}
</span>
{/block}
{block name='product_minimal_quantity'} {block name='product_minimal_quantity'}
<p class="product-minimal-quantity"> <p class="product-minimal-quantity">
{if $product.minimal_quantity > 1} {if $product.minimal_quantity > 1}

View File

@ -22,6 +22,6 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="product-additional-info"> <div class="product-additional-info flex flex-col">
{hook h='displayProductAdditionalInfo' product=$product} {hook h='displayProductAdditionalInfo' product=$product}
</div> </div>

View File

@ -22,25 +22,18 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="images-container"> <div class="images-container flex w-full flex-row-reverse justify-center gap-6 flex-wrap lg:flex-nowrap">
{block name='product_cover'} {block name='product_cover'}
<div class="product-cover"> <div class="product-cover w-full">
{if $product.cover} <img class="js-qv-product-cover w-full bg-gray-100" src="{$product.cover.bySize.large_default.url}" alt="{$product.cover.legend}" title="{$product.cover.legend}" itemprop="image">
<img class="js-qv-product-cover" src="{$product.cover.bySize.large_default.url}" alt="{$product.cover.legend}" title="{$product.cover.legend}" style="width:100%;" itemprop="image">
<div class="layer hidden-sm-down" data-toggle="modal" data-target="#product-modal">
<i class="material-icons zoom-in">&#xE8FF;</i>
</div>
{else}
<img src="{$urls.no_picture_image.bySize.large_default.url}" style="width:100%;">
{/if}
</div> </div>
{/block} {/block}
{block name='product_images'} {block name='product_images'}
<div class="js-qv-mask mask"> <div class="js-qv-mask mask" >
<ul class="product-images js-qv-product-images"> <ul class="product-images js-qv-product-images flex flex-row lg:flex-col gap-6">
{foreach from=$product.images item=image} {foreach from=$product.images item=image}
<li class="thumb-container"> <li class="thumb-container w-14 md:w-24">
<img <img
class="thumb js-thumb {if $image.id_image == $product.cover.id_image} selected {/if}" class="thumb js-thumb {if $image.id_image == $product.cover.id_image} selected {/if}"
data-image-medium-src="{$image.bySize.medium_default.url}" data-image-medium-src="{$image.bySize.medium_default.url}"
@ -48,7 +41,6 @@
src="{$image.bySize.home_default.url}" src="{$image.bySize.home_default.url}"
alt="{$image.legend}" alt="{$image.legend}"
title="{$image.legend}" title="{$image.legend}"
width="100"
itemprop="image" itemprop="image"
> >
</li> </li>

View File

@ -1,91 +1,19 @@
<div class="tab-pane fade{if !$product.description} in active{/if}" {block name='product_features'}
id="product-details"
data-product="{$product.embedded_attributes|json_encode}"
role="tabpanel"
>
{block name='product_reference'}
{if isset($product_manufacturer->id)}
<div class="product-manufacturer">
{if isset($manufacturer_image_url)}
<a href="{$product_brand_url}">
<img src="{$manufacturer_image_url}" class="img img-thumbnail manufacturer-logo" alt="{$product_manufacturer->name}">
</a>
{else}
<label class="label">{l s='Brand' d='Shop.Theme.Catalog'}</label>
<span>
<a href="{$product_brand_url}">{$product_manufacturer->name}</a>
</span>
{/if}
</div>
{/if}
{if isset($product.reference_to_display) && $product.reference_to_display neq ''}
<div class="product-reference">
<label class="label">{l s='Reference' d='Shop.Theme.Catalog'} </label>
<span itemprop="sku">{$product.reference_to_display}</span>
</div>
{/if}
{/block}
{block name='product_quantities'}
{if $product.show_quantities}
<div class="product-quantities">
<label class="label">{l s='In stock' d='Shop.Theme.Catalog'}</label>
<span data-stock="{$product.quantity}" data-allow-oosp="{$product.allow_oosp}">{$product.quantity} {$product.quantity_label}</span>
</div>
{/if}
{/block}
{block name='product_availability_date'}
{if $product.availability_date}
<div class="product-availability-date">
<label>{l s='Availability date:' d='Shop.Theme.Catalog'} </label>
<span>{$product.availability_date}</span>
</div>
{/if}
{/block}
{block name='product_out_of_stock'}
<div class="product-out-of-stock">
{hook h='actionProductOutOfStock' product=$product}
</div>
{/block}
{block name='product_features'}
{if $product.grouped_features} {if $product.grouped_features}
<section class="product-features"> <div class='w-full flex items-center flex-col gap-3'>
<p class="h6">{l s='Data sheet' d='Shop.Theme.Catalog'}</p> <h1 class='text-lg font-bold text-gray-600'>
<dl class="data-sheet"> Description
</h1>
<ul class="product-features list-[square] w-full flex flex-col gap-1 justify-center">
{foreach from=$product.grouped_features item=feature} {foreach from=$product.grouped_features item=feature}
<dt class="name">{$feature.name}</dt> <div class="flex gap-2">
<dd class="value">{$feature.value|escape:'htmlall'|nl2br nofilter}</dd> <li class="w-44 shrink-0">
<span class="name font-semibold">{$feature.name}</span>
</li>
<span class="value">{$feature.value|escape:'htmlall'|nl2br nofilter}</span>
</div>
{/foreach} {/foreach}
</dl> </ul>
</section>
{/if}
{/block}
{* if product have specific references, a table will be added to product details section *}
{block name='product_specific_references'}
{if !empty($product.specific_references)}
<section class="product-features">
<p class="h6">{l s='Specific References' d='Shop.Theme.Catalog'}</p>
<dl class="data-sheet">
{foreach from=$product.specific_references item=reference key=key}
<dt class="name">{$key}</dt>
<dd class="value">{$reference}</dd>
{/foreach}
</dl>
</section>
{/if}
{/block}
{block name='product_condition'}
{if $product.condition}
<div class="product-condition">
<label class="label">{l s='Condition' d='Shop.Theme.Catalog'} </label>
<link itemprop="itemCondition" href="{$product.condition.schema_url}"/>
<span>{$product.condition.label}</span>
</div> </div>
{/if} {/if}
{/block} {/block}
</div>

View File

@ -23,12 +23,12 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{if $product.show_price} {if $product.show_price}
<div class="product-prices"> <div class="product-prices flex flex-col">
{block name='product_discount'} {block name='product_discount'}
{if $product.has_discount} {if $product.has_discount}
<div class="product-discount"> <div class="product-discount">
{hook h='displayProductPriceBlock' product=$product type="old_price"} {hook h='displayProductPriceBlock' product=$product type="old_price"}
<span class="regular-price">{$product.regular_price}</span> <span class="regular-price line-through text-red-400 leading-none">{$product.regular_price}</span>
</div> </div>
{/if} {/if}
{/block} {/block}
@ -43,14 +43,14 @@
<link itemprop="availability" href="{$product.seo_availability}"/> <link itemprop="availability" href="{$product.seo_availability}"/>
<meta itemprop="priceCurrency" content="{$currency.iso_code}"> <meta itemprop="priceCurrency" content="{$currency.iso_code}">
<div class="current-price"> <div class="current-price flex gap-2 items-baseline">
<span itemprop="price" content="{$product.price_amount}">{$product.price}</span> <span itemprop="price" class="text-2xl font-normal" content="{$product.price_amount}">{$product.price}</span>
{if $product.has_discount} {if $product.has_discount}
{if $product.discount_type === 'percentage'} {if $product.discount_type === 'percentage'}
<span class="discount discount-percentage">{l s='Save %percentage%' d='Shop.Theme.Catalog' sprintf=['%percentage%' => $product.discount_percentage_absolute]}</span> <span class="discount discount-percentage">{l s='Save %percentage%' d='Shop.Theme.Catalog' sprintf=['%percentage%' => $product.discount_percentage_absolute]}</span>
{else} {else}
<span class="discount discount-amount"> <span class="discount discount-amount text-sm">
{l s='Save %amount%' d='Shop.Theme.Catalog' sprintf=['%amount%' => $product.discount_to_display]} {l s='Save %amount%' d='Shop.Theme.Catalog' sprintf=['%amount%' => $product.discount_to_display]}
</span> </span>
{/if} {/if}
@ -92,8 +92,6 @@
<div class="tax-shipping-delivery-label"> <div class="tax-shipping-delivery-label">
{if !$configuration.taxes_enabled} {if !$configuration.taxes_enabled}
{l s='No tax' d='Shop.Theme.Catalog'} {l s='No tax' d='Shop.Theme.Catalog'}
{elseif $configuration.display_taxes_label}
{$product.labels.tax_long}
{/if} {/if}
{hook h='displayProductPriceBlock' product=$product type="price"} {hook h='displayProductPriceBlock' product=$product type="price"}
{hook h='displayProductPriceBlock' product=$product type="after_price"} {hook h='displayProductPriceBlock' product=$product type="after_price"}

4
templates/catalog/_partials/product-variants.tpl Normal file → Executable file
View File

@ -26,10 +26,10 @@
{foreach from=$groups key=id_attribute_group item=group} {foreach from=$groups key=id_attribute_group item=group}
{if !empty($group.attributes)} {if !empty($group.attributes)}
<div class="clearfix product-variants-item"> <div class="clearfix product-variants-item">
<span class="control-label">{$group.name}</span> <span class="control-label font-semibold pr-2">{$group.name}:</span>
{if $group.group_type == 'select'} {if $group.group_type == 'select'}
<select <select
class="form-control form-control-select" class="form-control form-control-select p-2 w-14"
id="group_{$id_attribute_group}" id="group_{$id_attribute_group}"
data-product-attribute="{$id_attribute_group}" data-product-attribute="{$id_attribute_group}"
name="group[{$id_attribute_group}]"> name="group[{$id_attribute_group}]">

View File

@ -22,35 +22,50 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="js-product-list-top" class="row products-selection">
<div class="col-md-6 hidden-sm-down total-products"> <div id="js-product-list-top" class="bg-white">
{if $listing.pagination.total_items > 1}
<p>{l s='There are %product_count% products.' d='Shop.Theme.Catalog' sprintf=['%product_count%' => $listing.pagination.total_items]}</p> <!-- Top Bar With Filter Button and Sort By Selector -->
{elseif $listing.pagination.total_items > 0} <div class="flex justify-between">
<p>{l s='There is 1 product.' d='Shop.Theme.Catalog'}</p> <!-- Show Filters Button -->
<div class="flex">
{if !empty($listing.rendered_facets)}
<button id="show-filters" type="button" class="flex space-x-2 items-center">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-filter" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z" />
</svg>
<span> Filter </span>
</button>
{/if} {/if}
</div> </div>
<div class="col-md-6"> <!-- Sort By Dropdown -->
<div class="row sort-by-row"> <div class="flex max-w-[240px]">
{block name='sort_by'} {block name='sort_by'}
{include file='catalog/_partials/sort-orders.tpl' sort_orders=$listing.sort_orders} {include file='catalog/_partials/sort-orders.tpl' sort_orders=$listing.sort_orders}
{/block} {/block}
</div>
</div>
{if !empty($listing.rendered_facets)} <!-- Off Screen Canvas Menu For Filters -->
<div class="col-sm-3 col-xs-4 hidden-md-up filter-button"> <div id="product-list-top-filters" class="offcanvas fixed inset-0 flex w-64 hidden" role="dialog" aria-modal="true">
<button id="search_filter_toggler" class="btn btn-secondary"> <div class="relative mr-auto flex h-full flex-col overflow-y-auto bg-white py-4 pb-12 shadow-xl">
{l s='Filter' d='Shop.Theme.Actions'} <div class="flex items-center justify-between px-4">
<h2 class="text-lg font-medium text-gray-900">Filters</h2>
<button id="hide-filters" type="button">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-x" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M18 6l-12 12" /><path d="M6 6l12 12" />
</svg>
</button> </button>
</div> </div>
<form class="mt-4 border-t border-gray-200">
{if !empty($listing.rendered_facets)}
{include file='catalog/_partials/facets.tpl'}
{else}
<div></div>
{/if} {/if}
</form>
</div> </div>
</div> </div>
<div class="col-sm-12 hidden-md-up text-sm-center showing">
{l s='Showing %from%-%to% of %total% item(s)' d='Shop.Theme.Catalog' sprintf=[
'%from%' => $listing.pagination.items_shown_from ,
'%to%' => $listing.pagination.items_shown_to,
'%total%' => $listing.pagination.total_items
]}
</div>
</div> </div>

View File

@ -22,8 +22,8 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="js-product-list flex flex-col"> <div id="js-product-list" class="flex flex-col">
<div class="products grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4"> <div class="products flex flex-wrap">
{foreach from=$listing.products item="product"} {foreach from=$listing.products item="product"}
{block name='product_miniature'} {block name='product_miniature'}
{include file='catalog/_partials/miniatures/product.tpl' product=$product} {include file='catalog/_partials/miniatures/product.tpl' product=$product}
@ -35,8 +35,8 @@
{include file='_partials/pagination.tpl' pagination=$listing.pagination} {include file='_partials/pagination.tpl' pagination=$listing.pagination}
{/block} {/block}
<div class="flex justify-center md:hidden my-4"> <div class="flex justify-center md:hidden my-8">
<a href="#header" class="btn btn-secondary"> <a href="#js-product-list-header" class="btn btn-secondary font-semibold">
{l s='Back to top' d='Shop.Theme.Actions'} {l s='Back to top' d='Shop.Theme.Actions'}
</a> </a>
</div> </div>

View File

@ -22,26 +22,31 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<span class="col-sm-3 col-md-3 hidden-sm-down sort-by">{l s='Sort by:' d='Shop.Theme.Global'}</span>
<div class="{if !empty($listing.rendered_facets)}col-sm-9 col-xs-8{else}col-sm-12 col-xs-12{/if} col-md-9 products-sort-order dropdown"> <div class="relative flex-1 w-full max-w-[240px] group">
<button <button
class="btn-unstyle select-title" class="dropdown-toggle relative px-4 pr-6 leading-1 w-full text-left"
type="button"
rel="nofollow" rel="nofollow"
data-toggle="dropdown"
aria-haspopup="true" aria-haspopup="true"
aria-expanded="false"> aria-expanded="false">
{if isset($listing.sort_selected)}{$listing.sort_selected}{else}{l s='Select' d='Shop.Theme.Actions'}{/if} {if isset($listing.sort_selected)}{$listing.sort_selected}{else}{l s='Select' d='Shop.Theme.Actions'}{/if}
<i class="material-icons float-xs-right">&#xE5C5;</i> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down absolute right-0 top-1" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M6 9l6 6l6 -6"></path>
</svg>
</button> </button>
<div class="dropdown-menu"> <div class="dropdown-menu hidden group-hover:flex absolute top-full right-0 bg-white z-10 shadow-lg">
<div class="flex flex-col whitespace-nowrap">
{foreach from=$listing.sort_orders item=sort_order} {foreach from=$listing.sort_orders item=sort_order}
<a <a
rel="nofollow" rel="nofollow"
href="{$sort_order.url}" href="{$sort_order.url}"
class="select-list {['current' => $sort_order.current, 'js-search-link' => true]|classnames}" class="px-4 py-1 hover:text-yellow-700 select-list {['current' => $sort_order.current, 'js-search-link' => true]|classnames}"
> >
{$sort_order.label} {$sort_order.label}
</a> </a>
{/foreach} {/foreach}
</div> </div>
</div>
</div> </div>

View File

@ -0,0 +1,52 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
{$componentName = 'subcategories'}
{if !empty($subcategories)}
{if (isset($display_subcategories) && $display_subcategories eq 1) || !isset($display_subcategories) }
<div id="subcategories" class="{$componentName} flex flex-col gap-2 md:flex-row">
{foreach from=$subcategories item=subcategory}
<div class="subcategory__wrapper flex-1 bg-gray-100">
<a class="subcategory relative" href="{$subcategory.url}" title="{$subcategory.name|escape:'html':'UTF-8'}">
<div class="subcategory__image w-full">
{if !empty($subcategory.image.large.url)}
<img
class="img-fluid hidden md:block mx-auto w-full max-w-[171px] aspect-[342/513]"
src="{$subcategory.image.large.url}"
width="{$subcategory.image.large.width}"
height="{$subcategory.image.large.height}"
alt="{$subcategory.name|escape:'html':'UTF-8'}"
loading="lazy"
>
{/if}
</div>
<div class="p-2 flex items-center w-full relative md:absolute left-0 bottom-0 right-0 top-0 bg-black/70 flex items-center justify-center">
<p class="subcategory__name font-bold text-center w-full text-gray-50">{$subcategory.name|escape:'html':'UTF-8'}</p>
</div>
</a>
</div>
{/foreach}
</div>
{/if}
{/if}

View File

@ -25,4 +25,9 @@
{extends file='catalog/listing/product-list.tpl'} {extends file='catalog/listing/product-list.tpl'}
{block name='product_list_header'} {block name='product_list_header'}
{include file='catalog/_partials/category-header.tpl' listing=$listing category=$category}
{/block}
{block name='product_list_footer'}
{include file='catalog/_partials/category-footer.tpl' listing=$listing category=$category}
{/block} {/block}

View File

@ -31,7 +31,7 @@
<h2 id="js-product-list-header" class="h2">{$listing.label}</h2> <h2 id="js-product-list-header" class="h2">{$listing.label}</h2>
{/block} {/block}
<section id="products" class="flex flex-col gap-4"> <section id="products" class="flex flex-col gap-8">
{if $listing.products|count} {if $listing.products|count}
{block name='product_list_top'} {block name='product_list_top'}

View File

@ -52,36 +52,29 @@
<section id="main" itemscope itemtype="https://schema.org/Product"> <section id="main" itemscope itemtype="https://schema.org/Product">
<meta itemprop="url" content="{$product.url}"> <meta itemprop="url" content="{$product.url}">
<div class="row product-container"> <div class="flex gap-8 flex-wrap lg:flex-nowrap">
<div class="col-md-6">
{block name='page_content_container'} {block name='page_content_container'}
<section class="page-content" id="content"> <section class="flex w-full" id="content">
{block name='page_content'} {block name='page_content'}
<!-- @todo: use include file='catalog/_partials/product-flags.tpl'} --> <!-- @todo: use include file='catalog/_partials/product-flags.tpl'} -->
{block name='product_flags'} {block name='product_flags'}
<ul class="product-flags">
{foreach from=$product.flags item=flag}
<li class="product-flag {$flag.type}">{$flag.label}</li>
{/foreach}
</ul>
{/block} {/block}
{block name='product_cover_thumbnails'} {block name='product_cover_thumbnails'}
{include file='catalog/_partials/product-cover-thumbnails.tpl'} {include file='catalog/_partials/product-cover-thumbnails.tpl'}
{/block} {/block}
<div class="scroll-box-arrows">
<i class="material-icons left">&#xE314;</i>
<i class="material-icons right">&#xE315;</i>
</div>
{/block} {/block}
</section> </section>
{/block} {/block}
</div> <div class="flex flex-col w-full gap-3">
<div class="col-md-6">
{block name='page_header_container'} {block name='page_header_container'}
{block name='page_header'} {block name='page_header'}
<h1 class="h1" itemprop="name">{block name='page_title'}{$product.name}{/block}</h1> <div class='flex flex-col gap-2'>
<h1 class="text-2xl font-normal" itemprop="name">{block name='page_title'}{$product.name}{/block}</h1>
{if $product.description_short}
<span class='text-sm'>{$product.description_short nofilter}</span>
{/if}
</div>
{/block} {/block}
{/block} {/block}
{block name='product_prices'} {block name='product_prices'}
@ -89,10 +82,6 @@
{/block} {/block}
<div class="product-information"> <div class="product-information">
{block name='product_description_short'}
<div id="product-description-short-{$product.id}" itemprop="description">{$product.description_short nofilter}</div>
{/block}
{if $product.is_customizable && count($product.customizations.fields)} {if $product.is_customizable && count($product.customizations.fields)}
{block name='product_customization'} {block name='product_customization'}
{include file="catalog/_partials/product-customization.tpl" customizations=$product.customizations} {include file="catalog/_partials/product-customization.tpl" customizations=$product.customizations}
@ -127,14 +116,14 @@
{include file='catalog/_partials/product-discounts.tpl'} {include file='catalog/_partials/product-discounts.tpl'}
{/block} {/block}
{block name='product_add_to_cart'}
{include file='catalog/_partials/product-add-to-cart.tpl'}
{/block}
{block name='product_additional_info'} {block name='product_additional_info'}
{include file='catalog/_partials/product-additional-info.tpl'} {include file='catalog/_partials/product-additional-info.tpl'}
{/block} {/block}
{block name='product_add_to_cart'}
{include file='catalog/_partials/product-add-to-cart.tpl'}
{/block}
{* Input to refresh product HTML removed, block kept for compatibility with themes *} {* Input to refresh product HTML removed, block kept for compatibility with themes *}
{block name='product_refresh'}{/block} {block name='product_refresh'}{/block}
</form> </form>
@ -147,86 +136,10 @@
{/block} {/block}
{block name='product_tabs'} {block name='product_tabs'}
<div class="tabs"> <div class='w-full flex items-center flex-col mt-12'>
<ul class="nav nav-tabs" role="tablist">
{if $product.description}
<li class="nav-item">
<a
class="nav-link{if $product.description} active{/if}"
data-toggle="tab"
href="#description"
role="tab"
aria-controls="description"
{if $product.description} aria-selected="true"{/if}>{l s='Description' d='Shop.Theme.Catalog'}</a>
</li>
{/if}
<li class="nav-item">
<a
class="nav-link{if !$product.description} active{/if}"
data-toggle="tab"
href="#product-details"
role="tab"
aria-controls="product-details"
{if !$product.description} aria-selected="true"{/if}>{l s='Product Details' d='Shop.Theme.Catalog'}</a>
</li>
{if $product.attachments}
<li class="nav-item">
<a
class="nav-link"
data-toggle="tab"
href="#attachments"
role="tab"
aria-controls="attachments">{l s='Attachments' d='Shop.Theme.Catalog'}</a>
</li>
{/if}
{foreach from=$product.extraContent item=extra key=extraKey}
<li class="nav-item">
<a
class="nav-link"
data-toggle="tab"
href="#extra-{$extraKey}"
role="tab"
aria-controls="extra-{$extraKey}">{$extra.title}</a>
</li>
{/foreach}
</ul>
<div class="tab-content" id="tab-content">
<div class="tab-pane fade in{if $product.description} active{/if}" id="description" role="tabpanel">
{block name='product_description'}
<div class="product-description">{$product.description nofilter}</div>
{/block}
</div>
{block name='product_details'} {block name='product_details'}
{include file='catalog/_partials/product-details.tpl'} {include file='catalog/_partials/product-details.tpl'}
{/block} {/block}
{block name='product_attachments'}
{if $product.attachments}
<div class="tab-pane fade in" id="attachments" role="tabpanel">
<section class="product-attachments">
<p class="h5 text-uppercase">{l s='Download' d='Shop.Theme.Actions'}</p>
{foreach from=$product.attachments item=attachment}
<div class="attachment">
<h4><a href="{url entity='attachment' params=['id_attachment' => $attachment.id_attachment]}">{$attachment.name}</a></h4>
<p>{$attachment.description}</p
<a href="{url entity='attachment' params=['id_attachment' => $attachment.id_attachment]}">
{l s='Download' d='Shop.Theme.Actions'} ({$attachment.file_size_formatted})
</a>
</div>
{/foreach}
</section>
</div>
{/if}
{/block}
{foreach from=$product.extraContent item=extra key=extraKey}
<div class="tab-pane fade in {$extra.attr.class}" id="extra-{$extraKey}" role="tabpanel" {foreach $extra.attr as $key => $val} {$key}="{$val}"{/foreach}>
{$extra.content nofilter}
</div>
{/foreach}
</div>
</div> </div>
{/block} {/block}
</div> </div>
@ -235,9 +148,9 @@
{block name='product_accessories'} {block name='product_accessories'}
{if $accessories} {if $accessories}
<section class="product-accessories clearfix"> <section class="product-accessories flex flex-col gap-8 mt-24">
<p class="h5 text-uppercase">{l s='You might also like' d='Shop.Theme.Catalog'}</p> <p class="text-2xl font-bold">{l s='Related Products' d='Shop.Theme.Catalog'}</p>
<div class="products"> <div class="products flex flex-wrap">
{foreach from=$accessories item="product_accessory"} {foreach from=$accessories item="product_accessory"}
{block name='product_miniature'} {block name='product_miniature'}
{include file='catalog/_partials/miniatures/product.tpl' product=$product_accessory} {include file='catalog/_partials/miniatures/product.tpl' product=$product_accessory}
@ -253,7 +166,6 @@
{/block} {/block}
{block name='product_images_modal'} {block name='product_images_modal'}
{include file='catalog/_partials/product-images-modal.tpl'}
{/block} {/block}
{block name='page_footer_container'} {block name='page_footer_container'}

View File

@ -14,16 +14,17 @@
action="{url entity='order' params=['id_address' => $id_address]}" action="{url entity='order' params=['id_address' => $id_address]}"
data-id-address="{$id_address}" data-id-address="{$id_address}"
data-refresh-url="{url entity='order' params=['ajax' => 1, 'action' => 'addressForm']}" data-refresh-url="{url entity='order' params=['ajax' => 1, 'action' => 'addressForm']}"
class="w-full flex"
> >
{/block} {/block}
{block name='form_fields' append} {block name='form_fields' append}
<input type="hidden" name="saveAddress" value="{$type}"> <input type="hidden" name="saveAddress" value="{$type}">
{if $type === "delivery"} {if $type === "delivery"}
<div class="form-group row"> <div class="form-group w-full">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3 flex items-center gap-2 py-2">
<input name = "use_same_address" id="use_same_address" type = "checkbox" value = "1" {if $use_same_address} checked {/if}> <input name = "use_same_address" id="use_same_address" type = "checkbox" value = "1" {if $use_same_address} checked {/if}>
<label for="use_same_address">{l s='Use this address for invoice too' d='Shop.Theme.Checkout'}</label> <label for="use_same_address" class="font-semibold">{l s='Use this address for invoice too' d='Shop.Theme.Checkout'}</label>
</div> </div>
</div> </div>
{/if} {/if}
@ -31,15 +32,15 @@
{block name='form_buttons'} {block name='form_buttons'}
{if !$form_has_continue_button} {if !$form_has_continue_button}
<button type="submit" class="btn btn-primary float-xs-right">{l s='Save' d='Shop.Theme.Actions'}</button> <button type="submit" class="btn btn-primary float-xs-right flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900">{l s='Save' d='Shop.Theme.Actions'}</button>
<a class="js-cancel-address cancel-address float-xs-right" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a> <a class="js-cancel-address cancel-address float-xs-right flex-1 uppercase py-2 font-medium text-center border border-blue-950 text-blue-950 hover:text-blue-900 hover:border-blue-900" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a>
{else} {else}
<form> <form class="w-full flex">
<button type="submit" class="continue btn btn-primary float-xs-right" name="confirm-addresses" value="1"> <button type="submit" class="continue btn btn-primary float-xs-right flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900" name="confirm-addresses" value="1">
{l s='Continue' d='Shop.Theme.Actions'} {l s='Continue' d='Shop.Theme.Actions'}
</button> </button>
{if $customer.addresses|count > 0} {if $customer.addresses|count > 0}
<a class="js-cancel-address cancel-address float-xs-right" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a> <a class="js-cancel-address cancel-address float-xs-right flex-1 uppercase py-2 font-medium text-center border border-blue-950 text-blue-950 hover:text-blue-900 hover:border-blue-900" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a>
{/if} {/if}
</form> </form>
{/if} {/if}

View File

@ -24,11 +24,11 @@
*} *}
{block name='address_selector_blocks'} {block name='address_selector_blocks'}
{foreach $addresses as $address} {foreach $addresses as $address}
<article <div
class="address-item{if $address.id == $selected} selected{/if}" class="address-item{if $address.id == $selected} selected{/if} w-full md:w-1/2 flex justify-between pr-4 md:pr-12 mb-2"
id="{$name|classname}-address-{$address.id}" id="{$name|classname}-address-{$address.id}"
> >
<header class="h4"> <div class="flex gap-2">
<label class="radio-block"> <label class="radio-block">
<span class="custom-radio"> <span class="custom-radio">
<input <input
@ -39,34 +39,35 @@
> >
<span></span> <span></span>
</span> </span>
<span class="address-alias h4">{$address.alias}</span>
<div class="address">{$address.formatted nofilter}</div>
</label> </label>
</header> <div class="flex flex-col gap-1">
<hr> <span class="address-alias font-semibold">{$address.alias}</span>
<footer class="address-footer"> <div class="address">{$address.formatted nofilter}</div>
</div>
</div>
{if $interactive} {if $interactive}
<div class="flex flex-col justify-center gap-4">
<a <a
class="edit-address text-muted" class="edit-address text-muted"
data-link-action="edit-address" data-link-action="edit-address"
href="{url entity='order' params=['id_address' => $address.id, 'editAddress' => $type, 'token' => $token]}" href="{url entity='order' params=['id_address' => $address.id, 'editAddress' => $type, 'token' => $token]}"
> >
<i class="material-icons edit">&#xE254;</i>{l s='Edit' d='Shop.Theme.Actions'} <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-edit" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1" /><path d="M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z" /><path d="M16 5l3 3" /></svg>
</a> </a>
<a <a
class="delete-address text-muted" class="delete-address text-muted"
data-link-action="delete-address" data-link-action="delete-address"
href="{url entity='order' params=['id_address' => $address.id, 'deleteAddress' => true, 'token' => $token]}" href="{url entity='order' params=['id_address' => $address.id, 'deleteAddress' => true, 'token' => $token]}"
> >
<i class="material-icons delete">&#xE872;</i>{l s='Delete' d='Shop.Theme.Actions'} <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-trash" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 7l16 0" /><path d="M10 11l0 6" /><path d="M14 11l0 6" /><path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12" /><path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3" /></svg>
</a> </a>
</div>
{/if} {/if}
</footer> </div>
</article>
{/foreach} {/foreach}
{if $interactive} {if $interactive}
<p> <p>
<button class="ps-hidden-by-js form-control-submit center-block" type="submit">{l s='Save' d='Shop.Theme.Actions'}</button> <button class="ps-hidden-by-js form-control-submit center-block flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900" type="submit">{l s='Save' d='Shop.Theme.Actions'}</button>
</p> </p>
{/if} {/if}
{/block} {/block}

View File

@ -23,21 +23,21 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{block name='cart_detailed_actions'} {block name='cart_detailed_actions'}
<div class="checkout cart-detailed-actions card-block"> <div class="checkout cart-detailed-actions js-cart-detailed-actions card-block flex flex-col mt-4">
{if $cart.minimalPurchaseRequired} {if $cart.minimalPurchaseRequired}
<div class="alert alert-warning" role="alert"> <div class="alert alert-warning" role="alert">
{$cart.minimalPurchaseRequired} {$cart.minimalPurchaseRequired}
</div> </div>
<div class="text-sm-center"> <div class="flex">
<button type="button" class="btn btn-primary disabled" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button> <button type="button" class="flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900 disabled:bg-gray-600 disabled:text-gray-300" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button>
</div> </div>
{elseif empty($cart.products) } {elseif empty($cart.products) }
<div class="text-sm-center"> <div class="flex">
<button type="button" class="btn btn-primary disabled" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button> <button type="button" class="flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900 disabled:bg-gray-600 disabled:text-gray-300" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button>
</div> </div>
{else} {else}
<div class="text-sm-center"> <div class="flex">
<a href="{$urls.pages.order}" class="btn btn-primary">{l s='Proceed to checkout' d='Shop.Theme.Actions'}</a> <a href="{$urls.pages.order}" class="flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900">{l s='Proceed to checkout' d='Shop.Theme.Actions'}</a>
{hook h='displayExpressCheckout'} {hook h='displayExpressCheckout'}
</div> </div>
{/if} {/if}

View File

@ -22,131 +22,80 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="product-line-grid">
<!-- product left content: image-->
<div class="product-line-grid-left col-md-3 col-xs-4">
<span class="product-image media-middle">
<img src="{$product.cover.bySize.cart_default.url}" alt="{$product.name|escape:'quotes'}">
</span>
</div>
<!-- product left body: description --> <div class="flex max-md:flex-col flex-1 gap-4 items-center">
<div class="product-line-grid-body col-md-4 col-xs-8"> <div class="w-40 h-40">
<div class="product-line-info"> <img class="object-cover w-full h-full" src="{$product.cover.bySize.cart_default.url}" alt="{$product.name|escape:'quotes'}">
<a class="label" href="{$product.url}" data-id_customization="{$product.id_customization|intval}">{$product.name}</a>
</div> </div>
<div class="flex flex-1 max-md:items-center flex-col gap-2">
<div class="product-line-info product-price h5 {if $product.has_discount}has-discount{/if}"> <div class="product-line-info flex flex-col">
{if $product.has_discount} <a class="label text-lg font-semibold max-md:text-center" href="{$product.url}" data-id_customization="{$product.id_customization|intval}">{$product.name}</a>
<div class="product-discount">
<span class="regular-price">{$product.regular_price}</span>
{if $product.discount_type === 'percentage'}
<span class="discount discount-percentage">
-{$product.discount_percentage_absolute}
</span>
{else}
<span class="discount discount-amount">
-{$product.discount_to_display}
</span>
{/if}
</div>
{/if}
<div class="current-price">
<span class="price">{$product.price}</span>
{if $product.unit_price_full}
<div class="unit-price-cart">{$product.unit_price_full}</div>
{/if}
</div>
</div>
<br/>
{foreach from=$product.attributes key="attribute" item="value"}
<div class="product-line-info">
<span class="label">{$attribute}:</span>
<span class="value">{$value}</span>
</div>
{/foreach}
{if is_array($product.customizations) && $product.customizations|count} {if is_array($product.customizations) && $product.customizations|count}
<br>
{block name='cart_detailed_product_line_customization'} {block name='cart_detailed_product_line_customization'}
{foreach from=$product.customizations item="customization"} {foreach from=$product.customizations item="customization"}
<a href="#" data-toggle="modal" data-target="#product-customizations-modal-{$customization.id_customization}">{l s='Product customization' d='Shop.Theme.Catalog'}</a> <a href="#product-customizations-modal-{$customization.id_customization}" class="text-blue-900 font-medium max-md:text-center" rel="modal:open" >{l s='Show customizations' d='Shop.Theme.Catalog'}</a>
<div class="modal fade customization-modal" id="product-customizations-modal-{$customization.id_customization}" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal bg-white p-4" id="product-customizations-modal-{$customization.id_customization}" >
<div class="modal-dialog" role="document"> <div class="w-full flex items-center justify-between mb-4">
<div class="modal-content"> <h4 class="modal-title text-xl font-bold">{l s='Customizations' d='Shop.Theme.Catalog'}</h4>
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">{l s='Product customization' d='Shop.Theme.Catalog'}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body flex flex-col gap-2">
{foreach from=$customization.fields item="field"} {foreach from=$customization.fields item="field"}
<div class="product-customization-line row"> <div class="product-customization-line row">
<div class="col-sm-3 col-xs-4 label"> <div class="value">
{$field.label}
</div>
<div class="col-sm-9 col-xs-8 value">
{if $field.type == 'text'} {if $field.type == 'text'}
{if (int)$field.id_module} {if (int)$field.id_module}
{$field.text nofilter} {$field.text nofilter}
{else} {else}
{$field.text} {$field.text}
{/if} {/if}
{elseif $field.type == 'image'}
<img src="{$field.image.small.url}">
{/if} {/if}
</div> </div>
</div> </div>
{/foreach} {/foreach}
</div> </div>
</div> </div>
</div>
</div>
{/foreach} {/foreach}
{/block} {/block}
{/if} {/if}
</div> </div>
<div class="flex gap-4 product-line-info product-price h5 {if $product.has_discount}has-discount{/if}">
<!-- product left body: description --> {if $product.has_discount}
<div class="product-line-grid-right product-line-actions col-md-5 col-xs-12"> <span class="line-through text-red-400">{$product.regular_price}</span>
<div class="row"> {/if}
<div class="col-xs-4 hidden-md-up"></div> <div class="current-price">
<div class="col-md-10 col-xs-6"> <span class="price font-medium">{$product.price}</span>
<div class="row"> {if $product.unit_price_full}
<div class="col-md-6 col-xs-6 qty"> <div class="unit-price-cart">{$product.unit_price_full}</div>
{if isset($product.is_gift) && $product.is_gift} {/if}
<span class="gift-quantity">{$product.quantity}</span> </div>
{else} </div>
{foreach from=$product.attributes key="attribute" item="value"}
<div class="product-line-info font-semibold {$attribute|lower}">
<span class="label">{$attribute}:</span>
<span class="value">{$value}</span>
</div>
{/foreach}
<div class="flex items-center font-medium w-max">
<input <input
class="js-cart-line-product-quantity" class="js-cart-line-product-quantity text-center w-8 border-none active:ring-0 focus:ring-0"
data-down-url="{$product.down_quantity_url}" data-down-url="{$product.down_quantity_url}"
data-up-url="{$product.up_quantity_url}" data-up-url="{$product.up_quantity_url}"
data-update-url="{$product.update_quantity_url}" data-update-url="{$product.update_quantity_url}"
data-product-id="{$product.id_product}" data-product-id="{$product.id_product}"
type="number"
value="{$product.quantity}" value="{$product.quantity}"
name="product-quantity-spin" name="product-quantity-spin"
min="{$product.minimal_quantity}" min="{$product.minimal_quantity}"
/> />
{/if}
</div> </div>
<div class="col-md-6 col-xs-2 price"> </div>
<span class="product-price"> <div class="flex flex-col gap-4 w-24 items-center">
<strong> <span class="product-price text-base font-bold">
{if isset($product.is_gift) && $product.is_gift} {if isset($product.is_gift) && $product.is_gift}
<span class="gift">{l s='Gift' d='Shop.Theme.Checkout'}</span> {l s='Gift' d='Shop.Theme.Checkout'}
{else} {else}
{$product.total} {$product.total}
{/if} {/if}
</strong>
</span> </span>
</div>
</div>
</div>
<div class="col-md-2 col-xs-2 text-xs-right">
<div class="cart-line-product-actions"> <div class="cart-line-product-actions">
<a <a
class = "remove-from-cart" class = "remove-from-cart"
@ -158,7 +107,14 @@
data-id-customization = "{$product.id_customization|escape:'javascript'}" data-id-customization = "{$product.id_customization|escape:'javascript'}"
> >
{if !isset($product.is_gift) || !$product.is_gift} {if !isset($product.is_gift) || !$product.is_gift}
<i class="material-icons float-xs-left">delete</i> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler stroke-gray-700 icon-tabler-trash" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M4 7l16 0"></path>
<path d="M10 11l0 6"></path>
<path d="M14 11l0 6"></path>
<path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12"></path>
<path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3"></path>
</svg>
{/if} {/if}
</a> </a>
@ -168,8 +124,4 @@
</div> </div>
</div> </div>
</div>
</div>
<div class="clearfix"></div>
</div> </div>

View File

@ -23,13 +23,12 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{block name='cart_detailed_totals'} {block name='cart_detailed_totals'}
<div class="cart-detailed-totals"> <div class="cart-defaild-totals js-cart-detailed-totals flex flex-col gap-4">
<div class="flex flex-col gap-8">
<div class="card-block">
{foreach from=$cart.subtotals item="subtotal"} {foreach from=$cart.subtotals item="subtotal"}
{if $subtotal.value && $subtotal.type !== 'tax'} {if $subtotal && $subtotal.value|count_characters > 0 && $subtotal.type !== 'tax'}
<div class="cart-summary-line" id="cart-subtotal-{$subtotal.type}"> <div class="cart-summary-line flex font-medium" id="cart-subtotal-{$subtotal.type}">
<span class="label{if 'products' === $subtotal.type} js-subtotal{/if}"> <span class="flex-1 label{if 'products' === $subtotal.type} js-subtotal{/if}">
{if 'products' == $subtotal.type} {if 'products' == $subtotal.type}
{$cart.summary_string} {$cart.summary_string}
{else} {else}

Some files were not shown because too many files have changed in this diff Show More