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
</h4>
<p>
Our Stylists are here for you. We have helped dress some of the biggest names in Hollywood and Professional
sports. Our staff of highly experienced tailors and stylists understand the demands placed on you to always look
your very best.
</p>
<p class="mt-3">
Your personal stylist is ready to assist you in all your clothing needs.
</p>
<h4 class="text-xl font-medium mt-6">Customer Service</h4>
<p> Let us show you how custom works.
We will walk you through your first order.
Just drop us a line at
<a href="mailto:customerservice@brooksbingham.com" class="underline underline-offset-2">customerservice@brooksbingham.com</a>
, and we will get in touch with you.
</p>
</div> </div>
{if $contact_infos.phone} <hr class="my-8"/>
<hr/>
<div class="block">
<div class="icon"><i class="material-icons">&#xE0CD;</i></div>
<div class="data">
{l s='Call us:' d='Shop.Theme.Global'}<br/>
<a href="tel:{$contact_infos.phone}">{$contact_infos.phone}</a>
</div>
</div>
{/if}
{if $contact_infos.fax}
<hr/>
<div class="block">
<div class="icon"><i class="material-icons">&#xE0DF;</i></div>
<div class="data">
{l s='Fax:' d='Shop.Theme.Global'}<br/>
{$contact_infos.fax}
</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}
@ -76,12 +77,45 @@
} }
} }
</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> {/if}
{/block} {/foreach}
{/if} </div>
</section>
{/foreach}
</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}"
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'} {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>
@ -169,7 +125,3 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="clearfix"></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