@open-mercato/content 0.4.2-canary-c02407ff85
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.
- package/build.mjs +62 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +7 -0
- package/dist/modules/content/frontend/components/ContentLayout.js +85 -0
- package/dist/modules/content/frontend/components/ContentLayout.js.map +7 -0
- package/dist/modules/content/frontend/privacy/page.js +43 -0
- package/dist/modules/content/frontend/privacy/page.js.map +7 -0
- package/dist/modules/content/frontend/privacy/page.meta.js +8 -0
- package/dist/modules/content/frontend/privacy/page.meta.js.map +7 -0
- package/dist/modules/content/frontend/terms/page.js +45 -0
- package/dist/modules/content/frontend/terms/page.js.map +7 -0
- package/dist/modules/content/frontend/terms/page.meta.js +8 -0
- package/dist/modules/content/frontend/terms/page.meta.js.map +7 -0
- package/dist/modules/content/index.js +10 -0
- package/dist/modules/content/index.js.map +7 -0
- package/jest.config.cjs +19 -0
- package/package.json +75 -0
- package/src/index.ts +2 -0
- package/src/modules/content/frontend/components/ContentLayout.tsx +130 -0
- package/src/modules/content/frontend/privacy/page.meta.ts +6 -0
- package/src/modules/content/frontend/privacy/page.tsx +56 -0
- package/src/modules/content/frontend/terms/page.meta.ts +6 -0
- package/src/modules/content/frontend/terms/page.tsx +62 -0
- package/src/modules/content/index.ts +6 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +9 -0
- package/watch.mjs +6 -0
package/build.mjs
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as esbuild from 'esbuild'
|
|
2
|
+
import { glob } from 'glob'
|
|
3
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs'
|
|
4
|
+
import { dirname, join } from 'node:path'
|
|
5
|
+
|
|
6
|
+
const entryPoints = await glob('src/**/*.{ts,tsx}', {
|
|
7
|
+
ignore: ['**/__tests__/**', '**/*.test.ts', '**/*.test.tsx']
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
// Plugin to add .js extension to relative imports
|
|
11
|
+
const addJsExtension = {
|
|
12
|
+
name: 'add-js-extension',
|
|
13
|
+
setup(build) {
|
|
14
|
+
build.onEnd(async (result) => {
|
|
15
|
+
if (result.errors.length > 0) return
|
|
16
|
+
const outputFiles = await glob('dist/**/*.js')
|
|
17
|
+
for (const file of outputFiles) {
|
|
18
|
+
const fileDir = dirname(file)
|
|
19
|
+
let content = readFileSync(file, 'utf-8')
|
|
20
|
+
// Add .js to relative imports that don't have an extension
|
|
21
|
+
content = content.replace(
|
|
22
|
+
/from\s+["'](\.[^"']+)["']/g,
|
|
23
|
+
(match, path) => {
|
|
24
|
+
if (path.endsWith('.js') || path.endsWith('.json')) return match
|
|
25
|
+
// Check if it's a directory with index.js
|
|
26
|
+
const resolvedPath = join(fileDir, path)
|
|
27
|
+
if (existsSync(resolvedPath) && existsSync(join(resolvedPath, 'index.js'))) {
|
|
28
|
+
return `from "${path}/index.js"`
|
|
29
|
+
}
|
|
30
|
+
return `from "${path}.js"`
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
content = content.replace(
|
|
34
|
+
/import\s*\(\s*["'](\.[^"']+)["']\s*\)/g,
|
|
35
|
+
(match, path) => {
|
|
36
|
+
if (path.endsWith('.js') || path.endsWith('.json')) return match
|
|
37
|
+
// Check if it's a directory with index.js
|
|
38
|
+
const resolvedPath = join(fileDir, path)
|
|
39
|
+
if (existsSync(resolvedPath) && existsSync(join(resolvedPath, 'index.js'))) {
|
|
40
|
+
return `import("${path}/index.js")`
|
|
41
|
+
}
|
|
42
|
+
return `import("${path}.js")`
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
writeFileSync(file, content)
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
await esbuild.build({
|
|
52
|
+
entryPoints,
|
|
53
|
+
outdir: 'dist',
|
|
54
|
+
format: 'esm',
|
|
55
|
+
platform: 'node',
|
|
56
|
+
target: 'node18',
|
|
57
|
+
sourcemap: true,
|
|
58
|
+
jsx: 'automatic',
|
|
59
|
+
plugins: [addJsExtension],
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
console.log('content built successfully')
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import Image from "next/image";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { ChevronRight } from "lucide-react";
|
|
5
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
6
|
+
import { cn } from "@open-mercato/shared/lib/utils";
|
|
7
|
+
function ContentLayout({ title, intro, breadcrumb, children }) {
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-h-svh flex-col bg-muted/30", children: [
|
|
9
|
+
/* @__PURE__ */ jsx("header", { className: "border-b bg-background/80 backdrop-blur supports-[backdrop-filter]:bg-background/60", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-screen-lg items-center justify-between px-6 py-4", children: [
|
|
10
|
+
/* @__PURE__ */ jsxs(Link, { href: "/", className: "flex items-center gap-3 text-foreground transition hover:text-primary", "aria-label": "Go to the Open Mercato home page", children: [
|
|
11
|
+
/* @__PURE__ */ jsx(
|
|
12
|
+
Image,
|
|
13
|
+
{
|
|
14
|
+
src: "/open-mercato.svg",
|
|
15
|
+
alt: "Open Mercato logo",
|
|
16
|
+
width: 32,
|
|
17
|
+
height: 32,
|
|
18
|
+
className: "dark:invert",
|
|
19
|
+
priority: true
|
|
20
|
+
}
|
|
21
|
+
),
|
|
22
|
+
/* @__PURE__ */ jsx("span", { className: "text-base font-semibold tracking-tight", children: "Open Mercato" })
|
|
23
|
+
] }),
|
|
24
|
+
/* @__PURE__ */ jsxs("nav", { "aria-label": "Primary", className: "flex items-center gap-2", children: [
|
|
25
|
+
/* @__PURE__ */ jsx(Button, { asChild: true, variant: "ghost", size: "sm", children: /* @__PURE__ */ jsx(Link, { href: "/", children: "Home" }) }),
|
|
26
|
+
/* @__PURE__ */ jsx(Button, { asChild: true, size: "sm", children: /* @__PURE__ */ jsx(Link, { href: "/login", children: "Login" }) })
|
|
27
|
+
] })
|
|
28
|
+
] }) }),
|
|
29
|
+
/* @__PURE__ */ jsx("main", { className: "flex-1", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-screen-lg flex-col gap-6 px-6 py-10 sm:py-16", children: [
|
|
30
|
+
breadcrumb && breadcrumb.length > 0 ? /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", className: "text-sm text-muted-foreground", children: /* @__PURE__ */ jsx("ol", { className: "flex flex-wrap items-center gap-2", children: breadcrumb.map((item, index) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2", children: [
|
|
31
|
+
index > 0 ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5 text-border", "aria-hidden": "true" }) : null,
|
|
32
|
+
item.href ? /* @__PURE__ */ jsx(Link, { className: "transition hover:text-foreground", href: item.href, children: item.label }) : /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: item.label })
|
|
33
|
+
] }, `${item.label}-${index}`)) }) }) : null,
|
|
34
|
+
/* @__PURE__ */ jsxs("section", { className: "overflow-hidden rounded-2xl border bg-card shadow-sm", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("header", { className: "border-b bg-background/70 px-6 py-8 sm:px-10", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("h1", { className: "text-3xl font-semibold tracking-tight text-foreground sm:text-4xl", children: title }),
|
|
37
|
+
intro ? typeof intro === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: intro }) : /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: intro }) : null
|
|
38
|
+
] }) }),
|
|
39
|
+
/* @__PURE__ */ jsx("div", { className: "px-6 py-8 sm:px-10", children: /* @__PURE__ */ jsx(
|
|
40
|
+
"article",
|
|
41
|
+
{
|
|
42
|
+
className: cn(
|
|
43
|
+
"prose prose-slate max-w-none dark:prose-invert",
|
|
44
|
+
"prose-headings:font-semibold prose-headings:text-foreground",
|
|
45
|
+
"prose-p:leading-relaxed prose-li:marker:text-muted-foreground",
|
|
46
|
+
"prose-a:font-medium prose-a:text-primary prose-a:underline"
|
|
47
|
+
),
|
|
48
|
+
children
|
|
49
|
+
}
|
|
50
|
+
) })
|
|
51
|
+
] })
|
|
52
|
+
] }) }),
|
|
53
|
+
/* @__PURE__ */ jsx("footer", { className: "border-t bg-background/80 backdrop-blur supports-[backdrop-filter]:bg-background/60", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-screen-lg flex-col gap-4 px-6 py-8 text-sm text-muted-foreground sm:flex-row sm:items-center sm:justify-between", children: [
|
|
54
|
+
/* @__PURE__ */ jsxs(
|
|
55
|
+
Link,
|
|
56
|
+
{
|
|
57
|
+
href: "/",
|
|
58
|
+
className: "flex items-center gap-2 text-muted-foreground transition hover:text-foreground",
|
|
59
|
+
"aria-label": "Open Mercato",
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ jsx(Image, { src: "/open-mercato.svg", alt: "Open Mercato logo", width: 28, height: 28, className: "dark:invert" }),
|
|
62
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: "Open Mercato" })
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-2", children: [
|
|
67
|
+
/* @__PURE__ */ jsx(Link, { className: "transition hover:text-foreground", href: "/", children: "Home" }),
|
|
68
|
+
/* @__PURE__ */ jsx(Link, { className: "transition hover:text-foreground", href: "/login", children: "Login" }),
|
|
69
|
+
/* @__PURE__ */ jsx(Link, { className: "transition hover:text-foreground", href: "/terms", children: "Terms" }),
|
|
70
|
+
/* @__PURE__ */ jsx(Link, { className: "transition hover:text-foreground", href: "/privacy", children: "Privacy" })
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground/80 sm:text-right", children: [
|
|
73
|
+
"\xA9 ",
|
|
74
|
+
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
75
|
+
" Open Mercato. All rights reserved."
|
|
76
|
+
] })
|
|
77
|
+
] }) })
|
|
78
|
+
] });
|
|
79
|
+
}
|
|
80
|
+
var ContentLayout_default = ContentLayout;
|
|
81
|
+
export {
|
|
82
|
+
ContentLayout,
|
|
83
|
+
ContentLayout_default as default
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=ContentLayout.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/content/frontend/components/ContentLayout.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { ReactNode } from 'react'\nimport Image from 'next/image'\nimport Link from 'next/link'\nimport { ChevronRight } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\ntype BreadcrumbItem = {\n label: string\n href?: string\n}\n\ntype ContentLayoutProps = {\n title: string\n intro?: string\n breadcrumb?: BreadcrumbItem[]\n children: ReactNode\n}\n\nexport function ContentLayout({ title, intro, breadcrumb, children }: ContentLayoutProps) {\n return (\n <div className=\"flex min-h-svh flex-col bg-muted/30\">\n <header className=\"border-b bg-background/80 backdrop-blur supports-[backdrop-filter]:bg-background/60\">\n <div className=\"mx-auto flex w-full max-w-screen-lg items-center justify-between px-6 py-4\">\n <Link href=\"/\" className=\"flex items-center gap-3 text-foreground transition hover:text-primary\" aria-label=\"Go to the Open Mercato home page\">\n <Image\n src=\"/open-mercato.svg\"\n alt=\"Open Mercato logo\"\n width={32}\n height={32}\n className=\"dark:invert\"\n priority\n />\n <span className=\"text-base font-semibold tracking-tight\">Open Mercato</span>\n </Link>\n <nav aria-label=\"Primary\" className=\"flex items-center gap-2\">\n <Button asChild variant=\"ghost\" size=\"sm\">\n <Link href=\"/\">Home</Link>\n </Button>\n <Button asChild size=\"sm\">\n <Link href=\"/login\">Login</Link>\n </Button>\n </nav>\n </div>\n </header>\n\n <main className=\"flex-1\">\n <div className=\"mx-auto flex w-full max-w-screen-lg flex-col gap-6 px-6 py-10 sm:py-16\">\n {breadcrumb && breadcrumb.length > 0 ? (\n <nav aria-label=\"Breadcrumb\" className=\"text-sm text-muted-foreground\">\n <ol className=\"flex flex-wrap items-center gap-2\">\n {breadcrumb.map((item, index) => (\n <li key={`${item.label}-${index}`} className=\"flex items-center gap-2\">\n {index > 0 ? <ChevronRight className=\"size-3.5 text-border\" aria-hidden=\"true\" /> : null}\n {item.href ? (\n <Link className=\"transition hover:text-foreground\" href={item.href}>\n {item.label}\n </Link>\n ) : (\n <span className=\"font-medium text-foreground\">{item.label}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n ) : null}\n\n <section className=\"overflow-hidden rounded-2xl border bg-card shadow-sm\">\n <header className=\"border-b bg-background/70 px-6 py-8 sm:px-10\">\n <div className=\"flex flex-col gap-2\">\n <h1 className=\"text-3xl font-semibold tracking-tight text-foreground sm:text-4xl\">{title}</h1>\n {intro ? (\n typeof intro === 'string' ? (\n <p className=\"text-sm text-muted-foreground\">{intro}</p>\n ) : (\n <div className=\"text-sm text-muted-foreground\">{intro}</div>\n )\n ) : null}\n </div>\n </header>\n <div className=\"px-6 py-8 sm:px-10\">\n <article\n className={cn(\n 'prose prose-slate max-w-none dark:prose-invert',\n 'prose-headings:font-semibold prose-headings:text-foreground',\n 'prose-p:leading-relaxed prose-li:marker:text-muted-foreground',\n 'prose-a:font-medium prose-a:text-primary prose-a:underline'\n )}\n >\n {children}\n </article>\n </div>\n </section>\n </div>\n </main>\n\n <footer className=\"border-t bg-background/80 backdrop-blur supports-[backdrop-filter]:bg-background/60\">\n <div className=\"mx-auto flex w-full max-w-screen-lg flex-col gap-4 px-6 py-8 text-sm text-muted-foreground sm:flex-row sm:items-center sm:justify-between\">\n <Link\n href=\"/\"\n className=\"flex items-center gap-2 text-muted-foreground transition hover:text-foreground\"\n aria-label=\"Open Mercato\"\n >\n <Image src=\"/open-mercato.svg\" alt=\"Open Mercato logo\" width={28} height={28} className=\"dark:invert\" />\n <span className=\"font-medium text-foreground\">Open Mercato</span>\n </Link>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <Link className=\"transition hover:text-foreground\" href=\"/\">\n Home\n </Link>\n <Link className=\"transition hover:text-foreground\" href=\"/login\">\n Login\n </Link>\n <Link className=\"transition hover:text-foreground\" href=\"/terms\">\n Terms\n </Link>\n <Link className=\"transition hover:text-foreground\" href=\"/privacy\">\n Privacy\n </Link>\n </div>\n <p className=\"text-xs text-muted-foreground/80 sm:text-right\">\n \u00A9 {new Date().getFullYear()} Open Mercato. All rights reserved.\n </p>\n </div>\n </footer>\n </div>\n )\n}\n\nexport default ContentLayout\n"],
|
|
5
|
+
"mappings": "AAwBU,SACE,KADF;AAvBV,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,UAAU;AAcZ,SAAS,cAAc,EAAE,OAAO,OAAO,YAAY,SAAS,GAAuB;AACxF,SACE,qBAAC,SAAI,WAAU,uCACb;AAAA,wBAAC,YAAO,WAAU,uFAChB,+BAAC,SAAI,WAAU,8EACb;AAAA,2BAAC,QAAK,MAAK,KAAI,WAAU,yEAAwE,cAAW,oCAC1G;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAI;AAAA,YACJ,KAAI;AAAA,YACJ,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,WAAU;AAAA,YACV,UAAQ;AAAA;AAAA,QACV;AAAA,QACA,oBAAC,UAAK,WAAU,0CAAyC,0BAAY;AAAA,SACvE;AAAA,MACA,qBAAC,SAAI,cAAW,WAAU,WAAU,2BAClC;AAAA,4BAAC,UAAO,SAAO,MAAC,SAAQ,SAAQ,MAAK,MACnC,8BAAC,QAAK,MAAK,KAAI,kBAAI,GACrB;AAAA,QACA,oBAAC,UAAO,SAAO,MAAC,MAAK,MACnB,8BAAC,QAAK,MAAK,UAAS,mBAAK,GAC3B;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAEA,oBAAC,UAAK,WAAU,UACd,+BAAC,SAAI,WAAU,0EACZ;AAAA,oBAAc,WAAW,SAAS,IACjC,oBAAC,SAAI,cAAW,cAAa,WAAU,iCACrC,8BAAC,QAAG,WAAU,qCACX,qBAAW,IAAI,CAAC,MAAM,UACrB,qBAAC,QAAkC,WAAU,2BAC1C;AAAA,gBAAQ,IAAI,oBAAC,gBAAa,WAAU,wBAAuB,eAAY,QAAO,IAAK;AAAA,QACnF,KAAK,OACJ,oBAAC,QAAK,WAAU,oCAAmC,MAAM,KAAK,MAC3D,eAAK,OACR,IAEA,oBAAC,UAAK,WAAU,+BAA+B,eAAK,OAAM;AAAA,WAPrD,GAAG,KAAK,KAAK,IAAI,KAAK,EAS/B,CACD,GACH,GACF,IACE;AAAA,MAEJ,qBAAC,aAAQ,WAAU,wDACjB;AAAA,4BAAC,YAAO,WAAU,gDAChB,+BAAC,SAAI,WAAU,uBACb;AAAA,8BAAC,QAAG,WAAU,qEAAqE,iBAAM;AAAA,UACxF,QACC,OAAO,UAAU,WACf,oBAAC,OAAE,WAAU,iCAAiC,iBAAM,IAEpD,oBAAC,SAAI,WAAU,iCAAiC,iBAAM,IAEtD;AAAA,WACN,GACF;AAAA,QACA,oBAAC,SAAI,WAAU,sBACb;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH,GACF;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAEA,oBAAC,YAAO,WAAU,uFAChB,+BAAC,SAAI,WAAU,6IACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAW;AAAA,UAEX;AAAA,gCAAC,SAAM,KAAI,qBAAoB,KAAI,qBAAoB,OAAO,IAAI,QAAQ,IAAI,WAAU,eAAc;AAAA,YACtG,oBAAC,UAAK,WAAU,+BAA8B,0BAAY;AAAA;AAAA;AAAA,MAC5D;AAAA,MACA,qBAAC,SAAI,WAAU,+CACb;AAAA,4BAAC,QAAK,WAAU,oCAAmC,MAAK,KAAI,kBAE5D;AAAA,QACA,oBAAC,QAAK,WAAU,oCAAmC,MAAK,UAAS,mBAEjE;AAAA,QACA,oBAAC,QAAK,WAAU,oCAAmC,MAAK,UAAS,mBAEjE;AAAA,QACA,oBAAC,QAAK,WAAU,oCAAmC,MAAK,YAAW,qBAEnE;AAAA,SACF;AAAA,MACA,qBAAC,OAAE,WAAU,kDAAiD;AAAA;AAAA,SACzD,oBAAI,KAAK,GAAE,YAAY;AAAA,QAAE;AAAA,SAC9B;AAAA,OACF,GACF;AAAA,KACF;AAEJ;AAEA,IAAO,wBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ContentLayout } from "../components/ContentLayout.js";
|
|
3
|
+
function PrivacyPage() {
|
|
4
|
+
return /* @__PURE__ */ jsxs(
|
|
5
|
+
ContentLayout,
|
|
6
|
+
{
|
|
7
|
+
title: "Privacy Policy",
|
|
8
|
+
intro: "Last updated: January 1, 2025",
|
|
9
|
+
breadcrumb: [
|
|
10
|
+
{ label: "Home", href: "/" },
|
|
11
|
+
{ label: "Privacy Policy" }
|
|
12
|
+
],
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ jsx("p", { children: "This Privacy Policy explains how data is handled within the Open Mercato demo environment (the \u201CService\u201D). Because the Service is intended solely for evaluation, information may be deleted without notice." }),
|
|
15
|
+
/* @__PURE__ */ jsx("h2", { children: "1. Data Collected" }),
|
|
16
|
+
/* @__PURE__ */ jsxs("ul", { children: [
|
|
17
|
+
/* @__PURE__ */ jsx("li", { children: "Account details you create manually (e.g., email addresses, names)." }),
|
|
18
|
+
/* @__PURE__ */ jsx("li", { children: "Operational data you enter into demo modules (e.g., customer or catalog information)." }),
|
|
19
|
+
/* @__PURE__ */ jsx("li", { children: "Technical metadata such as timestamps and basic logging for diagnostics." })
|
|
20
|
+
] }),
|
|
21
|
+
/* @__PURE__ */ jsx("h2", { children: "2. Cookies" }),
|
|
22
|
+
/* @__PURE__ */ jsx("p", { children: "We use essential cookies to remember interface preferences (for example, dismissing demo notices). These cookies do not track users across services and expire automatically after a period of time." }),
|
|
23
|
+
/* @__PURE__ */ jsx("h2", { children: "3. Data Retention" }),
|
|
24
|
+
/* @__PURE__ */ jsx("p", { children: "Demo data is periodically rotated to maintain a clean environment. No guarantees are made regarding data retention or backup. Treat all information entered into the Service as temporary." }),
|
|
25
|
+
/* @__PURE__ */ jsx("h2", { children: "4. Third-Party Services" }),
|
|
26
|
+
/* @__PURE__ */ jsx("p", { children: "The Service may integrate with third-party infrastructure (email delivery, telemetry, or file storage) solely for demonstration. These integrations inherit their own privacy policies." }),
|
|
27
|
+
/* @__PURE__ */ jsx("h2", { children: "5. Your Responsibilities" }),
|
|
28
|
+
/* @__PURE__ */ jsx("p", { children: "Do not submit personal, sensitive, or production data. If you inadvertently upload such information, delete it immediately or contact us for assistance." }),
|
|
29
|
+
/* @__PURE__ */ jsx("h2", { children: "6. Contact" }),
|
|
30
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
31
|
+
"For privacy-related questions, email",
|
|
32
|
+
" ",
|
|
33
|
+
/* @__PURE__ */ jsx("a", { href: "mailto:info@catchthetornado.com", children: "info@catchthetornado.com" }),
|
|
34
|
+
"."
|
|
35
|
+
] })
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
PrivacyPage as default
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/content/frontend/privacy/page.tsx"],
|
|
4
|
+
"sourcesContent": ["import { ContentLayout } from '../components/ContentLayout'\n\nexport default function PrivacyPage() {\n return (\n <ContentLayout\n title=\"Privacy Policy\"\n intro=\"Last updated: January 1, 2025\"\n breadcrumb={[\n { label: 'Home', href: '/' },\n { label: 'Privacy Policy' },\n ]}\n >\n <p>\n This Privacy Policy explains how data is handled within the Open Mercato demo environment (the “Service”).\n Because the Service is intended solely for evaluation, information may be deleted without notice.\n </p>\n\n <h2>1. Data Collected</h2>\n <ul>\n <li>Account details you create manually (e.g., email addresses, names).</li>\n <li>Operational data you enter into demo modules (e.g., customer or catalog information).</li>\n <li>Technical metadata such as timestamps and basic logging for diagnostics.</li>\n </ul>\n\n <h2>2. Cookies</h2>\n <p>\n We use essential cookies to remember interface preferences (for example, dismissing demo notices). These cookies\n do not track users across services and expire automatically after a period of time.\n </p>\n\n <h2>3. Data Retention</h2>\n <p>\n Demo data is periodically rotated to maintain a clean environment. No guarantees are made regarding data\n retention or backup. Treat all information entered into the Service as temporary.\n </p>\n\n <h2>4. Third-Party Services</h2>\n <p>\n The Service may integrate with third-party infrastructure (email delivery, telemetry, or file storage) solely for\n demonstration. These integrations inherit their own privacy policies.\n </p>\n\n <h2>5. Your Responsibilities</h2>\n <p>\n Do not submit personal, sensitive, or production data. If you inadvertently upload such information, delete it\n immediately or contact us for assistance.\n </p>\n\n <h2>6. Contact</h2>\n <p>\n For privacy-related questions, email{' '}\n <a href=\"mailto:info@catchthetornado.com\">info@catchthetornado.com</a>.\n </p>\n </ContentLayout>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAYM,cAMA,YANA;AAZN,SAAS,qBAAqB;AAEf,SAAR,cAA+B;AACpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,YAAY;AAAA,QACV,EAAE,OAAO,QAAQ,MAAM,IAAI;AAAA,QAC3B,EAAE,OAAO,iBAAiB;AAAA,MAC5B;AAAA,MAEA;AAAA,4BAAC,OAAE,oOAGH;AAAA,QAEA,oBAAC,QAAG,+BAAiB;AAAA,QACrB,qBAAC,QACC;AAAA,8BAAC,QAAG,iFAAmE;AAAA,UACvE,oBAAC,QAAG,mGAAqF;AAAA,UACzF,oBAAC,QAAG,sFAAwE;AAAA,WAC9E;AAAA,QAEA,oBAAC,QAAG,wBAAU;AAAA,QACd,oBAAC,OAAE,kNAGH;AAAA,QAEA,oBAAC,QAAG,+BAAiB;AAAA,QACrB,oBAAC,OAAE,wMAGH;AAAA,QAEA,oBAAC,QAAG,qCAAuB;AAAA,QAC3B,oBAAC,OAAE,qMAGH;AAAA,QAEA,oBAAC,QAAG,sCAAwB;AAAA,QAC5B,oBAAC,OAAE,sKAGH;AAAA,QAEA,oBAAC,QAAG,wBAAU;AAAA,QACd,qBAAC,OAAE;AAAA;AAAA,UACoC;AAAA,UACrC,oBAAC,OAAE,MAAK,mCAAkC,sCAAwB;AAAA,UAAI;AAAA,WACxE;AAAA;AAAA;AAAA,EACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/content/frontend/privacy/page.meta.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Metadata } from 'next'\n\nexport const metadata: Metadata = {\n title: 'Privacy Policy',\n description: 'How the Open Mercato demo environment processes data.',\n}\n"],
|
|
5
|
+
"mappings": "AAEO,MAAM,WAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AACf;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ContentLayout } from "../components/ContentLayout.js";
|
|
3
|
+
function TermsPage() {
|
|
4
|
+
return /* @__PURE__ */ jsxs(
|
|
5
|
+
ContentLayout,
|
|
6
|
+
{
|
|
7
|
+
title: "Terms of Service",
|
|
8
|
+
intro: "Last updated: January 1, 2025",
|
|
9
|
+
breadcrumb: [
|
|
10
|
+
{ label: "Home", href: "/" },
|
|
11
|
+
{ label: "Terms of Service" }
|
|
12
|
+
],
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ jsx("p", { children: "These Terms of Service (\u201CTerms\u201D) govern your access to and use of this Open Mercato demo environment (the \u201CService\u201D). By using the Service you agree to be bound by these Terms." }),
|
|
15
|
+
/* @__PURE__ */ jsx("h2", { children: "1. Demo Environment" }),
|
|
16
|
+
/* @__PURE__ */ jsx("p", { children: "This Service is provided for evaluation and demonstration purposes only. All data you create or upload may be rotated or deleted at any time without notice. Do not store production, personal, or sensitive information in this environment." }),
|
|
17
|
+
/* @__PURE__ */ jsx("h2", { children: "2. Acceptable Use" }),
|
|
18
|
+
/* @__PURE__ */ jsxs("ul", { children: [
|
|
19
|
+
/* @__PURE__ */ jsx("li", { children: "Use the Service only for lawful purposes and in accordance with these Terms." }),
|
|
20
|
+
/* @__PURE__ */ jsx("li", { children: "Do not attempt to gain unauthorized access to the Service or underlying infrastructure." }),
|
|
21
|
+
/* @__PURE__ */ jsx("li", { children: "Do not reverse engineer, copy, or reuse content without appropriate attribution." })
|
|
22
|
+
] }),
|
|
23
|
+
/* @__PURE__ */ jsx("h2", { children: "3. No Warranty" }),
|
|
24
|
+
/* @__PURE__ */ jsx("p", { children: "The Service is provided \u201Cas is\u201D without any warranties of any kind, whether express or implied. Access may be interrupted, limited, or discontinued at any time." }),
|
|
25
|
+
/* @__PURE__ */ jsx("h2", { children: "4. Limitation of Liability" }),
|
|
26
|
+
/* @__PURE__ */ jsx("p", { children: "To the fullest extent permitted by law, Open Mercato and contributors shall not be liable for any damages arising from or related to your use of the Service." }),
|
|
27
|
+
/* @__PURE__ */ jsx("h2", { children: "5. Governing Law" }),
|
|
28
|
+
/* @__PURE__ */ jsx("p", { children: "These Terms are governed by the laws of the jurisdiction of Poland." }),
|
|
29
|
+
/* @__PURE__ */ jsx("h2", { children: "6. Changes" }),
|
|
30
|
+
/* @__PURE__ */ jsx("p", { children: "We may update these Terms from time to time. Continued use of the Service after changes become effective constitutes acceptance of the revised Terms." }),
|
|
31
|
+
/* @__PURE__ */ jsx("h2", { children: "7. Contact" }),
|
|
32
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
33
|
+
"Questions about these Terms may be directed to",
|
|
34
|
+
" ",
|
|
35
|
+
/* @__PURE__ */ jsx("a", { href: "mailto:info@catchthetornado.com", children: "info@catchthetornado.com" }),
|
|
36
|
+
"."
|
|
37
|
+
] })
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
TermsPage as default
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/content/frontend/terms/page.tsx"],
|
|
4
|
+
"sourcesContent": ["import { ContentLayout } from '../components/ContentLayout'\n\nexport default function TermsPage() {\n return (\n <ContentLayout\n title=\"Terms of Service\"\n intro=\"Last updated: January 1, 2025\"\n breadcrumb={[\n { label: 'Home', href: '/' },\n { label: 'Terms of Service' },\n ]}\n >\n <p>\n These Terms of Service (“Terms”) govern your access to and use of this Open Mercato demo environment\n (the “Service”). By using the Service you agree to be bound by these Terms.\n </p>\n\n <h2>1. Demo Environment</h2>\n <p>\n This Service is provided for evaluation and demonstration purposes only. All data you create or upload may be\n rotated or deleted at any time without notice. Do not store production, personal, or sensitive information in\n this environment.\n </p>\n\n <h2>2. Acceptable Use</h2>\n <ul>\n <li>Use the Service only for lawful purposes and in accordance with these Terms.</li>\n <li>Do not attempt to gain unauthorized access to the Service or underlying infrastructure.</li>\n <li>Do not reverse engineer, copy, or reuse content without appropriate attribution.</li>\n </ul>\n\n <h2>3. No Warranty</h2>\n <p>\n The Service is provided “as is” without any warranties of any kind, whether express or implied.\n Access may be interrupted, limited, or discontinued at any time.\n </p>\n\n <h2>4. Limitation of Liability</h2>\n <p>\n To the fullest extent permitted by law, Open Mercato and contributors shall not be liable for any damages arising\n from or related to your use of the Service.\n </p>\n\n <h2>5. Governing Law</h2>\n <p>\n These Terms are governed by the laws of the jurisdiction of Poland.\n </p>\n\n <h2>6. Changes</h2>\n <p>\n We may update these Terms from time to time. Continued use of the Service after changes become effective\n constitutes acceptance of the revised Terms.\n </p>\n\n <h2>7. Contact</h2>\n <p>\n Questions about these Terms may be directed to{' '}\n <a href=\"mailto:info@catchthetornado.com\">info@catchthetornado.com</a>.\n </p>\n </ContentLayout>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAYM,cAaA,YAbA;AAZN,SAAS,qBAAqB;AAEf,SAAR,YAA6B;AAClC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,YAAY;AAAA,QACV,EAAE,OAAO,QAAQ,MAAM,IAAI;AAAA,QAC3B,EAAE,OAAO,mBAAmB;AAAA,MAC9B;AAAA,MAEA;AAAA,4BAAC,OAAE,kNAGH;AAAA,QAEA,oBAAC,QAAG,iCAAmB;AAAA,QACvB,oBAAC,OAAE,2PAIH;AAAA,QAEA,oBAAC,QAAG,+BAAiB;AAAA,QACrB,qBAAC,QACC;AAAA,8BAAC,QAAG,0FAA4E;AAAA,UAChF,oBAAC,QAAG,qGAAuF;AAAA,UAC3F,oBAAC,QAAG,8FAAgF;AAAA,WACtF;AAAA,QAEA,oBAAC,QAAG,4BAAc;AAAA,QAClB,oBAAC,OAAE,wLAGH;AAAA,QAEA,oBAAC,QAAG,wCAA0B;AAAA,QAC9B,oBAAC,OAAE,2KAGH;AAAA,QAEA,oBAAC,QAAG,8BAAgB;AAAA,QACpB,oBAAC,OAAE,iFAEH;AAAA,QAEA,oBAAC,QAAG,wBAAU;AAAA,QACd,oBAAC,OAAE,mKAGH;AAAA,QAEA,oBAAC,QAAG,wBAAU;AAAA,QACd,qBAAC,OAAE;AAAA;AAAA,UAC8C;AAAA,UAC/C,oBAAC,OAAE,MAAK,mCAAkC,sCAAwB;AAAA,UAAI;AAAA,WACxE;AAAA;AAAA;AAAA,EACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/content/frontend/terms/page.meta.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Metadata } from 'next'\n\nexport const metadata: Metadata = {\n title: 'Terms of Service',\n description: 'Usage terms for the Open Mercato demo environment.',\n}\n"],
|
|
5
|
+
"mappings": "AAEO,MAAM,WAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AACf;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/modules/content/index.ts"],
|
|
4
|
+
"sourcesContent": ["export const metadata = {\n title: 'Content',\n description: 'Static informational pages such as terms of service and privacy policy.',\n}\n\nexport default metadata\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,aAAa;AACf;AAEA,IAAO,kBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/jest.config.cjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** @type {import('jest').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
preset: 'ts-jest',
|
|
4
|
+
testEnvironment: 'node',
|
|
5
|
+
rootDir: '.',
|
|
6
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
|
|
7
|
+
transform: {
|
|
8
|
+
'^.+\\.(t|j)sx?$': [
|
|
9
|
+
'ts-jest',
|
|
10
|
+
{
|
|
11
|
+
tsconfig: {
|
|
12
|
+
jsx: 'react-jsx',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
testMatch: ['<rootDir>/src/**/__tests__/**/*.test.(ts|tsx)'],
|
|
18
|
+
passWithNoTests: true,
|
|
19
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@open-mercato/content",
|
|
3
|
+
"version": "0.4.2-canary-c02407ff85",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "node build.mjs",
|
|
8
|
+
"watch": "node watch.mjs",
|
|
9
|
+
"test": "jest --config jest.config.cjs",
|
|
10
|
+
"typecheck": "tsc --noEmit"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": "./dist/index.js",
|
|
14
|
+
"./*.ts": {
|
|
15
|
+
"types": "./src/*.ts",
|
|
16
|
+
"default": "./dist/*.js"
|
|
17
|
+
},
|
|
18
|
+
"./*.tsx": {
|
|
19
|
+
"types": "./src/*.tsx",
|
|
20
|
+
"default": "./dist/*.js"
|
|
21
|
+
},
|
|
22
|
+
"./*.json": "./src/*.json",
|
|
23
|
+
"./*": {
|
|
24
|
+
"types": [
|
|
25
|
+
"./src/*.ts",
|
|
26
|
+
"./src/*.tsx"
|
|
27
|
+
],
|
|
28
|
+
"default": "./dist/*.js"
|
|
29
|
+
},
|
|
30
|
+
"./*/*.json": "./src/*/*.json",
|
|
31
|
+
"./*/*": {
|
|
32
|
+
"types": [
|
|
33
|
+
"./src/*/*.ts",
|
|
34
|
+
"./src/*/*.tsx"
|
|
35
|
+
],
|
|
36
|
+
"default": "./dist/*/*.js"
|
|
37
|
+
},
|
|
38
|
+
"./*/*/*.json": "./src/*/*/*.json",
|
|
39
|
+
"./*/*/*": {
|
|
40
|
+
"types": [
|
|
41
|
+
"./src/*/*/*.ts",
|
|
42
|
+
"./src/*/*/*.tsx"
|
|
43
|
+
],
|
|
44
|
+
"default": "./dist/*/*/*.js"
|
|
45
|
+
},
|
|
46
|
+
"./*/*/*/*.json": "./src/*/*/*/*.json",
|
|
47
|
+
"./*/*/*/*": {
|
|
48
|
+
"types": [
|
|
49
|
+
"./src/*/*/*/*.ts",
|
|
50
|
+
"./src/*/*/*/*.tsx"
|
|
51
|
+
],
|
|
52
|
+
"default": "./dist/*/*/*/*.js"
|
|
53
|
+
},
|
|
54
|
+
"./*/*/*/*/*.json": "./src/*/*/*/*/*.json",
|
|
55
|
+
"./*/*/*/*/*": {
|
|
56
|
+
"types": [
|
|
57
|
+
"./src/*/*/*/*/*.ts",
|
|
58
|
+
"./src/*/*/*/*/*.tsx"
|
|
59
|
+
],
|
|
60
|
+
"default": "./dist/*/*/*/*/*.js"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"@open-mercato/shared": "0.4.2-canary-c02407ff85"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/jest": "^30.0.0",
|
|
68
|
+
"jest": "^30.2.0",
|
|
69
|
+
"ts-jest": "^29.4.6"
|
|
70
|
+
},
|
|
71
|
+
"publishConfig": {
|
|
72
|
+
"access": "public"
|
|
73
|
+
},
|
|
74
|
+
"stableVersion": "0.4.1"
|
|
75
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { ReactNode } from 'react'
|
|
2
|
+
import Image from 'next/image'
|
|
3
|
+
import Link from 'next/link'
|
|
4
|
+
import { ChevronRight } from 'lucide-react'
|
|
5
|
+
import { Button } from '@open-mercato/ui/primitives/button'
|
|
6
|
+
import { cn } from '@open-mercato/shared/lib/utils'
|
|
7
|
+
|
|
8
|
+
type BreadcrumbItem = {
|
|
9
|
+
label: string
|
|
10
|
+
href?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
type ContentLayoutProps = {
|
|
14
|
+
title: string
|
|
15
|
+
intro?: string
|
|
16
|
+
breadcrumb?: BreadcrumbItem[]
|
|
17
|
+
children: ReactNode
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function ContentLayout({ title, intro, breadcrumb, children }: ContentLayoutProps) {
|
|
21
|
+
return (
|
|
22
|
+
<div className="flex min-h-svh flex-col bg-muted/30">
|
|
23
|
+
<header className="border-b bg-background/80 backdrop-blur supports-[backdrop-filter]:bg-background/60">
|
|
24
|
+
<div className="mx-auto flex w-full max-w-screen-lg items-center justify-between px-6 py-4">
|
|
25
|
+
<Link href="/" className="flex items-center gap-3 text-foreground transition hover:text-primary" aria-label="Go to the Open Mercato home page">
|
|
26
|
+
<Image
|
|
27
|
+
src="/open-mercato.svg"
|
|
28
|
+
alt="Open Mercato logo"
|
|
29
|
+
width={32}
|
|
30
|
+
height={32}
|
|
31
|
+
className="dark:invert"
|
|
32
|
+
priority
|
|
33
|
+
/>
|
|
34
|
+
<span className="text-base font-semibold tracking-tight">Open Mercato</span>
|
|
35
|
+
</Link>
|
|
36
|
+
<nav aria-label="Primary" className="flex items-center gap-2">
|
|
37
|
+
<Button asChild variant="ghost" size="sm">
|
|
38
|
+
<Link href="/">Home</Link>
|
|
39
|
+
</Button>
|
|
40
|
+
<Button asChild size="sm">
|
|
41
|
+
<Link href="/login">Login</Link>
|
|
42
|
+
</Button>
|
|
43
|
+
</nav>
|
|
44
|
+
</div>
|
|
45
|
+
</header>
|
|
46
|
+
|
|
47
|
+
<main className="flex-1">
|
|
48
|
+
<div className="mx-auto flex w-full max-w-screen-lg flex-col gap-6 px-6 py-10 sm:py-16">
|
|
49
|
+
{breadcrumb && breadcrumb.length > 0 ? (
|
|
50
|
+
<nav aria-label="Breadcrumb" className="text-sm text-muted-foreground">
|
|
51
|
+
<ol className="flex flex-wrap items-center gap-2">
|
|
52
|
+
{breadcrumb.map((item, index) => (
|
|
53
|
+
<li key={`${item.label}-${index}`} className="flex items-center gap-2">
|
|
54
|
+
{index > 0 ? <ChevronRight className="size-3.5 text-border" aria-hidden="true" /> : null}
|
|
55
|
+
{item.href ? (
|
|
56
|
+
<Link className="transition hover:text-foreground" href={item.href}>
|
|
57
|
+
{item.label}
|
|
58
|
+
</Link>
|
|
59
|
+
) : (
|
|
60
|
+
<span className="font-medium text-foreground">{item.label}</span>
|
|
61
|
+
)}
|
|
62
|
+
</li>
|
|
63
|
+
))}
|
|
64
|
+
</ol>
|
|
65
|
+
</nav>
|
|
66
|
+
) : null}
|
|
67
|
+
|
|
68
|
+
<section className="overflow-hidden rounded-2xl border bg-card shadow-sm">
|
|
69
|
+
<header className="border-b bg-background/70 px-6 py-8 sm:px-10">
|
|
70
|
+
<div className="flex flex-col gap-2">
|
|
71
|
+
<h1 className="text-3xl font-semibold tracking-tight text-foreground sm:text-4xl">{title}</h1>
|
|
72
|
+
{intro ? (
|
|
73
|
+
typeof intro === 'string' ? (
|
|
74
|
+
<p className="text-sm text-muted-foreground">{intro}</p>
|
|
75
|
+
) : (
|
|
76
|
+
<div className="text-sm text-muted-foreground">{intro}</div>
|
|
77
|
+
)
|
|
78
|
+
) : null}
|
|
79
|
+
</div>
|
|
80
|
+
</header>
|
|
81
|
+
<div className="px-6 py-8 sm:px-10">
|
|
82
|
+
<article
|
|
83
|
+
className={cn(
|
|
84
|
+
'prose prose-slate max-w-none dark:prose-invert',
|
|
85
|
+
'prose-headings:font-semibold prose-headings:text-foreground',
|
|
86
|
+
'prose-p:leading-relaxed prose-li:marker:text-muted-foreground',
|
|
87
|
+
'prose-a:font-medium prose-a:text-primary prose-a:underline'
|
|
88
|
+
)}
|
|
89
|
+
>
|
|
90
|
+
{children}
|
|
91
|
+
</article>
|
|
92
|
+
</div>
|
|
93
|
+
</section>
|
|
94
|
+
</div>
|
|
95
|
+
</main>
|
|
96
|
+
|
|
97
|
+
<footer className="border-t bg-background/80 backdrop-blur supports-[backdrop-filter]:bg-background/60">
|
|
98
|
+
<div className="mx-auto flex w-full max-w-screen-lg flex-col gap-4 px-6 py-8 text-sm text-muted-foreground sm:flex-row sm:items-center sm:justify-between">
|
|
99
|
+
<Link
|
|
100
|
+
href="/"
|
|
101
|
+
className="flex items-center gap-2 text-muted-foreground transition hover:text-foreground"
|
|
102
|
+
aria-label="Open Mercato"
|
|
103
|
+
>
|
|
104
|
+
<Image src="/open-mercato.svg" alt="Open Mercato logo" width={28} height={28} className="dark:invert" />
|
|
105
|
+
<span className="font-medium text-foreground">Open Mercato</span>
|
|
106
|
+
</Link>
|
|
107
|
+
<div className="flex flex-wrap items-center gap-x-4 gap-y-2">
|
|
108
|
+
<Link className="transition hover:text-foreground" href="/">
|
|
109
|
+
Home
|
|
110
|
+
</Link>
|
|
111
|
+
<Link className="transition hover:text-foreground" href="/login">
|
|
112
|
+
Login
|
|
113
|
+
</Link>
|
|
114
|
+
<Link className="transition hover:text-foreground" href="/terms">
|
|
115
|
+
Terms
|
|
116
|
+
</Link>
|
|
117
|
+
<Link className="transition hover:text-foreground" href="/privacy">
|
|
118
|
+
Privacy
|
|
119
|
+
</Link>
|
|
120
|
+
</div>
|
|
121
|
+
<p className="text-xs text-muted-foreground/80 sm:text-right">
|
|
122
|
+
© {new Date().getFullYear()} Open Mercato. All rights reserved.
|
|
123
|
+
</p>
|
|
124
|
+
</div>
|
|
125
|
+
</footer>
|
|
126
|
+
</div>
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export default ContentLayout
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ContentLayout } from '../components/ContentLayout'
|
|
2
|
+
|
|
3
|
+
export default function PrivacyPage() {
|
|
4
|
+
return (
|
|
5
|
+
<ContentLayout
|
|
6
|
+
title="Privacy Policy"
|
|
7
|
+
intro="Last updated: January 1, 2025"
|
|
8
|
+
breadcrumb={[
|
|
9
|
+
{ label: 'Home', href: '/' },
|
|
10
|
+
{ label: 'Privacy Policy' },
|
|
11
|
+
]}
|
|
12
|
+
>
|
|
13
|
+
<p>
|
|
14
|
+
This Privacy Policy explains how data is handled within the Open Mercato demo environment (the “Service”).
|
|
15
|
+
Because the Service is intended solely for evaluation, information may be deleted without notice.
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<h2>1. Data Collected</h2>
|
|
19
|
+
<ul>
|
|
20
|
+
<li>Account details you create manually (e.g., email addresses, names).</li>
|
|
21
|
+
<li>Operational data you enter into demo modules (e.g., customer or catalog information).</li>
|
|
22
|
+
<li>Technical metadata such as timestamps and basic logging for diagnostics.</li>
|
|
23
|
+
</ul>
|
|
24
|
+
|
|
25
|
+
<h2>2. Cookies</h2>
|
|
26
|
+
<p>
|
|
27
|
+
We use essential cookies to remember interface preferences (for example, dismissing demo notices). These cookies
|
|
28
|
+
do not track users across services and expire automatically after a period of time.
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
<h2>3. Data Retention</h2>
|
|
32
|
+
<p>
|
|
33
|
+
Demo data is periodically rotated to maintain a clean environment. No guarantees are made regarding data
|
|
34
|
+
retention or backup. Treat all information entered into the Service as temporary.
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
<h2>4. Third-Party Services</h2>
|
|
38
|
+
<p>
|
|
39
|
+
The Service may integrate with third-party infrastructure (email delivery, telemetry, or file storage) solely for
|
|
40
|
+
demonstration. These integrations inherit their own privacy policies.
|
|
41
|
+
</p>
|
|
42
|
+
|
|
43
|
+
<h2>5. Your Responsibilities</h2>
|
|
44
|
+
<p>
|
|
45
|
+
Do not submit personal, sensitive, or production data. If you inadvertently upload such information, delete it
|
|
46
|
+
immediately or contact us for assistance.
|
|
47
|
+
</p>
|
|
48
|
+
|
|
49
|
+
<h2>6. Contact</h2>
|
|
50
|
+
<p>
|
|
51
|
+
For privacy-related questions, email{' '}
|
|
52
|
+
<a href="mailto:info@catchthetornado.com">info@catchthetornado.com</a>.
|
|
53
|
+
</p>
|
|
54
|
+
</ContentLayout>
|
|
55
|
+
)
|
|
56
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ContentLayout } from '../components/ContentLayout'
|
|
2
|
+
|
|
3
|
+
export default function TermsPage() {
|
|
4
|
+
return (
|
|
5
|
+
<ContentLayout
|
|
6
|
+
title="Terms of Service"
|
|
7
|
+
intro="Last updated: January 1, 2025"
|
|
8
|
+
breadcrumb={[
|
|
9
|
+
{ label: 'Home', href: '/' },
|
|
10
|
+
{ label: 'Terms of Service' },
|
|
11
|
+
]}
|
|
12
|
+
>
|
|
13
|
+
<p>
|
|
14
|
+
These Terms of Service (“Terms”) govern your access to and use of this Open Mercato demo environment
|
|
15
|
+
(the “Service”). By using the Service you agree to be bound by these Terms.
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<h2>1. Demo Environment</h2>
|
|
19
|
+
<p>
|
|
20
|
+
This Service is provided for evaluation and demonstration purposes only. All data you create or upload may be
|
|
21
|
+
rotated or deleted at any time without notice. Do not store production, personal, or sensitive information in
|
|
22
|
+
this environment.
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<h2>2. Acceptable Use</h2>
|
|
26
|
+
<ul>
|
|
27
|
+
<li>Use the Service only for lawful purposes and in accordance with these Terms.</li>
|
|
28
|
+
<li>Do not attempt to gain unauthorized access to the Service or underlying infrastructure.</li>
|
|
29
|
+
<li>Do not reverse engineer, copy, or reuse content without appropriate attribution.</li>
|
|
30
|
+
</ul>
|
|
31
|
+
|
|
32
|
+
<h2>3. No Warranty</h2>
|
|
33
|
+
<p>
|
|
34
|
+
The Service is provided “as is” without any warranties of any kind, whether express or implied.
|
|
35
|
+
Access may be interrupted, limited, or discontinued at any time.
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
<h2>4. Limitation of Liability</h2>
|
|
39
|
+
<p>
|
|
40
|
+
To the fullest extent permitted by law, Open Mercato and contributors shall not be liable for any damages arising
|
|
41
|
+
from or related to your use of the Service.
|
|
42
|
+
</p>
|
|
43
|
+
|
|
44
|
+
<h2>5. Governing Law</h2>
|
|
45
|
+
<p>
|
|
46
|
+
These Terms are governed by the laws of the jurisdiction of Poland.
|
|
47
|
+
</p>
|
|
48
|
+
|
|
49
|
+
<h2>6. Changes</h2>
|
|
50
|
+
<p>
|
|
51
|
+
We may update these Terms from time to time. Continued use of the Service after changes become effective
|
|
52
|
+
constitutes acceptance of the revised Terms.
|
|
53
|
+
</p>
|
|
54
|
+
|
|
55
|
+
<h2>7. Contact</h2>
|
|
56
|
+
<p>
|
|
57
|
+
Questions about these Terms may be directed to{' '}
|
|
58
|
+
<a href="mailto:info@catchthetornado.com">info@catchthetornado.com</a>.
|
|
59
|
+
</p>
|
|
60
|
+
</ContentLayout>
|
|
61
|
+
)
|
|
62
|
+
}
|
package/tsconfig.json
ADDED