@shopify/shop-minis-react 0.0.16 → 0.0.18

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.
Files changed (120) hide show
  1. package/README.md +14 -10
  2. package/dist/_virtual/index2.js +3 -2
  3. package/dist/_virtual/index2.js.map +1 -1
  4. package/dist/_virtual/index3.js +2 -3
  5. package/dist/_virtual/index3.js.map +1 -1
  6. package/dist/components/atoms/button.js +28 -73
  7. package/dist/components/atoms/button.js.map +1 -1
  8. package/dist/components/atoms/favorite-button.js +21 -0
  9. package/dist/components/atoms/favorite-button.js.map +1 -0
  10. package/dist/components/atoms/icon-button.js +38 -0
  11. package/dist/components/atoms/icon-button.js.map +1 -0
  12. package/dist/components/atoms/touchable.js +14 -14
  13. package/dist/components/atoms/touchable.js.map +1 -1
  14. package/dist/components/commerce/merchant-card.js +1 -8
  15. package/dist/components/commerce/merchant-card.js.map +1 -1
  16. package/dist/components/commerce/product-card.js +79 -109
  17. package/dist/components/commerce/product-card.js.map +1 -1
  18. package/dist/components/commerce/product-link.js +36 -55
  19. package/dist/components/commerce/product-link.js.map +1 -1
  20. package/dist/components/ui/accordion.js.map +1 -0
  21. package/dist/components/{atoms → ui}/alert-dialog.js +1 -1
  22. package/dist/components/ui/alert-dialog.js.map +1 -0
  23. package/dist/components/ui/alert.js.map +1 -0
  24. package/dist/components/ui/avatar.js.map +1 -0
  25. package/dist/components/ui/badge.js.map +1 -0
  26. package/dist/components/ui/button.js +68 -0
  27. package/dist/components/ui/button.js.map +1 -0
  28. package/dist/components/ui/card.js.map +1 -0
  29. package/dist/components/{atoms → ui}/carousel.js +23 -23
  30. package/dist/components/ui/carousel.js.map +1 -0
  31. package/dist/components/ui/checkbox.js.map +1 -0
  32. package/dist/components/ui/dialog.js.map +1 -0
  33. package/dist/components/{atoms → ui}/drawer.js +25 -22
  34. package/dist/components/ui/drawer.js.map +1 -0
  35. package/dist/components/ui/input.js.map +1 -0
  36. package/dist/components/ui/label.js.map +1 -0
  37. package/dist/components/ui/progress.js.map +1 -0
  38. package/dist/components/ui/radio-group.js.map +1 -0
  39. package/dist/components/ui/resizable.js.map +1 -0
  40. package/dist/components/ui/scroll-area.js.map +1 -0
  41. package/dist/components/ui/select.js.map +1 -0
  42. package/dist/components/ui/separator.js.map +1 -0
  43. package/dist/components/ui/sheet.js.map +1 -0
  44. package/dist/components/ui/sonner.js.map +1 -0
  45. package/dist/index.js +193 -218
  46. package/dist/index.js.map +1 -1
  47. package/dist/shop-minis-react/node_modules/.pnpm/@radix-ui_react-use-is-hydrated@0.1.0_@types_react@19.1.6_react@19.1.0/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +1 -1
  48. package/dist/shop-minis-react/node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.js +1 -1
  49. package/package.json +6 -9
  50. package/src/components/atoms/button.tsx +10 -66
  51. package/src/components/atoms/favorite-button.tsx +22 -0
  52. package/src/components/atoms/icon-button.tsx +42 -0
  53. package/src/components/atoms/touchable.tsx +5 -1
  54. package/src/components/commerce/merchant-card.tsx +1 -12
  55. package/src/components/commerce/product-card.tsx +4 -32
  56. package/src/components/commerce/product-link.tsx +9 -29
  57. package/src/components/index.ts +23 -20
  58. package/src/components/{atoms → ui}/alert-dialog.tsx +1 -1
  59. package/src/components/ui/button.tsx +77 -0
  60. package/src/components/{atoms → ui}/carousel.tsx +11 -11
  61. package/src/components/{atoms → ui}/drawer.tsx +2 -1
  62. package/src/index.css +8 -2
  63. package/src/styles/globals.css +41 -0
  64. package/src/styles/theme.css +102 -0
  65. package/dist/components/atoms/accordion.js.map +0 -1
  66. package/dist/components/atoms/alert-dialog.js.map +0 -1
  67. package/dist/components/atoms/alert.js.map +0 -1
  68. package/dist/components/atoms/avatar.js.map +0 -1
  69. package/dist/components/atoms/badge.js.map +0 -1
  70. package/dist/components/atoms/card.js.map +0 -1
  71. package/dist/components/atoms/carousel.js.map +0 -1
  72. package/dist/components/atoms/checkbox.js.map +0 -1
  73. package/dist/components/atoms/dialog.js.map +0 -1
  74. package/dist/components/atoms/drawer.js.map +0 -1
  75. package/dist/components/atoms/input.js.map +0 -1
  76. package/dist/components/atoms/label.js.map +0 -1
  77. package/dist/components/atoms/progress.js.map +0 -1
  78. package/dist/components/atoms/radio-group.js.map +0 -1
  79. package/dist/components/atoms/resizable.js.map +0 -1
  80. package/dist/components/atoms/scroll-area.js.map +0 -1
  81. package/dist/components/atoms/select.js.map +0 -1
  82. package/dist/components/atoms/separator.js.map +0 -1
  83. package/dist/components/atoms/sheet.js.map +0 -1
  84. package/dist/components/atoms/sonner.js.map +0 -1
  85. package/src/base.css +0 -273
  86. package/tailwind.config.js +0 -3
  87. /package/dist/components/{atoms → ui}/accordion.js +0 -0
  88. /package/dist/components/{atoms → ui}/alert.js +0 -0
  89. /package/dist/components/{atoms → ui}/avatar.js +0 -0
  90. /package/dist/components/{atoms → ui}/badge.js +0 -0
  91. /package/dist/components/{atoms → ui}/card.js +0 -0
  92. /package/dist/components/{atoms → ui}/checkbox.js +0 -0
  93. /package/dist/components/{atoms → ui}/dialog.js +0 -0
  94. /package/dist/components/{atoms → ui}/input.js +0 -0
  95. /package/dist/components/{atoms → ui}/label.js +0 -0
  96. /package/dist/components/{atoms → ui}/progress.js +0 -0
  97. /package/dist/components/{atoms → ui}/radio-group.js +0 -0
  98. /package/dist/components/{atoms → ui}/resizable.js +0 -0
  99. /package/dist/components/{atoms → ui}/scroll-area.js +0 -0
  100. /package/dist/components/{atoms → ui}/select.js +0 -0
  101. /package/dist/components/{atoms → ui}/separator.js +0 -0
  102. /package/dist/components/{atoms → ui}/sheet.js +0 -0
  103. /package/dist/components/{atoms → ui}/sonner.js +0 -0
  104. /package/src/components/{atoms → ui}/accordion.tsx +0 -0
  105. /package/src/components/{atoms → ui}/alert.tsx +0 -0
  106. /package/src/components/{atoms → ui}/avatar.tsx +0 -0
  107. /package/src/components/{atoms → ui}/badge.tsx +0 -0
  108. /package/src/components/{atoms → ui}/card.tsx +0 -0
  109. /package/src/components/{atoms → ui}/checkbox.tsx +0 -0
  110. /package/src/components/{atoms → ui}/dialog.tsx +0 -0
  111. /package/src/components/{atoms → ui}/input.tsx +0 -0
  112. /package/src/components/{atoms → ui}/label.tsx +0 -0
  113. /package/src/components/{atoms → ui}/progress.tsx +0 -0
  114. /package/src/components/{atoms → ui}/radio-group.tsx +0 -0
  115. /package/src/components/{atoms → ui}/resizable.tsx +0 -0
  116. /package/src/components/{atoms → ui}/scroll-area.tsx +0 -0
  117. /package/src/components/{atoms → ui}/select.tsx +0 -0
  118. /package/src/components/{atoms → ui}/separator.tsx +0 -0
  119. /package/src/components/{atoms → ui}/sheet.tsx +0 -0
  120. /package/src/components/{atoms → ui}/sonner.tsx +0 -0
package/README.md CHANGED
@@ -69,25 +69,29 @@ function App() {
69
69
 
70
70
  ### Custom Theme
71
71
 
72
- You can customize the design system by overriding CSS variables:
72
+ You can customize the design system by overriding theme variables:
73
73
 
74
74
  ```css
75
75
  :root {
76
- /* Customize border radius */
77
- --radius: 0.75rem;
76
+ /* Customize primary brand color */
77
+ --theme-primary: #00843d;
78
+ --theme-primary-foreground: #ffffff;
78
79
 
79
- /* Customize colors */
80
- --primary: oklch(0.7 0.25 280);
81
- --primary-foreground: oklch(0.98 0.02 280);
80
+ /* Customize other semantic colors */
81
+ --theme-secondary: #f0f0f0;
82
+ --theme-destructive: #cc0000;
82
83
 
83
- /* Add your brand colors */
84
- --brand: oklch(0.6 0.3 200);
84
+ /* Customize border radius */
85
+ --radius: 0.75rem;
85
86
  }
86
87
 
87
88
  .dark {
88
- --primary: oklch(0.5 0.3 280);
89
- /* ... dark mode overrides */
89
+ --theme-primary: #10b554;
90
+ --theme-background: #1a1a1a;
90
91
  }
92
+ ```
93
+
94
+ See [THEME-CUSTOMIZATION.md](./THEME-CUSTOMIZATION.md) for detailed customization options.
91
95
 
92
96
  ### Vite Configuration
93
97
 
@@ -1,5 +1,6 @@
1
- var r = {};
1
+ import { __require as r } from "../shop-minis-react/node_modules/.pnpm/use-sync-external-store@1.5.0_react@19.1.0/node_modules/use-sync-external-store/shim/index.js";
2
+ var i = r();
2
3
  export {
3
- r as __exports
4
+ i as s
4
5
  };
5
6
  //# sourceMappingURL=index2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,6 +1,5 @@
1
- import { __require as r } from "../shop-minis-react/node_modules/.pnpm/use-sync-external-store@1.5.0_react@19.1.0/node_modules/use-sync-external-store/shim/index.js";
2
- var i = r();
1
+ var r = {};
3
2
  export {
4
- i as s
3
+ r as __exports
5
4
  };
6
5
  //# sourceMappingURL=index3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,88 +1,43 @@
1
- import { jsx as s } from "react/jsx-runtime";
2
- import * as b from "react";
3
- import { cva as l } from "../../shop-minis-react/node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.js";
4
- import { cn as u } from "../../lib/utils.js";
5
- import { Touchable as c } from "./touchable.js";
6
- import { Root as g } from "../../shop-minis-react/node_modules/.pnpm/@radix-ui_react-slot@1.2.3_@types_react@19.1.6_react@19.1.0/node_modules/@radix-ui/react-slot/dist/index.js";
7
- const h = l(
8
- "flex w-full items-center justify-center gap-3 whitespace-nowrap rounded-xl text-base font-semibold disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-5 shrink-0 [&_svg]:shrink-0",
9
- {
10
- variants: {
11
- variant: {
12
- primary: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
13
- secondary: "bg-slate-900 text-white shadow-xs hover:bg-slate-800",
14
- tertiary: "bg-slate-100 text-slate-900 shadow-xs hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-100 dark:hover:bg-slate-700",
15
- blurred: "bg-black/20 text-white shadow-xs hover:bg-black/30 backdrop-blur-md border border-white/20",
16
- text: "bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground",
17
- borderless: "bg-transparent text-primary hover:text-primary/80",
18
- borderlessUnbranded: "bg-transparent text-foreground hover:text-foreground/80",
19
- outlined: "border border-border bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground",
20
- dangerous: "bg-destructive text-white shadow-xs hover:bg-destructive/90",
21
- "outlined-dangerous": "border border-destructive bg-transparent text-destructive shadow-xs hover:bg-destructive/10"
22
- },
23
- size: {
24
- default: "h-9 px-4 py-2 has-[>svg]:px-3",
25
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
26
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
27
- icon: "size-9"
28
- }
29
- },
30
- defaultVariants: {
31
- variant: "primary",
32
- size: "default"
33
- }
34
- }
35
- );
36
- function x({
37
- className: r,
38
- variant: o,
39
- size: e,
40
- asChild: t = !1,
41
- ...a
42
- }) {
43
- return /* @__PURE__ */ s(
44
- t ? g : "button",
45
- {
46
- "data-slot": "button",
47
- className: u(h({ variant: o, size: e, className: r })),
48
- ...a
49
- }
50
- );
51
- }
52
- function y({
53
- className: r,
1
+ import { jsx as l } from "react/jsx-runtime";
2
+ import u from "react";
3
+ import { cn as r } from "../../lib/utils.js";
4
+ import { BaseButton as i } from "../ui/button.js";
5
+ import { Touchable as p } from "./touchable.js";
6
+ function C({
7
+ className: a,
54
8
  variant: o,
55
- size: e,
56
- onClick: t,
57
- stopPropagation: a = !1,
58
- ...n
9
+ size: m,
10
+ onClick: e,
11
+ stopPropagation: c = !1,
12
+ ...s
59
13
  }) {
60
- const d = b.useCallback(
61
- (i) => {
62
- t?.(i);
14
+ const f = u.useCallback(
15
+ (n) => {
16
+ e?.(n);
63
17
  },
64
- [t]
18
+ [e]
19
+ ), t = r(
20
+ o === "icon" ? "flex w-auto" : "flex w-full"
65
21
  );
66
- return /* @__PURE__ */ s(
67
- c,
22
+ return /* @__PURE__ */ l(
23
+ p,
68
24
  {
69
- onClick: d,
70
- stopPropagation: a,
71
- className: e === "icon" ? "flex w-auto" : "flex w-full",
72
- children: /* @__PURE__ */ s(
73
- x,
25
+ onClick: f,
26
+ stopPropagation: c,
27
+ className: t,
28
+ children: /* @__PURE__ */ l(
29
+ i,
74
30
  {
75
- className: r,
31
+ className: r(a, t),
76
32
  variant: o,
77
- size: e,
78
- ...n
33
+ size: m,
34
+ ...s
79
35
  }
80
36
  )
81
37
  }
82
38
  );
83
39
  }
84
40
  export {
85
- y as Button,
86
- h as buttonVariants
41
+ C as Button
87
42
  };
88
43
  //# sourceMappingURL=button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sources":["../../../src/components/atoms/button.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport {cva, type VariantProps} from 'class-variance-authority'\nimport {Slot as SlotPrimitive} from 'radix-ui'\n\nimport {cn} from '../../lib/utils'\n\nimport {Touchable} from './touchable'\n\nconst buttonVariants = cva(\n \"flex w-full items-center justify-center gap-3 whitespace-nowrap rounded-xl text-base font-semibold disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-5 shrink-0 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n primary:\n 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n secondary: 'bg-slate-900 text-white shadow-xs hover:bg-slate-800',\n tertiary:\n 'bg-slate-100 text-slate-900 shadow-xs hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-100 dark:hover:bg-slate-700',\n blurred:\n 'bg-black/20 text-white shadow-xs hover:bg-black/30 backdrop-blur-md border border-white/20',\n text: 'bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground',\n borderless: 'bg-transparent text-primary hover:text-primary/80',\n borderlessUnbranded:\n 'bg-transparent text-foreground hover:text-foreground/80',\n outlined:\n 'border border-border bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground',\n dangerous:\n 'bg-destructive text-white shadow-xs hover:bg-destructive/90',\n 'outlined-dangerous':\n 'border border-destructive bg-transparent text-destructive shadow-xs hover:bg-destructive/10',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'default',\n },\n }\n)\n\nfunction BaseButton({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? SlotPrimitive.Slot : 'button'\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({variant, size, className}))}\n {...props}\n />\n )\n}\n\nfunction Button({\n className,\n variant,\n size,\n onClick,\n stopPropagation = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {stopPropagation?: boolean}) {\n const handleClick = React.useCallback(\n (event: React.MouseEvent<any>) => {\n onClick?.(event)\n },\n [onClick]\n )\n\n return (\n <Touchable\n onClick={handleClick}\n stopPropagation={stopPropagation}\n className={size === 'icon' ? 'flex w-auto' : 'flex w-full'}\n >\n <BaseButton\n className={className}\n variant={variant}\n size={size}\n {...props}\n />\n </Touchable>\n )\n}\n\nexport {Button, buttonVariants}\n"],"names":["buttonVariants","cva","BaseButton","className","variant","size","asChild","props","jsx","SlotPrimitive.Slot","cn","Button","onClick","stopPropagation","handleClick","React","event","Touchable"],"mappings":";;;;;;AASA,MAAMA,IAAiBC;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WAAW;AAAA,QACX,UACE;AAAA,QACF,SACE;AAAA,QACF,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,qBACE;AAAA,QACF,UACE;AAAA,QACF,WACE;AAAA,QACF,sBACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MAAA;AAAA,IAEV;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AAEA,SAASC,EAAW;AAAA,EAClB,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,GAAGC;AACL,GAGK;AAID,SAAA,gBAAAC;AAAA,IAHWF,IAAUG,IAAqB;AAAA,IAGzC;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAGV,EAAe,EAAC,SAAAI,GAAS,MAAAC,GAAM,WAAAF,EAAA,CAAU,CAAC;AAAA,MACvD,GAAGI;AAAA,IAAA;AAAA,EACN;AAEJ;AAEA,SAASI,EAAO;AAAA,EACd,WAAAR;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAO;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,GAAGN;AACL,GACqE;AACnE,QAAMO,IAAcC,EAAM;AAAA,IACxB,CAACC,MAAiC;AAChC,MAAAJ,IAAUI,CAAK;AAAA,IACjB;AAAA,IACA,CAACJ,CAAO;AAAA,EACV;AAGE,SAAA,gBAAAJ;AAAA,IAACS;AAAA,IAAA;AAAA,MACC,SAASH;AAAA,MACT,iBAAAD;AAAA,MACA,WAAWR,MAAS,SAAS,gBAAgB;AAAA,MAE7C,UAAA,gBAAAG;AAAA,QAACN;AAAA,QAAA;AAAA,UACC,WAAAC;AAAA,UACA,SAAAC;AAAA,UACA,MAAAC;AAAA,UACC,GAAGE;AAAA,QAAA;AAAA,MAAA;AAAA,IACN;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"button.js","sources":["../../../src/components/atoms/button.tsx"],"sourcesContent":["import React from 'react'\n\nimport {VariantProps} from 'class-variance-authority'\n\nimport {cn} from '../../lib/utils'\nimport {BaseButton, buttonVariants} from '../ui/button'\n\nimport {Touchable} from './touchable'\n\nexport function Button({\n className,\n variant,\n size,\n onClick,\n stopPropagation = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {stopPropagation?: boolean}) {\n const handleClick = React.useCallback(\n (event: React.MouseEvent<any>) => {\n onClick?.(event)\n },\n [onClick]\n )\n\n const wrapperClassName = cn(\n variant === 'icon' ? 'flex w-auto' : 'flex w-full'\n )\n\n return (\n <Touchable\n onClick={handleClick}\n stopPropagation={stopPropagation}\n className={wrapperClassName}\n >\n <BaseButton\n className={cn(className, wrapperClassName)}\n variant={variant}\n size={size}\n {...props}\n />\n </Touchable>\n )\n}\n"],"names":["Button","className","variant","size","onClick","stopPropagation","props","handleClick","React","event","wrapperClassName","cn","jsx","Touchable","BaseButton"],"mappings":";;;;;AASO,SAASA,EAAO;AAAA,EACrB,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,GAAGC;AACL,GACqE;AACnE,QAAMC,IAAcC,EAAM;AAAA,IACxB,CAACC,MAAiC;AAChC,MAAAL,IAAUK,CAAK;AAAA,IACjB;AAAA,IACA,CAACL,CAAO;AAAA,EACV,GAEMM,IAAmBC;AAAA,IACvBT,MAAY,SAAS,gBAAgB;AAAA,EACvC;AAGE,SAAA,gBAAAU;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAASN;AAAA,MACT,iBAAAF;AAAA,MACA,WAAWK;AAAA,MAEX,UAAA,gBAAAE;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,WAAWH,EAAGV,GAAWS,CAAgB;AAAA,UACzC,SAAAR;AAAA,UACA,MAAAC;AAAA,UACC,GAAGG;AAAA,QAAA;AAAA,MAAA;AAAA,IACN;AAAA,EACF;AAEJ;"}
@@ -0,0 +1,21 @@
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import { IconButton as n } from "./icon-button.js";
3
+ import m from "../../shop-minis-react/node_modules/.pnpm/lucide-react@0.513.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/heart.js";
4
+ function e({
5
+ onClick: t,
6
+ filled: o = !1
7
+ }) {
8
+ return /* @__PURE__ */ r(
9
+ n,
10
+ {
11
+ Icon: m,
12
+ filled: o,
13
+ onClick: t,
14
+ buttonStyles: o ? "bg-primary" : "bg-button-overlay/30 backdrop-blur-sm"
15
+ }
16
+ );
17
+ }
18
+ export {
19
+ e as FavoriteButton
20
+ };
21
+ //# sourceMappingURL=favorite-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorite-button.js","sources":["../../../src/components/atoms/favorite-button.tsx"],"sourcesContent":["import {Heart} from 'lucide-react'\n\nimport {IconButton} from './icon-button'\n\nexport function FavoriteButton({\n onClick,\n filled = false,\n}: {\n onClick?: () => void\n filled?: boolean\n}) {\n return (\n <IconButton\n Icon={Heart}\n filled={filled}\n onClick={onClick}\n buttonStyles={\n filled ? 'bg-primary' : 'bg-button-overlay/30 backdrop-blur-sm'\n }\n />\n )\n}\n"],"names":["FavoriteButton","onClick","filled","jsx","IconButton","Heart"],"mappings":";;;AAIO,SAASA,EAAe;AAAA,EAC7B,SAAAC;AAAA,EACA,QAAAC,IAAS;AACX,GAGG;AAEC,SAAA,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAMC;AAAA,MACN,QAAAH;AAAA,MACA,SAAAD;AAAA,MACA,cACEC,IAAS,eAAe;AAAA,IAAA;AAAA,EAE5B;AAEJ;"}
@@ -0,0 +1,38 @@
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import { cn as t } from "../../lib/utils.js";
3
+ import { Button as l } from "./button.js";
4
+ function u({
5
+ onClick: e,
6
+ filled: n = !1,
7
+ size: r = "default",
8
+ Icon: a,
9
+ buttonStyles: i,
10
+ iconStyles: s
11
+ }) {
12
+ const m = {
13
+ sm: "size-3",
14
+ default: "size-4",
15
+ lg: "size-6"
16
+ };
17
+ return /* @__PURE__ */ o(
18
+ l,
19
+ {
20
+ onClick: e,
21
+ variant: "icon",
22
+ size: r,
23
+ className: t("bg-primary", i),
24
+ stopPropagation: !0,
25
+ children: /* @__PURE__ */ o(
26
+ a,
27
+ {
28
+ fill: n ? "currentColor" : "none",
29
+ className: t("text-primary-foreground", m[r], s)
30
+ }
31
+ )
32
+ }
33
+ );
34
+ }
35
+ export {
36
+ u as IconButton
37
+ };
38
+ //# sourceMappingURL=icon-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-button.js","sources":["../../../src/components/atoms/icon-button.tsx"],"sourcesContent":["import {LucideIcon} from 'lucide-react'\n\nimport {cn} from '../../lib/utils'\n\nimport {Button} from './button'\n\nexport function IconButton({\n onClick,\n filled = false,\n size = 'default',\n Icon,\n buttonStyles,\n iconStyles,\n}: {\n onClick?: () => void\n filled?: boolean\n size?: 'default' | 'sm' | 'lg'\n Icon: LucideIcon\n buttonStyles?: string\n iconStyles?: string\n}) {\n const sizeMap = {\n sm: 'size-3',\n default: 'size-4',\n lg: 'size-6',\n }\n\n return (\n <Button\n onClick={onClick}\n variant=\"icon\"\n size={size}\n className={cn('bg-primary', buttonStyles)}\n stopPropagation\n >\n <Icon\n fill={filled ? 'currentColor' : 'none'}\n className={cn('text-primary-foreground', sizeMap[size], iconStyles)}\n />\n </Button>\n )\n}\n"],"names":["IconButton","onClick","filled","size","Icon","buttonStyles","iconStyles","sizeMap","jsx","Button","cn"],"mappings":";;;AAMO,SAASA,EAAW;AAAA,EACzB,SAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,MAAAC,IAAO;AAAA,EACP,MAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AACF,GAOG;AACD,QAAMC,IAAU;AAAA,IACd,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,IAAI;AAAA,EACN;AAGE,SAAA,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAAAR;AAAA,MACA,SAAQ;AAAA,MACR,MAAAE;AAAA,MACA,WAAWO,EAAG,cAAcL,CAAY;AAAA,MACxC,iBAAe;AAAA,MAEf,UAAA,gBAAAG;AAAA,QAACJ;AAAA,QAAA;AAAA,UACC,MAAMF,IAAS,iBAAiB;AAAA,UAChC,WAAWQ,EAAG,2BAA2BH,EAAQJ,CAAI,GAAGG,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACpE;AAAA,EACF;AAEJ;"}
@@ -1,14 +1,14 @@
1
1
  import { jsx as d } from "react/jsx-runtime";
2
2
  import * as i from "react";
3
- import { useAnimationControls as p } from "../../shop-minis-react/node_modules/.pnpm/motion@12.17.3_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/motion/dist/es/framer-motion/dist/es/animation/hooks/use-animation.js";
4
- import { motion as f } from "../../shop-minis-react/node_modules/.pnpm/motion@12.17.3_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/motion/dist/es/framer-motion/dist/es/render/components/motion/proxy.js";
5
- const y = ({
3
+ import { useAnimationControls as f } from "../../shop-minis-react/node_modules/.pnpm/motion@12.17.3_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/motion/dist/es/framer-motion/dist/es/animation/hooks/use-animation.js";
4
+ import { motion as h } from "../../shop-minis-react/node_modules/.pnpm/motion@12.17.3_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/motion/dist/es/framer-motion/dist/es/render/components/motion/proxy.js";
5
+ const L = ({
6
6
  children: l,
7
7
  onClick: a,
8
8
  stopPropagation: e = !1,
9
9
  ...u
10
10
  }) => {
11
- const r = i.useRef(null), o = p(), m = i.useCallback(
11
+ const r = i.useRef(null), n = f(), { ref: v, ...m } = u, p = i.useCallback(
12
12
  (t) => {
13
13
  e && t.stopPropagation(), a?.(t);
14
14
  },
@@ -16,13 +16,13 @@ const y = ({
16
16
  );
17
17
  return i.useEffect(() => {
18
18
  if (!e || !r.current) return;
19
- const t = r.current, s = (n) => {
20
- n.stopImmediatePropagation(), n.stopPropagation(), o.start({
19
+ const t = r.current, s = (o) => {
20
+ o.stopImmediatePropagation(), o.stopPropagation(), n.start({
21
21
  scale: 0.95,
22
22
  opacity: 0.7
23
23
  });
24
- }, c = (n) => {
25
- n.stopImmediatePropagation(), n.stopPropagation(), o.start({
24
+ }, c = (o) => {
25
+ o.stopImmediatePropagation(), o.stopPropagation(), n.start({
26
26
  scale: 1,
27
27
  opacity: 1
28
28
  });
@@ -30,28 +30,28 @@ const y = ({
30
30
  return t.addEventListener("pointerdown", s, !0), t.addEventListener("pointerup", c, !0), () => {
31
31
  t.removeEventListener("pointerdown", s, !0), t.removeEventListener("pointerup", c, !0);
32
32
  };
33
- }, [e, o]), /* @__PURE__ */ d(
34
- f.div,
33
+ }, [e, n]), /* @__PURE__ */ d(
34
+ h.div,
35
35
  {
36
36
  ref: r,
37
37
  "data-touchable": "true",
38
38
  className: "flex w-full",
39
- animate: e ? o : void 0,
39
+ animate: e ? n : void 0,
40
40
  whileTap: e ? void 0 : { scale: 0.95, opacity: 0.7 },
41
41
  transition: {
42
42
  scale: { type: "tween", duration: 0.08, ease: "linear" },
43
43
  opacity: { type: "tween", duration: 0.08, ease: "linear" }
44
44
  },
45
- onClick: m,
45
+ onClick: p,
46
46
  style: {
47
47
  touchAction: e ? "manipulation" : void 0
48
48
  },
49
- ...u,
49
+ ...m,
50
50
  children: l
51
51
  }
52
52
  );
53
53
  };
54
54
  export {
55
- y as Touchable
55
+ L as Touchable
56
56
  };
57
57
  //# sourceMappingURL=touchable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"touchable.js","sources":["../../../src/components/atoms/touchable.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport {motion, HTMLMotionProps, useAnimationControls} from 'motion/react'\n\nexport const Touchable = ({\n children,\n onClick,\n stopPropagation = false,\n ...props\n}: HTMLMotionProps<'div'> & {\n onClick?: React.MouseEventHandler<HTMLDivElement>\n stopPropagation?: boolean\n}) => {\n const ref = React.useRef<HTMLDivElement>(null)\n const controls = useAnimationControls()\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (stopPropagation) event.stopPropagation()\n onClick?.(event)\n },\n [stopPropagation, onClick]\n )\n\n // Handle animations manually when stopPropagation is true to prevent parent from receiving event\n React.useEffect(() => {\n if (!stopPropagation || !ref.current) return\n\n const element = ref.current\n\n const handlePointerDown = (event: PointerEvent) => {\n event.stopImmediatePropagation()\n event.stopPropagation()\n\n // Animate to pressed state\n controls.start({\n scale: 0.95,\n opacity: 0.7,\n })\n }\n\n const handlePointerUp = (event: PointerEvent) => {\n event.stopImmediatePropagation()\n event.stopPropagation()\n\n // Animate back to normal state\n controls.start({\n scale: 1,\n opacity: 1,\n })\n }\n\n // Capture pointer event before Motion\n element.addEventListener('pointerdown', handlePointerDown, true)\n element.addEventListener('pointerup', handlePointerUp, true)\n\n return () => {\n element.removeEventListener('pointerdown', handlePointerDown, true)\n element.removeEventListener('pointerup', handlePointerUp, true)\n }\n }, [stopPropagation, controls])\n\n return (\n <motion.div\n ref={ref}\n data-touchable=\"true\"\n className=\"flex w-full\"\n animate={stopPropagation ? controls : undefined}\n whileTap={stopPropagation ? undefined : {scale: 0.95, opacity: 0.7}}\n transition={{\n scale: {type: 'tween', duration: 0.08, ease: 'linear'},\n opacity: {type: 'tween', duration: 0.08, ease: 'linear'},\n }}\n onClick={handleClick}\n style={{\n touchAction: stopPropagation ? 'manipulation' : undefined,\n }}\n {...props} // TODO: We may need to filter out some props, as we only need motion props\n >\n {children}\n </motion.div>\n )\n}\n"],"names":["Touchable","children","onClick","stopPropagation","props","ref","React","controls","useAnimationControls","handleClick","event","element","handlePointerDown","handlePointerUp","jsx","motion"],"mappings":";;;;AAIO,MAAMA,IAAY,CAAC;AAAA,EACxB,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,GAAGC;AACL,MAGM;AACE,QAAAC,IAAMC,EAAM,OAAuB,IAAI,GACvCC,IAAWC,EAAqB,GAEhCC,IAAcH,EAAM;AAAA,IACxB,CAACI,MAA4C;AACvC,MAAAP,OAAuB,gBAAgB,GAC3CD,IAAUQ,CAAK;AAAA,IACjB;AAAA,IACA,CAACP,GAAiBD,CAAO;AAAA,EAC3B;AAGA,SAAAI,EAAM,UAAU,MAAM;AACpB,QAAI,CAACH,KAAmB,CAACE,EAAI,QAAS;AAEtC,UAAMM,IAAUN,EAAI,SAEdO,IAAoB,CAACF,MAAwB;AACjD,MAAAA,EAAM,yBAAyB,GAC/BA,EAAM,gBAAgB,GAGtBH,EAAS,MAAM;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACV;AAAA,IACH,GAEMM,IAAkB,CAACH,MAAwB;AAC/C,MAAAA,EAAM,yBAAyB,GAC/BA,EAAM,gBAAgB,GAGtBH,EAAS,MAAM;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACV;AAAA,IACH;AAGQ,WAAAI,EAAA,iBAAiB,eAAeC,GAAmB,EAAI,GACvDD,EAAA,iBAAiB,aAAaE,GAAiB,EAAI,GAEpD,MAAM;AACH,MAAAF,EAAA,oBAAoB,eAAeC,GAAmB,EAAI,GAC1DD,EAAA,oBAAoB,aAAaE,GAAiB,EAAI;AAAA,IAChE;AAAA,EAAA,GACC,CAACV,GAAiBI,CAAQ,CAAC,GAG5B,gBAAAO;AAAA,IAACC,EAAO;AAAA,IAAP;AAAA,MACC,KAAAV;AAAA,MACA,kBAAe;AAAA,MACf,WAAU;AAAA,MACV,SAASF,IAAkBI,IAAW;AAAA,MACtC,UAAUJ,IAAkB,SAAY,EAAC,OAAO,MAAM,SAAS,IAAG;AAAA,MAClE,YAAY;AAAA,QACV,OAAO,EAAC,MAAM,SAAS,UAAU,MAAM,MAAM,SAAQ;AAAA,QACrD,SAAS,EAAC,MAAM,SAAS,UAAU,MAAM,MAAM,SAAQ;AAAA,MACzD;AAAA,MACA,SAASM;AAAA,MACT,OAAO;AAAA,QACL,aAAaN,IAAkB,iBAAiB;AAAA,MAClD;AAAA,MACC,GAAGC;AAAA,MAEH,UAAAH;AAAA,IAAA;AAAA,EACH;AAEJ;"}
1
+ {"version":3,"file":"touchable.js","sources":["../../../src/components/atoms/touchable.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport {motion, HTMLMotionProps, useAnimationControls} from 'motion/react'\n\nexport const Touchable = ({\n children,\n onClick,\n stopPropagation = false,\n ...props\n}: HTMLMotionProps<'div'> & {\n onClick?: React.MouseEventHandler<HTMLDivElement>\n stopPropagation?: boolean\n}) => {\n const ref = React.useRef<HTMLDivElement>(null)\n const controls = useAnimationControls()\n\n // Filter out props that shouldn't be passed to motion.div\n // Any other custom props that get added to the component interface should be filtered here\n const {ref: _, ...motionProps} = props\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (stopPropagation) event.stopPropagation()\n onClick?.(event)\n },\n [stopPropagation, onClick]\n )\n\n // Handle animations manually when stopPropagation is true to prevent parent from receiving event\n React.useEffect(() => {\n if (!stopPropagation || !ref.current) return\n\n const element = ref.current\n\n const handlePointerDown = (event: PointerEvent) => {\n event.stopImmediatePropagation()\n event.stopPropagation()\n\n // Animate to pressed state\n controls.start({\n scale: 0.95,\n opacity: 0.7,\n })\n }\n\n const handlePointerUp = (event: PointerEvent) => {\n event.stopImmediatePropagation()\n event.stopPropagation()\n\n // Animate back to normal state\n controls.start({\n scale: 1,\n opacity: 1,\n })\n }\n\n // Capture pointer event before Motion\n element.addEventListener('pointerdown', handlePointerDown, true)\n element.addEventListener('pointerup', handlePointerUp, true)\n\n return () => {\n element.removeEventListener('pointerdown', handlePointerDown, true)\n element.removeEventListener('pointerup', handlePointerUp, true)\n }\n }, [stopPropagation, controls])\n\n return (\n <motion.div\n ref={ref}\n data-touchable=\"true\"\n className=\"flex w-full\"\n animate={stopPropagation ? controls : undefined}\n whileTap={stopPropagation ? undefined : {scale: 0.95, opacity: 0.7}}\n transition={{\n scale: {type: 'tween', duration: 0.08, ease: 'linear'},\n opacity: {type: 'tween', duration: 0.08, ease: 'linear'},\n }}\n onClick={handleClick}\n style={{\n touchAction: stopPropagation ? 'manipulation' : undefined,\n }}\n {...motionProps}\n >\n {children}\n </motion.div>\n )\n}\n"],"names":["Touchable","children","onClick","stopPropagation","props","ref","React","controls","useAnimationControls","_","motionProps","handleClick","event","element","handlePointerDown","handlePointerUp","jsx","motion"],"mappings":";;;;AAIO,MAAMA,IAAY,CAAC;AAAA,EACxB,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,GAAGC;AACL,MAGM;AACE,QAAAC,IAAMC,EAAM,OAAuB,IAAI,GACvCC,IAAWC,EAAqB,GAIhC,EAAC,KAAKC,GAAG,GAAGC,EAAe,IAAAN,GAE3BO,IAAcL,EAAM;AAAA,IACxB,CAACM,MAA4C;AACvC,MAAAT,OAAuB,gBAAgB,GAC3CD,IAAUU,CAAK;AAAA,IACjB;AAAA,IACA,CAACT,GAAiBD,CAAO;AAAA,EAC3B;AAGA,SAAAI,EAAM,UAAU,MAAM;AACpB,QAAI,CAACH,KAAmB,CAACE,EAAI,QAAS;AAEtC,UAAMQ,IAAUR,EAAI,SAEdS,IAAoB,CAACF,MAAwB;AACjD,MAAAA,EAAM,yBAAyB,GAC/BA,EAAM,gBAAgB,GAGtBL,EAAS,MAAM;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACV;AAAA,IACH,GAEMQ,IAAkB,CAACH,MAAwB;AAC/C,MAAAA,EAAM,yBAAyB,GAC/BA,EAAM,gBAAgB,GAGtBL,EAAS,MAAM;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACV;AAAA,IACH;AAGQ,WAAAM,EAAA,iBAAiB,eAAeC,GAAmB,EAAI,GACvDD,EAAA,iBAAiB,aAAaE,GAAiB,EAAI,GAEpD,MAAM;AACH,MAAAF,EAAA,oBAAoB,eAAeC,GAAmB,EAAI,GAC1DD,EAAA,oBAAoB,aAAaE,GAAiB,EAAI;AAAA,IAChE;AAAA,EAAA,GACC,CAACZ,GAAiBI,CAAQ,CAAC,GAG5B,gBAAAS;AAAA,IAACC,EAAO;AAAA,IAAP;AAAA,MACC,KAAAZ;AAAA,MACA,kBAAe;AAAA,MACf,WAAU;AAAA,MACV,SAASF,IAAkBI,IAAW;AAAA,MACtC,UAAUJ,IAAkB,SAAY,EAAC,OAAO,MAAM,SAAS,IAAG;AAAA,MAClE,YAAY;AAAA,QACV,OAAO,EAAC,MAAM,SAAS,UAAU,MAAM,MAAM,SAAQ;AAAA,QACrD,SAAS,EAAC,MAAM,SAAS,UAAU,MAAM,MAAM,SAAQ;AAAA,MACzD;AAAA,MACA,SAASQ;AAAA,MACT,OAAO;AAAA,QACL,aAAaR,IAAkB,iBAAiB;AAAA,MAClD;AAAA,MACC,GAAGO;AAAA,MAEH,UAAAT;AAAA,IAAA;AAAA,EACH;AAEJ;"}
@@ -195,13 +195,6 @@ const z = Object.assign(d, {
195
195
  });
196
196
  export {
197
197
  q as MerchantCard,
198
- f as MerchantCardImage,
199
- m as MerchantCardImageContainer,
200
- h as MerchantCardInfo,
201
- u as MerchantCardLogo,
202
- g as MerchantCardName,
203
- z as MerchantCardPrimitive,
204
- p as MerchantCardRating,
205
- d as MerchantCardRoot
198
+ z as MerchantCardPrimitive
206
199
  };
207
200
  //# sourceMappingURL=merchant-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merchant-card.js","sources":["../../../src/components/commerce/merchant-card.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport {type Shop} from '@shopify/shop-minis-platform'\nimport {cva, type VariantProps} from 'class-variance-authority'\nimport {Star} from 'lucide-react'\nimport {Slot as SlotPrimitive} from 'radix-ui'\n\nimport {useShopNavigation} from '../../hooks/navigation/useShopNavigation'\nimport {cn} from '../../lib/utils'\nimport {Touchable} from '../atoms/touchable'\n\nconst merchantCardVariants = cva(\n 'relative w-full aspect-square overflow-hidden rounded-xl border border-grayscale-l20 bg-grayscale-l0 flex flex-col',\n {\n variants: {\n touchable: {\n true: 'cursor-pointer',\n false: '',\n },\n },\n defaultVariants: {\n touchable: true,\n },\n }\n)\n\nfunction formatReviewCount(count: number): string {\n if (count >= 1000000) {\n return `${Math.floor(count / 100000) / 10}M`\n }\n if (count >= 1000) {\n return `${Math.floor(count / 1000)}K`\n }\n return count.toString()\n}\n\nfunction normalizeRating(rating: number): number {\n return Math.round(rating * 10) / 10\n}\n\nexport interface MerchantCardRootProps\n extends React.ComponentProps<'div'>,\n VariantProps<typeof merchantCardVariants> {\n touchable?: boolean\n asChild?: boolean\n onPress?: () => void\n}\n\nfunction MerchantCardRoot({\n className,\n touchable = true,\n asChild = false,\n onPress,\n ...props\n}: MerchantCardRootProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div'\n\n const content = (\n <Comp\n className={cn(merchantCardVariants({touchable}), className)}\n {...props}\n />\n )\n\n if (touchable && onPress) {\n return (\n <Touchable\n onClick={onPress}\n whileTap={{opacity: 0.7}}\n transition={{\n opacity: {type: 'tween', duration: 0.08, ease: 'easeInOut'},\n }}\n >\n {content}\n </Touchable>\n )\n }\n\n return content\n}\n\nfunction MerchantCardImageContainer({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"merchant-card-image-container\"\n className={cn('relative overflow-hidden w-full flex-grow', className)}\n {...props}\n />\n )\n}\n\nfunction MerchantCardImage({\n className,\n src,\n alt,\n ...props\n}: React.ComponentProps<'img'> & {\n src?: string\n alt?: string\n}) {\n return src ? (\n <img\n data-slot=\"merchant-card-image\"\n src={src}\n alt={alt}\n className={cn('w-full h-full object-cover', className)}\n {...props}\n />\n ) : (\n <div className=\"w-full h-full bg-grayscale-l10\" />\n )\n}\n\nfunction MerchantCardLogo({\n className,\n src,\n alt,\n ...props\n}: React.ComponentProps<'div'> & {\n src?: string\n alt?: string\n}) {\n return (\n <div\n data-slot=\"merchant-card-logo\"\n className={cn(\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n 'w-14 h-14 rounded-xl',\n 'flex items-center justify-center overflow-hidden',\n className\n )}\n {...props}\n >\n {src ? (\n <img src={src} alt={alt} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full bg-grayscale-l20\" />\n )}\n </div>\n )\n}\n\nfunction MerchantCardInfo({className, ...props}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"merchant-card-info\"\n className={cn('p-3 space-y-1 flex-shrink-0', className)}\n {...props}\n />\n )\n}\n\nfunction MerchantCardName({\n className,\n children,\n ...props\n}: React.ComponentProps<'h3'>) {\n return (\n <h3\n data-slot=\"merchant-card-name\"\n className={cn(\n 'text-sm font-medium text-grayscale-d100',\n 'truncate overflow-hidden whitespace-nowrap text-ellipsis',\n className\n )}\n {...props}\n >\n {children}\n </h3>\n )\n}\n\nfunction MerchantCardRating({\n className,\n rating,\n reviewCount,\n ...props\n}: React.ComponentProps<'div'> & {\n rating?: number | null\n reviewCount?: number\n}) {\n if (!rating || !reviewCount) return null\n\n return (\n <div\n data-slot=\"merchant-card-rating\"\n className={cn(\n 'flex items-center gap-1 text-sm text-grayscale-d100',\n className\n )}\n {...props}\n >\n <Star className=\"h-3.5 w-3.5 fill-current\" />\n <>\n {normalizeRating(rating)} ({formatReviewCount(reviewCount)})\n </>\n </div>\n )\n}\n\nexport interface MerchantCardProps {\n shop: Shop\n touchable?: boolean\n}\n\n// Composed MerchantCard component\nfunction MerchantCard({shop, touchable = true}: MerchantCardProps) {\n const {navigateToShop} = useShopNavigation()\n\n const {\n id,\n name,\n reviewAnalytics: {averageRating, reviewCount},\n visualTheme,\n } = shop\n\n const handlePress = React.useCallback(() => {\n if (!touchable) return\n navigateToShop({shopId: id})\n }, [navigateToShop, id, touchable])\n\n return (\n <MerchantCardRoot touchable={touchable} onPress={handlePress}>\n <MerchantCardImageContainer>\n {/* TODO: Add featured image */}\n <MerchantCardImage src={undefined} alt={`${name} featured image`} />\n <MerchantCardLogo\n src={visualTheme?.logoImage?.url}\n alt={`${name} logo`}\n />\n </MerchantCardImageContainer>\n\n <MerchantCardInfo>\n <MerchantCardName>{name}</MerchantCardName>\n <MerchantCardRating rating={averageRating} reviewCount={reviewCount} />\n </MerchantCardInfo>\n </MerchantCardRoot>\n )\n}\n\nexport const MerchantCardPrimitive = Object.assign(MerchantCardRoot, {\n ImageContainer: MerchantCardImageContainer,\n Image: MerchantCardImage,\n Logo: MerchantCardLogo,\n Info: MerchantCardInfo,\n Name: MerchantCardName,\n Rating: MerchantCardRating,\n})\n\nexport {\n // Composed component\n MerchantCard,\n // Primitive components for custom composition\n MerchantCardRoot,\n MerchantCardImageContainer,\n MerchantCardImage,\n MerchantCardLogo,\n MerchantCardInfo,\n MerchantCardName,\n MerchantCardRating,\n}\n"],"names":["merchantCardVariants","cva","formatReviewCount","count","normalizeRating","rating","MerchantCardRoot","className","touchable","asChild","onPress","props","content","jsx","SlotPrimitive.Slot","cn","Touchable","MerchantCardImageContainer","MerchantCardImage","src","alt","MerchantCardLogo","MerchantCardInfo","MerchantCardName","children","MerchantCardRating","reviewCount","jsxs","Star","Fragment","MerchantCard","shop","navigateToShop","useShopNavigation","id","name","averageRating","visualTheme","handlePress","React","MerchantCardPrimitive"],"mappings":"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"}
1
+ {"version":3,"file":"merchant-card.js","sources":["../../../src/components/commerce/merchant-card.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport {type Shop} from '@shopify/shop-minis-platform'\nimport {cva, type VariantProps} from 'class-variance-authority'\nimport {Star} from 'lucide-react'\nimport {Slot as SlotPrimitive} from 'radix-ui'\n\nimport {useShopNavigation} from '../../hooks/navigation/useShopNavigation'\nimport {cn} from '../../lib/utils'\nimport {Touchable} from '../atoms/touchable'\n\nconst merchantCardVariants = cva(\n 'relative w-full aspect-square overflow-hidden rounded-xl border border-grayscale-l20 bg-grayscale-l0 flex flex-col',\n {\n variants: {\n touchable: {\n true: 'cursor-pointer',\n false: '',\n },\n },\n defaultVariants: {\n touchable: true,\n },\n }\n)\n\nfunction formatReviewCount(count: number): string {\n if (count >= 1000000) {\n return `${Math.floor(count / 100000) / 10}M`\n }\n if (count >= 1000) {\n return `${Math.floor(count / 1000)}K`\n }\n return count.toString()\n}\n\nfunction normalizeRating(rating: number): number {\n return Math.round(rating * 10) / 10\n}\n\nexport interface MerchantCardRootProps\n extends React.ComponentProps<'div'>,\n VariantProps<typeof merchantCardVariants> {\n touchable?: boolean\n asChild?: boolean\n onPress?: () => void\n}\n\nfunction MerchantCardRoot({\n className,\n touchable = true,\n asChild = false,\n onPress,\n ...props\n}: MerchantCardRootProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div'\n\n const content = (\n <Comp\n className={cn(merchantCardVariants({touchable}), className)}\n {...props}\n />\n )\n\n if (touchable && onPress) {\n return (\n <Touchable\n onClick={onPress}\n whileTap={{opacity: 0.7}}\n transition={{\n opacity: {type: 'tween', duration: 0.08, ease: 'easeInOut'},\n }}\n >\n {content}\n </Touchable>\n )\n }\n\n return content\n}\n\nfunction MerchantCardImageContainer({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"merchant-card-image-container\"\n className={cn('relative overflow-hidden w-full flex-grow', className)}\n {...props}\n />\n )\n}\n\nfunction MerchantCardImage({\n className,\n src,\n alt,\n ...props\n}: React.ComponentProps<'img'> & {\n src?: string\n alt?: string\n}) {\n return src ? (\n <img\n data-slot=\"merchant-card-image\"\n src={src}\n alt={alt}\n className={cn('w-full h-full object-cover', className)}\n {...props}\n />\n ) : (\n <div className=\"w-full h-full bg-grayscale-l10\" />\n )\n}\n\nfunction MerchantCardLogo({\n className,\n src,\n alt,\n ...props\n}: React.ComponentProps<'div'> & {\n src?: string\n alt?: string\n}) {\n return (\n <div\n data-slot=\"merchant-card-logo\"\n className={cn(\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n 'w-14 h-14 rounded-xl',\n 'flex items-center justify-center overflow-hidden',\n className\n )}\n {...props}\n >\n {src ? (\n <img src={src} alt={alt} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full bg-grayscale-l20\" />\n )}\n </div>\n )\n}\n\nfunction MerchantCardInfo({className, ...props}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"merchant-card-info\"\n className={cn('p-3 space-y-1 flex-shrink-0', className)}\n {...props}\n />\n )\n}\n\nfunction MerchantCardName({\n className,\n children,\n ...props\n}: React.ComponentProps<'h3'>) {\n return (\n <h3\n data-slot=\"merchant-card-name\"\n className={cn(\n 'text-sm font-medium text-grayscale-d100',\n 'truncate overflow-hidden whitespace-nowrap text-ellipsis',\n className\n )}\n {...props}\n >\n {children}\n </h3>\n )\n}\n\nfunction MerchantCardRating({\n className,\n rating,\n reviewCount,\n ...props\n}: React.ComponentProps<'div'> & {\n rating?: number | null\n reviewCount?: number\n}) {\n if (!rating || !reviewCount) return null\n\n return (\n <div\n data-slot=\"merchant-card-rating\"\n className={cn(\n 'flex items-center gap-1 text-sm text-grayscale-d100',\n className\n )}\n {...props}\n >\n <Star className=\"h-3.5 w-3.5 fill-current\" />\n <>\n {normalizeRating(rating)} ({formatReviewCount(reviewCount)})\n </>\n </div>\n )\n}\n\nexport interface MerchantCardProps {\n shop: Shop\n touchable?: boolean\n}\n\n// Composed MerchantCard component\nfunction MerchantCard({shop, touchable = true}: MerchantCardProps) {\n const {navigateToShop} = useShopNavigation()\n\n const {\n id,\n name,\n reviewAnalytics: {averageRating, reviewCount},\n visualTheme,\n } = shop\n\n const handlePress = React.useCallback(() => {\n if (!touchable) return\n navigateToShop({shopId: id})\n }, [navigateToShop, id, touchable])\n\n return (\n <MerchantCardRoot touchable={touchable} onPress={handlePress}>\n <MerchantCardImageContainer>\n {/* TODO: Add featured image */}\n <MerchantCardImage src={undefined} alt={`${name} featured image`} />\n <MerchantCardLogo\n src={visualTheme?.logoImage?.url}\n alt={`${name} logo`}\n />\n </MerchantCardImageContainer>\n\n <MerchantCardInfo>\n <MerchantCardName>{name}</MerchantCardName>\n <MerchantCardRating rating={averageRating} reviewCount={reviewCount} />\n </MerchantCardInfo>\n </MerchantCardRoot>\n )\n}\n\nexport const MerchantCardPrimitive = Object.assign(MerchantCardRoot, {\n ImageContainer: MerchantCardImageContainer,\n Image: MerchantCardImage,\n Logo: MerchantCardLogo,\n Info: MerchantCardInfo,\n Name: MerchantCardName,\n Rating: MerchantCardRating,\n})\n\nexport {MerchantCard}\n"],"names":["merchantCardVariants","cva","formatReviewCount","count","normalizeRating","rating","MerchantCardRoot","className","touchable","asChild","onPress","props","content","jsx","SlotPrimitive.Slot","cn","Touchable","MerchantCardImageContainer","MerchantCardImage","src","alt","MerchantCardLogo","MerchantCardInfo","MerchantCardName","children","MerchantCardRating","reviewCount","jsxs","Star","Fragment","MerchantCard","shop","navigateToShop","useShopNavigation","id","name","averageRating","visualTheme","handlePress","React","MerchantCardPrimitive"],"mappings":"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"}