@vvedantb/ui 0.34.0 → 0.36.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.
Files changed (50) hide show
  1. package/README.md +50 -6
  2. package/package.json +10 -2
  3. package/src/ai-elements/activity-shared.tsx +1 -1
  4. package/src/ai-elements/activity-tasks.tsx +5 -19
  5. package/src/ai-elements/attachments.tsx +2 -2
  6. package/src/ai-elements/code-block.tsx +3 -1
  7. package/src/ai-elements/conversation.tsx +10 -4
  8. package/src/ai-elements/prompt-input.tsx +5 -4
  9. package/src/client.ts +3 -0
  10. package/src/icons/animated/animated-bell-icon.tsx +68 -0
  11. package/src/icons/animated/animated-counter.tsx +45 -0
  12. package/src/icons/animated/animated-key-icon.tsx +79 -0
  13. package/src/icons/animated/animated-notification-icon.tsx +202 -0
  14. package/src/icons/animated/animated-progress.tsx +74 -0
  15. package/src/icons/animated/animated-status-dot.tsx +98 -0
  16. package/src/icons/animated/index.ts +22 -0
  17. package/src/icons/animated/morphing-menu-icon.tsx +71 -0
  18. package/src/icons/animated/morphing-mic-icon.tsx +52 -0
  19. package/src/icons/animated/pulsing-rings.tsx +50 -0
  20. package/src/index.ts +3 -0
  21. package/src/logos/chrome-icon.tsx +29 -0
  22. package/src/logos/claude-icon.tsx +13 -0
  23. package/src/logos/convex-icon.tsx +21 -0
  24. package/src/logos/cursor-icon.tsx +10 -0
  25. package/src/logos/dropbox-icon.tsx +14 -0
  26. package/src/logos/figma-icon.tsx +26 -0
  27. package/src/logos/github-icon.tsx +10 -0
  28. package/src/logos/gmail-icon.tsx +34 -0
  29. package/src/logos/google-drive-icon.tsx +33 -0
  30. package/src/logos/index.ts +19 -0
  31. package/src/logos/linear-icon.tsx +13 -0
  32. package/src/logos/logo-svg.tsx +32 -0
  33. package/src/logos/notion-icon.tsx +19 -0
  34. package/src/logos/onedrive-icon.tsx +165 -0
  35. package/src/logos/sharepoint-icon.tsx +222 -0
  36. package/src/logos/slack-icon.tsx +25 -0
  37. package/src/logos/vercel-icon.tsx +10 -0
  38. package/src/ui/_menu-parts.tsx +1 -1
  39. package/src/ui/button-group.tsx +1 -1
  40. package/src/ui/clear-input.tsx +2 -2
  41. package/src/ui/command.tsx +2 -2
  42. package/src/ui/context-menu.tsx +3 -3
  43. package/src/ui/dropdown-menu.tsx +1 -1
  44. package/src/ui/hover-card.tsx +3 -3
  45. package/src/ui/input-group.tsx +4 -4
  46. package/src/ui/popover.tsx +3 -5
  47. package/src/ui/search-input.tsx +1 -1
  48. package/src/ui/select.tsx +5 -5
  49. package/src/ui/sonner.tsx +3 -0
  50. package/src/ui/tooltip.tsx +3 -3
@@ -0,0 +1,26 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** Figma mark, in a square viewBox. */
4
+ export function FigmaIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="-9.5 0 57 57" {...props}>
7
+ <path
8
+ d="M19 28.5a9.5 9.5 0 1 1 19 0 9.5 9.5 0 0 1-19 0z"
9
+ fill="#1abcfe"
10
+ />
11
+ <path
12
+ d="M0 47.5A9.5 9.5 0 0 1 9.5 38H19v9.5a9.5 9.5 0 1 1-19 0z"
13
+ fill="#0acf83"
14
+ />
15
+ <path d="M19 0v19h9.5a9.5 9.5 0 1 0 0-19H19z" fill="#ff7262" />
16
+ <path
17
+ d="M0 9.5A9.5 9.5 0 0 0 9.5 19H19V0H9.5A9.5 9.5 0 0 0 0 9.5z"
18
+ fill="#f24e1e"
19
+ />
20
+ <path
21
+ d="M0 28.5A9.5 9.5 0 0 0 9.5 38H19V19H9.5A9.5 9.5 0 0 0 0 28.5z"
22
+ fill="#a259ff"
23
+ />
24
+ </LogoSvg>
25
+ );
26
+ }
@@ -0,0 +1,10 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** GitHub mark. Monochrome: uses `currentColor` so it follows light and dark themes. */
4
+ export function GitHubIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="0 0 24 24" fill="currentColor" {...props}>
7
+ <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
8
+ </LogoSvg>
9
+ );
10
+ }
@@ -0,0 +1,34 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** Gmail mark (svgl `gmail.svg`). */
4
+ export function GmailIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="0 49.4 512 399.42" {...props}>
7
+ <g fill="none" fillRule="evenodd">
8
+ <g fillRule="nonzero">
9
+ <path
10
+ fill="#4285f4"
11
+ d="M34.91 448.818h81.454V251L0 163.727V413.91c0 19.287 15.622 34.91 34.91 34.91z"
12
+ />
13
+ <path
14
+ fill="#34a853"
15
+ d="M395.636 448.818h81.455c19.287 0 34.909-15.622 34.909-34.909V163.727L395.636 251z"
16
+ />
17
+ <path
18
+ fill="#fbbc04"
19
+ d="M395.636 99.727V251L512 163.727v-46.545c0-43.142-49.25-67.782-83.782-41.891z"
20
+ />
21
+ </g>
22
+ <path
23
+ fill="#ea4335"
24
+ d="M116.364 251V99.727L256 204.455 395.636 99.727V251L256 355.727z"
25
+ />
26
+ <path
27
+ fill="#c5221f"
28
+ fillRule="nonzero"
29
+ d="M0 117.182v46.545L116.364 251V99.727L83.782 75.291C49.25 49.4 0 74.04 0 117.18z"
30
+ />
31
+ </g>
32
+ </LogoSvg>
33
+ );
34
+ }
@@ -0,0 +1,33 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** Google Drive mark. */
4
+ export function GoogleDriveIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="0 0 87.3 78" {...props}>
7
+ <path
8
+ d="m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z"
9
+ fill="#0066da"
10
+ />
11
+ <path
12
+ d="m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z"
13
+ fill="#00ac47"
14
+ />
15
+ <path
16
+ d="m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z"
17
+ fill="#ea4335"
18
+ />
19
+ <path
20
+ d="m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z"
21
+ fill="#00832d"
22
+ />
23
+ <path
24
+ d="m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z"
25
+ fill="#2684fc"
26
+ />
27
+ <path
28
+ d="m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z"
29
+ fill="#ffba00"
30
+ />
31
+ </LogoSvg>
32
+ );
33
+ }
@@ -0,0 +1,19 @@
1
+ // Third-party brand logos (full-colour unless noted). Family app marks live in `../brand`.
2
+ // Each logo takes `LogoProps`: `size` (default 24), `title` (labelled `role="img"`; otherwise
3
+ // `aria-hidden`) and any other SVG prop. Paths are the vendors' own; do not recolour them.
4
+ export type { LogoProps } from "./logo-svg";
5
+ export { ChromeIcon } from "./chrome-icon";
6
+ export { ClaudeIcon } from "./claude-icon";
7
+ export { ConvexIcon } from "./convex-icon";
8
+ export { CursorIcon } from "./cursor-icon";
9
+ export { DropboxIcon } from "./dropbox-icon";
10
+ export { FigmaIcon } from "./figma-icon";
11
+ export { GitHubIcon } from "./github-icon";
12
+ export { GmailIcon } from "./gmail-icon";
13
+ export { GoogleDriveIcon } from "./google-drive-icon";
14
+ export { LinearIcon } from "./linear-icon";
15
+ export { NotionIcon } from "./notion-icon";
16
+ export { OneDriveIcon } from "./onedrive-icon";
17
+ export { SharePointIcon } from "./sharepoint-icon";
18
+ export { SlackIcon } from "./slack-icon";
19
+ export { VercelIcon } from "./vercel-icon";
@@ -0,0 +1,13 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** Linear mark (the current four-band logo, 100x100 viewBox). */
4
+ export function LinearIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="0 0 100 100" fill="none" {...props}>
7
+ <path
8
+ fill="#5E6AD2"
9
+ d="M1.225 61.523c-.222-.949.908-1.546 1.597-.857l36.512 36.512c.69.69.092 1.82-.857 1.597-18.425-4.323-32.93-18.827-37.252-37.252ZM.002 46.889a.99.99 0 0 0 .29.76L52.35 99.71c.201.2.478.307.76.29 2.37-.149 4.695-.46 6.963-.927.765-.157 1.03-1.096.478-1.648L2.576 39.448c-.552-.551-1.491-.286-1.648.479a50.067 50.067 0 0 0-.926 6.962ZM4.21 29.705a.988.988 0 0 0 .208 1.1l64.776 64.776c.289.29.726.375 1.1.208a49.908 49.908 0 0 0 5.185-2.684.981.981 0 0 0 .183-1.54L8.436 24.336a.981.981 0 0 0-1.541.183 49.896 49.896 0 0 0-2.684 5.185Zm8.448-11.631a.986.986 0 0 1-.045-1.354C21.78 6.46 35.111 0 49.952 0 77.592 0 100 22.407 100 50.048c0 14.84-6.46 28.172-16.72 37.338a.986.986 0 0 1-1.354-.045L12.659 18.074Z"
10
+ />
11
+ </LogoSvg>
12
+ );
13
+ }
@@ -0,0 +1,32 @@
1
+ import type { ComponentProps, ReactNode } from "react";
2
+
3
+ /** Props shared by every third-party logo. Other SVG props (`id`, `style`, `data-*`, `ref`) go to the svg. */
4
+ export interface LogoProps extends Omit<ComponentProps<"svg">, "children" | "width" | "height" | "viewBox"> {
5
+ /** Width and height in px (or any CSS length). Default `24`. */
6
+ size?: number | string;
7
+ /**
8
+ * Accessible name. With `title` (or an `aria-label`) the svg is a labelled
9
+ * `role="img"`; without one it is decorative and `aria-hidden`.
10
+ */
11
+ title?: string;
12
+ }
13
+
14
+ /** The svg wrapper the logos share: size, viewBox and the decorative or labelled a11y pattern. */
15
+ export function LogoSvg({
16
+ size = 24,
17
+ title,
18
+ viewBox,
19
+ children,
20
+ ...props
21
+ }: LogoProps & { viewBox: string; children: ReactNode }) {
22
+ const label = title ?? props["aria-label"];
23
+ const a11y = label
24
+ ? { role: "img" as const, "aria-label": label }
25
+ : { "aria-hidden": true as const };
26
+ return (
27
+ <svg xmlns="http://www.w3.org/2000/svg" width={size} height={size} viewBox={viewBox} {...a11y} {...props}>
28
+ {title ? <title>{title}</title> : null}
29
+ {children}
30
+ </svg>
31
+ );
32
+ }
@@ -0,0 +1,19 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** Notion mark. */
4
+ export function NotionIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="0 0 100 100" {...props}>
7
+ <path
8
+ d="M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z"
9
+ fill="#fff"
10
+ />
11
+ <path
12
+ fillRule="evenodd"
13
+ clipRule="evenodd"
14
+ d="M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z"
15
+ fill="#000"
16
+ />
17
+ </LogoSvg>
18
+ );
19
+ }
@@ -0,0 +1,165 @@
1
+ import { useId } from "react";
2
+ import { LogoSvg, type LogoProps } from "./logo-svg";
3
+
4
+ /** Microsoft OneDrive mark (svgl `microsoft-onedrive.svg`). Gradient ids are unique per instance. */
5
+ export function OneDriveIcon(props: LogoProps) {
6
+ const id = useId();
7
+ return (
8
+ <LogoSvg viewBox="0 0 1000 615" {...props}>
9
+ <defs>
10
+ <radialGradient
11
+ id={`${id}a`}
12
+ cx="-446.23"
13
+ cy="850.24"
14
+ r="6.99"
15
+ fx="-446.23"
16
+ fy="850.24"
17
+ gradientTransform="matrix(28.87975 32.00675 53.69646 -48.39975 -32750.77 55564.7)"
18
+ gradientUnits="userSpaceOnUse"
19
+ >
20
+ <stop offset="0" stopColor="#4894fe" />
21
+ <stop offset=".7" stopColor="#0934b3" />
22
+ </radialGradient>
23
+ <radialGradient
24
+ id={`${id}b`}
25
+ cx="-463.71"
26
+ cy="855.09"
27
+ r="6.99"
28
+ fx="-463.71"
29
+ fy="855.09"
30
+ gradientTransform="matrix(-126.93754 135.45874 101.23704 94.7798 -144561.83 -18444.24)"
31
+ gradientUnits="userSpaceOnUse"
32
+ >
33
+ <stop offset=".17" stopColor="#23c0fe" />
34
+ <stop offset=".53" stopColor="#1c91ff" />
35
+ </radialGradient>
36
+ <radialGradient
37
+ id={`${id}c`}
38
+ cx="-478.67"
39
+ cy="847.12"
40
+ r="6.99"
41
+ fx="-478.67"
42
+ fy="847.12"
43
+ gradientTransform="matrix(-30.17956 -23.43498 -52.80172 67.93278 30509.91 -68620.88)"
44
+ gradientUnits="userSpaceOnUse"
45
+ >
46
+ <stop offset="0" stopColor="#fff" />
47
+ <stop offset=".66" stopColor="#adc0ff" stopOpacity="0" />
48
+ </radialGradient>
49
+ <radialGradient
50
+ id={`${id}d`}
51
+ cx="-484.89"
52
+ cy="847.31"
53
+ r="6.99"
54
+ fx="-484.89"
55
+ fy="847.31"
56
+ gradientTransform="matrix(-33.90072 -26.53382 -39.69188 50.66325 17714.49 -55348.26)"
57
+ gradientUnits="userSpaceOnUse"
58
+ >
59
+ <stop offset="0" stopColor="#033acc" />
60
+ <stop offset="1" stopColor="#368eff" stopOpacity="0" />
61
+ </radialGradient>
62
+ <radialGradient
63
+ id={`${id}e`}
64
+ cx="-454.42"
65
+ cy="853.18"
66
+ r="6.99"
67
+ fx="-454.42"
68
+ fy="853.18"
69
+ gradientTransform="matrix(38.74213 82.7056 94.03873 -44.01576 -62416.51 75114.97)"
70
+ gradientUnits="userSpaceOnUse"
71
+ >
72
+ <stop offset=".59" stopColor="#3464e3" stopOpacity="0" />
73
+ <stop offset="1" stopColor="#033acc" />
74
+ </radialGradient>
75
+ <radialGradient
76
+ id={`${id}f`}
77
+ cx="-465.3"
78
+ cy="852.63"
79
+ r="6.99"
80
+ fx="-465.3"
81
+ fy="852.63"
82
+ gradientTransform="matrix(-101.35519 93.7574 146.5162 158.24743 -171232.53 -91444.13)"
83
+ gradientUnits="userSpaceOnUse"
84
+ >
85
+ <stop offset="0" stopColor="#4bfde8" />
86
+ <stop offset=".54" stopColor="#4bfde8" stopOpacity="0" />
87
+ </radialGradient>
88
+ <radialGradient
89
+ id={`${id}h`}
90
+ cx="-445.42"
91
+ cy="847.35"
92
+ r="6.99"
93
+ fx="-445.42"
94
+ fy="847.35"
95
+ gradientTransform="matrix(60.3777 22.14291 39.59688 -107.87213 -6264.92 101508.79)"
96
+ gradientUnits="userSpaceOnUse"
97
+ >
98
+ <stop offset="0" stopColor="#fff" />
99
+ <stop offset=".79" stopColor="#fff" stopOpacity="0" />
100
+ </radialGradient>
101
+ <radialGradient
102
+ id={`${id}i`}
103
+ cx="-468.67"
104
+ cy="861.39"
105
+ r="6.99"
106
+ fx="-468.67"
107
+ fy="861.39"
108
+ gradientTransform="matrix(-67.45933 53.77501 53.21816 66.68832 -76468.45 -32083.78)"
109
+ gradientUnits="userSpaceOnUse"
110
+ >
111
+ <stop offset="0" stopColor="#4bfde8" />
112
+ <stop offset=".58" stopColor="#4bfde8" stopOpacity="0" />
113
+ </radialGradient>
114
+ <linearGradient
115
+ id={`${id}g`}
116
+ x1="638.67"
117
+ x2="638.67"
118
+ y1="2.44"
119
+ y2="421.76"
120
+ gradientTransform="matrix(1 0 0 -1 0 617.01)"
121
+ gradientUnits="userSpaceOnUse"
122
+ >
123
+ <stop offset="0" stopColor="#0086ff" />
124
+ <stop offset=".49" stopColor="#0bf" />
125
+ </linearGradient>
126
+ </defs>
127
+ <path
128
+ d="M276.36 94.08C123.48 94.08 9.21 209.84.6 338.79c5.33 27.79 22.83 82.65 50.24 79.84 34.26-3.52 120.56 0 194.17-123.26 53.77-90.04 164.37-201.29 31.35-201.29Z"
129
+ style={{ fill: `url(#${id}a)` }}
130
+ />
131
+ <path
132
+ d="M240.99 142.19c-51.39 75.26-120.56 183.1-143.91 217.03-27.75 40.34-101.25 23.2-95.16-34.62a237.4 237.4 0 0 0-1.38 14.19C-9.51 489.22 119.43 614.14 279.88 614.14c176.84 0 598.58-203.81 555.9-408.02C790.8 86.1 664.36 0 521.07 0S285.94 76.36 241 142.19Z"
133
+ style={{ fill: `url(#${id}b)` }}
134
+ />
135
+ <path
136
+ d="M240.99 142.19c-51.39 75.26-120.56 183.1-143.91 217.03-27.75 40.34-101.25 23.2-95.16-34.62a237.4 237.4 0 0 0-1.38 14.19C-9.51 489.22 119.43 614.14 279.88 614.14c176.84 0 598.58-203.81 555.9-408.02C790.8 86.1 664.36 0 521.07 0S285.94 76.36 241 142.19Z"
137
+ style={{ fillOpacity: 0.4, fill: `url(#${id}c)` }}
138
+ />
139
+ <path
140
+ d="M240.99 142.19c-51.39 75.26-120.56 183.1-143.91 217.03-27.75 40.34-101.25 23.2-95.16-34.62a237.4 237.4 0 0 0-1.38 14.19C-9.51 489.22 119.43 614.14 279.88 614.14c176.84 0 598.58-203.81 555.9-408.02C790.8 86.1 664.36 0 521.07 0S285.94 76.36 241 142.19Z"
141
+ style={{ fill: `url(#${id}d)` }}
142
+ />
143
+ <path
144
+ d="M240.99 142.19c-51.39 75.26-120.56 183.1-143.91 217.03-27.75 40.34-101.25 23.2-95.16-34.62a237.4 237.4 0 0 0-1.38 14.19C-9.51 489.22 119.43 614.14 279.88 614.14c176.84 0 598.58-203.81 555.9-408.02C790.8 86.1 664.36 0 521.07 0S285.94 76.36 241 142.19Z"
145
+ style={{ fill: `url(#${id}e)`, fillOpacity: 0.6 }}
146
+ />
147
+ <path
148
+ d="M240.99 142.19c-51.39 75.26-120.56 183.1-143.91 217.03-27.75 40.34-101.25 23.2-95.16-34.62a237.4 237.4 0 0 0-1.38 14.19C-9.51 489.22 119.43 614.14 279.88 614.14c176.84 0 598.58-203.81 555.9-408.02C790.8 86.1 664.36 0 521.07 0S285.94 76.36 241 142.19Z"
149
+ style={{ fillOpacity: 0.9, fill: `url(#${id}f)` }}
150
+ />
151
+ <path
152
+ d="M277.34 614.23s422.24.77 493.86.77c129.97 0 228.8-98.16 228.8-212.69s-100.8-212.1-228.8-212.1-201.7 88.57-257.06 185.25c-64.87 113.29-147.62 237.41-236.8 238.77Z"
153
+ style={{ fill: `url(#${id}g)` }}
154
+ />
155
+ <path
156
+ d="M277.34 614.23s422.24.77 493.86.77c129.97 0 228.8-98.16 228.8-212.69s-100.8-212.1-228.8-212.1-201.7 88.57-257.06 185.25c-64.87 113.29-147.62 237.41-236.8 238.77Z"
157
+ style={{ fill: `url(#${id}h)`, fillOpacity: 0.4 }}
158
+ />
159
+ <path
160
+ d="M277.34 614.23s422.24.77 493.86.77c129.97 0 228.8-98.16 228.8-212.69s-100.8-212.1-228.8-212.1-201.7 88.57-257.06 185.25c-64.87 113.29-147.62 237.41-236.8 238.77Z"
161
+ style={{ fill: `url(#${id}i)`, fillOpacity: 0.9 }}
162
+ />
163
+ </LogoSvg>
164
+ );
165
+ }
@@ -0,0 +1,222 @@
1
+ import { useId } from "react";
2
+ import { LogoSvg, type LogoProps } from "./logo-svg";
3
+
4
+ /** Microsoft SharePoint mark. Gradient ids are unique per instance. */
5
+ export function SharePointIcon(props: LogoProps) {
6
+ const id = useId();
7
+ return (
8
+ <LogoSvg viewBox="0 0 450 500" {...props}>
9
+ <defs>
10
+ <radialGradient
11
+ id={`${id}b`}
12
+ cx="-777.14"
13
+ cy="770.84"
14
+ r=".9"
15
+ fx="-777.14"
16
+ fy="770.84"
17
+ gradientTransform="matrix(-98.02204 -236.87999 -426.55553 175.97802 252868.13 -319393.72)"
18
+ gradientUnits="userSpaceOnUse"
19
+ >
20
+ <stop offset=".29" stopColor="#003b5d" />
21
+ <stop offset=".61" stopColor="#004a6c" stopOpacity=".69" />
22
+ <stop offset=".97" stopColor="#006f94" stopOpacity="0" />
23
+ </radialGradient>
24
+ <radialGradient
25
+ id={`${id}c`}
26
+ cx="-785.23"
27
+ cy="766.9"
28
+ r=".9"
29
+ fx="-785.23"
30
+ fy="766.9"
31
+ gradientTransform="matrix(-81.36865 -200.4872 -360.58286 145.8959 212855.73 -269057.38)"
32
+ gradientUnits="userSpaceOnUse"
33
+ >
34
+ <stop offset=".26" stopColor="#002a42" />
35
+ <stop offset=".61" stopColor="#004261" stopOpacity=".69" />
36
+ <stop offset=".97" stopColor="#006f94" stopOpacity="0" />
37
+ </radialGradient>
38
+ <radialGradient
39
+ id={`${id}d`}
40
+ cx="-739.84"
41
+ cy="872.71"
42
+ r=".9"
43
+ fx="-739.84"
44
+ fy="872.71"
45
+ gradientTransform="matrix(-102.53313 149.24243 149.46801 102.38138 -206024.5 21094.22)"
46
+ gradientUnits="userSpaceOnUse"
47
+ >
48
+ <stop offset="0" stopColor="#78edff" />
49
+ <stop offset="1" stopColor="#2ccfca" stopOpacity="0" />
50
+ </radialGradient>
51
+ <radialGradient
52
+ id={`${id}f`}
53
+ cx="-746.38"
54
+ cy="743.75"
55
+ r=".9"
56
+ fx="-746.38"
57
+ fy="743.75"
58
+ gradientTransform="matrix(56.60729 -162.28035 -292.83982 -101.83188 260296.26 -45019.25)"
59
+ gradientUnits="userSpaceOnUse"
60
+ >
61
+ <stop offset="0" stopColor="#003b5d" />
62
+ <stop offset=".49" stopColor="#004c6c" stopOpacity=".72" />
63
+ <stop offset=".97" stopColor="#007a86" stopOpacity="0" />
64
+ </radialGradient>
65
+ <radialGradient
66
+ id={`${id}g`}
67
+ cx="-741.46"
68
+ cy="888.91"
69
+ r=".9"
70
+ fx="-741.46"
71
+ fy="888.91"
72
+ gradientTransform="matrix(-85.44333 124.36732 124.55255 85.31498 -173675.69 16546.9)"
73
+ gradientUnits="userSpaceOnUse"
74
+ >
75
+ <stop offset="0" stopColor="#78edff" />
76
+ <stop offset="1" stopColor="#2ccfca" stopOpacity="0" />
77
+ </radialGradient>
78
+ <radialGradient
79
+ id={`${id}j`}
80
+ cx="-686.6"
81
+ cy="804.18"
82
+ r=".9"
83
+ fx="-686.6"
84
+ fy="804.18"
85
+ gradientTransform="matrix(222.887 222.57601 222.92613 -222.53738 -26208.17 332025.54)"
86
+ gradientUnits="userSpaceOnUse"
87
+ >
88
+ <stop offset=".06" stopColor="#00b6bd" />
89
+ <stop offset=".89" stopColor="#00495c" />
90
+ </radialGradient>
91
+ <radialGradient
92
+ id={`${id}k`}
93
+ cx="-686.07"
94
+ cy="864.41"
95
+ r=".9"
96
+ fx="-686.07"
97
+ fy="864.41"
98
+ gradientTransform="matrix(0 155.79 177.62 0 -153439.14 107241.64)"
99
+ gradientUnits="userSpaceOnUse"
100
+ >
101
+ <stop offset=".57" stopColor="#1e8581" stopOpacity="0" />
102
+ <stop offset=".97" stopColor="#1ecbe6" />
103
+ </radialGradient>
104
+ <linearGradient
105
+ id={`${id}a`}
106
+ x1="92.18"
107
+ x2="292.29"
108
+ y1="477.48"
109
+ y2="214.84"
110
+ gradientTransform="matrix(1 0 0 -1 0 502)"
111
+ gradientUnits="userSpaceOnUse"
112
+ >
113
+ <stop offset="0" stopColor="#00e3df" />
114
+ <stop offset=".41" stopColor="#0097a8" />
115
+ <stop offset="1" stopColor="#007791" />
116
+ </linearGradient>
117
+ <linearGradient
118
+ id={`${id}e`}
119
+ x1="245.14"
120
+ x2="411.9"
121
+ y1="331.57"
122
+ y2="112.7"
123
+ gradientTransform="matrix(1 0 0 -1 0 502)"
124
+ gradientUnits="userSpaceOnUse"
125
+ >
126
+ <stop offset="0" stopColor="#00e3df" />
127
+ <stop offset=".48" stopColor="#00a2b8" />
128
+ <stop offset=".95" stopColor="#00637c" />
129
+ </linearGradient>
130
+ <linearGradient
131
+ id={`${id}h`}
132
+ x1="153.42"
133
+ x2="259.71"
134
+ y1="214.53"
135
+ y2="1.97"
136
+ gradientTransform="matrix(1 0 0 -1 0 502)"
137
+ gradientUnits="userSpaceOnUse"
138
+ >
139
+ <stop offset=".05" stopColor="#75fff6" />
140
+ <stop offset=".51" stopColor="#00c7d1" />
141
+ <stop offset=".96" stopColor="#0096ad" />
142
+ </linearGradient>
143
+ <linearGradient
144
+ id={`${id}i`}
145
+ x1="292.44"
146
+ x2="235.63"
147
+ y1="-12.27"
148
+ y2="67.45"
149
+ gradientTransform="matrix(1 0 0 -1 0 502)"
150
+ gradientUnits="userSpaceOnUse"
151
+ >
152
+ <stop offset=".26" stopColor="#0e5a5d" />
153
+ <stop offset=".54" stopColor="#126c6b" stopOpacity=".69" />
154
+ <stop offset=".97" stopColor="#1c948a" stopOpacity="0" />
155
+ </linearGradient>
156
+ </defs>
157
+ <path
158
+ d="M187.79 300c82.97 0 150.23-67.16 150.23-150S270.75 0 187.79 0 37.56 67.16 37.56 150s67.26 150 150.23 150Z"
159
+ fill={`url(#${id}a)`}
160
+ />
161
+ <path
162
+ d="M187.79 300c82.97 0 150.23-67.16 150.23-150S270.75 0 187.79 0 37.56 67.16 37.56 150s67.26 150 150.23 150Z"
163
+ fill={`url(#${id}b)`}
164
+ fillOpacity=".2"
165
+ />
166
+ <path
167
+ d="M187.79 300c82.97 0 150.23-67.16 150.23-150S270.75 0 187.79 0 37.56 67.16 37.56 150s67.26 150 150.23 150Z"
168
+ fill={`url(#${id}c)`}
169
+ fillOpacity=".31"
170
+ />
171
+ <path
172
+ d="M187.79 300c82.97 0 150.23-67.16 150.23-150S270.75 0 187.79 0 37.56 67.16 37.56 150s67.26 150 150.23 150Z"
173
+ fill={`url(#${id}d)`}
174
+ fillOpacity=".7"
175
+ />
176
+ <path
177
+ d="M324.81 400C393.95 400 450 344.04 450 275s-56.05-125-125.19-125-125.19 55.96-125.19 125 56.05 125 125.19 125Z"
178
+ fill={`url(#${id}e)`}
179
+ />
180
+ <path
181
+ d="M324.81 400C393.95 400 450 344.04 450 275s-56.05-125-125.19-125-125.19 55.96-125.19 125 56.05 125 125.19 125Z"
182
+ fill={`url(#${id}f)`}
183
+ fillOpacity=".5"
184
+ />
185
+ <path
186
+ d="M324.81 400C393.95 400 450 344.04 450 275s-56.05-125-125.19-125-125.19 55.96-125.19 125 56.05 125 125.19 125Z"
187
+ fill={`url(#${id}g)`}
188
+ fillOpacity=".7"
189
+ />
190
+ <path
191
+ d="M206.56 500c58.77 0 106.41-47.57 106.41-106.25S265.33 287.5 206.56 287.5s-106.41 47.57-106.41 106.25S147.79 500 206.56 500Z"
192
+ fill={`url(#${id}h)`}
193
+ />
194
+ <path
195
+ d="M206.56 500c58.77 0 106.41-47.57 106.41-106.25S265.33 287.5 206.56 287.5s-106.41 47.57-106.41 106.25S147.79 500 206.56 500Z"
196
+ fill={`url(#${id}i)`}
197
+ fillOpacity=".32"
198
+ />
199
+ <rect
200
+ width="200.3"
201
+ height="200"
202
+ y="237.5"
203
+ rx="40.66"
204
+ ry="40.66"
205
+ fill={`url(#${id}j)`}
206
+ />
207
+ <rect
208
+ width="200.3"
209
+ height="200"
210
+ y="237.5"
211
+ rx="40.66"
212
+ ry="40.66"
213
+ fill={`url(#${id}k)`}
214
+ fillOpacity=".6"
215
+ />
216
+ <path
217
+ d="m57 372.15 21.72-11.32c2.45 4.94 5.64 8.58 9.58 10.92 3.99 2.34 8.36 3.51 13.09 3.51 5.27 0 9.29-1.06 12.05-3.19 2.77-2.18 4.15-5.45 4.15-9.8 0-3.4-1.33-6.27-3.99-8.61-2.66-2.39-7.37-4.2-14.13-5.42-12.88-2.34-22.25-6.43-28.1-12.28-5.8-5.85-8.7-13.13-8.7-21.84 0-10.84 3.83-19.5 11.5-25.99 7.66-6.48 17.78-9.72 30.34-9.72 8.46 0 15.91 1.73 22.35 5.18 6.44 3.45 11.55 8.4 15.33 14.83l-21.23 10.92c-2.34-3.61-4.87-6.22-7.58-7.81-2.72-1.65-6.12-2.47-10.22-2.47-4.9 0-8.62 1.06-11.18 3.19-2.5 2.13-3.75 4.89-3.75 8.29 0 2.92 1.2 5.5 3.59 7.73 2.45 2.18 7.34 3.96 14.69 5.34 12.35 2.34 21.56 6.59 27.62 12.76 6.12 6.11 9.18 13.84 9.18 23.2 0 11.37-3.65 20.38-10.94 27.02-7.29 6.64-17.7 9.96-31.21 9.96-9.79 0-18.63-2.13-26.5-6.38-7.82-4.3-13.7-10.31-17.64-18.02Z"
218
+ fill="#fff"
219
+ />
220
+ </LogoSvg>
221
+ );
222
+ }
@@ -0,0 +1,25 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** Slack mark. */
4
+ export function SlackIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="0 0 24 24" {...props}>
7
+ <path
8
+ d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313z"
9
+ fill="#E01E5A"
10
+ />
11
+ <path
12
+ d="M8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312z"
13
+ fill="#36C5F0"
14
+ />
15
+ <path
16
+ d="M18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312z"
17
+ fill="#2EB67D"
18
+ />
19
+ <path
20
+ d="M15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z"
21
+ fill="#ECB22E"
22
+ />
23
+ </LogoSvg>
24
+ );
25
+ }
@@ -0,0 +1,10 @@
1
+ import { LogoSvg, type LogoProps } from "./logo-svg";
2
+
3
+ /** Vercel mark (svgl). Monochrome: uses `currentColor`, so set the colour with a text class. */
4
+ export function VercelIcon(props: LogoProps) {
5
+ return (
6
+ <LogoSvg viewBox="0 0 24 24" fill="currentColor" {...props}>
7
+ <path d="M24 22.525H0l12-21.05 12 21.05z" />
8
+ </LogoSvg>
9
+ );
10
+ }
@@ -25,7 +25,7 @@ export interface MenuConfig {
25
25
  /** `RadioItem` indicator. */
26
26
  radio?: React.ReactNode;
27
27
  };
28
- /** Default for `Content` `collisionPadding`. */
28
+ /** Default for `Content` `collisionPadding` (built-in: `8`). */
29
29
  collisionPadding?: number | Partial<Record<"top" | "right" | "bottom" | "left", number>>;
30
30
  }
31
31
 
@@ -16,7 +16,7 @@ export interface ButtonGroupConfig {
16
16
  }
17
17
 
18
18
  const buttonGroupBaseClasses =
19
- "flex w-fit items-stretch focus-visible:*:z-10 focus-visible:*:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 [&>[data-slot=select-trigger]:last-of-type]:has-[select[aria-hidden=true]:last-child]:rounded-r-md has-[>[data-slot=button-group]]:gap-2";
19
+ "flex w-fit items-stretch focus-visible:*:z-10 focus-visible:*:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 [&>[data-slot=select-trigger]:last-of-type]:has-[select[aria-hidden=true]:last-child]:rounded-r-md has-[>[data-slot=button-group]]:gap-2 max-sm:[&>*]:after:content-none";
20
20
 
21
21
  const buttonGroupOrientationClasses = {
22
22
  horizontal:
@@ -49,10 +49,10 @@ export interface ClearInputProps extends Omit<
49
49
  }
50
50
 
51
51
  const inputClasses =
52
- "flex h-10 w-full rounded-field border border-border bg-field-background px-3.5 py-2 text-base sm:text-sm transition-[border-color,box-shadow,background-color] duration-200 ease-smooth placeholder:text-field-placeholder disabled:cursor-not-allowed disabled:opacity-50";
52
+ "flex h-10 w-full max-sm:min-w-0 rounded-field border border-border bg-field-background px-3.5 py-2 text-base sm:text-sm transition-[border-color,box-shadow,background-color] duration-200 ease-smooth placeholder:text-field-placeholder disabled:cursor-not-allowed disabled:opacity-50";
53
53
 
54
54
  const buttonClasses =
55
- "absolute right-2 top-1/2 z-4 inline-flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-[background-color,color,transform] duration-100 ease-out active:scale-[0.92] hover:bg-surface-tertiary/50 hover:text-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring";
55
+ "absolute right-2 top-1/2 z-4 inline-flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-[background-color,color,transform] duration-100 ease-out active:scale-[0.92] hover:bg-surface-tertiary/50 hover:text-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring max-sm:hit-target";
56
56
 
57
57
  const ClearInput = React.forwardRef<HTMLInputElement, ClearInputProps>(
58
58
  ({ animation, clearButton, classes, ...props }, ref) => {