raft-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +24 -0
  2. package/dist/cn.d.mts +2 -0
  3. package/dist/cn.mjs +2 -0
  4. package/dist/index.d.mts +2710 -0
  5. package/dist/index.mjs +4821 -0
  6. package/dist/label-DWq4ia5I.mjs +115 -0
  7. package/dist/styled-props-B3SNekJg.d.mts +16 -0
  8. package/dist/wip.d.mts +1238 -0
  9. package/dist/wip.mjs +1416 -0
  10. package/package.json +70 -0
  11. package/src/components/avatar/avatar.tsx +375 -0
  12. package/src/components/avatar/index.ts +17 -0
  13. package/src/components/badge/badge.tsx +393 -0
  14. package/src/components/badge/index.ts +2 -0
  15. package/src/components/banner/banner.tsx +269 -0
  16. package/src/components/banner/index.ts +8 -0
  17. package/src/components/bottom-sheet/bottom-sheet.tsx +152 -0
  18. package/src/components/bottom-sheet/index.ts +22 -0
  19. package/src/components/button/button.tsx +497 -0
  20. package/src/components/button/index.ts +2 -0
  21. package/src/components/checkbox/checkbox-indicator.tsx +128 -0
  22. package/src/components/checkbox/checkbox.tsx +350 -0
  23. package/src/components/checkbox/index.ts +2 -0
  24. package/src/components/combobox/combobox.tsx +603 -0
  25. package/src/components/combobox/index.ts +52 -0
  26. package/src/components/context-menu/context-menu.tsx +380 -0
  27. package/src/components/context-menu/index.ts +34 -0
  28. package/src/components/conversation-preview-card/conversation-preview-card.tsx +336 -0
  29. package/src/components/conversation-preview-card/index.ts +32 -0
  30. package/src/components/description-list/description-list.tsx +116 -0
  31. package/src/components/description-list/index.ts +14 -0
  32. package/src/components/dropdown-menu/dropdown-menu.tsx +405 -0
  33. package/src/components/dropdown-menu/index.ts +38 -0
  34. package/src/components/empty-state/empty-state.tsx +177 -0
  35. package/src/components/empty-state/index.ts +16 -0
  36. package/src/components/field/field.tsx +125 -0
  37. package/src/components/field/index.ts +18 -0
  38. package/src/components/inline-code/index.ts +2 -0
  39. package/src/components/inline-code/inline-code.tsx +33 -0
  40. package/src/components/input/index.ts +2 -0
  41. package/src/components/input/input.tsx +76 -0
  42. package/src/components/input-group/index.ts +7 -0
  43. package/src/components/input-group/input-group.tsx +215 -0
  44. package/src/components/kbd/index.ts +2 -0
  45. package/src/components/kbd/kbd.tsx +43 -0
  46. package/src/components/label/index.ts +7 -0
  47. package/src/components/label/label.tsx +99 -0
  48. package/src/components/lightbox/index.ts +24 -0
  49. package/src/components/lightbox/lightbox.tsx +245 -0
  50. package/src/components/list-item/index.ts +20 -0
  51. package/src/components/list-item/list-item.tsx +263 -0
  52. package/src/components/media-list-item/index.ts +20 -0
  53. package/src/components/media-list-item/media-list-item.tsx +169 -0
  54. package/src/components/notification-center/index.ts +39 -0
  55. package/src/components/notification-center/notification-center.tsx +558 -0
  56. package/src/components/panel-header/index.ts +22 -0
  57. package/src/components/panel-header/panel-header.tsx +199 -0
  58. package/src/components/popover/index.ts +30 -0
  59. package/src/components/popover/popover.tsx +248 -0
  60. package/src/components/preview-shell/index.ts +2 -0
  61. package/src/components/preview-shell/preview-shell.tsx +51 -0
  62. package/src/components/quoted-message-card/index.ts +36 -0
  63. package/src/components/quoted-message-card/quoted-message-card.tsx +391 -0
  64. package/src/components/radio-group/index.ts +6 -0
  65. package/src/components/radio-group/radio-group.tsx +119 -0
  66. package/src/components/section-header/index.ts +16 -0
  67. package/src/components/section-header/section-header.tsx +117 -0
  68. package/src/components/section-label/index.ts +2 -0
  69. package/src/components/section-label/section-label.tsx +38 -0
  70. package/src/components/segmented-control/index.ts +12 -0
  71. package/src/components/segmented-control/segmented-control.tsx +129 -0
  72. package/src/components/select/index.ts +40 -0
  73. package/src/components/select/select.tsx +382 -0
  74. package/src/components/spinner/index.ts +2 -0
  75. package/src/components/spinner/spinner.tsx +228 -0
  76. package/src/components/status/index.ts +2 -0
  77. package/src/components/status/status.tsx +152 -0
  78. package/src/components/tabs/index.ts +24 -0
  79. package/src/components/tabs/tabs.tsx +417 -0
  80. package/src/components/text/index.ts +2 -0
  81. package/src/components/text/text.tsx +130 -0
  82. package/src/components/textarea/index.ts +2 -0
  83. package/src/components/textarea/textarea.tsx +136 -0
  84. package/src/components/toggle-group/index.ts +12 -0
  85. package/src/components/toggle-group/toggle-group.tsx +111 -0
  86. package/src/components/tooltip/index.ts +14 -0
  87. package/src/components/tooltip/tooltip.tsx +186 -0
  88. package/src/fonts/brutal.css +2 -0
  89. package/src/index.ts +404 -0
  90. package/src/legacy/AttentionDot.tsx +28 -0
  91. package/src/legacy/AvatarListRow.tsx +87 -0
  92. package/src/legacy/AvatarSlot.tsx +157 -0
  93. package/src/legacy/Badge.tsx +95 -0
  94. package/src/legacy/Banner.tsx +74 -0
  95. package/src/legacy/BottomSheet.tsx +76 -0
  96. package/src/legacy/CheckMarker.tsx +72 -0
  97. package/src/legacy/Checkbox.tsx +81 -0
  98. package/src/legacy/ConversationPreviewCard.tsx +169 -0
  99. package/src/legacy/DismissBackdrop.tsx +68 -0
  100. package/src/legacy/EmptyState.tsx +63 -0
  101. package/src/legacy/ExperimentalBadge.tsx +19 -0
  102. package/src/legacy/FormField.tsx +106 -0
  103. package/src/legacy/KeyValueRow.tsx +67 -0
  104. package/src/legacy/Lightbox.tsx +119 -0
  105. package/src/legacy/NotificationCenter.tsx +217 -0
  106. package/src/legacy/PanelHeader.tsx +94 -0
  107. package/src/legacy/PreviewShell.tsx +40 -0
  108. package/src/legacy/QuotedMessageCard.tsx +181 -0
  109. package/src/legacy/ReorderablePanelTabs.tsx +151 -0
  110. package/src/legacy/SandboxedPreviewFrame.tsx +59 -0
  111. package/src/legacy/SearchInput.tsx +23 -0
  112. package/src/legacy/SectionEyebrow.tsx +60 -0
  113. package/src/legacy/SectionHeader.tsx +68 -0
  114. package/src/legacy/SegmentedControl.tsx +74 -0
  115. package/src/legacy/SlugInput.tsx +29 -0
  116. package/src/legacy/Spinner.tsx +89 -0
  117. package/src/legacy/StatusDot.tsx +51 -0
  118. package/src/legacy/SurfaceListItem.tsx +32 -0
  119. package/src/legacy/Textarea.tsx +137 -0
  120. package/src/legacy/button.tsx +100 -0
  121. package/src/legacy/context-menu-divider.tsx +12 -0
  122. package/src/legacy/menu-item.tsx +66 -0
  123. package/src/legacy/selection-popover.tsx +212 -0
  124. package/src/legacy/server-switcher-menu.tsx +203 -0
  125. package/src/legacy/source.css +240 -0
  126. package/src/lib/cn.ts +1 -0
  127. package/src/lib/styled-props.ts +11 -0
  128. package/src/lib/theme/theme-context.ts +28 -0
  129. package/src/lib/theme/theme-provider.tsx +181 -0
  130. package/src/lib/theme/use-theme.ts +12 -0
  131. package/src/lib/tv.ts +29 -0
  132. package/src/lib/without-children.ts +6 -0
  133. package/src/styles.css +467 -0
  134. package/src/wip.ts +255 -0
@@ -0,0 +1,111 @@
1
+ import type { ComponentPropsWithRef } from "react";
2
+ import { Toggle as BaseToggle } from "@base-ui/react/toggle";
3
+ import { ToggleGroup as BaseToggleGroup } from "@base-ui/react/toggle-group";
4
+ import { tv, type VariantProps } from "../../lib/tv.ts";
5
+ import type { StyledProps } from "../../lib/styled-props.ts";
6
+ import { useThemeFamily } from "../../lib/theme/use-theme.ts";
7
+
8
+ const toggleGroup = tv({
9
+ slots: {
10
+ root: ["inline-flex max-w-full flex-wrap items-center gap-1"],
11
+ item: [
12
+ "flex h-7 min-w-0 shrink-0 items-center gap-1 px-2",
13
+ "text-xs font-bold transition-colors",
14
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
15
+ ],
16
+ label: ["truncate"],
17
+ count: ["font-mono text-[10px] leading-none"],
18
+ },
19
+ variants: {
20
+ theme: {
21
+ brutal: {
22
+ item: [
23
+ "border-2 border-line-strong bg-layer-panel text-foreground-strong",
24
+ "hover:bg-primary-400/30 data-[pressed]:bg-primary-400 data-[pressed]:text-foreground-strong",
25
+ "data-[pressed]:shadow-sm data-[disabled]:cursor-not-allowed",
26
+ ],
27
+ count: ["text-foreground/40", "group-data-[pressed]/toggle-group-item:text-foreground/60"],
28
+ },
29
+ // Elegant styling is deferred; see the component TODO.
30
+ elegant: {},
31
+ },
32
+ disabled: {
33
+ true: {
34
+ root: "opacity-50",
35
+ },
36
+ false: {
37
+ root: "",
38
+ },
39
+ },
40
+ },
41
+ defaultVariants: {
42
+ disabled: false,
43
+ },
44
+ });
45
+
46
+ export type ToggleGroupProps<T extends string = string> = StyledProps<
47
+ Omit<BaseToggleGroup.Props<T>, "defaultValue" | "multiple" | "onValueChange" | "value">
48
+ > &
49
+ Omit<VariantProps<typeof toggleGroup>, "theme"> & {
50
+ value: T;
51
+ onValueChange: (value: T, eventDetails: BaseToggleGroup.ChangeEventDetails) => void;
52
+ ariaLabel?: string;
53
+ };
54
+
55
+ export function ToggleGroup<T extends string = string>({
56
+ value,
57
+ onValueChange,
58
+ ariaLabel,
59
+ disabled = false,
60
+ className,
61
+ ...props
62
+ }: ToggleGroupProps<T>) {
63
+ const { root } = toggleGroup({ disabled });
64
+ return (
65
+ <BaseToggleGroup
66
+ value={[value]}
67
+ onValueChange={(nextValue, eventDetails) => {
68
+ const selectedValue = nextValue[0];
69
+ if (selectedValue) onValueChange(selectedValue, eventDetails);
70
+ }}
71
+ aria-label={ariaLabel}
72
+ disabled={disabled}
73
+ data-slot="toggle-group"
74
+ className={root({ className })}
75
+ {...props}
76
+ />
77
+ );
78
+ }
79
+
80
+ export type ToggleGroupItemProps<T extends string = string> = StyledProps<BaseToggle.Props<T>>;
81
+
82
+ export function ToggleGroupItem<T extends string = string>({
83
+ className,
84
+ ...props
85
+ }: ToggleGroupItemProps<T>) {
86
+ const theme = useThemeFamily();
87
+ const { item } = toggleGroup({ theme });
88
+ return (
89
+ <BaseToggle
90
+ type="button"
91
+ data-slot="toggle-group-item"
92
+ className={item({ className: `group/toggle-group-item ${className ?? ""}`.trim() })}
93
+ {...props}
94
+ />
95
+ );
96
+ }
97
+
98
+ export type ToggleGroupLabelProps = ComponentPropsWithRef<"span">;
99
+
100
+ export function ToggleGroupLabel({ className, ...props }: ToggleGroupLabelProps) {
101
+ const { label } = toggleGroup();
102
+ return <span data-slot="toggle-group-label" className={label({ className })} {...props} />;
103
+ }
104
+
105
+ export type ToggleGroupCountProps = ComponentPropsWithRef<"span">;
106
+
107
+ export function ToggleGroupCount({ className, ...props }: ToggleGroupCountProps) {
108
+ const theme = useThemeFamily();
109
+ const { count } = toggleGroup({ theme });
110
+ return <span data-slot="toggle-group-count" className={count({ className })} {...props} />;
111
+ }
@@ -0,0 +1,14 @@
1
+ export {
2
+ Tooltip,
3
+ TooltipContent,
4
+ TooltipPortal,
5
+ TooltipProvider,
6
+ TooltipTrigger,
7
+ } from "./tooltip.tsx";
8
+ export type {
9
+ TooltipContentProps,
10
+ TooltipPortalProps,
11
+ TooltipProps,
12
+ TooltipProviderProps,
13
+ TooltipTriggerProps,
14
+ } from "./tooltip.tsx";
@@ -0,0 +1,186 @@
1
+ import { Tooltip as BaseTooltip } from "@base-ui/react/tooltip";
2
+ import type { ComponentProps } from "react";
3
+ import { tv } from "../../lib/tv.ts";
4
+ import type { StyledProps } from "../../lib/styled-props.ts";
5
+ import { useThemeFamily } from "../../lib/theme/use-theme.ts";
6
+
7
+ const tooltip = tv({
8
+ slots: {
9
+ trigger: ["select-none"],
10
+ positioner: ["isolate z-50 outline-none"],
11
+ content: [
12
+ "relative inline-flex max-w-xs items-center gap-1.5 px-2.5 py-1.5",
13
+ "text-xs leading-4 whitespace-normal",
14
+ "origin-[var(--transform-origin)] outline-none",
15
+ "transition-[opacity,transform] duration-100",
16
+ "data-[starting-style]:scale-95 data-[starting-style]:opacity-0",
17
+ "data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
18
+ "data-[instant]:transition-none",
19
+ "[&>svg]:size-3.5 [&>svg]:shrink-0",
20
+ "has-[[data-slot=kbd]]:py-1.5 has-[[data-slot=kbd]]:pr-1.5",
21
+ "[&_[data-slot=kbd]]:relative [&_[data-slot=kbd]]:z-10",
22
+ "[&_[data-slot=kbd]]:h-4 [&_[data-slot=kbd]]:min-w-4 [&_[data-slot=kbd]]:px-1 [&_[data-slot=kbd]]:py-0",
23
+ "[&_[data-slot=kbd]]:text-[10px] [&_[data-slot=kbd]]:font-semibold [&_[data-slot=kbd]]:leading-none",
24
+ ],
25
+ arrow: [
26
+ "pointer-events-none flex",
27
+ "data-[side=top]:bottom-[-6px]",
28
+ "data-[side=bottom]:top-[-6px] data-[side=bottom]:rotate-180",
29
+ "data-[side=left]:right-[-8px] data-[side=left]:-rotate-90",
30
+ "data-[side=right]:left-[-8px] data-[side=right]:rotate-90",
31
+ "data-[side=inline-start]:right-[-8px] data-[side=inline-start]:-rotate-90",
32
+ "data-[side=inline-end]:left-[-8px] data-[side=inline-end]:rotate-90",
33
+ ],
34
+ },
35
+ variants: {
36
+ theme: {
37
+ brutal: {
38
+ content: [
39
+ "border-2 border-black bg-white",
40
+ "font-sans font-bold text-black",
41
+ "shadow-none",
42
+ "[&_[data-slot=kbd]]:text-black/60",
43
+ ],
44
+ arrow: ["hidden"],
45
+ },
46
+ elegant: {
47
+ content: [
48
+ "rounded-md bg-layer-popover",
49
+ "font-sans text-xs font-medium tracking-[-0.005em] text-foreground-strong",
50
+ "shadow-[0_0_0_1px_oklch(0.21_0.006_285_/_0.10),0_1px_1px_oklch(0.21_0.006_285_/_0.04),0_1px_4px_-3px_oklch(0.21_0.006_285_/_0.10)]",
51
+ "[&_[data-slot=kbd]]:bg-foreground-muted/10 [&_[data-slot=kbd]]:text-foreground-muted [&_[data-slot=kbd]]:ring-0",
52
+ ],
53
+ arrow: [],
54
+ },
55
+ },
56
+ },
57
+ });
58
+
59
+ export type TooltipProviderProps = BaseTooltip.Provider.Props;
60
+
61
+ export function TooltipProvider({ delay = 0, ...props }: TooltipProviderProps) {
62
+ return <BaseTooltip.Provider delay={delay} {...props} />;
63
+ }
64
+
65
+ export type TooltipProps = BaseTooltip.Root.Props;
66
+
67
+ export function Tooltip(props: TooltipProps) {
68
+ return <BaseTooltip.Root {...props} />;
69
+ }
70
+
71
+ export type TooltipTriggerProps = StyledProps<BaseTooltip.Trigger.Props>;
72
+
73
+ export function TooltipTrigger({ className, ...props }: TooltipTriggerProps) {
74
+ const theme = useThemeFamily();
75
+ const { trigger } = tooltip({ theme });
76
+ return (
77
+ <BaseTooltip.Trigger
78
+ data-slot="tooltip-trigger"
79
+ className={trigger({ className })}
80
+ {...props}
81
+ />
82
+ );
83
+ }
84
+
85
+ export type TooltipPortalProps = BaseTooltip.Portal.Props;
86
+
87
+ export function TooltipPortal(props: TooltipPortalProps) {
88
+ return <BaseTooltip.Portal data-slot="tooltip-portal" {...props} />;
89
+ }
90
+
91
+ type TooltipArrowProps = StyledProps<BaseTooltip.Arrow.Props>;
92
+
93
+ function TooltipArrow({ className, ...props }: TooltipArrowProps) {
94
+ const theme = useThemeFamily();
95
+ const { arrow } = tooltip({ theme });
96
+ return (
97
+ <BaseTooltip.Arrow data-slot="tooltip-arrow" className={arrow({ className })} {...props}>
98
+ <TooltipArrowSvg />
99
+ </BaseTooltip.Arrow>
100
+ );
101
+ }
102
+
103
+ function TooltipArrowSvg(props: ComponentProps<"svg">) {
104
+ return (
105
+ <svg width="12" height="6" viewBox="0 0 12 6" fill="none" {...props}>
106
+ <path d="M1 0H11L6 5.25Z" className="fill-layer-popover" />
107
+ <path
108
+ d="M1 0.5L6 5.25L11 0.5"
109
+ className="stroke-[oklch(0.21_0.006_285_/_0.10)]"
110
+ strokeLinecap="round"
111
+ strokeLinejoin="round"
112
+ vectorEffect="non-scaling-stroke"
113
+ />
114
+ </svg>
115
+ );
116
+ }
117
+
118
+ export type TooltipContentProps = StyledProps<BaseTooltip.Popup.Props> &
119
+ Pick<
120
+ BaseTooltip.Positioner.Props,
121
+ | "align"
122
+ | "alignOffset"
123
+ | "anchor"
124
+ | "arrowPadding"
125
+ | "collisionAvoidance"
126
+ | "collisionBoundary"
127
+ | "collisionPadding"
128
+ | "disableAnchorTracking"
129
+ | "positionMethod"
130
+ | "side"
131
+ | "sideOffset"
132
+ | "sticky"
133
+ > & {
134
+ portalProps?: TooltipPortalProps;
135
+ };
136
+
137
+ export function TooltipContent({
138
+ align = "center",
139
+ alignOffset = 0,
140
+ anchor,
141
+ arrowPadding,
142
+ collisionAvoidance,
143
+ collisionBoundary,
144
+ collisionPadding,
145
+ disableAnchorTracking = false,
146
+ positionMethod = "fixed",
147
+ side = "top",
148
+ sideOffset = 6,
149
+ sticky,
150
+ portalProps,
151
+ className,
152
+ children,
153
+ ...props
154
+ }: TooltipContentProps) {
155
+ const theme = useThemeFamily();
156
+ const { positioner, content } = tooltip({ theme });
157
+
158
+ return (
159
+ <BaseTooltip.Portal {...portalProps}>
160
+ <BaseTooltip.Positioner
161
+ align={align}
162
+ alignOffset={alignOffset}
163
+ anchor={anchor}
164
+ arrowPadding={arrowPadding}
165
+ collisionAvoidance={collisionAvoidance}
166
+ collisionBoundary={collisionBoundary}
167
+ collisionPadding={collisionPadding}
168
+ disableAnchorTracking={disableAnchorTracking}
169
+ positionMethod={positionMethod}
170
+ side={side}
171
+ sideOffset={sideOffset}
172
+ sticky={sticky}
173
+ className={positioner()}
174
+ >
175
+ <BaseTooltip.Popup
176
+ data-slot="tooltip-content"
177
+ className={content({ className })}
178
+ {...props}
179
+ >
180
+ {children}
181
+ <TooltipArrow />
182
+ </BaseTooltip.Popup>
183
+ </BaseTooltip.Positioner>
184
+ </BaseTooltip.Portal>
185
+ );
186
+ }
@@ -0,0 +1,2 @@
1
+ @import "@fontsource-variable/space-grotesk/wght.css";
2
+ @import "@fontsource-variable/geist-mono/wght.css";