@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 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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -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": "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",
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 &ldquo;Service&rdquo;).\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,8 @@
1
+ const metadata = {
2
+ title: "Privacy Policy",
3
+ description: "How the Open Mercato demo environment processes data."
4
+ };
5
+ export {
6
+ metadata
7
+ };
8
+ //# sourceMappingURL=page.meta.js.map
@@ -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 (&ldquo;Terms&rdquo;) govern your access to and use of this Open Mercato demo environment\n (the &ldquo;Service&rdquo;). 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 &ldquo;as is&rdquo; 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,8 @@
1
+ const metadata = {
2
+ title: "Terms of Service",
3
+ description: "Usage terms for the Open Mercato demo environment."
4
+ };
5
+ export {
6
+ metadata
7
+ };
8
+ //# sourceMappingURL=page.meta.js.map
@@ -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,10 @@
1
+ const metadata = {
2
+ title: "Content",
3
+ description: "Static informational pages such as terms of service and privacy policy."
4
+ };
5
+ var content_default = metadata;
6
+ export {
7
+ content_default as default,
8
+ metadata
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -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
+ }
@@ -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,2 @@
1
+ // Barrel for @open-mercato/content
2
+ export {}
@@ -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,6 @@
1
+ import type { Metadata } from 'next'
2
+
3
+ export const metadata: Metadata = {
4
+ title: 'Privacy Policy',
5
+ description: 'How the Open Mercato demo environment processes data.',
6
+ }
@@ -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 &ldquo;Service&rdquo;).
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,6 @@
1
+ import type { Metadata } from 'next'
2
+
3
+ export const metadata: Metadata = {
4
+ title: 'Terms of Service',
5
+ description: 'Usage terms for the Open Mercato demo environment.',
6
+ }
@@ -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 (&ldquo;Terms&rdquo;) govern your access to and use of this Open Mercato demo environment
15
+ (the &ldquo;Service&rdquo;). 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 &ldquo;as is&rdquo; 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
+ }
@@ -0,0 +1,6 @@
1
+ export const metadata = {
2
+ title: 'Content',
3
+ description: 'Static informational pages such as terms of service and privacy policy.',
4
+ }
5
+
6
+ export default metadata
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "extends": "../../tsconfig.json",
4
+ "compilerOptions": {
5
+ "noEmit": false,
6
+ "declaration": false,
7
+ "outDir": "./dist",
8
+ "rootDir": "./src"
9
+ },
10
+ "include": ["src/**/*"]
11
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "extends": "../../tsconfig.base.json",
4
+ "compilerOptions": {
5
+ "noEmit": true
6
+ },
7
+ "include": ["src/**/*"],
8
+ "exclude": ["node_modules", "dist", "**/__tests__/**"]
9
+ }
package/watch.mjs ADDED
@@ -0,0 +1,6 @@
1
+ import { watch } from '../../scripts/watch.mjs'
2
+ import { dirname } from 'node:path'
3
+ import { fileURLToPath } from 'node:url'
4
+
5
+ const __dirname = dirname(fileURLToPath(import.meta.url))
6
+ watch(__dirname)