@slashclick/ui 0.1.13 → 0.1.15

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.
@@ -31,7 +31,8 @@ const CardWrapper = ({
31
31
  headerLabel,
32
32
  backButtonLabel,
33
33
  backButtonHref,
34
- slim
34
+ slim,
35
+ logo
35
36
  }) => {
36
37
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
37
38
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_card.CardHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -39,7 +40,8 @@ const CardWrapper = ({
39
40
  {
40
41
  label: headerLabel,
41
42
  backButtonHref,
42
- backButtonLabel
43
+ backButtonLabel,
44
+ logo
43
45
  }
44
46
  ) }),
45
47
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mb-10 mt-2 sm:mx-auto sm:w-full sm:max-w-[480px]", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/card/card-wrapper.tsx"],"sourcesContent":["'use client'\n\nimport {\n CardContent,\n CardFooter,\n CardHeader,\n} from '../ui/card'\nimport { Header } from './header'\nimport { BackButton } from './back-button'\n\ninterface CardWrapperProps {\n children: React.ReactNode\n headerLabel: string\n backButtonLabel: string\n backButtonHref: string\n showSocial?: boolean\n slim?: boolean\n}\n\nexport const CardWrapper = ({\n children,\n headerLabel,\n backButtonLabel,\n backButtonHref,\n slim,\n}: CardWrapperProps) => {\n return (\n <>\n <CardHeader>\n <Header\n label={headerLabel}\n backButtonHref={backButtonHref}\n backButtonLabel={backButtonLabel}\n />\n </CardHeader>\n <div className=\"mb-10 mt-2 sm:mx-auto sm:w-full sm:max-w-[480px]\">\n {slim && <CardContent>{children}</CardContent>}\n {!slim && (\n <div className=\"shadow-xs border border-gray-200 bg-white px-6 py-12 sm:rounded-lg sm:px-12 dark:border-gray-700 dark:bg-gray-800\">\n <CardContent>{children}</CardContent>\n </div>\n )}\n </div>\n <CardFooter>\n <BackButton label={backButtonLabel} href={backButtonHref} />\n </CardFooter>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BI;AAzBJ,kBAIO;AACP,oBAAuB;AACvB,yBAA2B;AAWpB,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,SACE,4EACE;AAAA,gDAAC,0BACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA;AAAA;AAAA,IACF,GACF;AAAA,IACA,6CAAC,SAAI,WAAU,oDACZ;AAAA,cAAQ,4CAAC,2BAAa,UAAS;AAAA,MAC/B,CAAC,QACA,4CAAC,SAAI,WAAU,qHACb,sDAAC,2BAAa,UAAS,GACzB;AAAA,OAEJ;AAAA,IACA,4CAAC,0BACC,sDAAC,iCAAW,OAAO,iBAAiB,MAAM,gBAAgB,GAC5D;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../components/card/card-wrapper.tsx"],"sourcesContent":["'use client'\n\nimport {\n CardContent,\n CardFooter,\n CardHeader,\n} from '../ui/card'\nimport { Header } from './header'\nimport { BackButton } from './back-button'\n\ninterface CardWrapperProps {\n children: React.ReactNode\n headerLabel: string\n backButtonLabel: string\n backButtonHref: string\n showSocial?: boolean\n slim?: boolean\n logo?: React.ReactNode\n}\n\nexport const CardWrapper = ({\n children,\n headerLabel,\n backButtonLabel,\n backButtonHref,\n slim,\n logo,\n}: CardWrapperProps) => {\n return (\n <>\n <CardHeader>\n <Header\n label={headerLabel}\n backButtonHref={backButtonHref}\n backButtonLabel={backButtonLabel}\n logo={logo}\n />\n </CardHeader>\n <div className=\"mb-10 mt-2 sm:mx-auto sm:w-full sm:max-w-[480px]\">\n {slim && <CardContent>{children}</CardContent>}\n {!slim && (\n <div className=\"shadow-xs border border-gray-200 bg-white px-6 py-12 sm:rounded-lg sm:px-12 dark:border-gray-700 dark:bg-gray-800\">\n <CardContent>{children}</CardContent>\n </div>\n )}\n </div>\n <CardFooter>\n <BackButton label={backButtonLabel} href={backButtonHref} />\n </CardFooter>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BI;AA3BJ,kBAIO;AACP,oBAAuB;AACvB,yBAA2B;AAYpB,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,SACE,4EACE;AAAA,gDAAC,0BACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,GACF;AAAA,IACA,6CAAC,SAAI,WAAU,oDACZ;AAAA,cAAQ,4CAAC,2BAAa,UAAS;AAAA,MAC/B,CAAC,QACA,4CAAC,SAAI,WAAU,qHACb,sDAAC,2BAAa,UAAS,GACzB;AAAA,OAEJ;AAAA,IACA,4CAAC,0BACC,sDAAC,iCAAW,OAAO,iBAAiB,MAAM,gBAAgB,GAC5D;AAAA,KACF;AAEJ;","names":[]}
@@ -5,7 +5,8 @@ interface CardWrapperProps {
5
5
  backButtonHref: string;
6
6
  showSocial?: boolean;
7
7
  slim?: boolean;
8
+ logo?: React.ReactNode;
8
9
  }
9
- export declare const CardWrapper: ({ children, headerLabel, backButtonLabel, backButtonHref, slim, }: CardWrapperProps) => import("react").JSX.Element;
10
+ export declare const CardWrapper: ({ children, headerLabel, backButtonLabel, backButtonHref, slim, logo, }: CardWrapperProps) => import("react").JSX.Element;
10
11
  export {};
11
12
  //# sourceMappingURL=card-wrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"card-wrapper.d.ts","sourceRoot":"","sources":["../../../components/card/card-wrapper.tsx"],"names":[],"mappings":"AAUA,UAAU,gBAAgB;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,eAAO,MAAM,WAAW,GAAI,mEAMzB,gBAAgB,gCAuBlB,CAAA"}
1
+ {"version":3,"file":"card-wrapper.d.ts","sourceRoot":"","sources":["../../../components/card/card-wrapper.tsx"],"names":[],"mappings":"AAUA,UAAU,gBAAgB;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACvB;AAED,eAAO,MAAM,WAAW,GAAI,yEAOzB,gBAAgB,gCAwBlB,CAAA"}
@@ -12,7 +12,8 @@ const CardWrapper = ({
12
12
  headerLabel,
13
13
  backButtonLabel,
14
14
  backButtonHref,
15
- slim
15
+ slim,
16
+ logo
16
17
  }) => {
17
18
  return /* @__PURE__ */ jsxs(Fragment, { children: [
18
19
  /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(
@@ -20,7 +21,8 @@ const CardWrapper = ({
20
21
  {
21
22
  label: headerLabel,
22
23
  backButtonHref,
23
- backButtonLabel
24
+ backButtonLabel,
25
+ logo
24
26
  }
25
27
  ) }),
26
28
  /* @__PURE__ */ jsxs("div", { className: "mb-10 mt-2 sm:mx-auto sm:w-full sm:max-w-[480px]", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/card/card-wrapper.tsx"],"sourcesContent":["'use client'\n\nimport {\n CardContent,\n CardFooter,\n CardHeader,\n} from '../ui/card'\nimport { Header } from './header'\nimport { BackButton } from './back-button'\n\ninterface CardWrapperProps {\n children: React.ReactNode\n headerLabel: string\n backButtonLabel: string\n backButtonHref: string\n showSocial?: boolean\n slim?: boolean\n}\n\nexport const CardWrapper = ({\n children,\n headerLabel,\n backButtonLabel,\n backButtonHref,\n slim,\n}: CardWrapperProps) => {\n return (\n <>\n <CardHeader>\n <Header\n label={headerLabel}\n backButtonHref={backButtonHref}\n backButtonLabel={backButtonLabel}\n />\n </CardHeader>\n <div className=\"mb-10 mt-2 sm:mx-auto sm:w-full sm:max-w-[480px]\">\n {slim && <CardContent>{children}</CardContent>}\n {!slim && (\n <div className=\"shadow-xs border border-gray-200 bg-white px-6 py-12 sm:rounded-lg sm:px-12 dark:border-gray-700 dark:bg-gray-800\">\n <CardContent>{children}</CardContent>\n </div>\n )}\n </div>\n <CardFooter>\n <BackButton label={backButtonLabel} href={backButtonHref} />\n </CardFooter>\n </>\n )\n}\n"],"mappings":";AA2BI,mBAEI,KAMF,YARF;AAzBJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAWpB,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,SACE,iCACE;AAAA,wBAAC,cACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA;AAAA;AAAA,IACF,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,oDACZ;AAAA,cAAQ,oBAAC,eAAa,UAAS;AAAA,MAC/B,CAAC,QACA,oBAAC,SAAI,WAAU,qHACb,8BAAC,eAAa,UAAS,GACzB;AAAA,OAEJ;AAAA,IACA,oBAAC,cACC,8BAAC,cAAW,OAAO,iBAAiB,MAAM,gBAAgB,GAC5D;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../components/card/card-wrapper.tsx"],"sourcesContent":["'use client'\n\nimport {\n CardContent,\n CardFooter,\n CardHeader,\n} from '../ui/card'\nimport { Header } from './header'\nimport { BackButton } from './back-button'\n\ninterface CardWrapperProps {\n children: React.ReactNode\n headerLabel: string\n backButtonLabel: string\n backButtonHref: string\n showSocial?: boolean\n slim?: boolean\n logo?: React.ReactNode\n}\n\nexport const CardWrapper = ({\n children,\n headerLabel,\n backButtonLabel,\n backButtonHref,\n slim,\n logo,\n}: CardWrapperProps) => {\n return (\n <>\n <CardHeader>\n <Header\n label={headerLabel}\n backButtonHref={backButtonHref}\n backButtonLabel={backButtonLabel}\n logo={logo}\n />\n </CardHeader>\n <div className=\"mb-10 mt-2 sm:mx-auto sm:w-full sm:max-w-[480px]\">\n {slim && <CardContent>{children}</CardContent>}\n {!slim && (\n <div className=\"shadow-xs border border-gray-200 bg-white px-6 py-12 sm:rounded-lg sm:px-12 dark:border-gray-700 dark:bg-gray-800\">\n <CardContent>{children}</CardContent>\n </div>\n )}\n </div>\n <CardFooter>\n <BackButton label={backButtonLabel} href={backButtonHref} />\n </CardFooter>\n </>\n )\n}\n"],"mappings":";AA6BI,mBAEI,KAOF,YATF;AA3BJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAYpB,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,SACE,iCACE;AAAA,wBAAC,cACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,oDACZ;AAAA,cAAQ,oBAAC,eAAa,UAAS;AAAA,MAC/B,CAAC,QACA,oBAAC,SAAI,WAAU,qHACb,8BAAC,eAAa,UAAS,GACzB;AAAA,OAEJ;AAAA,IACA,oBAAC,cACC,8BAAC,cAAW,OAAO,iBAAiB,MAAM,gBAAgB,GAC5D;AAAA,KACF;AAEJ;","names":[]}
@@ -37,10 +37,11 @@ var import_logo = require("../icons/logo");
37
37
  const Header = ({
38
38
  label,
39
39
  backButtonLabel,
40
- backButtonHref
40
+ backButtonHref,
41
+ logo
41
42
  }) => {
42
43
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "sm:mx-auto sm:w-full sm:max-w-md", children: [
43
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_logo.Logo, { className: "mx-auto h-10 w-auto" }) }),
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/", children: logo != null ? logo : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_logo.Logo, { className: "mx-auto h-10 w-auto" }) }),
44
45
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-gray-500 dark:text-white", children: label }),
45
46
  backButtonLabel ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-center text-sm text-gray-500 dark:text-gray-400", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: backButtonHref, children: backButtonLabel }) }) : null
46
47
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/card/header.tsx"],"sourcesContent":["import Link from 'next/link'\nimport { Logo } from '../icons/logo'\n\ninterface HeaderProps {\n label: string\n backButtonHref: string\n backButtonLabel: string\n}\n\nexport const Header = ({\n label,\n backButtonLabel,\n backButtonHref,\n}: HeaderProps) => {\n return (\n <div className=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <Link href=\"/\">\n <Logo className=\"mx-auto h-10 w-auto\" />\n </Link>\n <h2 className=\"mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-gray-500 dark:text-white\">\n {label}\n </h2>\n\n {backButtonLabel ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n <Link href={backButtonHref}>{backButtonLabel}</Link>\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAeI;AAfJ,kBAAiB;AACjB,kBAAqB;AAQd,MAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,MAAmB;AACjB,SACE,6CAAC,SAAI,WAAU,oCACb;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAK,KACT,sDAAC,oBAAK,WAAU,uBAAsB,GACxC;AAAA,IACA,4CAAC,QAAG,WAAU,8FACX,iBACH;AAAA,IAEC,kBACC,4CAAC,OAAE,WAAU,wDACX,sDAAC,YAAAA,SAAA,EAAK,MAAM,gBAAiB,2BAAgB,GAC/C,IACE;AAAA,KACN;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../../components/card/header.tsx"],"sourcesContent":["import Link from 'next/link'\nimport { Logo } from '../icons/logo'\n\ninterface HeaderProps {\n label: string\n backButtonHref: string\n backButtonLabel: string\n logo?: React.ReactNode\n}\n\nexport const Header = ({\n label,\n backButtonLabel,\n backButtonHref,\n logo,\n}: HeaderProps) => {\n return (\n <div className=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <Link href=\"/\">\n {logo ?? <Logo className=\"mx-auto h-10 w-auto\" />}\n </Link>\n <h2 className=\"mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-gray-500 dark:text-white\">\n {label}\n </h2>\n\n {backButtonLabel ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n <Link href={backButtonHref}>{backButtonLabel}</Link>\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBI;AAjBJ,kBAAiB;AACjB,kBAAqB;AASd,MAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAmB;AACjB,SACE,6CAAC,SAAI,WAAU,oCACb;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAK,KACR,gCAAQ,4CAAC,oBAAK,WAAU,uBAAsB,GACjD;AAAA,IACA,4CAAC,QAAG,WAAU,8FACX,iBACH;AAAA,IAEC,kBACC,4CAAC,OAAE,WAAU,wDACX,sDAAC,YAAAA,SAAA,EAAK,MAAM,gBAAiB,2BAAgB,GAC/C,IACE;AAAA,KACN;AAEJ;","names":["Link"]}
@@ -2,7 +2,8 @@ interface HeaderProps {
2
2
  label: string;
3
3
  backButtonHref: string;
4
4
  backButtonLabel: string;
5
+ logo?: React.ReactNode;
5
6
  }
6
- export declare const Header: ({ label, backButtonLabel, backButtonHref, }: HeaderProps) => import("react").JSX.Element;
7
+ export declare const Header: ({ label, backButtonLabel, backButtonHref, logo, }: HeaderProps) => import("react").JSX.Element;
7
8
  export {};
8
9
  //# sourceMappingURL=header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../components/card/header.tsx"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,eAAO,MAAM,MAAM,GAAI,6CAIpB,WAAW,gCAiBb,CAAA"}
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../components/card/header.tsx"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACvB;AAED,eAAO,MAAM,MAAM,GAAI,mDAKpB,WAAW,gCAiBb,CAAA"}
@@ -4,10 +4,11 @@ import { Logo } from "../icons/logo";
4
4
  const Header = ({
5
5
  label,
6
6
  backButtonLabel,
7
- backButtonHref
7
+ backButtonHref,
8
+ logo
8
9
  }) => {
9
10
  return /* @__PURE__ */ jsxs("div", { className: "sm:mx-auto sm:w-full sm:max-w-md", children: [
10
- /* @__PURE__ */ jsx(Link, { href: "/", children: /* @__PURE__ */ jsx(Logo, { className: "mx-auto h-10 w-auto" }) }),
11
+ /* @__PURE__ */ jsx(Link, { href: "/", children: logo != null ? logo : /* @__PURE__ */ jsx(Logo, { className: "mx-auto h-10 w-auto" }) }),
11
12
  /* @__PURE__ */ jsx("h2", { className: "mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-gray-500 dark:text-white", children: label }),
12
13
  backButtonLabel ? /* @__PURE__ */ jsx("p", { className: "text-center text-sm text-gray-500 dark:text-gray-400", children: /* @__PURE__ */ jsx(Link, { href: backButtonHref, children: backButtonLabel }) }) : null
13
14
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/card/header.tsx"],"sourcesContent":["import Link from 'next/link'\nimport { Logo } from '../icons/logo'\n\ninterface HeaderProps {\n label: string\n backButtonHref: string\n backButtonLabel: string\n}\n\nexport const Header = ({\n label,\n backButtonLabel,\n backButtonHref,\n}: HeaderProps) => {\n return (\n <div className=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <Link href=\"/\">\n <Logo className=\"mx-auto h-10 w-auto\" />\n </Link>\n <h2 className=\"mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-gray-500 dark:text-white\">\n {label}\n </h2>\n\n {backButtonLabel ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n <Link href={backButtonHref}>{backButtonLabel}</Link>\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":"AAeI,SAEI,KAFJ;AAfJ,OAAO,UAAU;AACjB,SAAS,YAAY;AAQd,MAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,MAAmB;AACjB,SACE,qBAAC,SAAI,WAAU,oCACb;AAAA,wBAAC,QAAK,MAAK,KACT,8BAAC,QAAK,WAAU,uBAAsB,GACxC;AAAA,IACA,oBAAC,QAAG,WAAU,8FACX,iBACH;AAAA,IAEC,kBACC,oBAAC,OAAE,WAAU,wDACX,8BAAC,QAAK,MAAM,gBAAiB,2BAAgB,GAC/C,IACE;AAAA,KACN;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../components/card/header.tsx"],"sourcesContent":["import Link from 'next/link'\nimport { Logo } from '../icons/logo'\n\ninterface HeaderProps {\n label: string\n backButtonHref: string\n backButtonLabel: string\n logo?: React.ReactNode\n}\n\nexport const Header = ({\n label,\n backButtonLabel,\n backButtonHref,\n logo,\n}: HeaderProps) => {\n return (\n <div className=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <Link href=\"/\">\n {logo ?? <Logo className=\"mx-auto h-10 w-auto\" />}\n </Link>\n <h2 className=\"mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-gray-500 dark:text-white\">\n {label}\n </h2>\n\n {backButtonLabel ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n <Link href={backButtonHref}>{backButtonLabel}</Link>\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":"AAiBI,SAEa,KAFb;AAjBJ,OAAO,UAAU;AACjB,SAAS,YAAY;AASd,MAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAmB;AACjB,SACE,qBAAC,SAAI,WAAU,oCACb;AAAA,wBAAC,QAAK,MAAK,KACR,gCAAQ,oBAAC,QAAK,WAAU,uBAAsB,GACjD;AAAA,IACA,oBAAC,QAAG,WAAU,8FACX,iBACH;AAAA,IAEC,kBACC,oBAAC,OAAE,WAAU,wDACX,8BAAC,QAAK,MAAM,gBAAiB,2BAAgB,GAC/C,IACE;AAAA,KACN;AAEJ;","names":[]}
@@ -82,7 +82,7 @@ const Pricing = ({ onSubscribe }) => {
82
82
  });
83
83
  if (!response.ok) {
84
84
  if (response.status === 401) {
85
- window.location.href = "/signin?redirect=/about/pricing";
85
+ window.location.href = `/signin?callbackUrl=${encodeURIComponent(window.location.pathname)}`;
86
86
  return;
87
87
  }
88
88
  const data2 = yield response.json().catch(() => ({}));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/tailwind/pricing.tsx"],"sourcesContent":["'use client'\nimport { useState } from 'react'\nimport { Check, Zap } from 'lucide-react'\n\nconst FREE_FEATURES = [\n '1 story',\n '10 characters',\n '10 locations',\n '1 timeline',\n 'Image galleries',\n 'Public sharing',\n]\n\nconst PRO_FEATURES = [\n 'Unlimited stories',\n 'Unlimited characters',\n 'Unlimited locations',\n 'Unlimited timelines',\n 'Image galleries',\n 'Public sharing',\n 'Priority support',\n]\n\nfunction classNames(...classes: string[]) {\n return classes.filter(Boolean).join(' ')\n}\n\ninterface PricingProps {\n onSubscribe?: () => void\n}\n\nexport const Pricing = ({ onSubscribe }: PricingProps) => {\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const handleSubscribe = async () => {\n if (onSubscribe) {\n onSubscribe()\n return\n }\n setLoading(true)\n setError(null)\n try {\n const response = await fetch('/api/subscription/checkout', {\n method: 'POST',\n })\n if (!response.ok) {\n if (response.status === 401) {\n window.location.href = '/signin?redirect=/about/pricing'\n return\n }\n const data = (await response.json().catch(() => ({}))) as {\n error?: string\n }\n throw new Error(data.error ?? 'Failed to create checkout session')\n }\n const data = (await response.json()) as { url: string }\n if (data.url) {\n window.location.href = data.url\n }\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : 'Something went wrong. Please try again.',\n )\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"bg-gray-900\">\n <main>\n {/* Header */}\n <div className=\"mx-auto mt-16 max-w-7xl px-6 sm:mt-32 lg:px-8\">\n <div className=\"mx-auto max-w-4xl text-center\">\n <h1 className=\"text-base font-semibold leading-7 text-indigo-400\">\n Pricing\n </h1>\n <p className=\"mt-2 text-4xl font-bold tracking-tight text-white sm:text-5xl\">\n Start free. Upgrade when you&apos;re ready.\n </p>\n </div>\n <p className=\"mx-auto mt-6 max-w-2xl text-center text-lg leading-8 text-gray-300\">\n Build your story bible for free. Subscribe for unlimited worlds,\n characters, and creative freedom.\n </p>\n\n {/* Pricing cards */}\n <div className=\"isolate mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-8 lg:mx-0 lg:max-w-none lg:grid-cols-2\">\n {/* Free tier */}\n <div className=\"rounded-3xl p-8 ring-1 ring-white/10 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Preview\n </h2>\n <p className=\"rounded-full bg-white/10 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Free forever\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Explore Story Bible and start building your creative world with\n no commitment.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $0\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <a\n href=\"/signin\"\n className=\"mt-6 block rounded-md bg-white/10 px-3 py-2 text-center text-sm font-semibold leading-6 text-white hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Get started free\n </a>\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {FREE_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n\n {/* Pro tier */}\n <div className=\"rounded-3xl bg-white/5 p-8 ring-2 ring-indigo-500 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Pro\n </h2>\n <p className=\"rounded-full bg-indigo-500 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Most popular\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Unlock unlimited stories, characters, locations, and timelines.\n Build entire universes.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $9.99\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <button\n onClick={handleSubscribe}\n disabled={loading}\n className={classNames(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-center text-sm font-semibold leading-6 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500',\n loading\n ? 'cursor-not-allowed bg-indigo-400 text-white'\n : 'shadow-2xs bg-indigo-500 text-white hover:bg-indigo-400',\n )}\n >\n <Zap className=\"h-4 w-4\" aria-hidden=\"true\" />\n {loading ? 'Redirecting…' : 'Subscribe — $9.99/mo'}\n </button>\n {error && (\n <p className=\"mt-3 text-center text-sm text-red-400\">{error}</p>\n )}\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {PRO_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n </div>\n\n {/* FAQ */}\n <div className=\"mx-auto mt-24 max-w-2xl pb-24\">\n <h2 className=\"text-2xl font-bold leading-10 tracking-tight text-white\">\n Frequently asked questions\n </h2>\n <dl className=\"mt-10 space-y-8\">\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Can I cancel anytime?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Yes. You can cancel at any time from the subscription\n management page. You retain Pro access until the end of your\n current billing period.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n What happens to my data if I downgrade?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Your existing stories and characters are never deleted.\n You&apos;ll just be unable to create new ones beyond the\n preview limits until you resubscribe.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Is billing monthly or annually?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Currently monthly only. Annual billing with a discount is\n coming soon.\n </dd>\n </div>\n </dl>\n </div>\n </div>\n </main>\n </div>\n )\n}\n"],"mappings":"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","names":["data"]}
1
+ {"version":3,"sources":["../../../components/tailwind/pricing.tsx"],"sourcesContent":["'use client'\nimport { useState } from 'react'\nimport { Check, Zap } from 'lucide-react'\n\nconst FREE_FEATURES = [\n '1 story',\n '10 characters',\n '10 locations',\n '1 timeline',\n 'Image galleries',\n 'Public sharing',\n]\n\nconst PRO_FEATURES = [\n 'Unlimited stories',\n 'Unlimited characters',\n 'Unlimited locations',\n 'Unlimited timelines',\n 'Image galleries',\n 'Public sharing',\n 'Priority support',\n]\n\nfunction classNames(...classes: string[]) {\n return classes.filter(Boolean).join(' ')\n}\n\ninterface PricingProps {\n onSubscribe?: () => void\n}\n\nexport const Pricing = ({ onSubscribe }: PricingProps) => {\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const handleSubscribe = async () => {\n if (onSubscribe) {\n onSubscribe()\n return\n }\n setLoading(true)\n setError(null)\n try {\n const response = await fetch('/api/subscription/checkout', {\n method: 'POST',\n })\n if (!response.ok) {\n if (response.status === 401) {\n window.location.href = `/signin?callbackUrl=${encodeURIComponent(window.location.pathname)}`\n return\n }\n const data = (await response.json().catch(() => ({}))) as {\n error?: string\n }\n throw new Error(data.error ?? 'Failed to create checkout session')\n }\n const data = (await response.json()) as { url: string }\n if (data.url) {\n window.location.href = data.url\n }\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : 'Something went wrong. Please try again.',\n )\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"bg-gray-900\">\n <main>\n {/* Header */}\n <div className=\"mx-auto mt-16 max-w-7xl px-6 sm:mt-32 lg:px-8\">\n <div className=\"mx-auto max-w-4xl text-center\">\n <h1 className=\"text-base font-semibold leading-7 text-indigo-400\">\n Pricing\n </h1>\n <p className=\"mt-2 text-4xl font-bold tracking-tight text-white sm:text-5xl\">\n Start free. Upgrade when you&apos;re ready.\n </p>\n </div>\n <p className=\"mx-auto mt-6 max-w-2xl text-center text-lg leading-8 text-gray-300\">\n Build your story bible for free. Subscribe for unlimited worlds,\n characters, and creative freedom.\n </p>\n\n {/* Pricing cards */}\n <div className=\"isolate mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-8 lg:mx-0 lg:max-w-none lg:grid-cols-2\">\n {/* Free tier */}\n <div className=\"rounded-3xl p-8 ring-1 ring-white/10 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Preview\n </h2>\n <p className=\"rounded-full bg-white/10 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Free forever\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Explore Story Bible and start building your creative world with\n no commitment.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $0\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <a\n href=\"/signin\"\n className=\"mt-6 block rounded-md bg-white/10 px-3 py-2 text-center text-sm font-semibold leading-6 text-white hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Get started free\n </a>\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {FREE_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n\n {/* Pro tier */}\n <div className=\"rounded-3xl bg-white/5 p-8 ring-2 ring-indigo-500 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Pro\n </h2>\n <p className=\"rounded-full bg-indigo-500 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Most popular\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Unlock unlimited stories, characters, locations, and timelines.\n Build entire universes.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $9.99\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <button\n onClick={handleSubscribe}\n disabled={loading}\n className={classNames(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-center text-sm font-semibold leading-6 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500',\n loading\n ? 'cursor-not-allowed bg-indigo-400 text-white'\n : 'shadow-2xs bg-indigo-500 text-white hover:bg-indigo-400',\n )}\n >\n <Zap className=\"h-4 w-4\" aria-hidden=\"true\" />\n {loading ? 'Redirecting…' : 'Subscribe — $9.99/mo'}\n </button>\n {error && (\n <p className=\"mt-3 text-center text-sm text-red-400\">{error}</p>\n )}\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {PRO_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n </div>\n\n {/* FAQ */}\n <div className=\"mx-auto mt-24 max-w-2xl pb-24\">\n <h2 className=\"text-2xl font-bold leading-10 tracking-tight text-white\">\n Frequently asked questions\n </h2>\n <dl className=\"mt-10 space-y-8\">\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Can I cancel anytime?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Yes. You can cancel at any time from the subscription\n management page. You retain Pro access until the end of your\n current billing period.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n What happens to my data if I downgrade?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Your existing stories and characters are never deleted.\n You&apos;ll just be unable to create new ones beyond the\n preview limits until you resubscribe.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Is billing monthly or annually?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Currently monthly only. Annual billing with a discount is\n coming soon.\n </dd>\n </div>\n </dl>\n </div>\n </div>\n </main>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4EU;AA3EV,mBAAyB;AACzB,0BAA2B;AAE3B,MAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,cAAc,SAAmB;AACxC,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAMO,MAAM,UAAU,CAAC,EAAE,YAAY,MAAoB;AACxD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,QAAM,kBAAkB,MAAY;AAnCtC;AAoCI,QAAI,aAAa;AACf,kBAAY;AACZ;AAAA,IACF;AACA,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,8BAA8B;AAAA,QACzD,QAAQ;AAAA,MACV,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,SAAS,WAAW,KAAK;AAC3B,iBAAO,SAAS,OAAO,uBAAuB,mBAAmB,OAAO,SAAS,QAAQ,CAAC;AAC1F;AAAA,QACF;AACA,cAAMA,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAGpD,cAAM,IAAI,OAAM,KAAAA,MAAK,UAAL,YAAc,mCAAmC;AAAA,MACnE;AACA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAI,KAAK,KAAK;AACZ,eAAO,SAAS,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AACZ;AAAA,QACE,eAAe,QACX,IAAI,UACJ;AAAA,MACN;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,4CAAC,SAAI,WAAU,eACb,sDAAC,UAEC,uDAAC,SAAI,WAAU,iDACb;AAAA,iDAAC,SAAI,WAAU,iCACb;AAAA,kDAAC,QAAG,WAAU,qDAAoD,qBAElE;AAAA,MACA,4CAAC,OAAE,WAAU,iEAAgE,oDAE7E;AAAA,OACF;AAAA,IACA,4CAAC,OAAE,WAAU,sEAAqE,gHAGlF;AAAA,IAGA,6CAAC,SAAI,WAAU,+FAEb;AAAA,mDAAC,SAAI,WAAU,gDACb;AAAA,qDAAC,SAAI,WAAU,6CACb;AAAA,sDAAC,QAAG,WAAU,8CAA6C,qBAE3D;AAAA,UACA,4CAAC,OAAE,WAAU,mFAAkF,0BAE/F;AAAA,WACF;AAAA,QACA,4CAAC,OAAE,WAAU,wCAAuC,4FAGpD;AAAA,QACA,6CAAC,OAAE,WAAU,oCACX;AAAA,sDAAC,UAAK,WAAU,gDAA+C,gBAE/D;AAAA,UACA,4CAAC,UAAK,WAAU,iDAAgD,oBAEhE;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YAET,wBAAc,IAAI,CAAC,YAClB,6CAAC,QAAiB,WAAU,gBAC1B;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAY;AAAA;AAAA,cACd;AAAA,cACC;AAAA,iBALM,OAMT,CACD;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MAGA,6CAAC,SAAI,WAAU,6DACb;AAAA,qDAAC,SAAI,WAAU,6CACb;AAAA,sDAAC,QAAG,WAAU,8CAA6C,iBAE3D;AAAA,UACA,4CAAC,OAAE,WAAU,qFAAoF,0BAEjG;AAAA,WACF;AAAA,QACA,4CAAC,OAAE,WAAU,wCAAuC,qGAGpD;AAAA,QACA,6CAAC,OAAE,WAAU,oCACX;AAAA,sDAAC,UAAK,WAAU,gDAA+C,mBAE/D;AAAA,UACA,4CAAC,UAAK,WAAU,iDAAgD,oBAEhE;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACA,UACI,gDACA;AAAA,YACN;AAAA,YAEA;AAAA,0DAAC,2BAAI,WAAU,WAAU,eAAY,QAAO;AAAA,cAC3C,UAAU,sBAAiB;AAAA;AAAA;AAAA,QAC9B;AAAA,QACC,SACC,4CAAC,OAAE,WAAU,yCAAyC,iBAAM;AAAA,QAE9D;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YAET,uBAAa,IAAI,CAAC,YACjB,6CAAC,QAAiB,WAAU,gBAC1B;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAY;AAAA;AAAA,cACd;AAAA,cACC;AAAA,iBALM,OAMT,CACD;AAAA;AAAA,QACH;AAAA,SACF;AAAA,OACF;AAAA,IAGA,6CAAC,SAAI,WAAU,iCACb;AAAA,kDAAC,QAAG,WAAU,2DAA0D,wCAExE;AAAA,MACA,6CAAC,QAAG,WAAU,mBACZ;AAAA,qDAAC,SACC;AAAA,sDAAC,QAAG,WAAU,gDAA+C,mCAE7D;AAAA,UACA,4CAAC,QAAG,WAAU,0CAAyC,wJAIvD;AAAA,WACF;AAAA,QACA,6CAAC,SACC;AAAA,sDAAC,QAAG,WAAU,gDAA+C,qDAE7D;AAAA,UACA,4CAAC,QAAG,WAAU,0CAAyC,+JAIvD;AAAA,WACF;AAAA,QACA,6CAAC,SACC;AAAA,sDAAC,QAAG,WAAU,gDAA+C,6CAE7D;AAAA,UACA,4CAAC,QAAG,WAAU,0CAAyC,oFAGvD;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF,GACF;AAEJ;","names":["data"]}
@@ -59,7 +59,7 @@ const Pricing = ({ onSubscribe }) => {
59
59
  });
60
60
  if (!response.ok) {
61
61
  if (response.status === 401) {
62
- window.location.href = "/signin?redirect=/about/pricing";
62
+ window.location.href = `/signin?callbackUrl=${encodeURIComponent(window.location.pathname)}`;
63
63
  return;
64
64
  }
65
65
  const data2 = yield response.json().catch(() => ({}));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../components/tailwind/pricing.tsx"],"sourcesContent":["'use client'\nimport { useState } from 'react'\nimport { Check, Zap } from 'lucide-react'\n\nconst FREE_FEATURES = [\n '1 story',\n '10 characters',\n '10 locations',\n '1 timeline',\n 'Image galleries',\n 'Public sharing',\n]\n\nconst PRO_FEATURES = [\n 'Unlimited stories',\n 'Unlimited characters',\n 'Unlimited locations',\n 'Unlimited timelines',\n 'Image galleries',\n 'Public sharing',\n 'Priority support',\n]\n\nfunction classNames(...classes: string[]) {\n return classes.filter(Boolean).join(' ')\n}\n\ninterface PricingProps {\n onSubscribe?: () => void\n}\n\nexport const Pricing = ({ onSubscribe }: PricingProps) => {\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const handleSubscribe = async () => {\n if (onSubscribe) {\n onSubscribe()\n return\n }\n setLoading(true)\n setError(null)\n try {\n const response = await fetch('/api/subscription/checkout', {\n method: 'POST',\n })\n if (!response.ok) {\n if (response.status === 401) {\n window.location.href = '/signin?redirect=/about/pricing'\n return\n }\n const data = (await response.json().catch(() => ({}))) as {\n error?: string\n }\n throw new Error(data.error ?? 'Failed to create checkout session')\n }\n const data = (await response.json()) as { url: string }\n if (data.url) {\n window.location.href = data.url\n }\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : 'Something went wrong. Please try again.',\n )\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"bg-gray-900\">\n <main>\n {/* Header */}\n <div className=\"mx-auto mt-16 max-w-7xl px-6 sm:mt-32 lg:px-8\">\n <div className=\"mx-auto max-w-4xl text-center\">\n <h1 className=\"text-base font-semibold leading-7 text-indigo-400\">\n Pricing\n </h1>\n <p className=\"mt-2 text-4xl font-bold tracking-tight text-white sm:text-5xl\">\n Start free. Upgrade when you&apos;re ready.\n </p>\n </div>\n <p className=\"mx-auto mt-6 max-w-2xl text-center text-lg leading-8 text-gray-300\">\n Build your story bible for free. Subscribe for unlimited worlds,\n characters, and creative freedom.\n </p>\n\n {/* Pricing cards */}\n <div className=\"isolate mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-8 lg:mx-0 lg:max-w-none lg:grid-cols-2\">\n {/* Free tier */}\n <div className=\"rounded-3xl p-8 ring-1 ring-white/10 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Preview\n </h2>\n <p className=\"rounded-full bg-white/10 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Free forever\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Explore Story Bible and start building your creative world with\n no commitment.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $0\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <a\n href=\"/signin\"\n className=\"mt-6 block rounded-md bg-white/10 px-3 py-2 text-center text-sm font-semibold leading-6 text-white hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Get started free\n </a>\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {FREE_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n\n {/* Pro tier */}\n <div className=\"rounded-3xl bg-white/5 p-8 ring-2 ring-indigo-500 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Pro\n </h2>\n <p className=\"rounded-full bg-indigo-500 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Most popular\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Unlock unlimited stories, characters, locations, and timelines.\n Build entire universes.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $9.99\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <button\n onClick={handleSubscribe}\n disabled={loading}\n className={classNames(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-center text-sm font-semibold leading-6 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500',\n loading\n ? 'cursor-not-allowed bg-indigo-400 text-white'\n : 'shadow-2xs bg-indigo-500 text-white hover:bg-indigo-400',\n )}\n >\n <Zap className=\"h-4 w-4\" aria-hidden=\"true\" />\n {loading ? 'Redirecting…' : 'Subscribe — $9.99/mo'}\n </button>\n {error && (\n <p className=\"mt-3 text-center text-sm text-red-400\">{error}</p>\n )}\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {PRO_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n </div>\n\n {/* FAQ */}\n <div className=\"mx-auto mt-24 max-w-2xl pb-24\">\n <h2 className=\"text-2xl font-bold leading-10 tracking-tight text-white\">\n Frequently asked questions\n </h2>\n <dl className=\"mt-10 space-y-8\">\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Can I cancel anytime?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Yes. You can cancel at any time from the subscription\n management page. You retain Pro access until the end of your\n current billing period.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n What happens to my data if I downgrade?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Your existing stories and characters are never deleted.\n You&apos;ll just be unable to create new ones beyond the\n preview limits until you resubscribe.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Is billing monthly or annually?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Currently monthly only. Annual billing with a discount is\n coming soon.\n </dd>\n </div>\n </dl>\n </div>\n </div>\n </main>\n </div>\n )\n}\n"],"mappings":"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","names":["data"]}
1
+ {"version":3,"sources":["../../../components/tailwind/pricing.tsx"],"sourcesContent":["'use client'\nimport { useState } from 'react'\nimport { Check, Zap } from 'lucide-react'\n\nconst FREE_FEATURES = [\n '1 story',\n '10 characters',\n '10 locations',\n '1 timeline',\n 'Image galleries',\n 'Public sharing',\n]\n\nconst PRO_FEATURES = [\n 'Unlimited stories',\n 'Unlimited characters',\n 'Unlimited locations',\n 'Unlimited timelines',\n 'Image galleries',\n 'Public sharing',\n 'Priority support',\n]\n\nfunction classNames(...classes: string[]) {\n return classes.filter(Boolean).join(' ')\n}\n\ninterface PricingProps {\n onSubscribe?: () => void\n}\n\nexport const Pricing = ({ onSubscribe }: PricingProps) => {\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const handleSubscribe = async () => {\n if (onSubscribe) {\n onSubscribe()\n return\n }\n setLoading(true)\n setError(null)\n try {\n const response = await fetch('/api/subscription/checkout', {\n method: 'POST',\n })\n if (!response.ok) {\n if (response.status === 401) {\n window.location.href = `/signin?callbackUrl=${encodeURIComponent(window.location.pathname)}`\n return\n }\n const data = (await response.json().catch(() => ({}))) as {\n error?: string\n }\n throw new Error(data.error ?? 'Failed to create checkout session')\n }\n const data = (await response.json()) as { url: string }\n if (data.url) {\n window.location.href = data.url\n }\n } catch (err) {\n setError(\n err instanceof Error\n ? err.message\n : 'Something went wrong. Please try again.',\n )\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"bg-gray-900\">\n <main>\n {/* Header */}\n <div className=\"mx-auto mt-16 max-w-7xl px-6 sm:mt-32 lg:px-8\">\n <div className=\"mx-auto max-w-4xl text-center\">\n <h1 className=\"text-base font-semibold leading-7 text-indigo-400\">\n Pricing\n </h1>\n <p className=\"mt-2 text-4xl font-bold tracking-tight text-white sm:text-5xl\">\n Start free. Upgrade when you&apos;re ready.\n </p>\n </div>\n <p className=\"mx-auto mt-6 max-w-2xl text-center text-lg leading-8 text-gray-300\">\n Build your story bible for free. Subscribe for unlimited worlds,\n characters, and creative freedom.\n </p>\n\n {/* Pricing cards */}\n <div className=\"isolate mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-8 lg:mx-0 lg:max-w-none lg:grid-cols-2\">\n {/* Free tier */}\n <div className=\"rounded-3xl p-8 ring-1 ring-white/10 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Preview\n </h2>\n <p className=\"rounded-full bg-white/10 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Free forever\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Explore Story Bible and start building your creative world with\n no commitment.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $0\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <a\n href=\"/signin\"\n className=\"mt-6 block rounded-md bg-white/10 px-3 py-2 text-center text-sm font-semibold leading-6 text-white hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Get started free\n </a>\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {FREE_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n\n {/* Pro tier */}\n <div className=\"rounded-3xl bg-white/5 p-8 ring-2 ring-indigo-500 xl:p-10\">\n <div className=\"flex items-center justify-between gap-x-4\">\n <h2 className=\"text-lg font-semibold leading-8 text-white\">\n Pro\n </h2>\n <p className=\"rounded-full bg-indigo-500 px-2.5 py-1 text-xs font-semibold leading-5 text-white\">\n Most popular\n </p>\n </div>\n <p className=\"mt-4 text-sm leading-6 text-gray-300\">\n Unlock unlimited stories, characters, locations, and timelines.\n Build entire universes.\n </p>\n <p className=\"mt-6 flex items-baseline gap-x-1\">\n <span className=\"text-4xl font-bold tracking-tight text-white\">\n $9.99\n </span>\n <span className=\"text-sm font-semibold leading-6 text-gray-300\">\n /month\n </span>\n </p>\n <button\n onClick={handleSubscribe}\n disabled={loading}\n className={classNames(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-center text-sm font-semibold leading-6 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500',\n loading\n ? 'cursor-not-allowed bg-indigo-400 text-white'\n : 'shadow-2xs bg-indigo-500 text-white hover:bg-indigo-400',\n )}\n >\n <Zap className=\"h-4 w-4\" aria-hidden=\"true\" />\n {loading ? 'Redirecting…' : 'Subscribe — $9.99/mo'}\n </button>\n {error && (\n <p className=\"mt-3 text-center text-sm text-red-400\">{error}</p>\n )}\n <ul\n role=\"list\"\n className=\"mt-8 space-y-3 text-sm leading-6 text-gray-300 xl:mt-10\"\n >\n {PRO_FEATURES.map((feature) => (\n <li key={feature} className=\"flex gap-x-3\">\n <Check\n className=\"h-6 w-5 flex-none text-white\"\n aria-hidden=\"true\"\n />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n </div>\n\n {/* FAQ */}\n <div className=\"mx-auto mt-24 max-w-2xl pb-24\">\n <h2 className=\"text-2xl font-bold leading-10 tracking-tight text-white\">\n Frequently asked questions\n </h2>\n <dl className=\"mt-10 space-y-8\">\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Can I cancel anytime?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Yes. You can cancel at any time from the subscription\n management page. You retain Pro access until the end of your\n current billing period.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n What happens to my data if I downgrade?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Your existing stories and characters are never deleted.\n You&apos;ll just be unable to create new ones beyond the\n preview limits until you resubscribe.\n </dd>\n </div>\n <div>\n <dt className=\"text-base font-semibold leading-7 text-white\">\n Is billing monthly or annually?\n </dt>\n <dd className=\"mt-2 text-base leading-7 text-gray-300\">\n Currently monthly only. Annual billing with a discount is\n coming soon.\n </dd>\n </div>\n </dl>\n </div>\n </div>\n </main>\n </div>\n )\n}\n"],"mappings":"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","names":["data"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slashclick/ui",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "sideEffects": [