untitledui 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.
Files changed (121) hide show
  1. package/dist/commands/add.js +339 -0
  2. package/dist/commands/init.js +436 -0
  3. package/dist/helper/download-tar-api.js +129 -0
  4. package/dist/helper/download-tar.js +81 -0
  5. package/dist/helper/find-css-file.js +19 -0
  6. package/dist/helper/formatText.js +37 -0
  7. package/dist/helper/get-components-api.js +47 -0
  8. package/dist/helper/get-components-list.js +62 -0
  9. package/dist/helper/get-components.js +19 -0
  10. package/dist/helper/get-config.js +163 -0
  11. package/dist/helper/get-package-info.js +99 -0
  12. package/dist/helper/get-pkg-manager.js +16 -0
  13. package/dist/helper/get-project.js +176 -0
  14. package/dist/helper/install-template.js +29 -0
  15. package/dist/helper/match-color-css.js +82 -0
  16. package/dist/helper/update-color-css.js +134 -0
  17. package/dist/index.js +25 -0
  18. package/dist/package.json +50 -0
  19. package/dist/res/components.json +520 -0
  20. package/dist/res/config.json +3 -0
  21. package/package.json +61 -0
  22. package/templates/default/.prettierrc +10 -0
  23. package/templates/default/README.md +36 -0
  24. package/templates/default/eslint.config.mjs +58 -0
  25. package/templates/default/next.config.ts +6 -0
  26. package/templates/default/package.json +57 -0
  27. package/templates/default/postcss.config.js +5 -0
  28. package/templates/default/public/favicon.ico +0 -0
  29. package/templates/default/public/marketing/smiling-girl.png +0 -0
  30. package/templates/default/public/marketing/spirals.webp +0 -0
  31. package/templates/default/src/app/home-screen.tsx +109 -0
  32. package/templates/default/src/app/layout.tsx +42 -0
  33. package/templates/default/src/app/not-found.tsx +40 -0
  34. package/templates/default/src/app/page.tsx +3 -0
  35. package/templates/default/src/components/foundations/dot-icon.tsx +27 -0
  36. package/templates/default/src/components/foundations/featured-icon/featured-icons.tsx +153 -0
  37. package/templates/default/src/components/foundations/logo/UntitledLogo.tsx +63 -0
  38. package/templates/default/src/components/foundations/logo/UntitledLogoMinimal.tsx +164 -0
  39. package/templates/default/src/components/foundations/payment-icons/amex-icon.tsx +19 -0
  40. package/templates/default/src/components/foundations/payment-icons/apple-pay-icon.tsx +27 -0
  41. package/templates/default/src/components/foundations/payment-icons/discover-icon.tsx +34 -0
  42. package/templates/default/src/components/foundations/payment-icons/index.tsx +10 -0
  43. package/templates/default/src/components/foundations/payment-icons/mastercard-icon.tsx +39 -0
  44. package/templates/default/src/components/foundations/payment-icons/paypal-icon.tsx +45 -0
  45. package/templates/default/src/components/foundations/payment-icons/stripe-icon.tsx +27 -0
  46. package/templates/default/src/components/foundations/payment-icons/union-pay-icon.tsx +37 -0
  47. package/templates/default/src/components/foundations/payment-icons/visa-icon.tsx +27 -0
  48. package/templates/default/src/components/marketing/header-navigation/base-components/nav-menu-item.tsx +41 -0
  49. package/templates/default/src/components/marketing/header-navigation/components/header.tsx +245 -0
  50. package/templates/default/src/components/marketing/header-navigation/dropdown-header-navigation.tsx +53 -0
  51. package/templates/default/src/components/shared/avatar/avatar-label-group.tsx +32 -0
  52. package/templates/default/src/components/shared/avatar/avatar-profile-photo.tsx +84 -0
  53. package/templates/default/src/components/shared/avatar/avatar.tsx +131 -0
  54. package/templates/default/src/components/shared/avatar/base-components/avatar-add-button.tsx +33 -0
  55. package/templates/default/src/components/shared/avatar/base-components/avatar-company-icon.tsx +26 -0
  56. package/templates/default/src/components/shared/avatar/base-components/avatar-online-indicator.tsx +31 -0
  57. package/templates/default/src/components/shared/avatar/base-components/index.ts +4 -0
  58. package/templates/default/src/components/shared/avatar/base-components/verified-tick.tsx +34 -0
  59. package/templates/default/src/components/shared/avatar/utils.ts +12 -0
  60. package/templates/default/src/components/shared/badges/badge-groups.tsx +176 -0
  61. package/templates/default/src/components/shared/badges/badge-types.ts +264 -0
  62. package/templates/default/src/components/shared/badges/badges.tsx +479 -0
  63. package/templates/default/src/components/shared/button-group/button-group.tsx +97 -0
  64. package/templates/default/src/components/shared/buttons/app-store-buttons-outline.tsx +454 -0
  65. package/templates/default/src/components/shared/buttons/app-store-buttons.tsx +806 -0
  66. package/templates/default/src/components/shared/buttons/button-utility.tsx +87 -0
  67. package/templates/default/src/components/shared/buttons/button.tsx +284 -0
  68. package/templates/default/src/components/shared/buttons/close-button.tsx +39 -0
  69. package/templates/default/src/components/shared/buttons/social-button.tsx +135 -0
  70. package/templates/default/src/components/shared/buttons/social-logos.tsx +115 -0
  71. package/templates/default/src/components/shared/checkbox/checkbox.tsx +120 -0
  72. package/templates/default/src/components/shared/dropdown/dropdown.tsx +138 -0
  73. package/templates/default/src/components/shared/input-dropdown/combobox.tsx +161 -0
  74. package/templates/default/src/components/shared/input-dropdown/dropdown-item.tsx +98 -0
  75. package/templates/default/src/components/shared/input-dropdown/input-dropdown.tsx +172 -0
  76. package/templates/default/src/components/shared/input-dropdown/multi-select.tsx +373 -0
  77. package/templates/default/src/components/shared/input-dropdown/popover.tsx +36 -0
  78. package/templates/default/src/components/shared/input-dropdown/select.tsx +63 -0
  79. package/templates/default/src/components/shared/inputs/file-upload-trigger.tsx +74 -0
  80. package/templates/default/src/components/shared/inputs/form/form.tsx +10 -0
  81. package/templates/default/src/components/shared/inputs/hint-text.tsx +34 -0
  82. package/templates/default/src/components/shared/inputs/input/index.tsx +189 -0
  83. package/templates/default/src/components/shared/inputs/input/input-payment.tsx +134 -0
  84. package/templates/default/src/components/shared/inputs/input/input-with-button.tsx +69 -0
  85. package/templates/default/src/components/shared/inputs/input/input-with-dropdown.tsx +178 -0
  86. package/templates/default/src/components/shared/inputs/input/input-with-prefix.tsx +74 -0
  87. package/templates/default/src/components/shared/inputs/label.tsx +46 -0
  88. package/templates/default/src/components/shared/inputs/textarea/textarea.tsx +82 -0
  89. package/templates/default/src/components/shared/progress-indicators/progress-circles.tsx +176 -0
  90. package/templates/default/src/components/shared/progress-indicators/progress-indicators.tsx +86 -0
  91. package/templates/default/src/components/shared/progress-indicators/simple-circle.tsx +29 -0
  92. package/templates/default/src/components/shared/radio-buttons/radio-buttons.tsx +125 -0
  93. package/templates/default/src/components/shared/radio-groups/radio-group-avatar.tsx +62 -0
  94. package/templates/default/src/components/shared/radio-groups/radio-group-checkbox.tsx +72 -0
  95. package/templates/default/src/components/shared/radio-groups/radio-group-icon-card.tsx +95 -0
  96. package/templates/default/src/components/shared/radio-groups/radio-group-icon-simple.tsx +70 -0
  97. package/templates/default/src/components/shared/radio-groups/radio-group-payment-icon.tsx +71 -0
  98. package/templates/default/src/components/shared/radio-groups/radio-group-radio-button.tsx +76 -0
  99. package/templates/default/src/components/shared/radio-groups/radio-groups.tsx +8 -0
  100. package/templates/default/src/components/shared/slider/slider.tsx +76 -0
  101. package/templates/default/src/components/shared/tags/base-components/tag-checkbox.tsx +47 -0
  102. package/templates/default/src/components/shared/tags/base-components/tag-close-x.tsx +34 -0
  103. package/templates/default/src/components/shared/tags/tags.tsx +162 -0
  104. package/templates/default/src/components/shared/toggle/toggle.tsx +140 -0
  105. package/templates/default/src/components/shared/tooltips/tooltips.tsx +140 -0
  106. package/templates/default/src/components/utils/index.ts +48 -0
  107. package/templates/default/src/components/utils/isDeepEqual.ts +31 -0
  108. package/templates/default/src/components/utils/isReactComponent.ts +22 -0
  109. package/templates/default/src/components/utils/mergeRefs.ts +19 -0
  110. package/templates/default/src/components/utils/useBreakpoint.ts +36 -0
  111. package/templates/default/src/components/utils/uuid.ts +9 -0
  112. package/templates/default/src/fonts/GeistMonoVF.woff +0 -0
  113. package/templates/default/src/fonts/GeistVF.woff +0 -0
  114. package/templates/default/src/hooks/use-resize-observer.tsx +55 -0
  115. package/templates/default/src/providers/theme.tsx +11 -0
  116. package/templates/default/src/styles/colors.css +805 -0
  117. package/templates/default/src/styles/globals.css +86 -0
  118. package/templates/default/src/styles/text-styles.css +177 -0
  119. package/templates/default/src/styles/theme.css +1310 -0
  120. package/templates/default/src/styles/typography.css +428 -0
  121. package/templates/default/tsconfig.json +27 -0
@@ -0,0 +1,58 @@
1
+ import tsPlugin from "@typescript-eslint/eslint-plugin";
2
+ import tsParser from "@typescript-eslint/parser";
3
+ import prettierConfig from "eslint-config-prettier";
4
+ import prettierPlugin from "eslint-plugin-prettier";
5
+ import unusedImports from "eslint-plugin-unused-imports";
6
+
7
+ export default [
8
+ {
9
+ ignores: ["node_modules/*"],
10
+ },
11
+ {
12
+ files: ["**/*.{js,jsx,ts,tsx}"],
13
+ languageOptions: {
14
+ parser: tsParser,
15
+ parserOptions: {
16
+ ecmaVersion: "latest",
17
+ sourceType: "module",
18
+ ecmaFeatures: {
19
+ jsx: true,
20
+ },
21
+ },
22
+ },
23
+ plugins: {
24
+ "@typescript-eslint": tsPlugin,
25
+ prettier: prettierPlugin,
26
+ "unused-imports": unusedImports,
27
+ },
28
+ rules: {
29
+ "unused-imports/no-unused-imports": "error",
30
+
31
+ "@typescript-eslint/consistent-type-imports": [
32
+ "error",
33
+ {
34
+ prefer: "type-imports",
35
+ fixStyle: "separate-type-imports",
36
+ disallowTypeAnnotations: true,
37
+ },
38
+ ],
39
+ "prettier/prettier": [
40
+ "error",
41
+ {},
42
+ {
43
+ usePrettierrc: true,
44
+ },
45
+ ],
46
+ "react/react-in-jsx-scope": "off",
47
+ "react/display-name": "off",
48
+ "react/jsx-keys": "off",
49
+ "react/no-unescaped-entities": "off",
50
+ "no-unused-vars": "off",
51
+ "no-undef": "off",
52
+ "no-redeclare": "warn",
53
+ "max-len": "off",
54
+ "jsx-a11y/alt-text": "off",
55
+ },
56
+ },
57
+ prettierConfig,
58
+ ];
@@ -0,0 +1,6 @@
1
+ import type { NextConfig } from "next";
2
+
3
+
4
+ const nextConfig: NextConfig = {}
5
+
6
+ export default nextConfig;
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "basic-form",
3
+ "version": "0.1.0",
4
+ "repository": "https://github.com/a-peak-works/starter-kits.git",
5
+ "author": "a-peak-works",
6
+ "license": "MIT",
7
+ "scripts": {
8
+ "dev": "next dev",
9
+ "build": "next build",
10
+ "start": "next start",
11
+ "lint": "next lint"
12
+ },
13
+ "dependencies": {
14
+ "@designbycode/tailwindcss-mask-image": "^2.0.3",
15
+ "@react-aria/utils": "^3.27.0",
16
+ "@react-stately/utils": "^3.10.5",
17
+ "@tailwindcss/postcss": "^4.0.4",
18
+ "@tailwindcss/typography": "^0.5.16",
19
+ "@untitledui/icons": "^0.0.15",
20
+ "input-otp": "^1.4.2",
21
+ "motion": "^11.18.2",
22
+ "next": "15.0.3",
23
+ "next-themes": "^0.4.4",
24
+ "qr-code-styling": "^1.9.1",
25
+ "react": "19.0.0",
26
+ "react-aria": "^3.37.0",
27
+ "react-aria-components": "^1.6.0",
28
+ "react-dom": "19.0.0",
29
+ "react-hotkeys-hook": "^4.6.1",
30
+ "sonner": "^1.7.4",
31
+ "tailwind-merge": "^3.0.1",
32
+ "tailwindcss": "^4.0.4",
33
+ "tailwindcss-animate": "^1.0.7",
34
+ "tailwindcss-react-aria-components": "^3.0.0-nightly-fee532d6a-241217"
35
+ },
36
+ "devDependencies": {
37
+ "@eslint/eslintrc": "^3.3.0",
38
+ "@trivago/prettier-plugin-sort-imports": "^5.2.2",
39
+ "@types/node": "^20.17.17",
40
+ "@types/react": "^18.3.18",
41
+ "@types/react-dom": "^18.3.5",
42
+ "@typescript-eslint/eslint-plugin": "^8.25.0",
43
+ "@typescript-eslint/parser": "^8.25.0",
44
+ "eslint": "^9.21.0",
45
+ "eslint-config-next": "15.0.3",
46
+ "eslint-config-prettier": "^10.0.1",
47
+ "eslint-plugin-import": "^2.31.0",
48
+ "eslint-plugin-prettier": "^5.2.3",
49
+ "eslint-plugin-simple-import-sort": "^12.1.1",
50
+ "eslint-plugin-unused-imports": "^4.1.4",
51
+ "postcss": "^8.5.1",
52
+ "postcss-loader": "^8.1.1",
53
+ "prettier": "^3.5.2",
54
+ "prettier-plugin-tailwindcss": "^0.6.11",
55
+ "typescript": "^5.7.3"
56
+ }
57
+ }
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
@@ -0,0 +1,109 @@
1
+ "use client";
2
+
3
+ import type { FormEvent } from "react";
4
+ import { Fragment } from "react";
5
+ import { ArrowRight } from "@untitledui/icons";
6
+ import { useTheme } from "next-themes";
7
+ import dynamic from "next/dynamic";
8
+ import Image from "next/image";
9
+ import Link from "next/link";
10
+ import { toast } from "sonner";
11
+ import { BadgeGroup } from "@/components/shared/badges/badge-groups";
12
+ import Button from "@/components/shared/buttons/button";
13
+ import { Form } from "@/components/shared/inputs/form/form";
14
+ import { Input } from "@/components/shared/inputs/input";
15
+ import { cx } from "@/components/utils";
16
+ import Spiral from "../../public/marketing/spirals.webp";
17
+
18
+ const Header = dynamic(() => import("@/components/marketing/header-navigation/components/header").then((mod) => mod.Header));
19
+
20
+ export const HomeScreen = () => {
21
+ const { systemTheme } = useTheme();
22
+ console.log(systemTheme);
23
+
24
+ const onSubmit = (event: FormEvent<HTMLFormElement>) => {
25
+ event.preventDefault();
26
+
27
+ const data = new FormData(event.currentTarget);
28
+
29
+ toast.custom((t) => (
30
+ <div
31
+ key={t}
32
+ className={cx(
33
+ "light-mode relative z-[var(--z-index)] flex max-w-full flex-col gap-4 rounded-xl border border-primary bg-primary p-4 shadow-lg xs:w-[var(--width)] xs:flex-row",
34
+ systemTheme === "dark" && "dark-mode",
35
+ )}
36
+ >
37
+ <pre className="w-full rounded-lg bg-secondary p-4 text-primary">
38
+ <code>{JSON.stringify(data, null, 2)}</code>
39
+ </pre>
40
+ </div>
41
+ ));
42
+ };
43
+
44
+ return (
45
+ <Fragment>
46
+ <Header />
47
+
48
+ <section className="relative bg-primary py-16 lg:flex lg:min-h-[720px] lg:items-center lg:py-24">
49
+ <div className="mx-auto flex w-full max-w-container items-center px-4 md:px-8">
50
+ <div className="flex flex-col items-start md:max-w-3xl lg:w-1/2 lg:pr-8">
51
+ <Link href="#" className="rounded-[10px] focus:outline-2 focus:outline-offset-2 focus:outline-focus-ring">
52
+ <BadgeGroup className="hidden md:flex" size="lg" addonText="We're hiring!" iconTrailing={ArrowRight} theme="modern" color="brand">
53
+ Join our remote team
54
+ </BadgeGroup>
55
+ <BadgeGroup className="md:hidden" size="md" addonText="We're hiring!" iconTrailing={ArrowRight} theme="modern" color="brand">
56
+ Join our remote team
57
+ </BadgeGroup>
58
+ </Link>
59
+
60
+ <h1 className="mt-4 td-md-semi text-primary md:td-lg-semi lg:td-xl-semi">People who care about your growth</h1>
61
+ <p className="mt-4 tt-lg text-tertiary md:mt-6 md:max-w-lg md:tt-xl">
62
+ Powerful, self-serve product and growth analytics to help you convert, engage, and retain more.
63
+ </p>
64
+
65
+ <Form
66
+ onSubmit={onSubmit}
67
+ className="mt-8 flex w-full flex-col items-stretch gap-4 md:mt-12 md:max-w-[480px] md:flex-row md:items-start"
68
+ >
69
+ <Input
70
+ isRequired
71
+ size="md"
72
+ name="email"
73
+ type="email"
74
+ wrapperClassName="py-0.5"
75
+ placeholder="Enter your email"
76
+ validate={(value) => value.includes("@") || "Please enter a valid email"}
77
+ hint={
78
+ <span>
79
+ We care about your data in our{" "}
80
+ <a
81
+ href="#"
82
+ className="rounded-sm underline underline-offset-3 focus:outline-2 focus:outline-offset-2 focus:outline-focus-ring"
83
+ >
84
+ privacy policy
85
+ </a>
86
+ .
87
+ </span>
88
+ }
89
+ />
90
+ <Button type="submit" size="xl">
91
+ Get started
92
+ </Button>
93
+ </Form>
94
+ </div>
95
+ </div>
96
+ <div className="relative mt-16 h-[240px] w-full px-4 md:h-[380px] md:px-8 lg:absolute lg:inset-y-0 lg:right-0 lg:mt-0 lg:h-full lg:w-1/2 lg:px-0">
97
+ <Image
98
+ fill
99
+ className="inset-0 size-full object-cover lg:absolute"
100
+ src={Spiral}
101
+ alt="Spirals"
102
+ priority
103
+ sizes="(min-width: 1024px) 50vw, 100vw"
104
+ />
105
+ </div>
106
+ </section>
107
+ </Fragment>
108
+ );
109
+ };
@@ -0,0 +1,42 @@
1
+ import type { Metadata, Viewport } from "next";
2
+ import localFont from "next/font/local";
3
+ import { cx } from "@/components/utils";
4
+ import { Theme } from "@/providers/theme";
5
+ import "@/styles/globals.css";
6
+
7
+ const geistSans = localFont({
8
+ src: "../fonts/GeistVF.woff",
9
+ variable: "--font-geist-sans",
10
+ weight: "100 900",
11
+ display: "swap",
12
+ });
13
+ const geistMono = localFont({
14
+ src: "../fonts/GeistMonoVF.woff",
15
+ variable: "--font-geist-mono",
16
+ weight: "100 900",
17
+ display: "swap",
18
+ });
19
+
20
+ export const metadata: Metadata = {
21
+ title: "Create Next App",
22
+ description: "Generated by create next app",
23
+ };
24
+
25
+ export const viewport: Viewport = {
26
+ themeColor: "#7f56d9",
27
+ colorScheme: "light dark",
28
+ };
29
+
30
+ export default function RootLayout({
31
+ children,
32
+ }: Readonly<{
33
+ children: React.ReactNode;
34
+ }>) {
35
+ return (
36
+ <html lang="en" suppressHydrationWarning>
37
+ <body className={cx(geistSans.variable, geistMono.variable, "bg-primary antialiased dark:dark-mode")}>
38
+ <Theme>{children}</Theme>
39
+ </body>
40
+ </html>
41
+ );
42
+ }
@@ -0,0 +1,40 @@
1
+ "use client";
2
+
3
+ import { ArrowLeft } from "@untitledui/icons";
4
+ import { useRouter } from "next/navigation";
5
+ import Button from "@/components/shared/buttons/button";
6
+
7
+ export default function NotFound() {
8
+ const router = useRouter();
9
+
10
+ return (
11
+ <section className="flex min-h-screen items-start bg-primary py-16 md:items-center md:py-24">
12
+ <div className="mx-auto max-w-container grow px-4 md:px-8">
13
+ <div className="flex w-full max-w-3xl flex-col gap-8 md:gap-12">
14
+ <div className="flex flex-col gap-4 md:gap-6">
15
+ <div className="flex flex-col gap-3">
16
+ <span className="tt-md-semi text-brand-secondary">404 error</span>
17
+ <h1 className="td-md-semi text-primary md:td-lg-semi lg:td-xl-semi">We can’t find that page</h1>
18
+ </div>
19
+ <p className="tt-lg text-tertiary md:tt-xl">Sorry, the page you are looking for doesn't exist or has been moved.</p>
20
+ </div>
21
+
22
+ <div className="flex flex-col-reverse gap-3 sm:flex-row">
23
+ <Button onClick={() => router.back()} color="secondary" size="xl" className="lg:hidden" iconLeading={ArrowLeft}>
24
+ Go back
25
+ </Button>
26
+ <Button onClick={() => router.back()} color="secondary" size="2xl" className="hidden lg:flex" iconLeading={ArrowLeft}>
27
+ Go back
28
+ </Button>
29
+ <Button href="/" size="xl" className="lg:hidden">
30
+ Take me home
31
+ </Button>
32
+ <Button href="/" size="2xl" className="hidden lg:flex">
33
+ Take me home
34
+ </Button>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </section>
39
+ );
40
+ }
@@ -0,0 +1,3 @@
1
+ import { HomeScreen } from "./home-screen";
2
+
3
+ export default HomeScreen;
@@ -0,0 +1,27 @@
1
+ "use client";
2
+
3
+ import type { HTMLAttributes } from "react";
4
+
5
+ const sizes = {
6
+ sm: {
7
+ wh: 8,
8
+ c: 4,
9
+ r: 3,
10
+ },
11
+ md: {
12
+ wh: 10,
13
+ c: 5,
14
+ r: 4,
15
+ },
16
+ };
17
+
18
+ const Dot = (props: HTMLAttributes<HTMLOrSVGElement> & { size?: "sm" | "md" }) => {
19
+ const { size = "md" } = props;
20
+ return (
21
+ <svg width={sizes[size].wh} height={sizes[size].wh} viewBox={`0 0 ${sizes[size].wh} ${sizes[size].wh}`} fill="none" {...props}>
22
+ <circle cx={sizes[size].c} cy={sizes[size].c} r={sizes[size].r} fill="currentColor" stroke="currentColor" />
23
+ </svg>
24
+ );
25
+ };
26
+
27
+ export default Dot;
@@ -0,0 +1,153 @@
1
+ import type { FC, ReactNode, Ref } from "react";
2
+ import { isValidElement } from "react";
3
+ import { cx, sortCx } from "@/components/utils";
4
+ import { isReactComponent } from "@/components/utils/isReactComponent";
5
+
6
+ const iconsSizes = {
7
+ sm: "size-4",
8
+ md: "size-5",
9
+ lg: "size-6",
10
+ xl: "size-7",
11
+ };
12
+
13
+ const styles = sortCx({
14
+ light: {
15
+ base: "rounded-full",
16
+ sizes: {
17
+ sm: "size-8",
18
+ md: "size-10",
19
+ lg: "size-12",
20
+ xl: "size-14",
21
+ },
22
+ colors: {
23
+ brand: "bg-brand-secondary text-featured-icon-light-fg-brand",
24
+ gray: "bg-tertiary text-featured-icon-light-fg-gray",
25
+ error: "bg-error-secondary text-featured-icon-light-fg-error",
26
+ warning: "bg-warning-secondary text-featured-icon-light-fg-warning",
27
+ success: "bg-success-secondary text-featured-icon-light-fg-success",
28
+ },
29
+ },
30
+
31
+ gradient: {
32
+ base: "rounded-full text-fg-white before:absolute before:inset-0 before:size-full before:rounded-full before:border before:mask-image-b after:absolute after:block after:rounded-full",
33
+ sizes: {
34
+ sm: "size-8 after:size-6",
35
+ md: "size-10 after:size-7",
36
+ lg: "size-12 after:size-8",
37
+ xl: "size-14 after:size-10",
38
+ },
39
+ colors: {
40
+ brand: "before:border-utility-brand-200 before:bg-utility-brand-50 after:bg-brand-solid",
41
+ gray: "before:border-utility-gray-200 before:bg-utility-gray-50 after:bg-secondary-solid",
42
+ error: "before:border-utility-error-200 before:bg-utility-error-50 after:bg-error-solid",
43
+ warning: "before:border-utility-warning-200 before:bg-utility-warning-50 after:bg-warning-solid",
44
+ success: "before:border-utility-success-200 before:bg-utility-success-50 after:bg-success-solid",
45
+ },
46
+ },
47
+
48
+ dark: {
49
+ base: "text-fg-white shadow-xs-skeumorphic before:absolute before:inset-px before:border before:border-white/12 before:mask-image-b",
50
+ sizes: {
51
+ sm: "size-8 rounded-md before:rounded-[5px]",
52
+ md: "size-10 rounded-lg before:rounded-[7px]",
53
+ lg: "size-12 rounded-[10px] before:rounded-[9px]",
54
+ xl: "size-14 rounded-xl before:rounded-[11px]",
55
+ },
56
+ colors: {
57
+ brand: "bg-brand-solid before:border-utility-brand-200/12",
58
+ gray: "bg-secondary-solid before:border-utility-gray-200/12",
59
+ error: "bg-error-solid before:border-utility-error-200/12",
60
+ warning: "bg-warning-solid before:border-utility-warning-200/12",
61
+ success: "bg-success-solid before:border-utility-success-200/12",
62
+ },
63
+ },
64
+
65
+ modern: {
66
+ base: "bg-primary shadow-xs-skeumorphic ring-1 ring-inset",
67
+ sizes: {
68
+ sm: "size-8 rounded-md",
69
+ md: "size-10 rounded-lg",
70
+ lg: "size-12 rounded-[10px]",
71
+ xl: "size-14 rounded-xl",
72
+ },
73
+ colors: {
74
+ brand: "",
75
+ gray: "text-fg-secondary ring-border-primary",
76
+ error: "",
77
+ warning: "",
78
+ success: "",
79
+ },
80
+ },
81
+ "modern-neue": {
82
+ base: [
83
+ "bg-primary_alt ring-1 ring-inset before:absolute before:inset-1",
84
+ // Shadow
85
+ "before:shadow-[0px_1px_2px_0px_rgba(0,0,0,0.1),0px_3px_3px_0px_rgba(0,0,0,0.09),1px_8px_5px_0px_rgba(0,0,0,0.05),2px_21px_6px_0px_rgba(0,0,0,0),0px_0px_0px_1px_rgba(0,0,0,0.08),1px_13px_5px_0px_rgba(0,0,0,0.01),0px_-2px_2px_0px_rgba(0,0,0,0.13)_inset] before:ring-1 before:ring-border-secondary_alt",
86
+ ].join(" "),
87
+ sizes: {
88
+ sm: "size-8 rounded-[8px] before:rounded-[4px]",
89
+ md: "size-10 rounded-[10px] before:rounded-[6px]",
90
+ lg: "size-12 rounded-[12px] before:rounded-[8px]",
91
+ xl: "size-14 rounded-[14px] before:rounded-[10px]",
92
+ },
93
+ colors: {
94
+ brand: "",
95
+ gray: "text-fg-secondary ring-border-primary",
96
+ error: "",
97
+ warning: "",
98
+ success: "",
99
+ },
100
+ },
101
+
102
+ outline: {
103
+ base: "before:absolute before:rounded-full before:border-2 after:absolute after:rounded-full after:border-2",
104
+ sizes: {
105
+ sm: "size-4 before:size-6 after:size-8.5",
106
+ md: "size-5 before:size-7 after:size-9.5",
107
+ lg: "size-6 before:size-8 after:size-10.5",
108
+ xl: "size-7 before:size-9 after:size-11.5",
109
+ },
110
+ colors: {
111
+ brand: "text-fg-brand-primary before:border-fg-brand-primary/30 after:border-fg-brand-primary/10",
112
+ gray: "text-fg-tertiary before:border-fg-tertiary/30 after:border-fg-tertiary/10",
113
+ error: "text-fg-error-primary before:border-fg-error-primary/30 after:border-fg-error-primary/10",
114
+ warning: "text-fg-warning-primary before:border-fg-warning-primary/30 after:border-fg-warning-primary/10",
115
+ success: "text-fg-success-primary before:border-fg-success-primary/30 after:border-fg-success-primary/10",
116
+ },
117
+ },
118
+ });
119
+
120
+ interface FeaturedIconProps {
121
+ ref?: Ref<HTMLDivElement>;
122
+ children?: ReactNode;
123
+ className?: string;
124
+ icon?: FC<{ className?: string }> | ReactNode;
125
+ size?: "sm" | "md" | "lg" | "xl";
126
+ color: "brand" | "gray" | "success" | "warning" | "error";
127
+ theme?: "light" | "gradient" | "dark" | "outline" | "modern" | "modern-neue";
128
+ }
129
+
130
+ export const FeaturedIcon = (props: FeaturedIconProps) => {
131
+ const { size = "sm", theme: variant = "light", color = "brand", icon: Icon } = props;
132
+
133
+ return (
134
+ <div
135
+ {...props}
136
+ data-featured-icon
137
+ className={cx(
138
+ "relative flex shrink-0 items-center justify-center",
139
+
140
+ styles[variant].base,
141
+ styles[variant].sizes[size],
142
+ styles[variant].colors[color],
143
+
144
+ props.className,
145
+ )}
146
+ >
147
+ {isReactComponent(Icon) && <Icon className={cx("z-1", iconsSizes[size])} />}
148
+ {isValidElement(Icon) && <div className="z-1">{Icon}</div>}
149
+
150
+ {props.children}
151
+ </div>
152
+ );
153
+ };
@@ -0,0 +1,63 @@
1
+ "use client";
2
+
3
+ import type { HTMLAttributes } from "react";
4
+ import { cx } from "../../utils";
5
+ import UntitledLogoMinimal from "./UntitledLogoMinimal";
6
+
7
+ const UntitledLogo = (props: HTMLAttributes<HTMLOrSVGElement>) => {
8
+ return (
9
+ <svg width="139" height="32" viewBox="0 0 139 32" {...props} className={cx("overflow-visible", props.className)}>
10
+ <foreignObject width="100%" height="100%" x="0" y="0" className="overflow-visible">
11
+ <div className="flex items-center gap-2.5">
12
+ {/* Minimal logo */}
13
+ <UntitledLogoMinimal className="size-8" />
14
+
15
+ {/* Logomark */}
16
+ <svg width="97" height="32" viewBox="0 0 97 32" fill="none">
17
+ <path
18
+ d="M33.9101 10.2372C34.2321 10.5355 34.6179 10.6847 35.0678 10.6847C35.5176 10.6847 35.9011 10.5355 36.2183 10.2372C36.5403 9.9342 36.7013 9.57199 36.7013 9.15058C36.7013 8.73392 36.5403 8.37644 36.2183 8.07814C35.9011 7.77511 35.5176 7.6236 35.0678 7.6236C34.6179 7.6236 34.2321 7.77511 33.9101 8.07814C33.5928 8.37644 33.4342 8.73392 33.4342 9.15058C33.4342 9.57199 33.5928 9.9342 33.9101 10.2372Z"
19
+ className="fill-fg-primary"
20
+ />
21
+ <path
22
+ d="M11.2997 20.6847C11.8063 19.8892 12.0597 18.9612 12.0597 17.9006V8.45456H8.98438V17.6378C8.98438 18.1918 8.86127 18.6842 8.61506 19.1151C8.37358 19.5459 8.0303 19.8845 7.58523 20.1307C7.14489 20.3769 6.62642 20.5 6.02983 20.5C5.43797 20.5 4.91951 20.3769 4.47443 20.1307C4.02936 19.8845 3.68371 19.5459 3.4375 19.1151C3.19602 18.6842 3.07528 18.1918 3.07528 17.6378V8.45456H0V17.9006C0 18.9612 0.250947 19.8892 0.752841 20.6847C1.25473 21.4801 1.95786 22.1004 2.86222 22.5455C3.76657 22.9858 4.82244 23.206 6.02983 23.206C7.23248 23.206 8.28599 22.9858 9.19034 22.5455C10.0947 22.1004 10.7978 21.4801 11.2997 20.6847Z"
23
+ className="fill-fg-primary"
24
+ />
25
+ <path
26
+ d="M18.3589 12.51C17.7907 12.8793 17.3859 13.3812 17.1444 14.0156H17.0165V12.0909H14.133V23H17.1586V16.6932C17.1633 16.2244 17.2509 15.8244 17.4214 15.4929C17.5966 15.1567 17.838 14.9011 18.1458 14.7259C18.4583 14.5507 18.8182 14.4631 19.2254 14.4631C19.8314 14.4631 20.3073 14.6525 20.6529 15.0313C20.9986 15.4053 21.169 15.9262 21.1643 16.5938V23H24.1898V16.054C24.1898 15.2065 24.0336 14.4773 23.7211 13.8665C23.4086 13.251 22.9706 12.7775 22.4072 12.446C21.8437 12.1146 21.1832 11.9489 20.4256 11.9489C19.616 11.9489 18.9271 12.1359 18.3589 12.51Z"
27
+ className="fill-fg-primary"
28
+ />
29
+ <path
30
+ d="M27.3463 21.821C27.0433 21.3523 26.8941 20.7604 26.8989 20.0455V14.3637H25.4074V12.0909H26.8989V9.47729H29.9244V12.0909H31.977V14.3637H29.9244V19.6477C29.9244 19.9271 29.967 20.1449 30.0523 20.3012C30.1375 20.4527 30.2559 20.5592 30.4074 20.6208C30.5636 20.6823 30.7436 20.7131 30.9472 20.7131C31.0892 20.7131 31.2313 20.7012 31.3733 20.6776C31.5153 20.6492 31.6242 20.6279 31.7 20.6137L32.1759 22.8651C32.0243 22.9124 31.8113 22.9669 31.5366 23.0284C31.262 23.0947 30.9282 23.135 30.5352 23.1492C29.8061 23.1776 29.1669 23.0805 28.6176 22.858C28.0731 22.6354 27.6493 22.2898 27.3463 21.821Z"
31
+ className="fill-fg-primary"
32
+ />
33
+ <path
34
+ d="M39.769 21.821C39.4659 21.3523 39.3168 20.7604 39.3215 20.0455V14.3637H37.83V12.0909H39.3215V9.47729H42.3471V12.0909H44.3996V14.3637H42.3471V19.6477C42.3471 19.9271 42.3897 20.1449 42.4749 20.3012C42.5602 20.4527 42.6785 20.5592 42.83 20.6208C42.9863 20.6823 43.1662 20.7131 43.3698 20.7131C43.5119 20.7131 43.6539 20.7012 43.796 20.6776C43.938 20.6492 44.0469 20.6279 44.1227 20.6137L44.5985 22.8651C44.447 22.9124 44.2339 22.9669 43.9593 23.0284C43.6847 23.0947 43.3509 23.135 42.9579 23.1492C42.2287 23.1776 41.5895 23.0805 41.0403 22.858C40.4958 22.6354 40.072 22.2898 39.769 21.821Z"
35
+ className="fill-fg-primary"
36
+ />
37
+ <path
38
+ fillRule="evenodd"
39
+ clipRule="evenodd"
40
+ d="M56.2257 23.2131C55.1035 23.2131 54.1376 22.9858 53.328 22.5313C52.5231 22.072 51.9028 21.4233 51.4672 20.5852C51.0316 19.7424 50.8138 18.7458 50.8138 17.5952C50.8138 16.473 51.0316 15.4882 51.4672 14.6406C51.9028 13.7931 52.516 13.1326 53.3067 12.6591C54.1021 12.1856 55.0349 11.9489 56.105 11.9489C56.8247 11.9489 57.4946 12.0649 58.1149 12.2969C58.7399 12.5242 59.2844 12.8674 59.7484 13.3267C60.2172 13.786 60.5818 14.3637 60.8422 15.0597C61.1026 15.751 61.2328 16.5606 61.2328 17.4887V18.3196H53.8038V18.3267C53.8038 18.8665 53.9033 19.3329 54.1021 19.7259C54.3057 20.1189 54.5922 20.4219 54.9615 20.635C55.3308 20.848 55.7688 20.9546 56.2754 20.9546C56.6116 20.9546 56.9194 20.9072 57.1987 20.8125C57.4781 20.7178 57.7172 20.5758 57.916 20.3864C58.1149 20.197 58.2664 19.965 58.3706 19.6904L61.1689 19.875C61.0268 20.5474 60.7357 21.1345 60.2953 21.6364C59.8597 22.1335 59.2963 22.5218 58.605 22.8012C57.9184 23.0758 57.1253 23.2131 56.2257 23.2131ZM54.1092 15.3722C53.9258 15.6954 53.8249 16.0529 53.8067 16.4446H58.3848C58.3848 16.009 58.2901 15.6231 58.1007 15.2869C57.9113 14.9508 57.6485 14.688 57.3124 14.4986C56.9809 14.3045 56.595 14.2074 56.1547 14.2074C55.6954 14.2074 55.2882 14.3139 54.9331 14.527C54.5827 14.7353 54.3081 15.0171 54.1092 15.3722Z"
41
+ className="fill-fg-primary"
42
+ />
43
+ <path
44
+ fillRule="evenodd"
45
+ clipRule="evenodd"
46
+ d="M64.5757 22.5384C65.2481 22.9645 65.9985 23.1776 66.8271 23.1776C67.4143 23.1776 67.9114 23.0805 68.3186 22.8864C68.7305 22.6923 69.0643 22.4484 69.32 22.1548C69.5804 21.8566 69.7817 21.5559 69.9237 21.2529H70.0516V23H73.0345V8.45456H70.0161V13.9233H69.9237C69.7911 13.6298 69.597 13.3315 69.3413 13.0284C69.0904 12.7207 68.7589 12.465 68.347 12.2614C67.9398 12.053 67.4308 11.9489 66.82 11.9489C66.0198 11.9489 65.2836 12.1572 64.6112 12.5739C63.9436 12.9858 63.4086 13.6084 63.0061 14.4418C62.6036 15.2704 62.4024 16.3097 62.4024 17.5597C62.4024 18.7765 62.5965 19.804 62.9848 20.6421C63.3778 21.4754 63.9081 22.1075 64.5757 22.5384ZM69.0217 20.3722C68.6856 20.6373 68.2736 20.7699 67.7859 20.7699C67.2888 20.7699 66.8698 20.635 66.5288 20.3651C66.1927 20.0905 65.9346 19.7117 65.7547 19.2287C65.5795 18.741 65.4919 18.1799 65.4919 17.5455C65.4919 16.9157 65.5795 16.3618 65.7547 15.8835C65.9299 15.4053 66.1879 15.0313 66.5288 14.7614C66.8698 14.4915 67.2888 14.3566 67.7859 14.3566C68.2736 14.3566 68.6879 14.4868 69.0288 14.7472C69.3698 15.0076 69.6302 15.3769 69.8101 15.8551C69.99 16.3334 70.08 16.8968 70.08 17.5455C70.08 18.1941 69.9876 18.76 69.803 19.2429C69.6231 19.7259 69.3626 20.1023 69.0217 20.3722Z"
47
+ className="fill-fg-primary"
48
+ />
49
+ <path
50
+ d="M88.0229 19.1151C88.2691 18.6842 88.3922 18.1918 88.3922 17.6378V8.45456H91.4675V17.9006C91.4675 18.9612 91.2142 19.8892 90.7075 20.6847C90.2056 21.4801 89.5025 22.1004 88.5982 22.5455C87.6938 22.9858 86.6403 23.206 85.4376 23.206C84.2303 23.206 83.1744 22.9858 82.27 22.5455C81.3657 22.1004 80.6625 21.4801 80.1607 20.6847C79.6588 19.8892 79.4078 18.9612 79.4078 17.9006V8.45456H82.4831V17.6378C82.4831 18.1918 82.6038 18.6842 82.8453 19.1151C83.0915 19.5459 83.4372 19.8845 83.8822 20.1307C84.3273 20.3769 84.8458 20.5 85.4376 20.5C86.0342 20.5 86.5527 20.3769 86.993 20.1307C87.4381 19.8845 87.7814 19.5459 88.0229 19.1151Z"
51
+ className="fill-fg-primary"
52
+ />
53
+ <path d="M33.5479 12.0909V23H36.5734V12.0909H33.5479Z" className="fill-fg-primary" />
54
+ <path d="M49.2305 23V8.45456H46.2049V23H49.2305Z" className="fill-fg-primary" />
55
+ <path d="M96.6729 23V8.45456H93.5977V23H96.6729Z" className="fill-fg-primary" />
56
+ </svg>
57
+ </div>
58
+ </foreignObject>
59
+ </svg>
60
+ );
61
+ };
62
+
63
+ export default UntitledLogo;