@zappie/theme-base 0.0.0-stage → 0.1.1

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 (50) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -2
  4. package/dist/address.d.ts +32 -0
  5. package/dist/address.js +4 -0
  6. package/dist/address.js.map +1 -0
  7. package/dist/cart.d.ts +12 -0
  8. package/dist/cart.js +1140 -0
  9. package/dist/cart.js.map +1 -0
  10. package/dist/catalogue.d.ts +60 -0
  11. package/dist/catalogue.js +1389 -0
  12. package/dist/catalogue.js.map +1 -0
  13. package/dist/checkout.d.ts +36 -0
  14. package/dist/checkout.js +4 -0
  15. package/dist/checkout.js.map +1 -0
  16. package/dist/chunk-2MV6KU3R.js +352 -0
  17. package/dist/chunk-2MV6KU3R.js.map +1 -0
  18. package/dist/chunk-FB5DRCU7.js +146 -0
  19. package/dist/chunk-FB5DRCU7.js.map +1 -0
  20. package/dist/chunk-IG63ONID.js +139 -0
  21. package/dist/chunk-IG63ONID.js.map +1 -0
  22. package/dist/chunk-ILOCSCZL.js +217 -0
  23. package/dist/chunk-ILOCSCZL.js.map +1 -0
  24. package/dist/chunk-JFEI2OUZ.js +13 -0
  25. package/dist/chunk-JFEI2OUZ.js.map +1 -0
  26. package/dist/chunk-NTJONY3N.js +95 -0
  27. package/dist/chunk-NTJONY3N.js.map +1 -0
  28. package/dist/chunk-QWST2TA2.js +22 -0
  29. package/dist/chunk-QWST2TA2.js.map +1 -0
  30. package/dist/chunk-USSLDBDY.js +48 -0
  31. package/dist/chunk-USSLDBDY.js.map +1 -0
  32. package/dist/chunk-VIAJ27YC.js +59 -0
  33. package/dist/chunk-VIAJ27YC.js.map +1 -0
  34. package/dist/host-bridge.d.ts +100 -0
  35. package/dist/host-bridge.js +4 -0
  36. package/dist/host-bridge.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.js +6 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/item-frame.d.ts +20 -0
  41. package/dist/item-frame.js +5 -0
  42. package/dist/item-frame.js.map +1 -0
  43. package/dist/item.d.ts +20 -0
  44. package/dist/item.js +153 -0
  45. package/dist/item.js.map +1 -0
  46. package/dist/navigation.d.ts +64 -0
  47. package/dist/navigation.js +4 -0
  48. package/dist/navigation.js.map +1 -0
  49. package/dist/styles.css +842 -0
  50. package/package.json +74 -3
package/dist/item.js ADDED
@@ -0,0 +1,153 @@
1
+ "use client";
2
+ import { ItemFrame, ItemEscapeContext } from './chunk-VIAJ27YC.js';
3
+ import { ItemImage, Description } from './chunk-USSLDBDY.js';
4
+ import { ItemConfigurator } from './chunk-2MV6KU3R.js';
5
+ import './chunk-QWST2TA2.js';
6
+ import './chunk-JFEI2OUZ.js';
7
+ import { Overlay } from '@zappie/foundations';
8
+ import { useState, useContext, useEffect, Fragment } from 'react';
9
+ import { jsx, jsxs } from 'react/jsx-runtime';
10
+
11
+ function ItemDetail(props) {
12
+ return /* @__PURE__ */ jsx(
13
+ ItemFrame,
14
+ {
15
+ id: props.item.id,
16
+ name: props.item.name,
17
+ hasImages: props.item.images.length > 0,
18
+ navigation: props.navigation,
19
+ themeClass: props.themeClass,
20
+ children: /* @__PURE__ */ jsx(ItemContent, { ...props }, props.item.id)
21
+ }
22
+ );
23
+ }
24
+ function ItemContent({
25
+ item,
26
+ menuId,
27
+ scope,
28
+ href,
29
+ navigation
30
+ }) {
31
+ const [image, setImage] = useState(0);
32
+ const [lightbox, setLightbox] = useState(false);
33
+ const [shareMessage, setShareMessage] = useState("");
34
+ const escape = useContext(ItemEscapeContext);
35
+ useEffect(() => {
36
+ if (!escape) {
37
+ return;
38
+ }
39
+ escape.current = lightbox ? () => setLightbox(false) : void 0;
40
+ return () => {
41
+ escape.current = void 0;
42
+ };
43
+ }, [escape, lightbox]);
44
+ return /* @__PURE__ */ jsxs(
45
+ "div",
46
+ {
47
+ className: `z-base-item-layout ${lightbox ? "z-base-item-lightbox" : ""}`,
48
+ children: [
49
+ item.images.length > 0 && /* @__PURE__ */ jsxs("section", { className: "z-base-item-media", "aria-label": "Product images", children: [
50
+ /* @__PURE__ */ jsx(
51
+ "button",
52
+ {
53
+ type: "button",
54
+ className: "z-base-item-photo",
55
+ "aria-label": lightbox ? "Close enlarged image" : "Enlarge product image",
56
+ onClick: () => setLightbox(!lightbox),
57
+ children: /* @__PURE__ */ jsx(
58
+ ItemImage,
59
+ {
60
+ src: item.images[image] ?? item.images[0] ?? "",
61
+ sizes: "(min-width: 768px) 450px, 100vw",
62
+ priority: true
63
+ },
64
+ image
65
+ )
66
+ }
67
+ ),
68
+ item.images.length > 1 && /* @__PURE__ */ jsxs("nav", { "aria-label": "Image gallery", children: [
69
+ /* @__PURE__ */ jsx(
70
+ "button",
71
+ {
72
+ type: "button",
73
+ onClick: () => setImage(
74
+ (image + item.images.length - 1) % item.images.length
75
+ ),
76
+ "aria-label": "Previous image",
77
+ children: "\u2190"
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsxs("span", { children: [
81
+ image + 1,
82
+ " / ",
83
+ item.images.length
84
+ ] }),
85
+ /* @__PURE__ */ jsx(
86
+ "button",
87
+ {
88
+ type: "button",
89
+ onClick: () => setImage((image + 1) % item.images.length),
90
+ "aria-label": "Next image",
91
+ children: "\u2192"
92
+ }
93
+ )
94
+ ] }),
95
+ lightbox && /* @__PURE__ */ jsx(
96
+ "button",
97
+ {
98
+ type: "button",
99
+ className: "z-base-button-secondary",
100
+ onClick: () => setLightbox(false),
101
+ children: "Back to product"
102
+ }
103
+ )
104
+ ] }),
105
+ !lightbox && /* @__PURE__ */ jsxs("div", { className: "z-base-item-details", children: [
106
+ /* @__PURE__ */ jsx(
107
+ "button",
108
+ {
109
+ type: "button",
110
+ className: "z-base-button-secondary",
111
+ "aria-label": "Share product",
112
+ onClick: () => {
113
+ const url = new URL(href, window.location.origin).href;
114
+ void Promise.resolve().then(
115
+ () => navigator.share ? navigator.share({ title: item.name, url }) : navigator.clipboard.writeText(url).then(() => setShareMessage("Link copied"))
116
+ ).catch((failure) => {
117
+ if (failure?.name !== "AbortError") {
118
+ setShareMessage(
119
+ "Could not share the link. Please try again."
120
+ );
121
+ }
122
+ });
123
+ },
124
+ children: "Share"
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsx(Overlay.Title, { children: item.name }),
128
+ !item.isAvailable && /* @__PURE__ */ jsx("p", { role: "status", children: item.stockLabel ?? "Unavailable" }),
129
+ shareMessage && /* @__PURE__ */ jsx("p", { role: "status", children: shareMessage }),
130
+ /* @__PURE__ */ jsx(
131
+ ItemConfigurator,
132
+ {
133
+ showPrice: true,
134
+ introduction: /* @__PURE__ */ jsxs(Fragment, { children: [
135
+ item.promo && /* @__PURE__ */ jsx("p", { children: item.promo.name }),
136
+ item.description && /* @__PURE__ */ jsx(Description, { value: item.description })
137
+ ] }),
138
+ item,
139
+ menuId,
140
+ scope,
141
+ onComplete: navigation.close
142
+ },
143
+ `${scope}:${item.id}:${menuId}`
144
+ )
145
+ ] })
146
+ ]
147
+ }
148
+ );
149
+ }
150
+
151
+ export { ItemContent, ItemDetail };
152
+ //# sourceMappingURL=item.js.map
153
+ //# sourceMappingURL=item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/item/item-detail.tsx"],"names":[],"mappings":"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","file":"item.js","sourcesContent":["\"use client\";\nimport { Overlay } from \"@zappie/foundations\";\nimport type { Item } from \"@zappie/sdk\";\nimport { Fragment, useContext, useEffect, useState } from \"react\";\nimport { Description, ItemImage } from \"../catalogue/presentation\";\nimport { ItemConfigurator } from \"./configurator\";\nimport { ItemEscapeContext, ItemFrame } from \"./frame\";\n\nexport type ItemDetailProps = {\n item: Item;\n menuId: string;\n scope: string;\n href: string;\n themeClass?: string;\n navigation: { isOpen: boolean; open(): void; close(): void };\n};\n/** Framework-independent SDK item screen, reusable through themeClass. */\nexport function ItemDetail(props: ItemDetailProps) {\n return (\n <ItemFrame\n id={props.item.id}\n name={props.item.name}\n hasImages={props.item.images.length > 0}\n navigation={props.navigation}\n themeClass={props.themeClass}\n >\n <ItemContent key={props.item.id} {...props} />\n </ItemFrame>\n );\n}\nexport function ItemContent({\n item,\n menuId,\n scope,\n href,\n navigation,\n}: ItemDetailProps) {\n const [image, setImage] = useState(0);\n const [lightbox, setLightbox] = useState(false);\n const [shareMessage, setShareMessage] = useState(\"\");\n const escape = useContext(ItemEscapeContext);\n useEffect(() => {\n if (!escape) {\n return;\n }\n escape.current = lightbox ? () => setLightbox(false) : undefined;\n return () => {\n escape.current = undefined;\n };\n }, [escape, lightbox]);\n return (\n <div\n className={`z-base-item-layout ${lightbox ? \"z-base-item-lightbox\" : \"\"}`}\n >\n {item.images.length > 0 && (\n <section className=\"z-base-item-media\" aria-label=\"Product images\">\n <button\n type=\"button\"\n className=\"z-base-item-photo\"\n aria-label={\n lightbox ? \"Close enlarged image\" : \"Enlarge product image\"\n }\n onClick={() => setLightbox(!lightbox)}\n >\n <ItemImage\n key={image}\n src={item.images[image] ?? item.images[0] ?? \"\"}\n sizes=\"(min-width: 768px) 450px, 100vw\"\n priority\n />\n </button>\n {item.images.length > 1 && (\n <nav aria-label=\"Image gallery\">\n <button\n type=\"button\"\n onClick={() =>\n setImage(\n (image + item.images.length - 1) % item.images.length,\n )\n }\n aria-label=\"Previous image\"\n >\n ←\n </button>\n <span>\n {image + 1} / {item.images.length}\n </span>\n <button\n type=\"button\"\n onClick={() => setImage((image + 1) % item.images.length)}\n aria-label=\"Next image\"\n >\n →\n </button>\n </nav>\n )}\n {lightbox && (\n <button\n type=\"button\"\n className=\"z-base-button-secondary\"\n onClick={() => setLightbox(false)}\n >\n Back to product\n </button>\n )}\n </section>\n )}\n {!lightbox && (\n <div className=\"z-base-item-details\">\n <button\n type=\"button\"\n className=\"z-base-button-secondary\"\n aria-label=\"Share product\"\n onClick={() => {\n const url = new URL(href, window.location.origin).href;\n void Promise.resolve()\n .then(() =>\n navigator.share\n ? navigator.share({ title: item.name, url })\n : navigator.clipboard\n .writeText(url)\n .then(() => setShareMessage(\"Link copied\")),\n )\n .catch((failure) => {\n if (failure?.name !== \"AbortError\") {\n setShareMessage(\n \"Could not share the link. Please try again.\",\n );\n }\n });\n }}\n >\n Share\n </button>\n <Overlay.Title>{item.name}</Overlay.Title>\n {!item.isAvailable && (\n <p role=\"status\">{item.stockLabel ?? \"Unavailable\"}</p>\n )}\n {shareMessage && <p role=\"status\">{shareMessage}</p>}\n <ItemConfigurator\n showPrice\n introduction={\n <Fragment>\n {item.promo && <p>{item.promo.name}</p>}\n {item.description && <Description value={item.description} />}\n </Fragment>\n }\n key={`${scope}:${item.id}:${menuId}`}\n item={item}\n menuId={menuId}\n scope={scope}\n onComplete={navigation.close}\n />\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,64 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Item } from '@zappie/sdk';
3
+ import { StorefrontUrlOptions } from '@zappie/sdk/url';
4
+ import { ReactNode } from 'react';
5
+
6
+ declare function createUrlNavigation(options?: UrlNavigationOptions): CatalogueNavigation;
7
+
8
+ /** URL-owned selection, shared by template routers and reusable base screens. */
9
+ type CatalogueLocation = {
10
+ pathname: string;
11
+ menuId?: string;
12
+ categoryId?: string;
13
+ menuLayout?: "GRID" | "LIST" | "CARD";
14
+ item?: {
15
+ id: string;
16
+ path: string;
17
+ presentation: "path" | "query";
18
+ };
19
+ };
20
+ /** Stable identities, not host selectors or retained DOM nodes. */
21
+ type CatalogueFocusTarget = {
22
+ itemId?: string;
23
+ fallback: "catalogue";
24
+ };
25
+ type CatalogueNavigationTarget = {
26
+ type: "item";
27
+ itemId: string;
28
+ menuId?: string;
29
+ categoryId?: string;
30
+ };
31
+ type CatalogueNavigation = {
32
+ /** Fresh URL snapshot on every read; providers re-render on history changes. */
33
+ readonly location: CatalogueLocation;
34
+ hrefFor(target: CatalogueNavigationTarget): string;
35
+ selectMenu(menuId: string): void;
36
+ selectCategory(categoryId: string): void;
37
+ setLayout(layout: NonNullable<CatalogueLocation["menuLayout"]>): void;
38
+ openItem(input: {
39
+ itemId: string;
40
+ /** Already normalized catalogue/search item; opening it must not fetch it again. */
41
+ item?: Item;
42
+ menuId: string;
43
+ categoryId?: string;
44
+ }): Promise<void>;
45
+ /** Resolves after history changes and the item releases its modal/focus lock. */
46
+ closeItem(): Promise<void>;
47
+ /** Close the active item/base overlay before opening another surface. */
48
+ openCart(): Promise<void>;
49
+ openBranchFinder(): Promise<void>;
50
+ openBranchDetails?(): Promise<void>;
51
+ switchFulfilment(mode: "delivery" | "pickup"): Promise<boolean>;
52
+ /** Called after close settles; use a registered trigger, or the catalogue heading. */
53
+ restoreFocus(target: CatalogueFocusTarget): void;
54
+ };
55
+ type UrlNavigationOptions = StorefrontUrlOptions & {
56
+ window?: Window & typeof globalThis;
57
+ };
58
+ declare function CatalogueNavigationProvider({ navigation, children, }: {
59
+ navigation: CatalogueNavigation;
60
+ children: ReactNode;
61
+ }): react_jsx_runtime.JSX.Element;
62
+ declare function useCatalogueNavigation(): CatalogueNavigation;
63
+
64
+ export { type CatalogueFocusTarget, type CatalogueLocation, type CatalogueNavigation, CatalogueNavigationProvider, type CatalogueNavigationTarget, type UrlNavigationOptions, createUrlNavigation, useCatalogueNavigation };
@@ -0,0 +1,4 @@
1
+ "use client";
2
+ export { CatalogueNavigationProvider, createUrlNavigation, useCatalogueNavigation } from './chunk-ILOCSCZL.js';
3
+ //# sourceMappingURL=navigation.js.map
4
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"navigation.js"}