@dub/ui 0.0.8 → 0.0.9

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 (134) hide show
  1. package/README.md +11 -0
  2. package/dist/accordion.d.mts +9 -0
  3. package/dist/accordion.mjs +1 -1
  4. package/dist/avatar.d.mts +15 -0
  5. package/dist/avatar.mjs +1 -1
  6. package/dist/background.d.mts +5 -0
  7. package/dist/background.mjs +1 -1
  8. package/dist/badge.d.mts +12 -0
  9. package/dist/badge.mjs +1 -1
  10. package/dist/button.d.mts +13 -0
  11. package/dist/button.mjs +1 -1
  12. package/dist/chunk-3Y5WGFFC.mjs +2 -0
  13. package/dist/chunk-4Y22ZONT.mjs +2 -0
  14. package/dist/chunk-B7YPSVHM.mjs +2 -0
  15. package/dist/chunk-BCILXFZH.mjs +2 -0
  16. package/dist/chunk-BZY4AURF.mjs +2 -0
  17. package/dist/chunk-HZBYDQAF.mjs +2 -0
  18. package/dist/chunk-IMRGY4OW.mjs +2 -0
  19. package/dist/chunk-JF4XLNZS.mjs +2 -0
  20. package/dist/chunk-OIIHWZYP.mjs +2 -0
  21. package/dist/chunk-S32PKYSI.mjs +8 -0
  22. package/dist/chunk-XG3NPZVV.mjs +2 -0
  23. package/dist/copy-button.d.mts +8 -0
  24. package/dist/copy-button.mjs +1 -1
  25. package/dist/footer.d.mts +5 -0
  26. package/dist/footer.mjs +1 -1
  27. package/dist/form.d.mts +14 -0
  28. package/dist/form.mjs +1 -1
  29. package/dist/icon-menu.d.mts +10 -0
  30. package/dist/icon-menu.mjs +1 -1
  31. package/dist/icons/copy.d.mts +7 -0
  32. package/dist/icons/copy.mjs +1 -1
  33. package/dist/icons/expanding-arrow.d.mts +7 -0
  34. package/dist/icons/expanding-arrow.mjs +1 -1
  35. package/dist/icons/facebook.d.mts +8 -0
  36. package/dist/icons/facebook.mjs +1 -1
  37. package/dist/icons/github.d.mts +7 -0
  38. package/dist/icons/github.mjs +1 -1
  39. package/dist/icons/google.d.mts +7 -0
  40. package/dist/icons/google.mjs +1 -1
  41. package/dist/icons/index.d.mts +17 -0
  42. package/dist/icons/index.mjs +1 -1
  43. package/dist/icons/linkedin.d.mts +8 -0
  44. package/dist/icons/linkedin.mjs +1 -1
  45. package/dist/icons/loading-circle.d.mts +7 -0
  46. package/dist/icons/loading-circle.mjs +1 -1
  47. package/dist/icons/loading-dots.d.mts +5 -0
  48. package/dist/icons/loading-dots.mjs +1 -1
  49. package/dist/icons/loading-spinner.d.mts +7 -0
  50. package/dist/icons/loading-spinner.mjs +1 -1
  51. package/dist/icons/logo.d.mts +7 -0
  52. package/dist/icons/logo.mjs +1 -1
  53. package/dist/icons/logotype.d.mts +7 -0
  54. package/dist/icons/logotype.mjs +1 -1
  55. package/dist/icons/magic.d.mts +7 -0
  56. package/dist/icons/magic.mjs +1 -1
  57. package/dist/icons/photo.d.mts +7 -0
  58. package/dist/icons/photo.mjs +1 -1
  59. package/dist/icons/tick.d.mts +7 -0
  60. package/dist/icons/tick.mjs +1 -1
  61. package/dist/icons/twitter.d.mts +7 -0
  62. package/dist/icons/twitter.mjs +1 -1
  63. package/dist/icons/unsplash.d.mts +7 -0
  64. package/dist/icons/unsplash.mjs +1 -1
  65. package/dist/index.d.mts +69 -0
  66. package/dist/index.mjs +1 -1
  67. package/dist/link-preview.d.mts +7 -0
  68. package/dist/link-preview.mjs +1 -1
  69. package/dist/max-width-wrapper.d.mts +9 -0
  70. package/dist/max-width-wrapper.mjs +1 -1
  71. package/dist/modal.d.mts +14 -0
  72. package/dist/modal.mjs +1 -1
  73. package/dist/nav-mobile.d.mts +5 -0
  74. package/dist/nav-mobile.mjs +1 -1
  75. package/dist/nav.d.mts +9 -0
  76. package/dist/nav.mjs +1 -1
  77. package/dist/popover.d.mts +13 -0
  78. package/dist/popover.mjs +1 -1
  79. package/dist/switch.d.mts +14 -0
  80. package/dist/switch.mjs +1 -1
  81. package/dist/tab-select.d.mts +9 -0
  82. package/dist/tab-select.mjs +1 -1
  83. package/dist/tooltip.d.mts +32 -0
  84. package/dist/tooltip.mjs +1 -1
  85. package/package.json +13 -14
  86. package/.turbo/turbo-build.log +0 -123
  87. package/postcss.config.js +0 -9
  88. package/src/accordion.tsx +0 -60
  89. package/src/avatar.tsx +0 -47
  90. package/src/background.tsx +0 -71
  91. package/src/badge.tsx +0 -33
  92. package/src/button.tsx +0 -60
  93. package/src/content.ts +0 -34
  94. package/src/copy-button.tsx +0 -39
  95. package/src/footer.tsx +0 -204
  96. package/src/form.tsx +0 -77
  97. package/src/hooks/index.ts +0 -5
  98. package/src/hooks/use-current-anchor.ts +0 -65
  99. package/src/hooks/use-intersection-observer.ts +0 -41
  100. package/src/hooks/use-local-storage.ts +0 -24
  101. package/src/hooks/use-media-query.ts +0 -46
  102. package/src/hooks/use-scroll.ts +0 -21
  103. package/src/icon-menu.tsx +0 -15
  104. package/src/icons/copy.tsx +0 -18
  105. package/src/icons/expanding-arrow.tsx +0 -39
  106. package/src/icons/facebook.tsx +0 -23
  107. package/src/icons/github.tsx +0 -14
  108. package/src/icons/google.tsx +0 -12
  109. package/src/icons/index.tsx +0 -23
  110. package/src/icons/linkedin.tsx +0 -22
  111. package/src/icons/loading-circle.tsx +0 -25
  112. package/src/icons/loading-dots.tsx +0 -21
  113. package/src/icons/loading-spinner.tsx +0 -34
  114. package/src/icons/logo.tsx +0 -29
  115. package/src/icons/logotype.tsx +0 -51
  116. package/src/icons/magic.tsx +0 -30
  117. package/src/icons/photo.tsx +0 -20
  118. package/src/icons/tick.tsx +0 -18
  119. package/src/icons/twitter.tsx +0 -31
  120. package/src/icons/unsplash.tsx +0 -17
  121. package/src/index.tsx +0 -35
  122. package/src/link-preview.tsx +0 -111
  123. package/src/max-width-wrapper.tsx +0 -21
  124. package/src/modal.tsx +0 -102
  125. package/src/nav-mobile.tsx +0 -108
  126. package/src/nav.tsx +0 -205
  127. package/src/popover.tsx +0 -61
  128. package/src/styles.css +0 -3
  129. package/src/switch.tsx +0 -60
  130. package/src/tab-select.tsx +0 -27
  131. package/src/tooltip.tsx +0 -184
  132. package/tailwind.config.ts +0 -9
  133. package/tsconfig.json +0 -5
  134. package/tsup.config.ts +0 -15
package/src/modal.tsx DELETED
@@ -1,102 +0,0 @@
1
- "use client";
2
-
3
- import { cn } from "@dub/utils";
4
- import * as Dialog from "@radix-ui/react-dialog";
5
- import { useRouter } from "next/navigation";
6
- import { Dispatch, SetStateAction } from "react";
7
- import { Drawer } from "vaul";
8
- import { useMediaQuery } from "./hooks";
9
-
10
- export function Modal({
11
- children,
12
- className,
13
- dialogOnly,
14
- showModal,
15
- setShowModal,
16
- onClose,
17
- preventDefaultClose,
18
- }: {
19
- children: React.ReactNode;
20
- className?: string;
21
- dialogOnly?: boolean;
22
- showModal?: boolean;
23
- setShowModal?: Dispatch<SetStateAction<boolean>>;
24
- onClose?: () => void;
25
- preventDefaultClose?: boolean;
26
- }) {
27
- const router = useRouter();
28
-
29
- const closeModal = ({ dragged }: { dragged?: boolean } = {}) => {
30
- if (preventDefaultClose && !dragged) {
31
- return;
32
- }
33
- // fire onClose event if provided
34
- onClose && onClose();
35
-
36
- // if setShowModal is defined, use it to close modal
37
- if (setShowModal) {
38
- setShowModal(false);
39
- // else, this is intercepting route @modal
40
- } else {
41
- router.back();
42
- }
43
- };
44
- const { isMobile } = useMediaQuery();
45
-
46
- if (isMobile && !dialogOnly) {
47
- return (
48
- <Drawer.Root
49
- open={setShowModal ? showModal : true}
50
- onOpenChange={(open) => {
51
- if (!open) {
52
- closeModal({ dragged: true });
53
- }
54
- }}
55
- >
56
- <Drawer.Overlay className="fixed inset-0 z-40 bg-gray-100 bg-opacity-10 backdrop-blur" />
57
- <Drawer.Portal>
58
- <Drawer.Content
59
- className={cn(
60
- "fixed bottom-0 left-0 right-0 z-50 mt-24 rounded-t-[10px] border-t border-gray-200 bg-white",
61
- className,
62
- )}
63
- >
64
- <div className="sticky top-0 z-20 flex w-full items-center justify-center rounded-t-[10px] bg-inherit">
65
- <div className="my-3 h-1 w-12 rounded-full bg-gray-300" />
66
- </div>
67
- {children}
68
- </Drawer.Content>
69
- <Drawer.Overlay />
70
- </Drawer.Portal>
71
- </Drawer.Root>
72
- );
73
- }
74
- return (
75
- <Dialog.Root
76
- open={setShowModal ? showModal : true}
77
- onOpenChange={(open) => {
78
- if (!open) {
79
- closeModal();
80
- }
81
- }}
82
- >
83
- <Dialog.Portal>
84
- <Dialog.Overlay
85
- // for detecting when there's an active opened modal
86
- id="modal-backdrop"
87
- className="animate-fade-in fixed inset-0 z-40 bg-gray-100 bg-opacity-50 backdrop-blur-md"
88
- />
89
- <Dialog.Content
90
- onOpenAutoFocus={(e) => e.preventDefault()}
91
- onCloseAutoFocus={(e) => e.preventDefault()}
92
- className={cn(
93
- "animate-scale-in fixed inset-0 z-40 m-auto max-h-fit w-full max-w-md overflow-hidden border border-gray-200 bg-white p-0 shadow-xl md:rounded-2xl",
94
- className,
95
- )}
96
- >
97
- {children}
98
- </Dialog.Content>
99
- </Dialog.Portal>
100
- </Dialog.Root>
101
- );
102
- }
@@ -1,108 +0,0 @@
1
- "use client";
2
-
3
- import { APP_DOMAIN, cn } from "@dub/utils";
4
- import { ChevronDown, Menu, X } from "lucide-react";
5
- import Link from "next/link";
6
- import { useParams } from "next/navigation";
7
- import { useState } from "react";
8
- import { FEATURES_LIST } from "./content";
9
- import { navItems } from "./nav";
10
-
11
- export function NavMobile() {
12
- const { domain = "dub.co" } = useParams() as { domain: string };
13
- const [open, setOpen] = useState(false);
14
- const [openFeatures, setOpenFeatures] = useState(false);
15
-
16
- return (
17
- <>
18
- <button
19
- onClick={() => setOpen(!open)}
20
- className={cn(
21
- "absolute right-3 top-3 z-40 rounded-full p-2 transition-colors duration-200 hover:bg-gray-200 focus:outline-none active:bg-gray-300 lg:hidden",
22
- open && "hover:bg-gray-100 active:bg-gray-200",
23
- )}
24
- >
25
- {open ? (
26
- <X className="h-5 w-5 text-gray-600" />
27
- ) : (
28
- <Menu className="h-5 w-5 text-gray-600" />
29
- )}
30
- </button>
31
- <nav
32
- className={cn(
33
- "fixed inset-0 z-20 hidden w-full bg-white px-5 py-16",
34
- open && "block",
35
- )}
36
- >
37
- <ul className="grid divide-y divide-gray-200">
38
- <li className="py-3">
39
- <button
40
- className="flex w-full justify-between"
41
- onClick={() => setOpenFeatures(!openFeatures)}
42
- >
43
- <p className="font-semibold">Features</p>
44
- <ChevronDown
45
- className={cn(
46
- "h-5 w-5 text-gray-500 transition-all",
47
- openFeatures && "rotate-180",
48
- )}
49
- />
50
- </button>
51
- {openFeatures && (
52
- <div className="grid gap-4 overflow-hidden py-4">
53
- {FEATURES_LIST.map(({ slug, icon: Icon, shortTitle }) => (
54
- <Link
55
- key={slug}
56
- href={
57
- domain === "dub.co"
58
- ? `/features/${slug}`
59
- : `https://dub.co/features/${slug}?utm_source=${domain}&utm_medium=referral&utm_campaign=custom-domain`
60
- }
61
- onClick={() => setOpen(false)}
62
- className="flex w-full space-x-2"
63
- >
64
- <Icon className="h-5 w-5 text-gray-500" />
65
- <span className="text-sm">{shortTitle}</span>
66
- </Link>
67
- ))}
68
- </div>
69
- )}
70
- </li>
71
- {navItems.map(({ name, slug }) => (
72
- <li key={slug} className="py-3">
73
- <Link
74
- href={
75
- domain === "dub.co"
76
- ? `/${slug}`
77
- : `https://dub.co/${slug}?utm_source=${domain}&utm_medium=referral&utm_campaign=custom-domain`
78
- }
79
- onClick={() => setOpen(false)}
80
- className="flex w-full font-semibold capitalize"
81
- >
82
- {name}
83
- </Link>
84
- </li>
85
- ))}
86
-
87
- <li className="py-3">
88
- <Link
89
- href={`${APP_DOMAIN}/login`}
90
- className="flex w-full font-semibold capitalize"
91
- >
92
- Log in
93
- </Link>
94
- </li>
95
-
96
- <li className="py-3">
97
- <Link
98
- href={`${APP_DOMAIN}/register`}
99
- className="flex w-full font-semibold capitalize"
100
- >
101
- Sign Up
102
- </Link>
103
- </li>
104
- </ul>
105
- </nav>
106
- </>
107
- );
108
- }
package/src/nav.tsx DELETED
@@ -1,205 +0,0 @@
1
- "use client";
2
-
3
- import { APP_DOMAIN, SHOW_BACKGROUND_SEGMENTS, cn } from "@dub/utils";
4
- import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
5
- import va from "@vercel/analytics";
6
- import { ChevronDown } from "lucide-react";
7
- import Link from "next/link";
8
- import { useParams, useSelectedLayoutSegment } from "next/navigation";
9
- import { FEATURES_LIST } from "./content";
10
- import { useScroll } from "./hooks";
11
- import { LogoType } from "./icons";
12
- import { MaxWidthWrapper } from "./max-width-wrapper";
13
-
14
- export const navItems = [
15
- {
16
- name: "Customers",
17
- slug: "customers",
18
- },
19
- {
20
- name: "Changelog",
21
- slug: "changelog",
22
- },
23
- {
24
- name: "Help",
25
- slug: "help",
26
- },
27
- {
28
- name: "Pricing",
29
- slug: "pricing",
30
- },
31
- ];
32
-
33
- export function Nav() {
34
- const { domain = "dub.co" } = useParams() as { domain: string };
35
- const scrolled = useScroll(80);
36
- const selectedLayout = useSelectedLayoutSegment();
37
- const helpCenter = selectedLayout === "help";
38
-
39
- return (
40
- <div
41
- className={cn(`sticky inset-x-0 top-0 z-30 w-full transition-all`, {
42
- "border-b border-gray-200 bg-white/75 backdrop-blur-lg": scrolled,
43
- "border-b border-gray-200 bg-white":
44
- selectedLayout && !SHOW_BACKGROUND_SEGMENTS.includes(selectedLayout),
45
- })}
46
- >
47
- <MaxWidthWrapper
48
- {...(helpCenter && {
49
- className: "max-w-screen-lg",
50
- })}
51
- >
52
- <div className="flex h-14 items-center justify-between">
53
- <div className="flex items-center space-x-4">
54
- <Link
55
- href={domain === "dub.co" ? "/" : `https://dub.co`}
56
- {...(domain !== "dub.co" && {
57
- onClick: () => {
58
- va.track("Referred from custom domain", {
59
- domain,
60
- medium: "logo",
61
- });
62
- },
63
- })}
64
- >
65
- <LogoType />
66
- </Link>
67
- {helpCenter ? (
68
- <div className="flex items-center">
69
- <div className="mr-3 h-5 border-l-2 border-gray-400" />
70
- <Link
71
- href="/help"
72
- className="font-display text-lg font-bold text-gray-700"
73
- >
74
- Help Center
75
- </Link>
76
- </div>
77
- ) : (
78
- <NavigationMenuPrimitive.Root
79
- delayDuration={0}
80
- className="relative hidden lg:block"
81
- >
82
- <NavigationMenuPrimitive.List className="flex flex-row space-x-2 p-4">
83
- <NavigationMenuPrimitive.Item>
84
- <NavigationMenuPrimitive.Trigger className="group flex items-center space-x-2 rounded-md px-3 py-2 text-sm font-medium hover:bg-gray-100 focus:outline-none">
85
- <p
86
- className={cn(
87
- "text-sm font-medium text-gray-500 transition-colors ease-out group-hover:text-black",
88
- {
89
- "text-black": selectedLayout === "features",
90
- },
91
- )}
92
- >
93
- Features
94
- </p>
95
- <ChevronDown className="h-4 w-4 transition-all group-data-[state=open]:rotate-180" />
96
- </NavigationMenuPrimitive.Trigger>
97
-
98
- <NavigationMenuPrimitive.Content>
99
- <div className="grid w-[32rem] grid-cols-2 gap-1 p-3">
100
- {FEATURES_LIST.map(
101
- ({ slug, icon: Icon, title, shortTitle }) => (
102
- <Link
103
- key={slug}
104
- href={
105
- domain === "dub.co"
106
- ? `/features/${slug}`
107
- : `https://dub.co/features/${slug}`
108
- }
109
- {...(domain !== "dub.co" && {
110
- onClick: () => {
111
- va.track("Referred from custom domain", {
112
- domain,
113
- medium: `navbar item (features/${slug})`,
114
- });
115
- },
116
- })}
117
- className="rounded-lg p-3 transition-colors hover:bg-gray-100 active:bg-gray-200"
118
- >
119
- <div className="flex items-center space-x-2">
120
- <Icon className="h-4 w-4 text-gray-700" />
121
- <p className="text-sm font-medium text-gray-700">
122
- {shortTitle}
123
- </p>
124
- </div>
125
- <p className="mt-1 line-clamp-1 text-sm text-gray-500">
126
- {title}
127
- </p>
128
- </Link>
129
- ),
130
- )}
131
- </div>
132
- </NavigationMenuPrimitive.Content>
133
- </NavigationMenuPrimitive.Item>
134
-
135
- {navItems.map(({ name, slug }) => (
136
- <NavigationMenuPrimitive.Item key={slug} asChild>
137
- <Link
138
- id={`nav-${slug}`}
139
- key={slug}
140
- href={
141
- domain === "dub.co"
142
- ? `/${slug}`
143
- : `https://dub.co/${slug}`
144
- }
145
- {...(domain !== "dub.co" && {
146
- onClick: () => {
147
- va.track("Referred from custom domain", {
148
- domain,
149
- medium: `navbar item (${slug})`,
150
- });
151
- },
152
- })}
153
- className={cn(
154
- "rounded-md px-3 py-2 text-sm font-medium text-gray-500 transition-colors ease-out hover:text-black",
155
- {
156
- "text-black": selectedLayout === slug,
157
- },
158
- )}
159
- >
160
- {name}
161
- </Link>
162
- </NavigationMenuPrimitive.Item>
163
- ))}
164
- </NavigationMenuPrimitive.List>
165
-
166
- <NavigationMenuPrimitive.Viewport className="data-[state=closed]:animate-scale-out-content data-[state=open]:animate-scale-in-content absolute left-0 top-full flex w-[var(--radix-navigation-menu-viewport-width)] origin-[top_center] justify-start rounded-lg border border-gray-200 bg-white shadow-lg" />
167
- </NavigationMenuPrimitive.Root>
168
- )}
169
- </div>
170
-
171
- <div className="hidden lg:block">
172
- <Link
173
- href={`${APP_DOMAIN}/login`}
174
- {...(domain !== "dub.co" && {
175
- onClick: () => {
176
- va.track("Referred from custom domain", {
177
- domain,
178
- medium: `navbar item (login)`,
179
- });
180
- },
181
- })}
182
- className="animate-fade-in rounded-full px-4 py-1.5 text-sm font-medium text-gray-500 transition-colors ease-out hover:text-black"
183
- >
184
- Log in
185
- </Link>
186
- <Link
187
- href={`${APP_DOMAIN}/register`}
188
- {...(domain !== "dub.co" && {
189
- onClick: () => {
190
- va.track("Referred from custom domain", {
191
- domain,
192
- medium: `navbar item (signup)`,
193
- });
194
- },
195
- })}
196
- className="animate-fade-in rounded-full border border-black bg-black px-4 py-1.5 text-sm text-white transition-all hover:bg-white hover:text-black"
197
- >
198
- Sign Up
199
- </Link>
200
- </div>
201
- </div>
202
- </MaxWidthWrapper>
203
- </div>
204
- );
205
- }
package/src/popover.tsx DELETED
@@ -1,61 +0,0 @@
1
- "use client";
2
-
3
- import * as PopoverPrimitive from "@radix-ui/react-popover";
4
- import { Dispatch, ReactNode, SetStateAction } from "react";
5
- import { Drawer } from "vaul";
6
- import { useMediaQuery } from "./hooks";
7
-
8
- export function Popover({
9
- children,
10
- content,
11
- align = "center",
12
- openPopover,
13
- setOpenPopover,
14
- mobileOnly,
15
- }: {
16
- children: ReactNode;
17
- content: ReactNode | string;
18
- align?: "center" | "start" | "end";
19
- openPopover: boolean;
20
- setOpenPopover: Dispatch<SetStateAction<boolean>>;
21
- mobileOnly?: boolean;
22
- }) {
23
- const { isMobile } = useMediaQuery();
24
-
25
- if (mobileOnly || isMobile) {
26
- return (
27
- <Drawer.Root open={openPopover} onOpenChange={setOpenPopover}>
28
- <div className="sm:hidden">{children}</div>
29
- <Drawer.Overlay className="fixed inset-0 z-40 bg-gray-100 bg-opacity-10 backdrop-blur" />
30
- <Drawer.Portal>
31
- <Drawer.Content className="fixed bottom-0 left-0 right-0 z-50 mt-24 rounded-t-[10px] border-t border-gray-200 bg-white">
32
- <div className="sticky top-0 z-20 flex w-full items-center justify-center rounded-t-[10px] bg-inherit">
33
- <div className="my-3 h-1 w-12 rounded-full bg-gray-300" />
34
- </div>
35
- <div className="flex min-h-[150px] w-full items-center justify-center overflow-hidden bg-white pb-8 align-middle shadow-xl">
36
- {content}
37
- </div>
38
- </Drawer.Content>
39
- <Drawer.Overlay />
40
- </Drawer.Portal>
41
- </Drawer.Root>
42
- );
43
- }
44
-
45
- return (
46
- <PopoverPrimitive.Root open={openPopover} onOpenChange={setOpenPopover}>
47
- <PopoverPrimitive.Trigger className="sm:inline-flex" asChild>
48
- {children}
49
- </PopoverPrimitive.Trigger>
50
- <PopoverPrimitive.Portal>
51
- <PopoverPrimitive.Content
52
- sideOffset={8}
53
- align={align}
54
- className="animate-slide-up-fade z-50 items-center rounded-md border border-gray-200 bg-white drop-shadow-lg sm:block"
55
- >
56
- {content}
57
- </PopoverPrimitive.Content>
58
- </PopoverPrimitive.Portal>
59
- </PopoverPrimitive.Root>
60
- );
61
- }
package/src/styles.css DELETED
@@ -1,3 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
package/src/switch.tsx DELETED
@@ -1,60 +0,0 @@
1
- "use client";
2
-
3
- import { cn } from "@dub/utils";
4
- import * as SwitchPrimitive from "@radix-ui/react-switch";
5
- import { Dispatch, ReactNode, SetStateAction } from "react";
6
- import { Tooltip } from "./tooltip";
7
-
8
- export function Switch({
9
- fn,
10
- trackDimensions,
11
- thumbDimensions,
12
- thumbTranslate,
13
- checked = true,
14
- disabled = false,
15
- disabledTooltip,
16
- }: {
17
- fn: Dispatch<SetStateAction<boolean>> | (() => void);
18
- trackDimensions?: string;
19
- thumbDimensions?: string;
20
- thumbTranslate?: string;
21
- checked?: boolean;
22
- disabled?: boolean;
23
- disabledTooltip?: string | ReactNode;
24
- }) {
25
- if (disabledTooltip) {
26
- return (
27
- <Tooltip content={disabledTooltip}>
28
- <div className="radix-state-checked:bg-gray-300 relative inline-flex h-4 w-8 flex-shrink-0 cursor-not-allowed rounded-full border-2 border-transparent bg-gray-200">
29
- <div className="h-3 w-3 transform rounded-full bg-white shadow-lg" />
30
- </div>
31
- </Tooltip>
32
- );
33
- }
34
-
35
- return (
36
- <SwitchPrimitive.Root
37
- checked={checked}
38
- name="switch"
39
- onCheckedChange={(checked) => fn(checked)}
40
- disabled={disabled}
41
- className={cn(
42
- disabled
43
- ? "cursor-not-allowed bg-gray-300"
44
- : "radix-state-checked:bg-blue-500 radix-state-unchecked:bg-gray-200 cursor-pointer focus:outline-none focus-visible:ring focus-visible:ring-blue-500 focus-visible:ring-opacity-75",
45
- "relative inline-flex h-4 w-8 flex-shrink-0 rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out",
46
- trackDimensions,
47
- )}
48
- >
49
- <SwitchPrimitive.Thumb
50
- className={cn(
51
- `radix-state-checked:${thumbTranslate}`,
52
- "radix-state-unchecked:translate-x-0",
53
- `pointer-events-none h-3 w-3 translate-x-4 transform rounded-full bg-white shadow-lg ring-0 transition duration-200 ease-in-out`,
54
- thumbDimensions,
55
- thumbTranslate,
56
- )}
57
- />
58
- </SwitchPrimitive.Root>
59
- );
60
- }
@@ -1,27 +0,0 @@
1
- export function TabSelect({
2
- options,
3
- selected,
4
- selectAction,
5
- }: {
6
- options: string[];
7
- selected: string;
8
- selectAction: (option: string) => void;
9
- }) {
10
- return (
11
- <div className="relative inline-flex items-center space-x-3">
12
- {options.map((option) => (
13
- <button
14
- key={option}
15
- className={`${
16
- option === selected
17
- ? "bg-gray-200 text-gray-800"
18
- : "bg-gray-50 text-gray-600 hover:bg-gray-100"
19
- } rounded-md px-2 py-1 text-sm font-medium capitalize transition-all duration-75 active:scale-90 sm:px-3`}
20
- onClick={() => selectAction(option)}
21
- >
22
- {option}
23
- </button>
24
- ))}
25
- </div>
26
- );
27
- }