@otmc/ui 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +12 -0
- package/README.md +1 -2
- package/dist/index.cjs +118 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +22 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
OTMC License
|
|
2
|
+
Copyright (c) 2026 OTMC Softwares. All rights reserved.
|
|
3
|
+
|
|
4
|
+
Contributors:
|
|
5
|
+
* Nguyen Van Trung
|
|
6
|
+
* OTMC Contributors
|
|
7
|
+
|
|
8
|
+
This software and all related source code, assets, and documentation are the
|
|
9
|
+
property of OTMC Softwares. Unauthorized copying, modification, distribution,
|
|
10
|
+
or use of this software is prohibited without prior written permission from
|
|
11
|
+
OTMC Softwares.
|
|
12
|
+
|
package/README.md
CHANGED
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
Footer: () => Footer
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(index_exports);
|
|
26
|
+
|
|
27
|
+
// src/branding/Footer.tsx
|
|
28
|
+
var import_core = require("@mantine/core");
|
|
29
|
+
var import_icons_react = require("@tabler/icons-react");
|
|
30
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
31
|
+
var DEFAULT_COPYRIGHT = "OTMC Softwares. All rights reserved.";
|
|
32
|
+
var DEFAULT_AUTHOR = "Nguyen Van Trung, OTMC Contributors.";
|
|
33
|
+
var DEFAULT_AUTHOR_HREF = "https://github.com";
|
|
34
|
+
var DEFAULT_SOCIAL_LINKS = [
|
|
35
|
+
{
|
|
36
|
+
label: "Facebook",
|
|
37
|
+
href: "https://www.facebook.com",
|
|
38
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_react.IconBrandFacebook, { size: 20 }),
|
|
39
|
+
color: "blue.8",
|
|
40
|
+
external: true
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
label: "GitHub",
|
|
44
|
+
href: "https://github.com",
|
|
45
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_react.IconBrandGithub, { size: 20 }),
|
|
46
|
+
color: "gray.6",
|
|
47
|
+
external: true
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
label: "Gmail",
|
|
51
|
+
href: "mailto:test@gmail.com",
|
|
52
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_react.IconMail, { size: 20 }),
|
|
53
|
+
color: "red.8",
|
|
54
|
+
external: false
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
function Footer({
|
|
58
|
+
copyright = DEFAULT_COPYRIGHT,
|
|
59
|
+
author = DEFAULT_AUTHOR,
|
|
60
|
+
authorHref = DEFAULT_AUTHOR_HREF,
|
|
61
|
+
socialLinks = DEFAULT_SOCIAL_LINKS,
|
|
62
|
+
showSocialLinks = true
|
|
63
|
+
}) {
|
|
64
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Stack, { gap: "sm", mt: "md", align: "center", children: [
|
|
65
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Stack, { gap: 2, align: "center", children: [
|
|
66
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { gap: 4, wrap: "nowrap", children: [
|
|
67
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Text, { c: "dimmed", size: "xs", children: [
|
|
68
|
+
"Copyright",
|
|
69
|
+
" "
|
|
70
|
+
] }),
|
|
71
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_react.IconCopyright, { size: 15 }),
|
|
72
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Text, { size: "xs", c: "dimmed", children: [
|
|
73
|
+
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
74
|
+
" ",
|
|
75
|
+
copyright
|
|
76
|
+
] })
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { gap: 4, wrap: "nowrap", children: [
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { size: "xs", c: "dimmed", children: "Built with" }),
|
|
80
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
81
|
+
import_icons_react.IconHeart,
|
|
82
|
+
{
|
|
83
|
+
size: 15,
|
|
84
|
+
style: { color: "var(--mantine-color-red-7)" }
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { size: "xs", c: "dimmed", children: "by" }),
|
|
88
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
89
|
+
import_core.Anchor,
|
|
90
|
+
{
|
|
91
|
+
href: authorHref,
|
|
92
|
+
size: "xs",
|
|
93
|
+
fw: 500,
|
|
94
|
+
target: "_blank",
|
|
95
|
+
children: author
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
] })
|
|
99
|
+
] }),
|
|
100
|
+
showSocialLinks && socialLinks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Group, { gap: "sm", children: socialLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Tooltip, { label: link.label, withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
101
|
+
import_core.ActionIcon,
|
|
102
|
+
{
|
|
103
|
+
variant: "subtle",
|
|
104
|
+
color: link.color,
|
|
105
|
+
component: "a",
|
|
106
|
+
href: link.href,
|
|
107
|
+
target: link.external ? "_blank" : void 0,
|
|
108
|
+
rel: link.external ? "noopener noreferrer" : void 0,
|
|
109
|
+
children: link.icon
|
|
110
|
+
}
|
|
111
|
+
) }, link.href)) })
|
|
112
|
+
] });
|
|
113
|
+
}
|
|
114
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
115
|
+
0 && (module.exports = {
|
|
116
|
+
Footer
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/branding/Footer.tsx"],"sourcesContent":["/*\r\n * OTMC License.\r\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * Contributors: Nguyen Van Trung, OTMC Authors.\r\n */\r\n\r\nexport * from './branding';\r\n","/***\r\n * OTMC License.\r\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * Contributors: Nguyen Van Trung, OTMC Contributors.\r\n***/\r\n\r\nimport { Stack, Group, Text, Anchor, Tooltip, ActionIcon } from '@mantine/core';\r\nimport {\r\n IconCopyright,\r\n IconHeart,\r\n IconBrandFacebook,\r\n IconBrandGithub,\r\n IconMail,\r\n} from '@tabler/icons-react';\r\nimport { ReactNode } from 'react';\r\n\r\nexport interface FooterSocialLink {\r\n label: string;\r\n href: string;\r\n icon: ReactNode;\r\n color?: string;\r\n external?: boolean;\r\n}\r\n\r\nexport interface FooterProps {\r\n copyright?: string;\r\n author?: string;\r\n authorHref?: string;\r\n socialLinks?: FooterSocialLink[];\r\n showCopyright?: boolean;\r\n showAuthor?: boolean;\r\n showSocialLinks?: boolean;\r\n}\r\n\r\nconst DEFAULT_COPYRIGHT = 'OTMC Softwares. All rights reserved.';\r\nconst DEFAULT_AUTHOR = 'Nguyen Van Trung, OTMC Contributors.';\r\nconst DEFAULT_AUTHOR_HREF = 'https://github.com';\r\nconst DEFAULT_SOCIAL_LINKS: FooterSocialLink[] = [\r\n {\r\n label: 'Facebook',\r\n href: 'https://www.facebook.com',\r\n icon: <IconBrandFacebook size={20} />,\r\n color: 'blue.8',\r\n external: true,\r\n },\r\n {\r\n label: 'GitHub',\r\n href: 'https://github.com',\r\n icon: <IconBrandGithub size={20} />,\r\n color: 'gray.6',\r\n external: true,\r\n },\r\n {\r\n label: 'Gmail',\r\n href: 'mailto:test@gmail.com',\r\n icon: <IconMail size={20} />,\r\n color: 'red.8',\r\n external: false,\r\n },\r\n];\r\n\r\nexport function Footer({\r\n copyright = DEFAULT_COPYRIGHT,\r\n author = DEFAULT_AUTHOR,\r\n authorHref = DEFAULT_AUTHOR_HREF,\r\n socialLinks = DEFAULT_SOCIAL_LINKS,\r\n showSocialLinks = true,\r\n}: FooterProps) {\r\n\r\n return (\r\n <Stack gap=\"sm\" mt=\"md\" align=\"center\">\r\n <Stack gap={2} align=\"center\">\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text c=\"dimmed\" size=\"xs\">\r\n Copyright{' '}\r\n </Text>\r\n <IconCopyright size={15} />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n {new Date().getFullYear()} {copyright}\r\n </Text>\r\n </Group>\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Built with\r\n </Text>\r\n <IconHeart\r\n size={15}\r\n style={{ color: 'var(--mantine-color-red-7)' }}\r\n />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n by\r\n </Text>\r\n <Anchor\r\n href={authorHref}\r\n size=\"xs\"\r\n fw={500}\r\n target=\"_blank\"\r\n >\r\n {author}\r\n </Anchor>\r\n </Group>\r\n </Stack>\r\n\r\n {showSocialLinks && socialLinks.length > 0 && (\r\n <Group gap=\"sm\">\r\n {socialLinks.map((link) => (\r\n <Tooltip key={link.href} label={link.label} withArrow>\r\n <ActionIcon\r\n variant=\"subtle\"\r\n color={link.color}\r\n component=\"a\"\r\n href={link.href}\r\n target={link.external ? '_blank' : undefined}\r\n rel={link.external ? 'noopener noreferrer' : undefined}\r\n >\r\n {link.icon}\r\n </ActionIcon>\r\n </Tooltip>\r\n ))}\r\n </Group>\r\n )}\r\n </Stack>\r\n );\r\n}\r\n\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,kBAAgE;AAChE,yBAMO;AA4BG;AAPV,IAAM,oBAAoB;AAC1B,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAC5B,IAAM,uBAA2C;AAAA,EAC/C;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM,4CAAC,wCAAkB,MAAM,IAAI;AAAA,IACnC,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM,4CAAC,sCAAgB,MAAM,IAAI;AAAA,IACjC,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM,4CAAC,+BAAS,MAAM,IAAI;AAAA,IAC1B,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,OAAO;AAAA,EACrB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,cAAc;AAAA,EACd,kBAAkB;AACpB,GAAgB;AAEd,SACE,6CAAC,qBAAM,KAAI,MAAK,IAAG,MAAK,OAAM,UAC5B;AAAA,iDAAC,qBAAM,KAAK,GAAG,OAAM,UACnB;AAAA,mDAAC,qBAAM,KAAK,GAAG,MAAK,UAClB;AAAA,qDAAC,oBAAK,GAAE,UAAS,MAAK,MAAK;AAAA;AAAA,UACf;AAAA,WACZ;AAAA,QACA,4CAAC,oCAAc,MAAM,IAAI;AAAA,QACzB,6CAAC,oBAAK,MAAK,MAAK,GAAE,UACf;AAAA,+BAAI,KAAK,GAAE,YAAY;AAAA,UAAE;AAAA,UAAE;AAAA,WAC9B;AAAA,SACF;AAAA,MACA,6CAAC,qBAAM,KAAK,GAAG,MAAK,UAClB;AAAA,oDAAC,oBAAK,MAAK,MAAK,GAAE,UAAS,wBAE3B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,OAAO,EAAE,OAAO,6BAA6B;AAAA;AAAA,QAC/C;AAAA,QACA,4CAAC,oBAAK,MAAK,MAAK,GAAE,UAAS,gBAE3B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,MAAK;AAAA,YACL,IAAI;AAAA,YACJ,QAAO;AAAA,YAEN;AAAA;AAAA,QACH;AAAA,SACF;AAAA,OACF;AAAA,IAEC,mBAAmB,YAAY,SAAS,KACvC,4CAAC,qBAAM,KAAI,MACR,sBAAY,IAAI,CAAC,SAChB,4CAAC,uBAAwB,OAAO,KAAK,OAAO,WAAS,MACnD;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,WAAU;AAAA,QACV,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK,WAAW,WAAW;AAAA,QACnC,KAAK,KAAK,WAAW,wBAAwB;AAAA,QAE5C,eAAK;AAAA;AAAA,IACR,KAVY,KAAK,IAWnB,CACD,GACH;AAAA,KAEJ;AAEJ;","names":[]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface FooterSocialLink {
|
|
5
|
+
label: string;
|
|
6
|
+
href: string;
|
|
7
|
+
icon: ReactNode;
|
|
8
|
+
color?: string;
|
|
9
|
+
external?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface FooterProps {
|
|
12
|
+
copyright?: string;
|
|
13
|
+
author?: string;
|
|
14
|
+
authorHref?: string;
|
|
15
|
+
socialLinks?: FooterSocialLink[];
|
|
16
|
+
showCopyright?: boolean;
|
|
17
|
+
showAuthor?: boolean;
|
|
18
|
+
showSocialLinks?: boolean;
|
|
19
|
+
}
|
|
20
|
+
declare function Footer({ copyright, author, authorHref, socialLinks, showSocialLinks, }: FooterProps): react.JSX.Element;
|
|
21
|
+
|
|
22
|
+
export { Footer, type FooterProps, type FooterSocialLink };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface FooterSocialLink {
|
|
5
|
+
label: string;
|
|
6
|
+
href: string;
|
|
7
|
+
icon: ReactNode;
|
|
8
|
+
color?: string;
|
|
9
|
+
external?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface FooterProps {
|
|
12
|
+
copyright?: string;
|
|
13
|
+
author?: string;
|
|
14
|
+
authorHref?: string;
|
|
15
|
+
socialLinks?: FooterSocialLink[];
|
|
16
|
+
showCopyright?: boolean;
|
|
17
|
+
showAuthor?: boolean;
|
|
18
|
+
showSocialLinks?: boolean;
|
|
19
|
+
}
|
|
20
|
+
declare function Footer({ copyright, author, authorHref, socialLinks, showSocialLinks, }: FooterProps): react.JSX.Element;
|
|
21
|
+
|
|
22
|
+
export { Footer, type FooterProps, type FooterSocialLink };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// src/branding/Footer.tsx
|
|
2
|
+
import { Stack, Group, Text, Anchor, Tooltip, ActionIcon } from "@mantine/core";
|
|
3
|
+
import {
|
|
4
|
+
IconCopyright,
|
|
5
|
+
IconHeart,
|
|
6
|
+
IconBrandFacebook,
|
|
7
|
+
IconBrandGithub,
|
|
8
|
+
IconMail
|
|
9
|
+
} from "@tabler/icons-react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
var DEFAULT_COPYRIGHT = "OTMC Softwares. All rights reserved.";
|
|
12
|
+
var DEFAULT_AUTHOR = "Nguyen Van Trung, OTMC Contributors.";
|
|
13
|
+
var DEFAULT_AUTHOR_HREF = "https://github.com";
|
|
14
|
+
var DEFAULT_SOCIAL_LINKS = [
|
|
15
|
+
{
|
|
16
|
+
label: "Facebook",
|
|
17
|
+
href: "https://www.facebook.com",
|
|
18
|
+
icon: /* @__PURE__ */ jsx(IconBrandFacebook, { size: 20 }),
|
|
19
|
+
color: "blue.8",
|
|
20
|
+
external: true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: "GitHub",
|
|
24
|
+
href: "https://github.com",
|
|
25
|
+
icon: /* @__PURE__ */ jsx(IconBrandGithub, { size: 20 }),
|
|
26
|
+
color: "gray.6",
|
|
27
|
+
external: true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
label: "Gmail",
|
|
31
|
+
href: "mailto:test@gmail.com",
|
|
32
|
+
icon: /* @__PURE__ */ jsx(IconMail, { size: 20 }),
|
|
33
|
+
color: "red.8",
|
|
34
|
+
external: false
|
|
35
|
+
}
|
|
36
|
+
];
|
|
37
|
+
function Footer({
|
|
38
|
+
copyright = DEFAULT_COPYRIGHT,
|
|
39
|
+
author = DEFAULT_AUTHOR,
|
|
40
|
+
authorHref = DEFAULT_AUTHOR_HREF,
|
|
41
|
+
socialLinks = DEFAULT_SOCIAL_LINKS,
|
|
42
|
+
showSocialLinks = true
|
|
43
|
+
}) {
|
|
44
|
+
return /* @__PURE__ */ jsxs(Stack, { gap: "sm", mt: "md", align: "center", children: [
|
|
45
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 2, align: "center", children: [
|
|
46
|
+
/* @__PURE__ */ jsxs(Group, { gap: 4, wrap: "nowrap", children: [
|
|
47
|
+
/* @__PURE__ */ jsxs(Text, { c: "dimmed", size: "xs", children: [
|
|
48
|
+
"Copyright",
|
|
49
|
+
" "
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ jsx(IconCopyright, { size: 15 }),
|
|
52
|
+
/* @__PURE__ */ jsxs(Text, { size: "xs", c: "dimmed", children: [
|
|
53
|
+
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
54
|
+
" ",
|
|
55
|
+
copyright
|
|
56
|
+
] })
|
|
57
|
+
] }),
|
|
58
|
+
/* @__PURE__ */ jsxs(Group, { gap: 4, wrap: "nowrap", children: [
|
|
59
|
+
/* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: "Built with" }),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
IconHeart,
|
|
62
|
+
{
|
|
63
|
+
size: 15,
|
|
64
|
+
style: { color: "var(--mantine-color-red-7)" }
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: "by" }),
|
|
68
|
+
/* @__PURE__ */ jsx(
|
|
69
|
+
Anchor,
|
|
70
|
+
{
|
|
71
|
+
href: authorHref,
|
|
72
|
+
size: "xs",
|
|
73
|
+
fw: 500,
|
|
74
|
+
target: "_blank",
|
|
75
|
+
children: author
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
] })
|
|
79
|
+
] }),
|
|
80
|
+
showSocialLinks && socialLinks.length > 0 && /* @__PURE__ */ jsx(Group, { gap: "sm", children: socialLinks.map((link) => /* @__PURE__ */ jsx(Tooltip, { label: link.label, withArrow: true, children: /* @__PURE__ */ jsx(
|
|
81
|
+
ActionIcon,
|
|
82
|
+
{
|
|
83
|
+
variant: "subtle",
|
|
84
|
+
color: link.color,
|
|
85
|
+
component: "a",
|
|
86
|
+
href: link.href,
|
|
87
|
+
target: link.external ? "_blank" : void 0,
|
|
88
|
+
rel: link.external ? "noopener noreferrer" : void 0,
|
|
89
|
+
children: link.icon
|
|
90
|
+
}
|
|
91
|
+
) }, link.href)) })
|
|
92
|
+
] });
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
Footer
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/branding/Footer.tsx"],"sourcesContent":["/***\r\n * OTMC License.\r\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * Contributors: Nguyen Van Trung, OTMC Contributors.\r\n***/\r\n\r\nimport { Stack, Group, Text, Anchor, Tooltip, ActionIcon } from '@mantine/core';\r\nimport {\r\n IconCopyright,\r\n IconHeart,\r\n IconBrandFacebook,\r\n IconBrandGithub,\r\n IconMail,\r\n} from '@tabler/icons-react';\r\nimport { ReactNode } from 'react';\r\n\r\nexport interface FooterSocialLink {\r\n label: string;\r\n href: string;\r\n icon: ReactNode;\r\n color?: string;\r\n external?: boolean;\r\n}\r\n\r\nexport interface FooterProps {\r\n copyright?: string;\r\n author?: string;\r\n authorHref?: string;\r\n socialLinks?: FooterSocialLink[];\r\n showCopyright?: boolean;\r\n showAuthor?: boolean;\r\n showSocialLinks?: boolean;\r\n}\r\n\r\nconst DEFAULT_COPYRIGHT = 'OTMC Softwares. All rights reserved.';\r\nconst DEFAULT_AUTHOR = 'Nguyen Van Trung, OTMC Contributors.';\r\nconst DEFAULT_AUTHOR_HREF = 'https://github.com';\r\nconst DEFAULT_SOCIAL_LINKS: FooterSocialLink[] = [\r\n {\r\n label: 'Facebook',\r\n href: 'https://www.facebook.com',\r\n icon: <IconBrandFacebook size={20} />,\r\n color: 'blue.8',\r\n external: true,\r\n },\r\n {\r\n label: 'GitHub',\r\n href: 'https://github.com',\r\n icon: <IconBrandGithub size={20} />,\r\n color: 'gray.6',\r\n external: true,\r\n },\r\n {\r\n label: 'Gmail',\r\n href: 'mailto:test@gmail.com',\r\n icon: <IconMail size={20} />,\r\n color: 'red.8',\r\n external: false,\r\n },\r\n];\r\n\r\nexport function Footer({\r\n copyright = DEFAULT_COPYRIGHT,\r\n author = DEFAULT_AUTHOR,\r\n authorHref = DEFAULT_AUTHOR_HREF,\r\n socialLinks = DEFAULT_SOCIAL_LINKS,\r\n showSocialLinks = true,\r\n}: FooterProps) {\r\n\r\n return (\r\n <Stack gap=\"sm\" mt=\"md\" align=\"center\">\r\n <Stack gap={2} align=\"center\">\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text c=\"dimmed\" size=\"xs\">\r\n Copyright{' '}\r\n </Text>\r\n <IconCopyright size={15} />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n {new Date().getFullYear()} {copyright}\r\n </Text>\r\n </Group>\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Built with\r\n </Text>\r\n <IconHeart\r\n size={15}\r\n style={{ color: 'var(--mantine-color-red-7)' }}\r\n />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n by\r\n </Text>\r\n <Anchor\r\n href={authorHref}\r\n size=\"xs\"\r\n fw={500}\r\n target=\"_blank\"\r\n >\r\n {author}\r\n </Anchor>\r\n </Group>\r\n </Stack>\r\n\r\n {showSocialLinks && socialLinks.length > 0 && (\r\n <Group gap=\"sm\">\r\n {socialLinks.map((link) => (\r\n <Tooltip key={link.href} label={link.label} withArrow>\r\n <ActionIcon\r\n variant=\"subtle\"\r\n color={link.color}\r\n component=\"a\"\r\n href={link.href}\r\n target={link.external ? '_blank' : undefined}\r\n rel={link.external ? 'noopener noreferrer' : undefined}\r\n >\r\n {link.icon}\r\n </ActionIcon>\r\n </Tooltip>\r\n ))}\r\n </Group>\r\n )}\r\n </Stack>\r\n );\r\n}\r\n\r\n"],"mappings":";AAMA,SAAS,OAAO,OAAO,MAAM,QAAQ,SAAS,kBAAkB;AAChE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA4BG,cAgCA,YAhCA;AAPV,IAAM,oBAAoB;AAC1B,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAC5B,IAAM,uBAA2C;AAAA,EAC/C;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM,oBAAC,qBAAkB,MAAM,IAAI;AAAA,IACnC,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM,oBAAC,mBAAgB,MAAM,IAAI;AAAA,IACjC,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM,oBAAC,YAAS,MAAM,IAAI;AAAA,IAC1B,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,OAAO;AAAA,EACrB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,cAAc;AAAA,EACd,kBAAkB;AACpB,GAAgB;AAEd,SACE,qBAAC,SAAM,KAAI,MAAK,IAAG,MAAK,OAAM,UAC5B;AAAA,yBAAC,SAAM,KAAK,GAAG,OAAM,UACnB;AAAA,2BAAC,SAAM,KAAK,GAAG,MAAK,UAClB;AAAA,6BAAC,QAAK,GAAE,UAAS,MAAK,MAAK;AAAA;AAAA,UACf;AAAA,WACZ;AAAA,QACA,oBAAC,iBAAc,MAAM,IAAI;AAAA,QACzB,qBAAC,QAAK,MAAK,MAAK,GAAE,UACf;AAAA,+BAAI,KAAK,GAAE,YAAY;AAAA,UAAE;AAAA,UAAE;AAAA,WAC9B;AAAA,SACF;AAAA,MACA,qBAAC,SAAM,KAAK,GAAG,MAAK,UAClB;AAAA,4BAAC,QAAK,MAAK,MAAK,GAAE,UAAS,wBAE3B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,OAAO,EAAE,OAAO,6BAA6B;AAAA;AAAA,QAC/C;AAAA,QACA,oBAAC,QAAK,MAAK,MAAK,GAAE,UAAS,gBAE3B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,MAAK;AAAA,YACL,IAAI;AAAA,YACJ,QAAO;AAAA,YAEN;AAAA;AAAA,QACH;AAAA,SACF;AAAA,OACF;AAAA,IAEC,mBAAmB,YAAY,SAAS,KACvC,oBAAC,SAAM,KAAI,MACR,sBAAY,IAAI,CAAC,SAChB,oBAAC,WAAwB,OAAO,KAAK,OAAO,WAAS,MACnD;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,WAAU;AAAA,QACV,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK,WAAW,WAAW;AAAA,QACnC,KAAK,KAAK,WAAW,wBAAwB;AAAA,QAE5C,eAAK;AAAA;AAAA,IACR,KAVY,KAAK,IAWnB,CACD,GACH;AAAA,KAEJ;AAEJ;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,60 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@otmc/ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@otmc/ui",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "OTMC shared React component library",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.cts",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"README.md",
|
|
25
|
+
"LICENSE"
|
|
26
|
+
],
|
|
27
|
+
"keywords": [
|
|
28
|
+
"otmc",
|
|
29
|
+
"ui",
|
|
30
|
+
"components",
|
|
31
|
+
"react",
|
|
32
|
+
"mantine"
|
|
33
|
+
],
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"@mantine/core": ">=8",
|
|
36
|
+
"react": ">=18",
|
|
37
|
+
"react-dom": ">=18",
|
|
38
|
+
"@tabler/icons-react": ">=3"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@mantine/core": "^7.0.0",
|
|
45
|
+
"@mantine/hooks": "^7.0.0",
|
|
46
|
+
"@types/react": "^18.0.0",
|
|
47
|
+
"@types/react-dom": "^18.0.0",
|
|
48
|
+
"react": "^18.0.0",
|
|
49
|
+
"react-dom": "^18.0.0",
|
|
50
|
+
"tsup": "^8.0.0",
|
|
51
|
+
"typescript": "^5.0.0"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"dev": "tsup --watch",
|
|
55
|
+
"build": "tsup",
|
|
56
|
+
"preview": "http-server dist -p 4000",
|
|
57
|
+
"typecheck": "tsc --noEmit",
|
|
58
|
+
"prepublishOnly": "npm run typecheck && npm run build"
|
|
59
|
+
}
|
|
60
|
+
}
|