@music-vine/cadence 0.1.0
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/README.md +146 -0
- package/dist/components/accordion.d.ts +35 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +95 -0
- package/dist/components/accordion.js.map +7 -0
- package/dist/components/badge.d.ts +14 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +78 -0
- package/dist/components/badge.js.map +7 -0
- package/dist/components/breadcrumb.d.ts +20 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb.js +98 -0
- package/dist/components/breadcrumb.js.map +7 -0
- package/dist/components/button.d.ts +47 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +295 -0
- package/dist/components/button.js.map +7 -0
- package/dist/components/card.d.ts +9 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +65 -0
- package/dist/components/card.js.map +7 -0
- package/dist/components/carousel-dots.d.ts +9 -0
- package/dist/components/carousel-dots.d.ts.map +1 -0
- package/dist/components/carousel-dots.js +55 -0
- package/dist/components/carousel-dots.js.map +7 -0
- package/dist/components/carousel.d.ts +33 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +217 -0
- package/dist/components/carousel.js.map +7 -0
- package/dist/components/checkbox.d.ts +13 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +57 -0
- package/dist/components/checkbox.js.map +7 -0
- package/dist/components/context-menu.d.ts +28 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/context-menu.js +154 -0
- package/dist/components/context-menu.js.map +7 -0
- package/dist/components/dialog.d.ts +20 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +98 -0
- package/dist/components/dialog.js.map +7 -0
- package/dist/components/drawer.d.ts +26 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +133 -0
- package/dist/components/drawer.js.map +7 -0
- package/dist/components/index.d.ts +35 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +277 -0
- package/dist/components/index.js.map +7 -0
- package/dist/components/input.d.ts +20 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +174 -0
- package/dist/components/input.js.map +7 -0
- package/dist/components/label.d.ts +6 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +21 -0
- package/dist/components/label.js.map +7 -0
- package/dist/components/popover.d.ts +8 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +38 -0
- package/dist/components/popover.js.map +7 -0
- package/dist/components/price-tag.d.ts +11 -0
- package/dist/components/price-tag.d.ts.map +1 -0
- package/dist/components/price-tag.js +31 -0
- package/dist/components/price-tag.js.map +7 -0
- package/dist/components/radio-group.d.ts +6 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +84 -0
- package/dist/components/radio-group.js.map +7 -0
- package/dist/components/scroll-area.d.ts +15 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +132 -0
- package/dist/components/scroll-area.js.map +7 -0
- package/dist/components/select.d.ts +59 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +210 -0
- package/dist/components/select.js.map +7 -0
- package/dist/components/separator.d.ts +5 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +25 -0
- package/dist/components/separator.js.map +7 -0
- package/dist/components/skeleton.d.ts +10 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +29 -0
- package/dist/components/skeleton.js.map +7 -0
- package/dist/components/slider.d.ts +15 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +95 -0
- package/dist/components/slider.js.map +7 -0
- package/dist/components/stacking-card.d.ts +54 -0
- package/dist/components/stacking-card.d.ts.map +1 -0
- package/dist/components/stacking-card.js +636 -0
- package/dist/components/stacking-card.js.map +7 -0
- package/dist/components/tabs.d.ts +8 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +48 -0
- package/dist/components/tabs.js.map +7 -0
- package/dist/components/textarea.d.ts +11 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +43 -0
- package/dist/components/textarea.js.map +7 -0
- package/dist/components/toast.d.ts +7 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +53 -0
- package/dist/components/toast.js.map +7 -0
- package/dist/components/toggle-button.d.ts +20 -0
- package/dist/components/toggle-button.d.ts.map +1 -0
- package/dist/components/toggle-button.js +56 -0
- package/dist/components/toggle-button.js.map +7 -0
- package/dist/components/typography/heading.d.ts +18 -0
- package/dist/components/typography/heading.d.ts.map +1 -0
- package/dist/components/typography/heading.js +105 -0
- package/dist/components/typography/heading.js.map +7 -0
- package/dist/components/typography/index.d.ts +5 -0
- package/dist/components/typography/index.d.ts.map +1 -0
- package/dist/components/typography/index.js +36 -0
- package/dist/components/typography/index.js.map +7 -0
- package/dist/components/typography/list.d.ts +17 -0
- package/dist/components/typography/list.d.ts.map +1 -0
- package/dist/components/typography/list.js +73 -0
- package/dist/components/typography/list.js.map +7 -0
- package/dist/components/typography/prose.d.ts +5 -0
- package/dist/components/typography/prose.d.ts.map +1 -0
- package/dist/components/typography/prose.js +50 -0
- package/dist/components/typography/prose.js.map +7 -0
- package/dist/components/typography/text.d.ts +11 -0
- package/dist/components/typography/text.d.ts.map +1 -0
- package/dist/components/typography/text.js +38 -0
- package/dist/components/typography/text.js.map +7 -0
- package/dist/icons/custom/boards-indicator.d.ts +7 -0
- package/dist/icons/custom/boards-indicator.d.ts.map +1 -0
- package/dist/icons/custom/boards-indicator.js +70 -0
- package/dist/icons/custom/boards-indicator.js.map +7 -0
- package/dist/icons/custom/download-history.d.ts +6 -0
- package/dist/icons/custom/download-history.d.ts.map +1 -0
- package/dist/icons/custom/download-history.js +19 -0
- package/dist/icons/custom/download-history.js.map +7 -0
- package/dist/icons/custom/exclamation-mark-in-octagon.d.ts +6 -0
- package/dist/icons/custom/exclamation-mark-in-octagon.d.ts.map +1 -0
- package/dist/icons/custom/exclamation-mark-in-octagon.js +57 -0
- package/dist/icons/custom/exclamation-mark-in-octagon.js.map +7 -0
- package/dist/icons/custom/pin.d.ts +6 -0
- package/dist/icons/custom/pin.d.ts.map +1 -0
- package/dist/icons/custom/pin.js +28 -0
- package/dist/icons/custom/pin.js.map +7 -0
- package/dist/icons/custom/premium-star.d.ts +10 -0
- package/dist/icons/custom/premium-star.d.ts.map +1 -0
- package/dist/icons/custom/premium-star.js +191 -0
- package/dist/icons/custom/premium-star.js.map +7 -0
- package/dist/icons/custom/social/discord.d.ts +6 -0
- package/dist/icons/custom/social/discord.d.ts.map +1 -0
- package/dist/icons/custom/social/discord.js +27 -0
- package/dist/icons/custom/social/discord.js.map +7 -0
- package/dist/icons/custom/social/index.d.ts +4 -0
- package/dist/icons/custom/social/index.d.ts.map +1 -0
- package/dist/icons/custom/social/index.js +4 -0
- package/dist/icons/custom/social/index.js.map +7 -0
- package/dist/icons/custom/social/tiktok.d.ts +6 -0
- package/dist/icons/custom/social/tiktok.d.ts.map +1 -0
- package/dist/icons/custom/social/tiktok.js +27 -0
- package/dist/icons/custom/social/tiktok.js.map +7 -0
- package/dist/icons/custom/social/twitter-x.d.ts +6 -0
- package/dist/icons/custom/social/twitter-x.d.ts.map +1 -0
- package/dist/icons/custom/social/twitter-x.js +29 -0
- package/dist/icons/custom/social/twitter-x.js.map +7 -0
- package/dist/icons/custom/tick-in-circle.d.ts +7 -0
- package/dist/icons/custom/tick-in-circle.d.ts.map +1 -0
- package/dist/icons/custom/tick-in-circle.js +32 -0
- package/dist/icons/custom/tick-in-circle.js.map +7 -0
- package/dist/icons/custom/tick-small.d.ts +6 -0
- package/dist/icons/custom/tick-small.d.ts.map +1 -0
- package/dist/icons/custom/tick-small.js +16 -0
- package/dist/icons/custom/tick-small.js.map +7 -0
- package/dist/icons/custom/tick.d.ts +3 -0
- package/dist/icons/custom/tick.d.ts.map +1 -0
- package/dist/icons/custom/tick.js +31 -0
- package/dist/icons/custom/tick.js.map +7 -0
- package/dist/icons/custom/uppbeat-credit.d.ts +4 -0
- package/dist/icons/custom/uppbeat-credit.d.ts.map +1 -0
- package/dist/icons/custom/uppbeat-credit.js +55 -0
- package/dist/icons/custom/uppbeat-credit.js.map +7 -0
- package/dist/icons/index.d.ts +20 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +15 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +7 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/styles/index.css +3 -0
- package/dist/styles/storybook.css +14 -0
- package/package.json +107 -0
- package/tailwind.config.ts +299 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { X } from "lucide-react";
|
|
4
|
+
import { Slot as SlotPrimitive } from "radix-ui";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { useState } from "react";
|
|
7
|
+
import { cn } from "../lib/utils";
|
|
8
|
+
const inputWrapperVariants = cva("relative flex w-full items-center", {
|
|
9
|
+
variants: {
|
|
10
|
+
size: {
|
|
11
|
+
auto: "h-auto w-auto",
|
|
12
|
+
default: "h-10",
|
|
13
|
+
sm: "h-7"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
defaultVariants: {
|
|
17
|
+
size: "default"
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
const inputVariants = cva(
|
|
21
|
+
[
|
|
22
|
+
"w-full touch-manipulation self-stretch shadow-none outline-none outline-0 transition duration-200 ease-out disabled:cursor-not-allowed dark:disabled:cursor-not-allowed",
|
|
23
|
+
// text
|
|
24
|
+
"font-sans text-base text-black antialiased disabled:text-black/60 dark:text-white dark:disabled:text-white/60",
|
|
25
|
+
// placeholder
|
|
26
|
+
"placeholder-gray-700 placeholder:font-sans dark:placeholder-gray-200",
|
|
27
|
+
// background
|
|
28
|
+
"bg-white focus:bg-white enabled:hover:bg-white disabled:bg-white/60 dark:bg-black dark:disabled:bg-black/60 dark:focus:bg-black dark:enabled:hover:bg-black",
|
|
29
|
+
// borders (light)
|
|
30
|
+
"rounded-lg border border-gray-150 border-solid invalid:border-red invalid:hover:border-red focus:border-pink-500 enabled:hover:border-gray-200 enabled:focus:hover:border-pink-500 disabled:border-gray-150/60",
|
|
31
|
+
// borders light
|
|
32
|
+
// borders (dark)
|
|
33
|
+
"dark:border-gray-800 dark:disabled:border-gray-900 dark:focus:border-white dark:enabled:hover:border-gray-700 dark:enabled:focus:hover:border-white dark:invalid:border-red dark:invalid:hover:border-red",
|
|
34
|
+
// borders dark
|
|
35
|
+
// default clear button
|
|
36
|
+
"dark:[&::-webkit-search-cancel-button]:hidden"
|
|
37
|
+
],
|
|
38
|
+
{
|
|
39
|
+
variants: {
|
|
40
|
+
size: {
|
|
41
|
+
default: "px-4",
|
|
42
|
+
sm: "px-3",
|
|
43
|
+
auto: "px-4"
|
|
44
|
+
},
|
|
45
|
+
hasLeftIcon: {
|
|
46
|
+
true: "",
|
|
47
|
+
false: ""
|
|
48
|
+
},
|
|
49
|
+
hasRightIcon: {
|
|
50
|
+
true: "",
|
|
51
|
+
false: ""
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
compoundVariants: [
|
|
55
|
+
{
|
|
56
|
+
hasLeftIcon: true,
|
|
57
|
+
size: "default",
|
|
58
|
+
class: "pl-10"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
hasLeftIcon: true,
|
|
62
|
+
size: "sm",
|
|
63
|
+
class: "pl-8"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
hasRightIcon: true,
|
|
67
|
+
size: "default",
|
|
68
|
+
class: "pr-10"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
hasRightIcon: true,
|
|
72
|
+
size: "sm",
|
|
73
|
+
class: "pr-8"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
defaultVariants: {
|
|
77
|
+
size: "default",
|
|
78
|
+
hasLeftIcon: false,
|
|
79
|
+
hasRightIcon: false
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
const Input = React.forwardRef(
|
|
84
|
+
({
|
|
85
|
+
className,
|
|
86
|
+
size,
|
|
87
|
+
type = "text",
|
|
88
|
+
htmlSize,
|
|
89
|
+
leftIcon,
|
|
90
|
+
rightIcon,
|
|
91
|
+
placeholder,
|
|
92
|
+
...props
|
|
93
|
+
}, ref) => {
|
|
94
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
95
|
+
return /* @__PURE__ */ jsxs(
|
|
96
|
+
"div",
|
|
97
|
+
{
|
|
98
|
+
className: cn(inputWrapperVariants({ size })),
|
|
99
|
+
onBlur: () => {
|
|
100
|
+
setTimeout(() => {
|
|
101
|
+
setIsFocused(false);
|
|
102
|
+
}, 50);
|
|
103
|
+
},
|
|
104
|
+
children: [
|
|
105
|
+
!!leftIcon && /* @__PURE__ */ jsx(
|
|
106
|
+
SlotPrimitive.Slot,
|
|
107
|
+
{
|
|
108
|
+
className: cn(
|
|
109
|
+
"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none",
|
|
110
|
+
size === "sm" ? "left-3 size-3" : "left-4 size-4"
|
|
111
|
+
),
|
|
112
|
+
children: leftIcon
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ jsx(
|
|
116
|
+
"input",
|
|
117
|
+
{
|
|
118
|
+
className: cn(
|
|
119
|
+
inputVariants({
|
|
120
|
+
size,
|
|
121
|
+
hasLeftIcon: !!leftIcon,
|
|
122
|
+
hasRightIcon: !!rightIcon,
|
|
123
|
+
className
|
|
124
|
+
})
|
|
125
|
+
),
|
|
126
|
+
onFocus: (e) => {
|
|
127
|
+
setIsFocused(true);
|
|
128
|
+
props.onFocus?.(e);
|
|
129
|
+
},
|
|
130
|
+
placeholder: isFocused ? " " : placeholder,
|
|
131
|
+
ref,
|
|
132
|
+
size: htmlSize,
|
|
133
|
+
type,
|
|
134
|
+
...props
|
|
135
|
+
}
|
|
136
|
+
),
|
|
137
|
+
!!rightIcon && /* @__PURE__ */ jsx(
|
|
138
|
+
SlotPrimitive.Slot,
|
|
139
|
+
{
|
|
140
|
+
className: cn(
|
|
141
|
+
"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none",
|
|
142
|
+
size === "sm" ? "right-3 size-3" : "right-4 size-4"
|
|
143
|
+
),
|
|
144
|
+
children: rightIcon
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
Input.displayName = "Input";
|
|
153
|
+
const ClearInputButton = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
154
|
+
"button",
|
|
155
|
+
{
|
|
156
|
+
className: cn(
|
|
157
|
+
"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300",
|
|
158
|
+
"focus-visible:ring-2 focus-visible:ring-pink-500 focus-visible:ring-offset-2 focus-visible:ring-offset-gray-100",
|
|
159
|
+
"rounded-full focus-visible:outline-none dark:focus-visible:ring-pink-500 dark:focus-visible:ring-offset-gray-800",
|
|
160
|
+
className
|
|
161
|
+
),
|
|
162
|
+
ref,
|
|
163
|
+
type: "button",
|
|
164
|
+
...props,
|
|
165
|
+
children: /* @__PURE__ */ jsx(X, { className: "absolute inset-0 size-full fill-none", strokeWidth: 3 })
|
|
166
|
+
}
|
|
167
|
+
));
|
|
168
|
+
ClearInputButton.displayName = "ClearInputButton";
|
|
169
|
+
export {
|
|
170
|
+
ClearInputButton,
|
|
171
|
+
Input,
|
|
172
|
+
inputVariants
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/input.tsx"],
|
|
4
|
+
"sourcesContent": ["import { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { useState } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst inputWrapperVariants = cva(\"relative flex w-full items-center\", {\n variants: {\n size: {\n auto: \"h-auto w-auto\",\n default: \"h-10\",\n sm: \"h-7\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n});\n\nconst inputVariants = cva(\n [\n \"w-full touch-manipulation self-stretch shadow-none outline-none outline-0 transition duration-200 ease-out disabled:cursor-not-allowed dark:disabled:cursor-not-allowed\",\n // text\n \"font-sans text-base text-black antialiased disabled:text-black/60 dark:text-white dark:disabled:text-white/60\",\n // placeholder\n \"placeholder-gray-700 placeholder:font-sans dark:placeholder-gray-200\",\n // background\n \"bg-white focus:bg-white enabled:hover:bg-white disabled:bg-white/60 dark:bg-black dark:disabled:bg-black/60 dark:focus:bg-black dark:enabled:hover:bg-black\",\n // borders (light)\n \"rounded-lg border border-gray-150 border-solid invalid:border-red invalid:hover:border-red focus:border-pink-500 enabled:hover:border-gray-200 enabled:focus:hover:border-pink-500 disabled:border-gray-150/60\", // borders light\n // borders (dark)\n \"dark:border-gray-800 dark:disabled:border-gray-900 dark:focus:border-white dark:enabled:hover:border-gray-700 dark:enabled:focus:hover:border-white dark:invalid:border-red dark:invalid:hover:border-red\", // borders dark\n // default clear button\n \"dark:[&::-webkit-search-cancel-button]:hidden\",\n ],\n {\n variants: {\n size: {\n default: \"px-4\",\n sm: \"px-3\",\n auto: \"px-4\",\n },\n hasLeftIcon: {\n true: \"\",\n false: \"\",\n },\n hasRightIcon: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n hasLeftIcon: true,\n size: \"default\",\n class: \"pl-10\",\n },\n {\n hasLeftIcon: true,\n size: \"sm\",\n class: \"pl-8\",\n },\n {\n hasRightIcon: true,\n size: \"default\",\n class: \"pr-10\",\n },\n {\n hasRightIcon: true,\n size: \"sm\",\n class: \"pr-8\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n hasLeftIcon: false,\n hasRightIcon: false,\n },\n }\n);\n\ntype InputPropsWithoutSize = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n>;\n\ntype InputVariantsProps = VariantProps<typeof inputVariants>;\n\n// Omit hasLeftIcon and hasRightIcon from the public API\ntype PublicInputVariantsProps = Omit<\n InputVariantsProps,\n \"hasLeftIcon\" | \"hasRightIcon\"\n>;\n\nexport interface InputProps\n extends InputPropsWithoutSize,\n PublicInputVariantsProps {\n htmlSize?: number;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n size,\n type = \"text\",\n htmlSize,\n leftIcon,\n rightIcon,\n placeholder,\n ...props\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = useState(false);\n\n return (\n <div\n className={cn(inputWrapperVariants({ size }))}\n onBlur={() => {\n setTimeout(() => {\n setIsFocused(false);\n }, 50);\n }}\n >\n {!!leftIcon && (\n <SlotPrimitive.Slot\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none\",\n size === \"sm\" ? \"left-3 size-3\" : \"left-4 size-4\"\n )}\n >\n {leftIcon}\n </SlotPrimitive.Slot>\n )}\n <input\n className={cn(\n inputVariants({\n size,\n hasLeftIcon: !!leftIcon,\n hasRightIcon: !!rightIcon,\n className,\n })\n )}\n onFocus={(e) => {\n setIsFocused(true);\n props.onFocus?.(e);\n }}\n placeholder={isFocused ? \" \" : placeholder}\n ref={ref}\n size={htmlSize}\n type={type}\n {...props}\n />\n {!!rightIcon && (\n <SlotPrimitive.Slot\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none\",\n size === \"sm\" ? \"right-3 size-3\" : \"right-4 size-4\"\n )}\n >\n {rightIcon}\n </SlotPrimitive.Slot>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\ntype ClearInputButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst ClearInputButton = React.forwardRef<\n HTMLButtonElement,\n ClearInputButtonProps\n>(({ className, ...props }, ref) => (\n <button\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300\",\n \"focus-visible:ring-2 focus-visible:ring-pink-500 focus-visible:ring-offset-2 focus-visible:ring-offset-gray-100\",\n \"rounded-full focus-visible:outline-none dark:focus-visible:ring-pink-500 dark:focus-visible:ring-offset-gray-800\",\n className\n )}\n ref={ref}\n type=\"button\"\n {...props}\n >\n <X className=\"absolute inset-0 size-full fill-none\" strokeWidth={3} />\n </button>\n));\n\nClearInputButton.displayName = \"ClearInputButton\";\n\nexport { ClearInputButton, Input, inputVariants };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import { Label as LabelPrimitive } from "radix-ui";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
declare const Label: React.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & VariantProps<(props?: import("class-variance-authority/types").ClassProp | undefined) => string> & React.RefAttributes<HTMLLabelElement>>;
|
|
5
|
+
export { Label };
|
|
6
|
+
//# sourceMappingURL=label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/components/label.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,QAAA,MAAM,KAAK,4PAUT,CAAC;AAIH,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { Label as LabelPrimitive } from "radix-ui";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
const labelVariants = cva(
|
|
7
|
+
"font-semibold text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
|
8
|
+
);
|
|
9
|
+
const Label = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
10
|
+
LabelPrimitive.Root,
|
|
11
|
+
{
|
|
12
|
+
className: cn(labelVariants(), className),
|
|
13
|
+
ref,
|
|
14
|
+
...props
|
|
15
|
+
}
|
|
16
|
+
));
|
|
17
|
+
Label.displayName = LabelPrimitive.Root.displayName;
|
|
18
|
+
export {
|
|
19
|
+
Label
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=label.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/label.tsx"],
|
|
4
|
+
"sourcesContent": ["import { cva, type VariantProps } from \"class-variance-authority\";\nimport { Label as LabelPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst labelVariants = cva(\n \"font-semibold text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n className={cn(labelVariants(), className)}\n ref={ref}\n {...props}\n />\n));\n\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n"],
|
|
5
|
+
"mappings": "AAeE;AAfF,SAAS,WAA8B;AACvC,SAAS,SAAS,sBAAsB;AACxC,YAAY,WAAW;AAEvB,SAAS,UAAU;AAEnB,MAAM,gBAAgB;AAAA,EACpB;AACF;AAEA,MAAM,QAAQ,MAAM,WAIlB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,eAAe;AAAA,EAAf;AAAA,IACC,WAAW,GAAG,cAAc,GAAG,SAAS;AAAA,IACxC;AAAA,IACC,GAAG;AAAA;AACN,CACD;AAED,MAAM,cAAc,eAAe,KAAK;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
declare const Popover: React.FC<PopoverPrimitive.PopoverProps>;
|
|
4
|
+
declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
5
|
+
declare const PopoverAnchor: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>>;
|
|
6
|
+
declare const PopoverContent: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
7
|
+
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };
|
|
8
|
+
//# sourceMappingURL=popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,OAAO,yCAAwB,CAAC;AAEtC,QAAA,MAAM,cAAc,gHAA2B,CAAC;AAEhD,QAAA,MAAM,aAAa,4GAA0B,CAAC;AAE9C,QAAA,MAAM,cAAc,gKA6BnB,CAAC;AAIF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/utils";
|
|
5
|
+
const Popover = PopoverPrimitive.Root;
|
|
6
|
+
const PopoverTrigger = PopoverPrimitive.Trigger;
|
|
7
|
+
const PopoverAnchor = PopoverPrimitive.Anchor;
|
|
8
|
+
const PopoverContent = React.forwardRef(
|
|
9
|
+
({
|
|
10
|
+
className,
|
|
11
|
+
forceMount = false,
|
|
12
|
+
align = "center",
|
|
13
|
+
sideOffset = 4,
|
|
14
|
+
...props
|
|
15
|
+
}, ref) => {
|
|
16
|
+
return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { forceMount: forceMount || void 0, children: /* @__PURE__ */ jsx(
|
|
17
|
+
PopoverPrimitive.Content,
|
|
18
|
+
{
|
|
19
|
+
align,
|
|
20
|
+
className: cn(
|
|
21
|
+
"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 z-50 origin-[var(--radix-popover-content-transform-origin)] rounded-md border border-gray-150 border-solid bg-white fill-mode-forwards p-4 text-gray-950 shadow-md outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:opacity-0 data-[state=open]:opacity-100 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50",
|
|
22
|
+
className
|
|
23
|
+
),
|
|
24
|
+
ref,
|
|
25
|
+
sideOffset,
|
|
26
|
+
...props
|
|
27
|
+
}
|
|
28
|
+
) });
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
|
|
32
|
+
export {
|
|
33
|
+
Popover,
|
|
34
|
+
PopoverAnchor,
|
|
35
|
+
PopoverContent,
|
|
36
|
+
PopoverTrigger
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=popover.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/popover.tsx"],
|
|
4
|
+
"sourcesContent": ["import { Popover as PopoverPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(\n (\n {\n className,\n forceMount = false,\n align = \"center\",\n sideOffset = 4,\n ...props\n },\n ref\n ) => {\n return (\n <PopoverPrimitive.Portal forceMount={forceMount || undefined}>\n <PopoverPrimitive.Content\n align={align}\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 z-50 origin-[var(--radix-popover-content-transform-origin)] rounded-md border border-gray-150 border-solid bg-white fill-mode-forwards p-4 text-gray-950 shadow-md outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:opacity-0 data-[state=open]:opacity-100 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n ref={ref}\n sideOffset={sideOffset}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n }\n);\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n"],
|
|
5
|
+
"mappings": "AA2BQ;AA3BR,SAAS,WAAW,wBAAwB;AAC5C,YAAY,WAAW;AAEvB,SAAS,UAAU;AAEnB,MAAM,UAAU,iBAAiB;AAEjC,MAAM,iBAAiB,iBAAiB;AAExC,MAAM,gBAAgB,iBAAiB;AAEvC,MAAM,iBAAiB,MAAM;AAAA,EAI3B,CACE;AAAA,IACE;AAAA,IACA,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,oBAAC,iBAAiB,QAAjB,EAAwB,YAAY,cAAc,QACjD;AAAA,MAAC,iBAAiB;AAAA,MAAjB;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc,iBAAiB,QAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { TextProps } from "./typography/text";
|
|
3
|
+
export interface PriceTagProps extends TextProps {
|
|
4
|
+
currencySymbol: string;
|
|
5
|
+
price: string;
|
|
6
|
+
frequency: string;
|
|
7
|
+
ref?: React.Ref<HTMLParagraphElement>;
|
|
8
|
+
}
|
|
9
|
+
declare function PriceTag({ currencySymbol, price, frequency, ref, ...props }: PriceTagProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export { PriceTag };
|
|
11
|
+
//# sourceMappingURL=price-tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"price-tag.d.ts","sourceRoot":"","sources":["../../src/components/price-tag.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;CACvC;AAED,iBAAS,QAAQ,CAAC,EAChB,cAAc,EACd,KAAK,EACL,SAAS,EACT,GAAG,EACH,GAAG,KAAK,EACT,EAAE,aAAa,2CA0Bf;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from "./typography/text";
|
|
3
|
+
function PriceTag({
|
|
4
|
+
currencySymbol,
|
|
5
|
+
price,
|
|
6
|
+
frequency,
|
|
7
|
+
ref,
|
|
8
|
+
...props
|
|
9
|
+
}) {
|
|
10
|
+
const [mainUnit, cents = "00"] = price.split(".", 2);
|
|
11
|
+
const accessiblePrice = `${currencySymbol}${price} per ${frequency}`;
|
|
12
|
+
return /* @__PURE__ */ jsxs(Text, { className: "font-sans font-normal leading-5", ref, ...props, children: [
|
|
13
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: accessiblePrice }),
|
|
14
|
+
/* @__PURE__ */ jsxs("span", { "aria-hidden": "true", children: [
|
|
15
|
+
/* @__PURE__ */ jsx("span", { className: "text-gray-700 text-xs dark:text-gray-200", children: currencySymbol }),
|
|
16
|
+
/* @__PURE__ */ jsxs("span", { className: "font-heading font-semibold text-base text-gray-950 dark:text-white", children: [
|
|
17
|
+
mainUnit,
|
|
18
|
+
".",
|
|
19
|
+
cents
|
|
20
|
+
] }),
|
|
21
|
+
/* @__PURE__ */ jsxs("span", { className: "text-gray-700 text-xs dark:text-gray-200", children: [
|
|
22
|
+
"/",
|
|
23
|
+
frequency
|
|
24
|
+
] })
|
|
25
|
+
] })
|
|
26
|
+
] });
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
PriceTag
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=price-tag.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/price-tag.tsx"],
|
|
4
|
+
"sourcesContent": ["import type * as React from \"react\";\nimport type { TextProps } from \"./typography/text\";\nimport { Text } from \"./typography/text\";\n\nexport interface PriceTagProps extends TextProps {\n currencySymbol: string;\n price: string;\n frequency: string;\n ref?: React.Ref<HTMLParagraphElement>;\n}\n\nfunction PriceTag({\n currencySymbol,\n price,\n frequency,\n ref,\n ...props\n}: PriceTagProps) {\n // Split price into main unit and cents/pence\n const [mainUnit, cents = \"00\"] = price.split(\".\", 2);\n\n // Create accessible label for screen readers\n const accessiblePrice = `${currencySymbol}${price} per ${frequency}`;\n\n return (\n <Text className=\"font-sans font-normal leading-5\" ref={ref} {...props}>\n {/* Screen reader only text */}\n <span className=\"sr-only\">{accessiblePrice}</span>\n\n {/* Visual presentation hidden from screen readers */}\n <span aria-hidden=\"true\">\n <span className=\"text-gray-700 text-xs dark:text-gray-200\">\n {currencySymbol}\n </span>\n <span className=\"font-heading font-semibold text-base text-gray-950 dark:text-white\">\n {mainUnit}.{cents}\n </span>\n <span className=\"text-gray-700 text-xs dark:text-gray-200\">\n /{frequency}\n </span>\n </span>\n </Text>\n );\n}\n\nexport { PriceTag };\n"],
|
|
5
|
+
"mappings": "AA2BM,cAOE,YAPF;AAzBN,SAAS,YAAY;AASrB,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAEhB,QAAM,CAAC,UAAU,QAAQ,IAAI,IAAI,MAAM,MAAM,KAAK,CAAC;AAGnD,QAAM,kBAAkB,GAAG,cAAc,GAAG,KAAK,QAAQ,SAAS;AAElE,SACE,qBAAC,QAAK,WAAU,mCAAkC,KAAW,GAAG,OAE9D;AAAA,wBAAC,UAAK,WAAU,WAAW,2BAAgB;AAAA,IAG3C,qBAAC,UAAK,eAAY,QAChB;AAAA,0BAAC,UAAK,WAAU,4CACb,0BACH;AAAA,MACA,qBAAC,UAAK,WAAU,sEACb;AAAA;AAAA,QAAS;AAAA,QAAE;AAAA,SACd;AAAA,MACA,qBAAC,UAAK,WAAU,4CAA2C;AAAA;AAAA,QACvD;AAAA,SACJ;AAAA,OACF;AAAA,KACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
declare const RadioGroup: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
+
declare const RadioGroupItem: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
5
|
+
export { RadioGroup, RadioGroupItem };
|
|
6
|
+
//# sourceMappingURL=radio-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio-group.d.ts","sourceRoot":"","sources":["../../src/components/radio-group.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,UAAU,+JASd,CAAC;AAIH,QAAA,MAAM,cAAc,yKA4ElB,CAAC;AAIH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Circle } from "lucide-react";
|
|
3
|
+
import { AnimatePresence, motion } from "motion/react";
|
|
4
|
+
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { cn } from "../lib/utils";
|
|
7
|
+
const RadioGroup = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
8
|
+
RadioGroupPrimitive.Root,
|
|
9
|
+
{
|
|
10
|
+
className: cn("grid gap-2", className),
|
|
11
|
+
...props,
|
|
12
|
+
ref
|
|
13
|
+
}
|
|
14
|
+
));
|
|
15
|
+
RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
|
|
16
|
+
const RadioGroupItem = React.forwardRef(({ className, ...props }, ref) => {
|
|
17
|
+
const [isChecked, setIsChecked] = React.useState(false);
|
|
18
|
+
const itemRef = React.useRef(null);
|
|
19
|
+
React.useEffect(() => {
|
|
20
|
+
const observer = new MutationObserver((mutations) => {
|
|
21
|
+
mutations.forEach((mutation) => {
|
|
22
|
+
if (mutation.type === "attributes" && mutation.attributeName === "data-state") {
|
|
23
|
+
const newState = itemRef.current?.getAttribute("data-state");
|
|
24
|
+
setIsChecked(newState === "checked");
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
if (itemRef.current) {
|
|
29
|
+
observer.observe(itemRef.current, { attributes: true });
|
|
30
|
+
}
|
|
31
|
+
return () => {
|
|
32
|
+
observer.disconnect();
|
|
33
|
+
};
|
|
34
|
+
}, []);
|
|
35
|
+
const setRefs = React.useCallback(
|
|
36
|
+
(element) => {
|
|
37
|
+
itemRef.current = element;
|
|
38
|
+
if (typeof ref === "function") {
|
|
39
|
+
ref(element);
|
|
40
|
+
} else if (ref && "current" in ref) {
|
|
41
|
+
ref.current = element;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
[ref]
|
|
45
|
+
);
|
|
46
|
+
return /* @__PURE__ */ jsxs(
|
|
47
|
+
RadioGroupPrimitive.Item,
|
|
48
|
+
{
|
|
49
|
+
className: cn(
|
|
50
|
+
"relative aspect-square size-4 h-4 w-4 rounded-full border border-gray-500 border-solid p-0.5 text-pink-500 ring-offset-pink-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-pink-500 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-pink-500",
|
|
51
|
+
className
|
|
52
|
+
),
|
|
53
|
+
ref: setRefs,
|
|
54
|
+
...props,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: isChecked && /* @__PURE__ */ jsx(
|
|
57
|
+
motion.div,
|
|
58
|
+
{
|
|
59
|
+
animate: { scale: 2, opacity: 0 },
|
|
60
|
+
className: "absolute inset-0 z-0 rounded-full bg-pink-500",
|
|
61
|
+
exit: { scale: 0, opacity: 0 },
|
|
62
|
+
initial: { scale: 0, opacity: 0.5 },
|
|
63
|
+
transition: { duration: 0.4 }
|
|
64
|
+
}
|
|
65
|
+
) }),
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
motion.div,
|
|
68
|
+
{
|
|
69
|
+
animate: isChecked ? { scale: 1.1 } : { scale: 1 },
|
|
70
|
+
className: "relative",
|
|
71
|
+
transition: { type: "spring", stiffness: 300, damping: 20 },
|
|
72
|
+
children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(Circle, { className: "size-2.5 fill-current text-current" }) })
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
|
|
80
|
+
export {
|
|
81
|
+
RadioGroup,
|
|
82
|
+
RadioGroupItem
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=radio-group.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/radio-group.tsx"],
|
|
4
|
+
"sourcesContent": ["import { Circle } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n));\n\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n const [isChecked, setIsChecked] = React.useState(false);\n const itemRef = React.useRef<HTMLButtonElement | null>(null);\n\n React.useEffect(() => {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (\n mutation.type === \"attributes\" &&\n mutation.attributeName === \"data-state\"\n ) {\n const newState = itemRef.current?.getAttribute(\"data-state\");\n\n setIsChecked(newState === \"checked\");\n }\n });\n });\n\n if (itemRef.current) {\n observer.observe(itemRef.current, { attributes: true });\n }\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Forward the ref to both our local ref and the passed ref\n const setRefs = React.useCallback(\n (element: HTMLButtonElement | null) => {\n itemRef.current = element;\n\n // Handle function refs\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref && \"current\" in ref) {\n ref.current = element;\n }\n },\n [ref]\n );\n\n return (\n <RadioGroupPrimitive.Item\n className={cn(\n \"relative aspect-square size-4 h-4 w-4 rounded-full border border-gray-500 border-solid p-0.5 text-pink-500 ring-offset-pink-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-pink-500 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-pink-500\",\n className\n )}\n ref={setRefs}\n {...props}\n >\n <AnimatePresence>\n {isChecked && (\n <motion.div\n animate={{ scale: 2, opacity: 0 }}\n className=\"absolute inset-0 z-0 rounded-full bg-pink-500\"\n exit={{ scale: 0, opacity: 0 }}\n initial={{ scale: 0, opacity: 0.5 }}\n transition={{ duration: 0.4 }}\n />\n )}\n </AnimatePresence>\n <motion.div\n animate={isChecked ? { scale: 1.1 } : { scale: 1 }}\n className=\"relative\"\n transition={{ type: \"spring\", stiffness: 300, damping: 20 }}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"size-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </motion.div>\n </RadioGroupPrimitive.Item>\n );\n});\n\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n"],
|
|
5
|
+
"mappings": "AAWE,cAuDE,YAvDF;AAXF,SAAS,cAAc;AACvB,SAAS,iBAAiB,cAAc;AACxC,SAAS,cAAc,2BAA2B;AAClD,YAAY,WAAW;AAEvB,SAAS,UAAU;AAEnB,MAAM,aAAa,MAAM,WAGvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,oBAAoB;AAAA,EAApB;AAAA,IACC,WAAW,GAAG,cAAc,SAAS;AAAA,IACpC,GAAG;AAAA,IACJ;AAAA;AACF,CACD;AAED,WAAW,cAAc,oBAAoB,KAAK;AAElD,MAAM,iBAAiB,MAAM,WAG3B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,UAAU,MAAM,OAAiC,IAAI;AAE3D,QAAM,UAAU,MAAM;AACpB,UAAM,WAAW,IAAI,iBAAiB,CAAC,cAAc;AACnD,gBAAU,QAAQ,CAAC,aAAa;AAC9B,YACE,SAAS,SAAS,gBAClB,SAAS,kBAAkB,cAC3B;AACA,gBAAM,WAAW,QAAQ,SAAS,aAAa,YAAY;AAE3D,uBAAa,aAAa,SAAS;AAAA,QACrC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,QAAQ,SAAS;AACnB,eAAS,QAAQ,QAAQ,SAAS,EAAE,YAAY,KAAK,CAAC;AAAA,IACxD;AAEA,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,UAAU,MAAM;AAAA,IACpB,CAAC,YAAsC;AACrC,cAAQ,UAAU;AAGlB,UAAI,OAAO,QAAQ,YAAY;AAC7B,YAAI,OAAO;AAAA,MACb,WAAW,OAAO,aAAa,KAAK;AAClC,YAAI,UAAU;AAAA,MAChB;AAAA,IACF;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACJ,GAAG;AAAA,MAEJ;AAAA,4BAAC,mBACE,uBACC;AAAA,UAAC,OAAO;AAAA,UAAP;AAAA,YACC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,YAChC,WAAU;AAAA,YACV,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,YAC7B,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI;AAAA,YAClC,YAAY,EAAE,UAAU,IAAI;AAAA;AAAA,QAC9B,GAEJ;AAAA,QACA;AAAA,UAAC,OAAO;AAAA,UAAP;AAAA,YACC,SAAS,YAAY,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE;AAAA,YACjD,WAAU;AAAA,YACV,YAAY,EAAE,MAAM,UAAU,WAAW,KAAK,SAAS,GAAG;AAAA,YAE1D,8BAAC,oBAAoB,WAApB,EAA8B,WAAU,oCACvC,8BAAC,UAAO,WAAU,sCAAqC,GACzD;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,eAAe,cAAc,oBAAoB,KAAK;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
declare const ScrollBar: React.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
+
interface FadeAwayProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
|
+
direction: "top" | "bottom" | "right" | "left";
|
|
6
|
+
show: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare const FadeAway: React.ForwardRefExoticComponent<FadeAwayProps & React.RefAttributes<HTMLDivElement>>;
|
|
9
|
+
interface ScrollAreaProps extends React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {
|
|
10
|
+
fadeAway?: boolean | "top" | "bottom" | "y" | "left" | "right" | "x";
|
|
11
|
+
hideScrollBar?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare const ScrollArea: React.ForwardRefExoticComponent<ScrollAreaProps & React.RefAttributes<HTMLDivElement>>;
|
|
14
|
+
export { FadeAway, ScrollArea, ScrollBar, type ScrollAreaProps };
|
|
15
|
+
//# sourceMappingURL=scroll-area.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-area.d.ts","sourceRoot":"","sources":["../../src/components/scroll-area.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,SAAS,wKAmBb,CAAC;AAIH,UAAU,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAClE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,IAAI,EAAE,OAAO,CAAC;CACf;AAED,QAAA,MAAM,QAAQ,sFAqBb,CAAC;AAIF,UAAU,eACR,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACvE,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA0ED,QAAA,MAAM,UAAU,wFA8Cd,CAAC;AAIH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import throttle from "lodash/throttle";
|
|
3
|
+
import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
const ScrollBar = React.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsx(
|
|
7
|
+
ScrollAreaPrimitive.ScrollAreaScrollbar,
|
|
8
|
+
{
|
|
9
|
+
className: cn(
|
|
10
|
+
"flex touch-none select-none transition-colors",
|
|
11
|
+
orientation === "vertical" && "h-full w-2.5 border-0 border-l border-l-transparent border-solid p-[1px]",
|
|
12
|
+
orientation === "horizontal" && "h-2.5 flex-col border-0 border-t border-t-transparent border-solid p-[1px]",
|
|
13
|
+
className
|
|
14
|
+
),
|
|
15
|
+
orientation,
|
|
16
|
+
ref,
|
|
17
|
+
...props,
|
|
18
|
+
children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-gray-200 dark:bg-gray-800" })
|
|
19
|
+
}
|
|
20
|
+
));
|
|
21
|
+
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
|
|
22
|
+
const FadeAway = React.forwardRef(
|
|
23
|
+
({ className, direction, show, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
24
|
+
"div",
|
|
25
|
+
{
|
|
26
|
+
className: cn(
|
|
27
|
+
"pointer-events-none absolute z-[8] transition-opacity duration-200",
|
|
28
|
+
direction === "top" && "top-0 right-0 left-0 h-[var(--fade-away-top-height,32px)] bg-gradient-to-b",
|
|
29
|
+
direction === "bottom" && "right-0 bottom-0 left-0 h-[var(--fade-away-bottom-height,32px)] bg-gradient-to-t",
|
|
30
|
+
direction === "right" && "top-0 right-0 bottom-0 w-[var(--fade-away-right-width,32px)] bg-gradient-to-l",
|
|
31
|
+
direction === "left" && "top-0 bottom-0 left-0 w-[var(--fade-away-left-width,32px)] bg-gradient-to-r",
|
|
32
|
+
"from-[var(--fade-away-from,rgb(255_255_255))] to-[var(--fade-away-to,rgb(255_255_255_/_0))] dark:from-[var(--fade-away-from-dark,rgb(21_25_25))] dark:to-[var(--fade-away-to-dark,rgb(21_25_25_/_0))]",
|
|
33
|
+
show ? "opacity-100" : "opacity-0",
|
|
34
|
+
className
|
|
35
|
+
),
|
|
36
|
+
ref,
|
|
37
|
+
...props
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
);
|
|
41
|
+
FadeAway.displayName = "FadeAway";
|
|
42
|
+
const useScrollFade = ({ viewportRef, enabled }) => {
|
|
43
|
+
const [showTopFade, setShowTopFade] = React.useState(false);
|
|
44
|
+
const [showBottomFade, setShowBottomFade] = React.useState(true);
|
|
45
|
+
const [showLeftFade, setShowLeftFade] = React.useState(false);
|
|
46
|
+
const [showRightFade, setShowRightFade] = React.useState(true);
|
|
47
|
+
const handleScroll = React.useCallback(() => {
|
|
48
|
+
if (!enabled) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (viewportRef.current) {
|
|
52
|
+
const {
|
|
53
|
+
scrollTop,
|
|
54
|
+
scrollLeft,
|
|
55
|
+
scrollHeight,
|
|
56
|
+
scrollWidth,
|
|
57
|
+
clientHeight,
|
|
58
|
+
clientWidth
|
|
59
|
+
} = viewportRef.current;
|
|
60
|
+
setShowTopFade(scrollTop > 0);
|
|
61
|
+
setShowBottomFade(scrollTop < scrollHeight - clientHeight - 1);
|
|
62
|
+
setShowLeftFade(scrollLeft > 0);
|
|
63
|
+
setShowRightFade(scrollLeft < scrollWidth - clientWidth - 1);
|
|
64
|
+
}
|
|
65
|
+
}, [viewportRef, enabled]);
|
|
66
|
+
const throttledHandleScroll = React.useMemo(
|
|
67
|
+
() => throttle(handleScroll, 50),
|
|
68
|
+
[handleScroll]
|
|
69
|
+
);
|
|
70
|
+
React.useEffect(() => {
|
|
71
|
+
if (!enabled) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const viewport = viewportRef.current;
|
|
75
|
+
if (!viewport) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
throttledHandleScroll();
|
|
79
|
+
viewport.addEventListener("scroll", throttledHandleScroll, {
|
|
80
|
+
passive: true
|
|
81
|
+
});
|
|
82
|
+
const resizeObserver = new ResizeObserver(throttledHandleScroll);
|
|
83
|
+
resizeObserver.observe(viewport);
|
|
84
|
+
return () => {
|
|
85
|
+
viewport.removeEventListener("scroll", throttledHandleScroll);
|
|
86
|
+
resizeObserver.disconnect();
|
|
87
|
+
throttledHandleScroll.cancel();
|
|
88
|
+
};
|
|
89
|
+
}, [throttledHandleScroll, viewportRef, enabled]);
|
|
90
|
+
return { showTopFade, showBottomFade, showLeftFade, showRightFade };
|
|
91
|
+
};
|
|
92
|
+
const ScrollArea = React.forwardRef(({ className, children, fadeAway = false, hideScrollBar, ...props }, ref) => {
|
|
93
|
+
const viewportRef = React.useRef(null);
|
|
94
|
+
const { showTopFade, showBottomFade, showLeftFade, showRightFade } = useScrollFade({
|
|
95
|
+
viewportRef,
|
|
96
|
+
enabled: !!fadeAway
|
|
97
|
+
});
|
|
98
|
+
const shouldHideScrollBar = "hideScrollBar" in props || hideScrollBar === true;
|
|
99
|
+
return /* @__PURE__ */ jsxs(
|
|
100
|
+
ScrollAreaPrimitive.Root,
|
|
101
|
+
{
|
|
102
|
+
className: cn("relative overflow-hidden", className),
|
|
103
|
+
ref,
|
|
104
|
+
...props,
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsxs(
|
|
107
|
+
ScrollAreaPrimitive.Viewport,
|
|
108
|
+
{
|
|
109
|
+
className: "h-full w-full rounded-[inherit]",
|
|
110
|
+
ref: viewportRef,
|
|
111
|
+
children: [
|
|
112
|
+
fadeAway && (fadeAway === true || fadeAway === "top" || fadeAway === "y") && /* @__PURE__ */ jsx(FadeAway, { direction: "top", show: showTopFade }),
|
|
113
|
+
fadeAway && (fadeAway === true || fadeAway === "left" || fadeAway === "x") && /* @__PURE__ */ jsx(FadeAway, { direction: "left", show: showLeftFade }),
|
|
114
|
+
children,
|
|
115
|
+
fadeAway && (fadeAway === true || fadeAway === "bottom" || fadeAway === "y") && /* @__PURE__ */ jsx(FadeAway, { direction: "bottom", show: showBottomFade }),
|
|
116
|
+
fadeAway && (fadeAway === true || fadeAway === "right" || fadeAway === "x") && /* @__PURE__ */ jsx(FadeAway, { direction: "right", show: showRightFade })
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
),
|
|
120
|
+
/* @__PURE__ */ jsx(ScrollBar, { className: shouldHideScrollBar ? "hidden opacity-0" : "" }),
|
|
121
|
+
/* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
|
|
127
|
+
export {
|
|
128
|
+
FadeAway,
|
|
129
|
+
ScrollArea,
|
|
130
|
+
ScrollBar
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=scroll-area.js.map
|