@akinon/projectzero 1.108.0-rc.87 → 1.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,6 @@ import { Product } from '@akinon/next/types';
7
7
  import { Image } from '@akinon/next/components/image';
8
8
  import useFavButton from '../../hooks/use-fav-button';
9
9
  import { twMerge } from 'tailwind-merge';
10
- import PluginModule, { Component } from '@akinon/next/components/plugin-module';
11
10
 
12
11
  type ProductSliderItem = {
13
12
  product: Product;
@@ -36,102 +35,90 @@ export default function ProductInfoSlider({ product }: ProductSliderItem) {
36
35
  carouselRef.current?.next();
37
36
  };
38
37
 
39
- const handleThumbnailClick = (index: number) => {
38
+ const handleThumbnailClick = (index) => {
40
39
  setActiveIndex(index);
41
40
  carouselRef.current?.goToSlide(index);
42
41
  };
43
42
 
44
43
  return (
45
- <>
46
- <div className="lg:grid lg:grid-cols-6">
47
- <div className="lg:col-span-1">
48
- <div className="flex flex-col items-center justify-center md:mr-[6px]">
49
- <button
50
- onClick={goToPrev}
51
- className={twMerge(
52
- 'hidden justify-center p-2 mb-3 border border-gray-100 rounded-full cursor-pointer lg:block',
53
- [activeIndex === 0 && 'cursor-not-allowed opacity-45']
54
- )}
55
- disabled={activeIndex === 0}
56
- >
57
- <Icon name="chevron-up" size={15} className="fill-[#000000]" />
58
- </button>
59
- <div className="hidden flex-col items-center overflow-scroll w-[80px] max-h-[620px] lg:block">
60
- {product?.productimage_set?.map((item, index) => (
61
- <Image
62
- key={index}
63
- src={item.image}
64
- alt={`Thumbnail ${index}`}
65
- width={80}
66
- height={128}
67
- aspectRatio={80 / 128}
68
- className={twMerge('cursor-pointer', [
69
- activeIndex === index && 'border-2 border-primary'
70
- ])}
71
- onClick={() => handleThumbnailClick(index)}
72
- />
73
- ))}
74
- </div>
75
- <button
76
- onClick={goToNext}
77
- className={twMerge(
78
- 'hidden justify-center p-2 mt-3 border border-gray-100 rounded-full cursor-pointer lg:block',
79
- [
80
- activeIndex === product.productimage_set.length - 1 &&
81
- 'cursor-not-allowed opacity-45'
82
- ]
83
- )}
84
- disabled={activeIndex === product.productimage_set.length - 1}
85
- >
86
- <Icon name="chevron-down" size={15} className="fill-[#000000]" />
87
- </button>
88
- </div>
89
- </div>
90
-
91
- <div className="relative lg:col-span-5">
92
- <FavButton className="absolute right-8 top-6 z-[20] sm:hidden" />
93
-
94
- <PluginModule
95
- component={Component.ProductImageSearchFeature}
96
- props={{
97
- product,
98
- activeIndex,
99
- showResetButton: true
100
- }}
101
- />
102
-
103
- <CarouselCore
104
- responsive={{
105
- all: {
106
- breakpoint: { max: 5000, min: 0 },
107
- items: 1
108
- }
109
- }}
110
- arrows={false}
111
- swipeable={true}
112
- ref={carouselRef}
113
- afterChange={(previousSlide, { currentSlide }) => {
114
- setActiveIndex(currentSlide);
115
- }}
116
- containerAspectRatio={{ mobile: 520 / 798, desktop: 484 / 726 }}
44
+ <div className="lg:grid lg:grid-cols-6">
45
+ <div className="lg:col-span-1">
46
+ <div className="flex flex-col items-center justify-center md:mr-[6px]">
47
+ <button
48
+ onClick={goToPrev}
49
+ className={twMerge(
50
+ 'hidden justify-center p-2 mb-3 border border-gray-100 rounded-full cursor-pointer lg:block',
51
+ [activeIndex === 0 && 'cursor-not-allowed opacity-45']
52
+ )}
53
+ disabled={activeIndex === 0}
117
54
  >
118
- {product?.productimage_set?.map((item, i) => (
55
+ <Icon name="chevron-up" size={15} className="fill-[#000000]" />
56
+ </button>
57
+ <div className="hidden flex-col items-center overflow-scroll w-[80px] max-h-[620px] lg:block">
58
+ {product?.productimage_set?.map((item, index) => (
119
59
  <Image
120
- key={i}
60
+ key={index}
121
61
  src={item.image}
122
- alt={product?.name || 'Product image'}
123
- draggable={false}
124
- aspectRatio={484 / 726}
125
- sizes="(min-width: 425px) 512px,
126
- (min-width: 601px) 576px,
127
- (min-width: 768px) 336px,
128
- (min-width: 1024px) 484px, 368px"
129
- fill
62
+ alt={`Thumbnail ${index}`}
63
+ width={80}
64
+ height={128}
65
+ className={twMerge('cursor-pointer', [
66
+ activeIndex === index && 'border-2 border-primary'
67
+ ])}
68
+ onClick={() => handleThumbnailClick(index)}
130
69
  />
131
70
  ))}
132
- </CarouselCore>
71
+ </div>
72
+ <button
73
+ onClick={goToNext}
74
+ className={twMerge(
75
+ 'hidden justify-center p-2 mt-3 border border-gray-100 rounded-full cursor-pointer lg:block',
76
+ [
77
+ activeIndex === product.productimage_set.length - 1 &&
78
+ 'cursor-not-allowed opacity-45'
79
+ ]
80
+ )}
81
+ disabled={activeIndex === product.productimage_set.length - 1}
82
+ >
83
+ <Icon name="chevron-down" size={15} className="fill-[#000000]" />
84
+ </button>
133
85
  </div>
134
86
  </div>
135
- </>
87
+
88
+ <div className="relative lg:col-span-5">
89
+ <FavButton className="absolute right-8 top-6 z-[20] sm:hidden" />
90
+
91
+ <CarouselCore
92
+ responsive={{
93
+ all: {
94
+ breakpoint: { max: 5000, min: 0 },
95
+ items: 1
96
+ }
97
+ }}
98
+ arrows={false}
99
+ swipeable={true}
100
+ ref={carouselRef}
101
+ afterChange={(previousSlide, { currentSlide }) => {
102
+ setActiveIndex(currentSlide);
103
+ }}
104
+ containerAspectRatio={{ mobile: 520 / 798, desktop: 484 / 726 }}
105
+ >
106
+ {product?.productimage_set?.map((item, i) => (
107
+ <Image
108
+ key={i}
109
+ src={item.image}
110
+ alt={product.name}
111
+ draggable={false}
112
+ aspectRatio={484 / 726}
113
+ sizes="(min-width: 425px) 512px,
114
+ (min-width: 601px) 576px,
115
+ (min-width: 768px) 336px,
116
+ (min-width: 1024px) 484px, 368px"
117
+ fill
118
+ />
119
+ ))}
120
+ </CarouselCore>
121
+ </div>
122
+ </div>
136
123
  );
137
124
  }
@@ -29,14 +29,7 @@ async function checkVersion(pkg: PackageJson) {
29
29
 
30
30
  if (!semver.satisfies(pkg.dependencies['@akinon/next'], latestVersion)) {
31
31
  console.warn(
32
- `\x1b[43m Warning: The "${packageName}" package is currently at`,
33
- `\x1b[41m version ${pkg.dependencies['@akinon/next']}`,
34
- `\x1b[43m Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`,
35
- '\x1b[0m\n'
36
- );
37
- } else {
38
- console.log(
39
- `\x1b[42m Info: The package "${packageName}" is currently in the current version (${latestVersion}).`,
32
+ `\x1b[43mWarning: The "${packageName}" package is currently at version ${pkg.dependencies['@akinon/next']}. Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`,
40
33
  '\x1b[0m\n'
41
34
  );
42
35
  }
@@ -61,27 +54,7 @@ export default async () => {
61
54
  }
62
55
  }
63
56
 
64
- function findPackageJson(): PackageJson {
65
- const packageJsonPaths = [
66
- path.resolve(rootDir, './package.json'),
67
- path.resolve(rootDir, './apps/projectzeronext/package.json')
68
- ];
69
-
70
- for (const packageJsonPath of packageJsonPaths) {
71
- try {
72
- const pkg = require(packageJsonPath);
73
- if (pkg.dependencies['@akinon/next']) {
74
- return pkg;
75
- }
76
- } catch (error) {
77
- continue;
78
- }
79
- }
80
-
81
- throw new Error('Could not find package.json with @akinon/next dependency');
82
- }
83
-
84
- const pkg = findPackageJson();
57
+ const pkg: PackageJson = require(path.resolve(rootDir, './package.json'));
85
58
  await checkVersion(pkg);
86
59
 
87
60
  const pluginsFilePath = findPluginsFilePath();
@@ -50,10 +50,7 @@ function checkVersion(pkg) {
50
50
  const pkgInfo = (yield response.json());
51
51
  const latestVersion = pkgInfo['dist-tags'].latest;
52
52
  if (!semver_1.default.satisfies(pkg.dependencies['@akinon/next'], latestVersion)) {
53
- console.warn(`\x1b[43m Warning: The "${packageName}" package is currently at`, `\x1b[41m version ${pkg.dependencies['@akinon/next']}`, `\x1b[43m Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`, '\x1b[0m\n');
54
- }
55
- else {
56
- console.log(`\x1b[42m Info: The package "${packageName}" is currently in the current version (${latestVersion}).`, '\x1b[0m\n');
53
+ console.warn(`\x1b[43mWarning: The "${packageName}" package is currently at version ${pkg.dependencies['@akinon/next']}. Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`, '\x1b[0m\n');
57
54
  }
58
55
  }
59
56
  catch (error) {
@@ -75,25 +72,7 @@ exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
75
72
  throw new Error('plugins.js was not found in either of the expected locations.');
76
73
  }
77
74
  }
78
- function findPackageJson() {
79
- const packageJsonPaths = [
80
- path_1.default.resolve(rootDir, './package.json'),
81
- path_1.default.resolve(rootDir, './apps/projectzeronext/package.json')
82
- ];
83
- for (const packageJsonPath of packageJsonPaths) {
84
- try {
85
- const pkg = require(packageJsonPath);
86
- if (pkg.dependencies['@akinon/next']) {
87
- return pkg;
88
- }
89
- }
90
- catch (error) {
91
- continue;
92
- }
93
- }
94
- throw new Error('Could not find package.json with @akinon/next dependency');
95
- }
96
- const pkg = findPackageJson();
75
+ const pkg = require(path_1.default.resolve(rootDir, './package.json'));
97
76
  yield checkVersion(pkg);
98
77
  const pluginsFilePath = findPluginsFilePath();
99
78
  let installedPlugins = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akinon/projectzero",
3
- "version": "1.108.0-rc.87",
3
+ "version": "1.108.0",
4
4
  "private": false,
5
5
  "description": "CLI tool to manage your Project Zero Next project",
6
6
  "bin": {
@@ -1,67 +0,0 @@
1
- import { Skeleton, SkeletonWrapper } from 'components';
2
-
3
- export default function Loading() {
4
- return (
5
- <div className="container mx-auto">
6
- <div className="max-w-5xl mx-auto my-5 px-7">
7
- <SkeletonWrapper className="md:mb-7">
8
- <Skeleton className="w-[17.25rem] h-4 lg:w-64" />
9
- </SkeletonWrapper>
10
- </div>
11
- <div className="grid max-w-5xl grid-cols-2 lg:gap-8 mx-auto px-7">
12
- <div className="col-span-2 mb-7 md:mb-0 lg:col-span-1">
13
- <div className="flex gap-1">
14
- <SkeletonWrapper className="hidden md:block md:mb-7">
15
- {Array(5)
16
- .fill(null)
17
- .map((_, index) => (
18
- <Skeleton key={index} className="w-20 h-24 mb-2" />
19
- ))}
20
- </SkeletonWrapper>
21
-
22
- <div className="flex-1">
23
- <SkeletonWrapper className="md:mb-7">
24
- <Skeleton className="w-full h-[30.375rem] md:h-[36.375rem]" />
25
- </SkeletonWrapper>
26
- </div>
27
- </div>
28
- </div>
29
- <div className="flex flex-col items-center col-span-2 lg:col-span-1">
30
- <div className="w-full">
31
- <SkeletonWrapper className="w-full md:mb-7 flex justify-center items-center">
32
- <Skeleton className="w-96 h-16 mb-9" />
33
- <Skeleton className="hidden w-36 h-14 mb-9 md:block" />
34
-
35
- <div className="flex flex-col justify-center items-center mb-9">
36
- <Skeleton className="w-36 h-4 mb-2" />
37
- <div className="flex items-center gap-2">
38
- {Array(3)
39
- .fill(null)
40
- .map((_, index) => (
41
- <Skeleton key={index} className="w-24 h-10" />
42
- ))}
43
- </div>
44
- </div>
45
-
46
- <div className="flex flex-col justify-center items-center mb-4">
47
- <Skeleton className="w-36 h-4 mb-2" />
48
- <div className="flex items-center gap-2">
49
- {Array(5)
50
- .fill(null)
51
- .map((_, index) => (
52
- <Skeleton key={index} className="w-11 h-11" />
53
- ))}
54
- </div>
55
- </div>
56
-
57
- <Skeleton className="hidden w-full h-14 mb-6 md:block" />
58
- <Skeleton className="w-40 h-10 mb-9 md:w-72" />
59
- <Skeleton className="w-24 h-10 mb-7" />
60
- <Skeleton className="w-full h-36" />
61
- </SkeletonWrapper>
62
- </div>
63
- </div>
64
- </div>
65
- </div>
66
- );
67
- }
@@ -1 +0,0 @@
1
- export * from '@akinon/next/api/image-proxy';
@@ -1 +0,0 @@
1
- export * from '@akinon/next/api/similar-product-list';
@@ -1 +0,0 @@
1
- export * from '@akinon/next/api/similar-products';
@@ -1,106 +0,0 @@
1
- 'use client';
2
-
3
- import { useLocalization } from '@akinon/next/hooks';
4
- import { Basket } from '@akinon/next/types';
5
- import { Button, LoaderSpinner, Link } from '@theme/components';
6
- import { BasketItem, Summary } from '@theme/views/basket';
7
- import { ROUTES } from '@theme/routes';
8
- import PluginModule, { Component } from '@akinon/next/components/plugin-module';
9
- import { useEffect, useState } from 'react';
10
- import { pushCartView } from '@theme/utils/gtm';
11
-
12
- interface BasketContentProps {
13
- initialBasket: Basket;
14
- multiBasket: boolean;
15
- }
16
-
17
- export function BasketContent({
18
- initialBasket,
19
- multiBasket
20
- }: BasketContentProps) {
21
- const { t } = useLocalization();
22
- const [basket, setBasket] = useState<Basket>(initialBasket);
23
-
24
- useEffect(() => {
25
- if (basket) {
26
- const products = basket.basketitem_set.map((basketItem) => ({
27
- ...basketItem.product
28
- }));
29
- pushCartView(products);
30
- }
31
- }, [basket]);
32
-
33
- const handleBasketUpdate = (updatedBasket: Basket) => {
34
- setBasket(updatedBasket);
35
- };
36
-
37
- if (!basket) {
38
- return (
39
- <div className="flex justify-center w-full">
40
- <LoaderSpinner />
41
- </div>
42
- );
43
- }
44
-
45
- return (
46
- <div className="max-w-screen-xl p-4 flex flex-col text-primary-800 lg:p-8 xl:flex-row xl:mx-auto">
47
- {basket.basketitem_set && basket.basketitem_set.length > 0 ? (
48
- <>
49
- <div className="flex-1 xl:mr-16">
50
- <div className="flex items-center justify-between py-2 border-b border-gray-200 lg:py-3">
51
- <h2 className="text-xl lg:text-2xl font-light">
52
- {t('basket.my_cart')}
53
- </h2>
54
- <Link
55
- href={ROUTES.HOME}
56
- className="text-xs hover:text-secondary-500"
57
- >
58
- {t('basket.back_to_shopping')}
59
- </Link>
60
- </div>
61
- <ul>
62
- {multiBasket ? (
63
- <PluginModule
64
- component={Component.MultiBasket}
65
- props={{
66
- BasketItem,
67
- onBasketUpdate: handleBasketUpdate
68
- }}
69
- />
70
- ) : (
71
- basket.basketitem_set.map((basketItem, index) => (
72
- <BasketItem
73
- key={index}
74
- basketItem={basketItem}
75
- onBasketUpdate={handleBasketUpdate}
76
- />
77
- ))
78
- )}
79
- </ul>
80
- </div>
81
- <Summary basket={basket} onBasketUpdate={handleBasketUpdate} />
82
- </>
83
- ) : (
84
- <div className="flex flex-col items-center container max-w-screen-sm py-4 px-4 xs:py-6 xs:px-6 sm:py-8 sm:px-8 lg:max-w-screen-xl">
85
- <h1
86
- className="w-full text-xl font-light text-secondary text-center sm:text-2xl"
87
- data-testid="basket-empty"
88
- >
89
- {t('basket.empty.title')}
90
- </h1>
91
-
92
- <div className="w-full text-sm text-black-800 text-center my-4 mb-2 sm:text-base">
93
- <p>{t('basket.empty.content_first')}</p>
94
- <p>{t('basket.empty.content_second')}.</p>
95
- </div>
96
-
97
- <Link href={ROUTES.HOME} passHref>
98
- <Button className="px-10 mt-2" appearance="filled">
99
- {t('basket.empty.button')}
100
- </Button>
101
- </Link>
102
- </div>
103
- )}
104
- </div>
105
- );
106
- }