@olwiba/ui 0.0.38 → 0.0.41

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.
@@ -0,0 +1,35 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface ActionEmailProps {
5
+ appName: string;
6
+ preview: string;
7
+ heading: string;
8
+ description: string;
9
+ actionLabel: string;
10
+ actionUrl: string;
11
+ brandColor?: string;
12
+ showLinkFallback?: boolean;
13
+ }
14
+ declare function ActionEmail({ appName, preview, heading, description, actionLabel, actionUrl, brandColor, showLinkFallback, }: ActionEmailProps): react_jsx_runtime.JSX.Element;
15
+
16
+ interface NoticeEmailProps {
17
+ appName: string;
18
+ preview: string;
19
+ heading: string;
20
+ body: string;
21
+ brandColor?: string;
22
+ }
23
+ declare function NoticeEmail({ appName, preview, heading, body, brandColor, }: NoticeEmailProps): react_jsx_runtime.JSX.Element;
24
+
25
+ interface EmailLayoutProps {
26
+ preview?: string;
27
+ appName: string;
28
+ brandColor?: string;
29
+ children: ReactNode;
30
+ footer?: ReactNode;
31
+ }
32
+ /** Branded email shell — UI block composed from CN primitives. */
33
+ declare function EmailLayout({ preview, appName, brandColor, children, footer, }: EmailLayoutProps): react_jsx_runtime.JSX.Element;
34
+
35
+ export { ActionEmail, type ActionEmailProps, EmailLayout, type EmailLayoutProps, NoticeEmail, type NoticeEmailProps };
@@ -0,0 +1,135 @@
1
+ import { EmailRoot, EmailHead, EmailPreview, EmailBody, emailTheme, EmailContainer, EmailSection, EmailText, EmailHeading, EmailButton, EmailLink } from '@olwiba/cn/email';
2
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
+
4
+ // src/email/ActionEmail.tsx
5
+ function EmailLayout({
6
+ preview,
7
+ appName,
8
+ brandColor = emailTheme.defaultBrandColor,
9
+ children,
10
+ footer
11
+ }) {
12
+ const year = (/* @__PURE__ */ new Date()).getFullYear();
13
+ return /* @__PURE__ */ jsxs(EmailRoot, { children: [
14
+ /* @__PURE__ */ jsx(EmailHead, {}),
15
+ preview ? /* @__PURE__ */ jsx(EmailPreview, { children: preview }) : null,
16
+ /* @__PURE__ */ jsx(
17
+ EmailBody,
18
+ {
19
+ style: {
20
+ backgroundColor: emailTheme.pageBackground,
21
+ fontFamily: emailTheme.fontFamily,
22
+ margin: 0,
23
+ padding: "24px 0"
24
+ },
25
+ children: /* @__PURE__ */ jsxs(
26
+ EmailContainer,
27
+ {
28
+ style: {
29
+ maxWidth: "560px",
30
+ margin: "0 auto",
31
+ backgroundColor: emailTheme.cardBackground,
32
+ borderRadius: "16px",
33
+ overflow: "hidden",
34
+ border: `1px solid ${emailTheme.cardBorder}`
35
+ },
36
+ children: [
37
+ /* @__PURE__ */ jsx(
38
+ EmailSection,
39
+ {
40
+ style: {
41
+ padding: "24px 32px",
42
+ borderBottom: `1px solid ${emailTheme.cardBorder}`
43
+ },
44
+ children: /* @__PURE__ */ jsx(
45
+ EmailText,
46
+ {
47
+ style: {
48
+ margin: 0,
49
+ fontSize: "18px",
50
+ fontWeight: 600,
51
+ color: brandColor
52
+ },
53
+ children: appName
54
+ }
55
+ )
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsx(EmailSection, { style: { padding: "32px" }, children }),
59
+ footer ?? /* @__PURE__ */ jsx(
60
+ EmailSection,
61
+ {
62
+ style: {
63
+ padding: "20px 32px",
64
+ borderTop: `1px solid ${emailTheme.cardBorder}`,
65
+ backgroundColor: emailTheme.mutedBackground
66
+ },
67
+ children: /* @__PURE__ */ jsxs(
68
+ EmailText,
69
+ {
70
+ variant: "caption",
71
+ style: {
72
+ margin: 0,
73
+ textAlign: "center"
74
+ },
75
+ children: [
76
+ "\xA9 ",
77
+ year,
78
+ " ",
79
+ appName,
80
+ ". All rights reserved."
81
+ ]
82
+ }
83
+ )
84
+ }
85
+ )
86
+ ]
87
+ }
88
+ )
89
+ }
90
+ )
91
+ ] });
92
+ }
93
+ function EmailLinkFallback({
94
+ actionUrl,
95
+ label = "Or copy and paste this link into your browser:",
96
+ brandColor
97
+ }) {
98
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
99
+ /* @__PURE__ */ jsx(EmailText, { variant: "caption", style: { margin: "24px 0 8px" }, children: label }),
100
+ /* @__PURE__ */ jsx(EmailText, { style: { margin: 0 }, children: /* @__PURE__ */ jsx(EmailLink, { href: actionUrl, brandColor, children: actionUrl }) })
101
+ ] });
102
+ }
103
+ function ActionEmail({
104
+ appName,
105
+ preview,
106
+ heading,
107
+ description,
108
+ actionLabel,
109
+ actionUrl,
110
+ brandColor = emailTheme.defaultBrandColor,
111
+ showLinkFallback = true
112
+ }) {
113
+ return /* @__PURE__ */ jsxs(EmailLayout, { preview, appName, brandColor, children: [
114
+ /* @__PURE__ */ jsx(EmailHeading, { children: heading }),
115
+ /* @__PURE__ */ jsx(EmailText, { variant: "muted", style: { margin: "0 0 24px" }, children: description }),
116
+ /* @__PURE__ */ jsx(EmailButton, { href: actionUrl, label: actionLabel, brandColor }),
117
+ showLinkFallback ? /* @__PURE__ */ jsx(EmailLinkFallback, { actionUrl, brandColor }) : null
118
+ ] });
119
+ }
120
+ function NoticeEmail({
121
+ appName,
122
+ preview,
123
+ heading,
124
+ body,
125
+ brandColor = emailTheme.defaultBrandColor
126
+ }) {
127
+ return /* @__PURE__ */ jsxs(EmailLayout, { preview, appName, brandColor, children: [
128
+ /* @__PURE__ */ jsx(EmailHeading, { children: heading }),
129
+ /* @__PURE__ */ jsx(EmailText, { variant: "muted", style: { margin: 0, whiteSpace: "pre-wrap" }, children: body })
130
+ ] });
131
+ }
132
+
133
+ export { ActionEmail, EmailLayout, NoticeEmail };
134
+ //# sourceMappingURL=index.js.map
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/email/EmailLayout.tsx","../../src/email/EmailLinkFallback.tsx","../../src/email/ActionEmail.tsx","../../src/email/NoticeEmail.tsx"],"names":["jsxs","jsx","EmailText","emailTheme","EmailHeading"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from 'react';\nimport {\n EmailBody,\n EmailContainer,\n EmailHead,\n EmailPreview,\n EmailRoot,\n EmailSection,\n EmailText,\n emailTheme,\n} from '@olwiba/cn/email';\n\nexport interface EmailLayoutProps {\n preview?: string;\n appName: string;\n brandColor?: string;\n children: ReactNode;\n footer?: ReactNode;\n}\n\n/** Branded email shell — UI block composed from CN primitives. */\nexport function EmailLayout({\n preview,\n appName,\n brandColor = emailTheme.defaultBrandColor,\n children,\n footer,\n}: EmailLayoutProps) {\n const year = new Date().getFullYear();\n\n return (\n <EmailRoot>\n <EmailHead />\n {preview ? <EmailPreview>{preview}</EmailPreview> : null}\n <EmailBody\n style={{\n backgroundColor: emailTheme.pageBackground,\n fontFamily: emailTheme.fontFamily,\n margin: 0,\n padding: '24px 0',\n }}\n >\n <EmailContainer\n style={{\n maxWidth: '560px',\n margin: '0 auto',\n backgroundColor: emailTheme.cardBackground,\n borderRadius: '16px',\n overflow: 'hidden',\n border: `1px solid ${emailTheme.cardBorder}`,\n }}\n >\n <EmailSection\n style={{\n padding: '24px 32px',\n borderBottom: `1px solid ${emailTheme.cardBorder}`,\n }}\n >\n <EmailText\n style={{\n margin: 0,\n fontSize: '18px',\n fontWeight: 600,\n color: brandColor,\n }}\n >\n {appName}\n </EmailText>\n </EmailSection>\n\n <EmailSection style={{ padding: '32px' }}>{children}</EmailSection>\n\n {footer ?? (\n <EmailSection\n style={{\n padding: '20px 32px',\n borderTop: `1px solid ${emailTheme.cardBorder}`,\n backgroundColor: emailTheme.mutedBackground,\n }}\n >\n <EmailText\n variant=\"caption\"\n style={{\n margin: 0,\n textAlign: 'center',\n }}\n >\n © {year} {appName}. All rights reserved.\n </EmailText>\n </EmailSection>\n )}\n </EmailContainer>\n </EmailBody>\n </EmailRoot>\n );\n}\n","import { EmailLink, EmailText } from '@olwiba/cn/email';\n\nexport interface EmailLinkFallbackProps {\n actionUrl: string;\n label?: string;\n brandColor?: string;\n}\n\nexport function EmailLinkFallback({\n actionUrl,\n label = 'Or copy and paste this link into your browser:',\n brandColor,\n}: EmailLinkFallbackProps) {\n return (\n <>\n <EmailText variant=\"caption\" style={{ margin: '24px 0 8px' }}>\n {label}\n </EmailText>\n <EmailText style={{ margin: 0 }}>\n <EmailLink href={actionUrl} brandColor={brandColor}>\n {actionUrl}\n </EmailLink>\n </EmailText>\n </>\n );\n}\n","import {\n EmailButton,\n EmailHeading,\n EmailText,\n emailTheme,\n} from '@olwiba/cn/email';\nimport { EmailLayout } from './EmailLayout';\nimport { EmailLinkFallback } from './EmailLinkFallback';\n\nexport interface ActionEmailProps {\n appName: string;\n preview: string;\n heading: string;\n description: string;\n actionLabel: string;\n actionUrl: string;\n brandColor?: string;\n showLinkFallback?: boolean;\n}\n\nexport function ActionEmail({\n appName,\n preview,\n heading,\n description,\n actionLabel,\n actionUrl,\n brandColor = emailTheme.defaultBrandColor,\n showLinkFallback = true,\n}: ActionEmailProps) {\n return (\n <EmailLayout preview={preview} appName={appName} brandColor={brandColor}>\n <EmailHeading>{heading}</EmailHeading>\n <EmailText variant=\"muted\" style={{ margin: '0 0 24px' }}>\n {description}\n </EmailText>\n <EmailButton href={actionUrl} label={actionLabel} brandColor={brandColor} />\n {showLinkFallback ? (\n <EmailLinkFallback actionUrl={actionUrl} brandColor={brandColor} />\n ) : null}\n </EmailLayout>\n );\n}\n","import {\n EmailHeading,\n EmailText,\n emailTheme,\n} from '@olwiba/cn/email';\nimport { EmailLayout } from './EmailLayout';\n\nexport interface NoticeEmailProps {\n appName: string;\n preview: string;\n heading: string;\n body: string;\n brandColor?: string;\n}\n\nexport function NoticeEmail({\n appName,\n preview,\n heading,\n body,\n brandColor = emailTheme.defaultBrandColor,\n}: NoticeEmailProps) {\n return (\n <EmailLayout preview={preview} appName={appName} brandColor={brandColor}>\n <EmailHeading>{heading}</EmailHeading>\n <EmailText variant=\"muted\" style={{ margin: 0, whiteSpace: 'pre-wrap' }}>\n {body}\n </EmailText>\n </EmailLayout>\n );\n}\n"]}
package/dist/index.js CHANGED
@@ -153,7 +153,7 @@ function ShellSidebar({
153
153
  /* @__PURE__ */ jsx(SidebarHeader, { children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(SidebarMenuButton, { asChild: true, tooltip: typeof brand.name === "string" ? brand.name : void 0, className: "data-[slot=sidebar-menu-button]:!p-1.5", children: renderLink({
154
154
  href: brand.href ?? "#",
155
155
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
156
- brand.logo ?? /* @__PURE__ */ jsx("span", { className: "flex size-4 shrink-0 items-center justify-center text-sm font-semibold", children: fallbackLogo }),
156
+ brand.logo ? /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary text-primary-foreground", children: brand.logo }) : /* @__PURE__ */ jsx("span", { className: "flex size-4 shrink-0 items-center justify-center text-sm font-semibold", children: fallbackLogo }),
157
157
  /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-base font-semibold group-data-[collapsible=icon]:hidden", children: brand.name })
158
158
  ] })
159
159
  }) }) }) }) }),
@@ -1243,6 +1243,17 @@ function NewsletterSection({
1243
1243
  " ",
1244
1244
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: successDescription })
1245
1245
  ] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "mt-8 flex flex-col gap-3 sm:flex-row", children: [
1246
+ /* @__PURE__ */ jsx(
1247
+ "input",
1248
+ {
1249
+ type: "text",
1250
+ name: "company",
1251
+ tabIndex: -1,
1252
+ autoComplete: "off",
1253
+ "aria-hidden": "true",
1254
+ className: "hidden"
1255
+ }
1256
+ ),
1246
1257
  /* @__PURE__ */ jsx(
1247
1258
  Input$1,
1248
1259
  {
@@ -1331,23 +1342,34 @@ function ContactSection({
1331
1342
  ] }),
1332
1343
  /* @__PURE__ */ jsx(Button$1, { variant: "outline", onClick: () => setSubmitted(false), children: sendAnotherLabel })
1333
1344
  ] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-5", children: [
1345
+ /* @__PURE__ */ jsx(
1346
+ "input",
1347
+ {
1348
+ type: "text",
1349
+ name: "company",
1350
+ tabIndex: -1,
1351
+ autoComplete: "off",
1352
+ "aria-hidden": "true",
1353
+ className: "hidden"
1354
+ }
1355
+ ),
1334
1356
  /* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [
1335
1357
  /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
1336
1358
  /* @__PURE__ */ jsx(Label, { htmlFor: "contact-first", children: "First name" }),
1337
- /* @__PURE__ */ jsx(Input$1, { id: "contact-first", placeholder: "Olivia", required: true })
1359
+ /* @__PURE__ */ jsx(Input$1, { id: "contact-first", name: "firstName", placeholder: "Olivia", required: true })
1338
1360
  ] }),
1339
1361
  /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
1340
1362
  /* @__PURE__ */ jsx(Label, { htmlFor: "contact-last", children: "Last name" }),
1341
- /* @__PURE__ */ jsx(Input$1, { id: "contact-last", placeholder: "Reed", required: true })
1363
+ /* @__PURE__ */ jsx(Input$1, { id: "contact-last", name: "lastName", placeholder: "Reed", required: true })
1342
1364
  ] })
1343
1365
  ] }),
1344
1366
  /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
1345
1367
  /* @__PURE__ */ jsx(Label, { htmlFor: "contact-email", children: "Email" }),
1346
- /* @__PURE__ */ jsx(Input$1, { id: "contact-email", type: "email", placeholder: "olivia@company.com", required: true })
1368
+ /* @__PURE__ */ jsx(Input$1, { id: "contact-email", name: "email", type: "email", placeholder: "olivia@company.com", required: true })
1347
1369
  ] }),
1348
1370
  /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
1349
1371
  /* @__PURE__ */ jsx(Label, { htmlFor: "contact-subject", children: "Subject" }),
1350
- /* @__PURE__ */ jsx(Input$1, { id: "contact-subject", placeholder: "How can we help?", required: true })
1372
+ /* @__PURE__ */ jsx(Input$1, { id: "contact-subject", name: "subject", placeholder: "How can we help?", required: true })
1351
1373
  ] }),
1352
1374
  /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
1353
1375
  /* @__PURE__ */ jsx(Label, { htmlFor: "contact-message", children: "Message" }),
@@ -1355,6 +1377,7 @@ function ContactSection({
1355
1377
  Textarea$1,
1356
1378
  {
1357
1379
  id: "contact-message",
1380
+ name: "message",
1358
1381
  placeholder: "Tell us what you're working on...",
1359
1382
  className: "min-h-28 resize-none",
1360
1383
  required: true
@@ -1404,7 +1427,7 @@ function Navbar({
1404
1427
  renderLink({
1405
1428
  href: brandHref,
1406
1429
  children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 font-semibold", children: [
1407
- brand.logo && /* @__PURE__ */ jsx("span", { className: "flex h-7 w-7 items-center justify-center rounded-lg bg-primary text-primary-foreground", children: brand.logo }),
1430
+ brand.logo && /* @__PURE__ */ jsx("span", { className: "flex h-9 w-9 items-center justify-center rounded-xl bg-primary text-primary-foreground", children: brand.logo }),
1408
1431
  /* @__PURE__ */ jsx("span", { children: brand.name })
1409
1432
  ] })
1410
1433
  }),
@@ -1476,18 +1499,18 @@ function Footer({
1476
1499
  }) {
1477
1500
  const brandHref = brand.href ?? "/";
1478
1501
  const copyrightText = legal ?? `\xA9 ${(/* @__PURE__ */ new Date()).getFullYear()} ${brand.name}. All rights reserved.`;
1479
- return /* @__PURE__ */ jsx("footer", { className: "bg-gray-900", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-7xl overflow-hidden px-6 py-20 sm:py-24 lg:px-8", children: [
1502
+ return /* @__PURE__ */ jsx("footer", { className: "overflow-hidden rounded-2xl border bg-foreground text-background", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-7xl px-6 py-20 sm:py-24 lg:px-8", children: [
1480
1503
  /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: renderLink({
1481
1504
  href: brandHref,
1482
1505
  className: "flex items-center gap-2",
1483
1506
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
1484
- brand.logo && /* @__PURE__ */ jsx("span", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-white/10 text-white", children: brand.logo }),
1485
- /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold text-white", children: brand.name })
1507
+ brand.logo && /* @__PURE__ */ jsx("span", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-background/10 text-background", children: brand.logo }),
1508
+ /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold text-background", children: brand.name })
1486
1509
  ] })
1487
1510
  }) }),
1488
1511
  navLinks && navLinks.length > 0 && /* @__PURE__ */ jsx("nav", { className: "mt-10 flex flex-wrap justify-center gap-x-12 gap-y-3", "aria-label": "Footer", children: navLinks.map(({ label, href }) => /* @__PURE__ */ jsx("div", { children: renderLink({
1489
1512
  href,
1490
- className: "text-sm/6 text-gray-400 hover:text-white transition-colors",
1513
+ className: "text-sm/6 text-background/70 transition-colors hover:text-background",
1491
1514
  children: label
1492
1515
  }) }, label)) }),
1493
1516
  socialLinks && socialLinks.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-10 flex justify-center gap-x-10", children: socialLinks.map(({ label, href, icon }) => /* @__PURE__ */ jsx(
@@ -1495,12 +1518,12 @@ function Footer({
1495
1518
  {
1496
1519
  href,
1497
1520
  "aria-label": label,
1498
- className: "text-gray-400 hover:text-gray-300 transition-colors",
1521
+ className: "text-background/70 transition-colors hover:text-background",
1499
1522
  children: icon
1500
1523
  },
1501
1524
  label
1502
1525
  )) }),
1503
- /* @__PURE__ */ jsx("p", { className: "mt-10 text-center text-sm/6 text-gray-500", children: copyrightText })
1526
+ /* @__PURE__ */ jsx("p", { className: "mt-10 text-center text-sm/6 text-background/50", children: copyrightText })
1504
1527
  ] }) });
1505
1528
  }
1506
1529
  var speedDuration = {