@seed-design/react 1.1.16 → 1.2.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 (189) hide show
  1. package/lib/components/AspectRatio/AspectRatio.cjs +53 -0
  2. package/lib/components/AspectRatio/AspectRatio.d.ts +11 -0
  3. package/lib/components/AspectRatio/AspectRatio.d.ts.map +1 -0
  4. package/lib/components/AspectRatio/AspectRatio.js +30 -0
  5. package/lib/components/AspectRatio/index.cjs +9 -0
  6. package/lib/components/AspectRatio/index.d.ts +2 -0
  7. package/lib/components/AspectRatio/index.d.ts.map +1 -0
  8. package/lib/components/AspectRatio/index.js +1 -0
  9. package/lib/components/Avatar/Avatar.cjs +4 -10
  10. package/lib/components/Avatar/Avatar.d.ts +4 -4
  11. package/lib/components/Avatar/Avatar.d.ts.map +1 -1
  12. package/lib/components/Avatar/Avatar.js +4 -10
  13. package/lib/components/Checkbox/Checkbox.cjs +10 -0
  14. package/lib/components/Checkbox/Checkbox.d.ts +4 -0
  15. package/lib/components/Checkbox/Checkbox.d.ts.map +1 -1
  16. package/lib/components/Checkbox/Checkbox.js +10 -1
  17. package/lib/components/Checkbox/Checkbox.namespace.cjs +1 -0
  18. package/lib/components/Checkbox/Checkbox.namespace.d.ts +1 -1
  19. package/lib/components/Checkbox/Checkbox.namespace.d.ts.map +1 -1
  20. package/lib/components/Checkbox/Checkbox.namespace.js +1 -1
  21. package/lib/components/Checkbox/index.cjs +1 -0
  22. package/lib/components/Checkbox/index.d.ts +1 -1
  23. package/lib/components/Checkbox/index.d.ts.map +1 -1
  24. package/lib/components/Checkbox/index.js +1 -1
  25. package/lib/components/ChipTabs/ChipTabs.cjs +23 -4
  26. package/lib/components/ChipTabs/ChipTabs.d.ts.map +1 -1
  27. package/lib/components/ChipTabs/ChipTabs.js +23 -4
  28. package/lib/components/Dialog/Dialog.d.ts.map +1 -1
  29. package/lib/components/Fieldset/Fieldset.cjs +86 -0
  30. package/lib/components/Fieldset/Fieldset.d.ts +30 -0
  31. package/lib/components/Fieldset/Fieldset.d.ts.map +1 -0
  32. package/lib/components/Fieldset/Fieldset.js +75 -0
  33. package/lib/components/Fieldset/Fieldset.namespace.cjs +16 -0
  34. package/lib/components/Fieldset/Fieldset.namespace.d.ts +2 -0
  35. package/lib/components/Fieldset/Fieldset.namespace.d.ts.map +1 -0
  36. package/lib/components/Fieldset/Fieldset.namespace.js +1 -0
  37. package/lib/components/Fieldset/index.cjs +18 -0
  38. package/lib/components/Fieldset/index.d.ts +3 -0
  39. package/lib/components/Fieldset/index.d.ts.map +1 -0
  40. package/lib/components/Fieldset/index.js +3 -0
  41. package/lib/components/Grid/Grid.cjs +56 -0
  42. package/lib/components/Grid/Grid.d.ts +41 -0
  43. package/lib/components/Grid/Grid.d.ts.map +1 -0
  44. package/lib/components/Grid/Grid.js +33 -0
  45. package/lib/components/Grid/index.cjs +9 -0
  46. package/lib/components/Grid/index.d.ts +2 -0
  47. package/lib/components/Grid/index.d.ts.map +1 -0
  48. package/lib/components/Grid/index.js +1 -0
  49. package/lib/components/GridItem/GridItem.cjs +45 -0
  50. package/lib/components/GridItem/GridItem.d.ts +35 -0
  51. package/lib/components/GridItem/GridItem.d.ts.map +1 -0
  52. package/lib/components/GridItem/GridItem.js +22 -0
  53. package/lib/components/GridItem/index.cjs +9 -0
  54. package/lib/components/GridItem/index.d.ts +2 -0
  55. package/lib/components/GridItem/index.d.ts.map +1 -0
  56. package/lib/components/GridItem/index.js +1 -0
  57. package/lib/components/HelpBubble/HelpBubble.cjs +5 -0
  58. package/lib/components/HelpBubble/HelpBubble.d.ts +3 -0
  59. package/lib/components/HelpBubble/HelpBubble.d.ts.map +1 -1
  60. package/lib/components/HelpBubble/HelpBubble.js +5 -1
  61. package/lib/components/HelpBubble/HelpBubble.namespace.cjs +1 -0
  62. package/lib/components/HelpBubble/HelpBubble.namespace.d.ts +1 -1
  63. package/lib/components/HelpBubble/HelpBubble.namespace.d.ts.map +1 -1
  64. package/lib/components/HelpBubble/HelpBubble.namespace.js +1 -1
  65. package/lib/components/HelpBubble/index.cjs +1 -0
  66. package/lib/components/HelpBubble/index.d.ts +1 -1
  67. package/lib/components/HelpBubble/index.d.ts.map +1 -1
  68. package/lib/components/HelpBubble/index.js +1 -1
  69. package/lib/components/ImageFrame/ImageFrame.cjs +157 -0
  70. package/lib/components/ImageFrame/ImageFrame.d.ts +51 -0
  71. package/lib/components/ImageFrame/ImageFrame.d.ts.map +1 -0
  72. package/lib/components/ImageFrame/ImageFrame.js +129 -0
  73. package/lib/components/ImageFrame/index.cjs +14 -0
  74. package/lib/components/ImageFrame/index.d.ts +2 -0
  75. package/lib/components/ImageFrame/index.d.ts.map +1 -0
  76. package/lib/components/ImageFrame/index.js +1 -0
  77. package/lib/components/MenuSheet/MenuSheet.cjs +60 -24
  78. package/lib/components/MenuSheet/MenuSheet.d.ts +12 -0
  79. package/lib/components/MenuSheet/MenuSheet.d.ts.map +1 -1
  80. package/lib/components/MenuSheet/MenuSheet.js +57 -25
  81. package/lib/components/MenuSheet/MenuSheet.namespace.cjs +4 -0
  82. package/lib/components/MenuSheet/MenuSheet.namespace.d.ts +1 -1
  83. package/lib/components/MenuSheet/MenuSheet.namespace.d.ts.map +1 -1
  84. package/lib/components/MenuSheet/MenuSheet.namespace.js +1 -1
  85. package/lib/components/MenuSheet/index.cjs +4 -0
  86. package/lib/components/MenuSheet/index.d.ts +1 -1
  87. package/lib/components/MenuSheet/index.d.ts.map +1 -1
  88. package/lib/components/MenuSheet/index.js +1 -1
  89. package/lib/components/RadioGroup/RadioGroup.cjs +4 -1
  90. package/lib/components/RadioGroup/RadioGroup.d.ts +3 -2
  91. package/lib/components/RadioGroup/RadioGroup.d.ts.map +1 -1
  92. package/lib/components/RadioGroup/RadioGroup.js +4 -1
  93. package/lib/components/RadioGroupField/RadioGroupField.cjs +79 -0
  94. package/lib/components/RadioGroupField/RadioGroupField.d.ts +30 -0
  95. package/lib/components/RadioGroupField/RadioGroupField.d.ts.map +1 -0
  96. package/lib/components/RadioGroupField/RadioGroupField.js +68 -0
  97. package/lib/components/RadioGroupField/RadioGroupField.namespace.cjs +16 -0
  98. package/lib/components/RadioGroupField/RadioGroupField.namespace.d.ts +2 -0
  99. package/lib/components/RadioGroupField/RadioGroupField.namespace.d.ts.map +1 -0
  100. package/lib/components/RadioGroupField/RadioGroupField.namespace.js +1 -0
  101. package/lib/components/RadioGroupField/index.cjs +18 -0
  102. package/lib/components/RadioGroupField/index.d.ts +3 -0
  103. package/lib/components/RadioGroupField/index.d.ts.map +1 -0
  104. package/lib/components/RadioGroupField/index.js +3 -0
  105. package/lib/components/SelectBox/CheckSelectBox.cjs +117 -8
  106. package/lib/components/SelectBox/CheckSelectBox.d.ts +38 -10
  107. package/lib/components/SelectBox/CheckSelectBox.d.ts.map +1 -1
  108. package/lib/components/SelectBox/CheckSelectBox.js +113 -10
  109. package/lib/components/SelectBox/CheckSelectBox.namespace.cjs +6 -0
  110. package/lib/components/SelectBox/CheckSelectBox.namespace.d.ts +1 -1
  111. package/lib/components/SelectBox/CheckSelectBox.namespace.d.ts.map +1 -1
  112. package/lib/components/SelectBox/CheckSelectBox.namespace.js +1 -1
  113. package/lib/components/SelectBox/RadioSelectBox.cjs +112 -9
  114. package/lib/components/SelectBox/RadioSelectBox.d.ts +31 -7
  115. package/lib/components/SelectBox/RadioSelectBox.d.ts.map +1 -1
  116. package/lib/components/SelectBox/RadioSelectBox.js +109 -10
  117. package/lib/components/SelectBox/RadioSelectBox.namespace.cjs +5 -1
  118. package/lib/components/SelectBox/RadioSelectBox.namespace.d.ts +1 -1
  119. package/lib/components/SelectBox/RadioSelectBox.namespace.d.ts.map +1 -1
  120. package/lib/components/SelectBox/RadioSelectBox.namespace.js +1 -1
  121. package/lib/components/SelectBox/index.cjs +11 -1
  122. package/lib/components/SelectBox/index.d.ts +2 -2
  123. package/lib/components/SelectBox/index.d.ts.map +1 -1
  124. package/lib/components/SelectBox/index.js +2 -2
  125. package/lib/components/Switch/Switch.cjs +10 -5
  126. package/lib/components/Switch/Switch.d.ts +3 -3
  127. package/lib/components/Switch/Switch.d.ts.map +1 -1
  128. package/lib/components/Switch/Switch.js +10 -5
  129. package/lib/components/TagGroup/TagGroup.cjs +25 -9
  130. package/lib/components/TagGroup/TagGroup.d.ts +5 -1
  131. package/lib/components/TagGroup/TagGroup.d.ts.map +1 -1
  132. package/lib/components/TagGroup/TagGroup.js +25 -10
  133. package/lib/components/TagGroup/TagGroup.namespace.cjs +1 -0
  134. package/lib/components/TagGroup/TagGroup.namespace.d.ts +1 -1
  135. package/lib/components/TagGroup/TagGroup.namespace.d.ts.map +1 -1
  136. package/lib/components/TagGroup/TagGroup.namespace.js +1 -1
  137. package/lib/components/TagGroup/index.cjs +1 -0
  138. package/lib/components/TagGroup/index.d.ts +1 -1
  139. package/lib/components/TagGroup/index.d.ts.map +1 -1
  140. package/lib/components/TagGroup/index.js +1 -1
  141. package/lib/components/index.cjs +53 -1
  142. package/lib/components/index.d.ts +6 -0
  143. package/lib/components/index.d.ts.map +1 -1
  144. package/lib/components/index.js +16 -6
  145. package/lib/index.cjs +53 -1
  146. package/lib/index.js +16 -6
  147. package/lib/utils/styled.cjs +11 -5
  148. package/lib/utils/styled.d.ts +6 -0
  149. package/lib/utils/styled.d.ts.map +1 -1
  150. package/lib/utils/styled.js +11 -5
  151. package/package.json +6 -3
  152. package/src/components/AspectRatio/AspectRatio.tsx +38 -0
  153. package/src/components/AspectRatio/index.ts +1 -0
  154. package/src/components/Avatar/Avatar.tsx +7 -14
  155. package/src/components/Checkbox/Checkbox.namespace.ts +2 -0
  156. package/src/components/Checkbox/Checkbox.tsx +24 -0
  157. package/src/components/Checkbox/index.ts +2 -0
  158. package/src/components/ChipTabs/ChipTabs.tsx +25 -4
  159. package/src/components/Dialog/Dialog.tsx +6 -0
  160. package/src/components/Fieldset/Fieldset.namespace.ts +17 -0
  161. package/src/components/Fieldset/Fieldset.tsx +101 -0
  162. package/src/components/Fieldset/index.ts +19 -0
  163. package/src/components/Grid/Grid.tsx +79 -0
  164. package/src/components/Grid/index.ts +1 -0
  165. package/src/components/GridItem/GridItem.tsx +70 -0
  166. package/src/components/GridItem/index.ts +1 -0
  167. package/src/components/HelpBubble/HelpBubble.namespace.ts +3 -0
  168. package/src/components/HelpBubble/HelpBubble.tsx +7 -2
  169. package/src/components/HelpBubble/index.ts +2 -0
  170. package/src/components/ImageFrame/ImageFrame.tsx +227 -0
  171. package/src/components/ImageFrame/index.ts +14 -0
  172. package/src/components/MenuSheet/MenuSheet.namespace.ts +8 -0
  173. package/src/components/MenuSheet/MenuSheet.tsx +82 -34
  174. package/src/components/MenuSheet/index.ts +8 -0
  175. package/src/components/RadioGroup/RadioGroup.tsx +8 -2
  176. package/src/components/RadioGroupField/RadioGroupField.namespace.ts +18 -0
  177. package/src/components/RadioGroupField/RadioGroupField.tsx +114 -0
  178. package/src/components/RadioGroupField/index.ts +2 -0
  179. package/src/components/SelectBox/CheckSelectBox.namespace.ts +12 -0
  180. package/src/components/SelectBox/CheckSelectBox.tsx +229 -24
  181. package/src/components/SelectBox/RadioSelectBox.namespace.ts +10 -2
  182. package/src/components/SelectBox/RadioSelectBox.tsx +210 -16
  183. package/src/components/SelectBox/index.ts +22 -2
  184. package/src/components/Switch/Switch.tsx +16 -7
  185. package/src/components/TagGroup/TagGroup.namespace.ts +2 -0
  186. package/src/components/TagGroup/TagGroup.tsx +33 -9
  187. package/src/components/TagGroup/index.ts +2 -0
  188. package/src/components/index.ts +6 -0
  189. package/src/utils/styled.tsx +23 -5
@@ -0,0 +1,70 @@
1
+ import * as React from "react";
2
+ import { Box, type BoxProps } from "../Box/Box";
3
+
4
+ export interface GridItemProps extends Omit<BoxProps, "gridColumn" | "gridRow" | "gridArea"> {
5
+ /**
6
+ * If true, the component will render its children directly without a wrapper element.
7
+ * @default false
8
+ */
9
+ asChild?: boolean;
10
+
11
+ /**
12
+ * Number of columns to span, or "full" for full width (1 / -1).
13
+ */
14
+ colSpan?: number | "full";
15
+
16
+ /**
17
+ * Number of rows to span, or "full" for full height (1 / -1).
18
+ */
19
+ rowSpan?: number | "full";
20
+
21
+ /**
22
+ * Starting column
23
+ */
24
+ colStart?: number;
25
+
26
+ /**
27
+ * Ending column.
28
+ */
29
+ colEnd?: number;
30
+
31
+ /**
32
+ * Starting row
33
+ */
34
+ rowStart?: number;
35
+
36
+ /**
37
+ * Ending row.
38
+ */
39
+ rowEnd?: number;
40
+
41
+ // NOTE: grid-area is not currently supported here: see Grid.tsx
42
+ }
43
+
44
+ export const GridItem = React.forwardRef<HTMLDivElement, GridItemProps>((props, ref) => {
45
+ const { asChild = false, colSpan, colStart, colEnd, rowSpan, rowStart, rowEnd, ...rest } = props;
46
+
47
+ const gridColumn = getGridLine(colSpan, colStart, colEnd);
48
+ const gridRow = getGridLine(rowSpan, rowStart, rowEnd);
49
+
50
+ return <Box ref={ref} asChild={asChild} gridColumn={gridColumn} gridRow={gridRow} {...rest} />;
51
+ });
52
+ GridItem.displayName = "GridItem";
53
+
54
+ function getGridLine(
55
+ span: GridItemProps["colSpan"] & GridItemProps["rowSpan"],
56
+ start: GridItemProps["colStart"] & GridItemProps["rowStart"],
57
+ end: GridItemProps["colEnd"] & GridItemProps["rowEnd"],
58
+ ): (BoxProps["gridRow"] & BoxProps["gridColumn"]) | undefined {
59
+ if (span === "full") return "1 / -1";
60
+
61
+ if (start !== undefined && end !== undefined) return `${start} / ${end}`;
62
+
63
+ if (start !== undefined) return `${start}`;
64
+
65
+ if (end !== undefined) return `auto / ${end}`;
66
+
67
+ if (span !== undefined) return `span ${span}`;
68
+
69
+ return undefined;
70
+ }
@@ -0,0 +1 @@
1
+ export { GridItem, type GridItemProps } from "./GridItem";
@@ -2,6 +2,7 @@ export {
2
2
  HelpBubbleAnchor as Anchor,
3
3
  HelpBubbleArrow as Arrow,
4
4
  HelpBubbleArrowTip as ArrowTip,
5
+ HelpBubbleBody as Body,
5
6
  HelpBubbleCloseButton as CloseButton,
6
7
  HelpBubbleContent as Content,
7
8
  HelpBubbleDescription as Description,
@@ -10,8 +11,10 @@ export {
10
11
  HelpBubbleRoot as Root,
11
12
  HelpBubbleTitle as Title,
12
13
  HelpBubbleTrigger as Trigger,
14
+ type HelpBubbleAnchorProps as AnchorProps,
13
15
  type HelpBubbleArrowProps as ArrowProps,
14
16
  type HelpBubbleArrowTipProps as ArrowTipProps,
17
+ type HelpBubbleBodyProps as BodyProps,
15
18
  type HelpBubbleCloseButtonProps as CloseButtonProps,
16
19
  type HelpBubbleContentProps as ContentProps,
17
20
  type HelpBubbleDescriptionProps as DescriptionProps,
@@ -147,6 +147,13 @@ export const HelpBubbleCloseButton = withContext<HTMLButtonElement, HelpBubbleCl
147
147
 
148
148
  ////////////////////////////////////////////////////////////////////////////////////
149
149
 
150
+ export interface HelpBubbleBodyProps extends PrimitiveProps, React.HTMLAttributes<HTMLDivElement> {}
151
+
152
+ export const HelpBubbleBody = withContext<HTMLDivElement, HelpBubbleBodyProps>(
153
+ withStateProps(Primitive.div),
154
+ "body",
155
+ );
156
+
150
157
  export interface HelpBubbleTitleProps
151
158
  extends PrimitiveProps,
152
159
  React.HTMLAttributes<HTMLSpanElement> {}
@@ -156,8 +163,6 @@ export const HelpBubbleTitle = withContext<HTMLSpanElement, HelpBubbleTitleProps
156
163
  "title",
157
164
  );
158
165
 
159
- ////////////////////////////////////////////////////////////////////////////////////
160
-
161
166
  export interface HelpBubbleDescriptionProps
162
167
  extends PrimitiveProps,
163
168
  React.HTMLAttributes<HTMLDivElement> {}
@@ -2,6 +2,7 @@ export {
2
2
  HelpBubbleAnchor,
3
3
  HelpBubbleArrow,
4
4
  HelpBubbleArrowTip,
5
+ HelpBubbleBody,
5
6
  HelpBubbleCloseButton,
6
7
  HelpBubbleContent,
7
8
  HelpBubbleDescription,
@@ -13,6 +14,7 @@ export {
13
14
  type HelpBubbleAnchorProps,
14
15
  type HelpBubbleArrowProps,
15
16
  type HelpBubbleArrowTipProps,
17
+ type HelpBubbleBodyProps,
16
18
  type HelpBubbleCloseButtonProps,
17
19
  type HelpBubbleContentProps,
18
20
  type HelpBubbleDescriptionProps,
@@ -0,0 +1,227 @@
1
+ import {
2
+ imageFrame as imageFrameRecipe,
3
+ type ImageFrameVariantProps,
4
+ } from "@seed-design/css/recipes/image-frame";
5
+ import {
6
+ imageFrameIcon,
7
+ type ImageFrameIconVariantProps,
8
+ } from "@seed-design/css/recipes/image-frame-icon";
9
+ import {
10
+ imageFrameIndicator,
11
+ type ImageFrameIndicatorVariantProps,
12
+ } from "@seed-design/css/recipes/image-frame-indicator";
13
+ import { imageFrameReactionButton } from "@seed-design/css/recipes/image-frame-reaction-button";
14
+ import { imageFrameFloater as floaterVars } from "@seed-design/css/vars/component";
15
+ import { Image } from "@seed-design/react-image";
16
+ import { Toggle as TogglePrimitive } from "@seed-design/react-toggle";
17
+ import clsx from "clsx";
18
+ import * as React from "react";
19
+ import { AspectRatio, type AspectRatioProps } from "../AspectRatio/AspectRatio";
20
+ import { Badge, type BadgeProps } from "../Badge/Badge";
21
+ import { Float, type FloatProps } from "../Float/Float";
22
+ import { Icon } from "../Icon/Icon";
23
+
24
+ export interface ImageFrameProps
25
+ extends Omit<AspectRatioProps, "children">,
26
+ ImageFrameVariantProps {
27
+ src: string;
28
+ alt: string;
29
+ fallback?: React.ReactNode;
30
+ loading?: "eager" | "lazy";
31
+ decoding?: "async" | "auto" | "sync";
32
+ crossOrigin?: "anonymous" | "use-credentials" | "";
33
+ referrerPolicy?: React.HTMLAttributeReferrerPolicy;
34
+ sizes?: string;
35
+ srcSet?: string;
36
+ onLoad?: React.ReactEventHandler<HTMLImageElement>;
37
+ onError?: React.ReactEventHandler<HTMLImageElement>;
38
+ /**
39
+ * Overlay elements to be rendered on top of the image.
40
+ * Use ImageFrameFloater to position them.
41
+ */
42
+ children?: React.ReactNode;
43
+ }
44
+
45
+ export const ImageFrame = React.forwardRef<HTMLDivElement, ImageFrameProps>(
46
+ (
47
+ {
48
+ ratio = 4 / 3,
49
+ rounded,
50
+ stroke,
51
+ src,
52
+ alt,
53
+ fallback,
54
+ className,
55
+ loading,
56
+ decoding,
57
+ crossOrigin,
58
+ referrerPolicy,
59
+ sizes,
60
+ srcSet,
61
+ onLoad,
62
+ onError,
63
+ children,
64
+ ...rest
65
+ },
66
+ ref,
67
+ ) => {
68
+ return (
69
+ <AspectRatio ref={ref} ratio={ratio} className={className} {...rest}>
70
+ <Image.Root className={imageFrameRecipe({ rounded, stroke })}>
71
+ <Image.Content
72
+ src={src}
73
+ alt={alt}
74
+ loading={loading}
75
+ decoding={decoding}
76
+ crossOrigin={crossOrigin}
77
+ referrerPolicy={referrerPolicy}
78
+ sizes={sizes}
79
+ srcSet={srcSet}
80
+ onLoad={onLoad}
81
+ onError={onError}
82
+ />
83
+ {fallback && <Image.Fallback>{fallback}</Image.Fallback>}
84
+ {children}
85
+ </Image.Root>
86
+ </AspectRatio>
87
+ );
88
+ },
89
+ );
90
+
91
+ ImageFrame.displayName = "ImageFrame";
92
+
93
+ ////////////////////////////////////////////////////////////////////////////////////
94
+
95
+ export interface ImageFrameFloaterProps extends FloatProps {}
96
+
97
+ /**
98
+ * ImageFrame 내에서 오버레이 요소를 배치하기 위한 컴포넌트
99
+ *
100
+ * @remarks
101
+ * offsetX, offsetY 기본값은 rootage 스펙(image-frame-floater)에서 가져옵니다.
102
+ */
103
+ export const ImageFrameFloater = React.forwardRef<HTMLDivElement, ImageFrameFloaterProps>(
104
+ (
105
+ {
106
+ offsetX = floaterVars.base.enabled.root.offset,
107
+ offsetY = floaterVars.base.enabled.root.offset,
108
+ ...rest
109
+ },
110
+ ref,
111
+ ) => {
112
+ return <Float ref={ref} offsetX={offsetX} offsetY={offsetY} {...rest} />;
113
+ },
114
+ );
115
+
116
+ ImageFrameFloater.displayName = "ImageFrameFloater";
117
+
118
+ ////////////////////////////////////////////////////////////////////////////////////
119
+
120
+ export interface ImageFrameBadgeProps extends BadgeProps {}
121
+
122
+ export const ImageFrameBadge = React.forwardRef<HTMLSpanElement, ImageFrameBadgeProps>(
123
+ (props, ref) => {
124
+ return <Badge ref={ref} {...props} />;
125
+ },
126
+ );
127
+
128
+ ImageFrameBadge.displayName = "ImageFrameBadge";
129
+
130
+ ////////////////////////////////////////////////////////////////////////////////////
131
+
132
+ export interface ImageFrameIconProps
133
+ extends ImageFrameIconVariantProps,
134
+ Omit<React.HTMLAttributes<HTMLSpanElement>, "children"> {
135
+ svg: React.ReactNode;
136
+ }
137
+
138
+ export const ImageFrameIcon = React.forwardRef<HTMLSpanElement, ImageFrameIconProps>(
139
+ ({ svg, className, ...rest }, ref) => {
140
+ return (
141
+ <span ref={ref} className={clsx(imageFrameIcon(), className)} {...rest}>
142
+ <Icon svg={svg} />
143
+ </span>
144
+ );
145
+ },
146
+ );
147
+
148
+ ImageFrameIcon.displayName = "ImageFrameIcon";
149
+
150
+ ////////////////////////////////////////////////////////////////////////////////////
151
+
152
+ export interface ImageFrameIndicatorProps
153
+ extends ImageFrameIndicatorVariantProps,
154
+ React.HTMLAttributes<HTMLSpanElement> {
155
+ children: React.ReactNode;
156
+ }
157
+
158
+ export const ImageFrameIndicator = React.forwardRef<HTMLSpanElement, ImageFrameIndicatorProps>(
159
+ ({ children, className, ...rest }, ref) => {
160
+ return (
161
+ <span ref={ref} className={clsx(imageFrameIndicator(), className)} {...rest}>
162
+ {children}
163
+ </span>
164
+ );
165
+ },
166
+ );
167
+
168
+ ImageFrameIndicator.displayName = "ImageFrameIndicator";
169
+
170
+ ////////////////////////////////////////////////////////////////////////////////////
171
+
172
+ const HeartFillPath =
173
+ "M15.5452 10C11.7873 10 9.25 12.9484 9.25 16.6267C9.25 19.8754 11.1219 22.0952 13.1877 23.969C13.7807 24.5069 14.4438 25.0617 15.095 25.6066C15.5434 25.9817 15.9862 26.3522 16.3967 26.7093C17.4501 27.6257 18.4191 28.557 19.1995 29.5994C19.3886 29.8518 19.6856 30.0003 20.001 30C20.3163 29.9997 20.6131 29.8507 20.8016 29.5979C21.5785 28.5562 22.5453 27.6253 23.598 26.7091C24.0105 26.35 24.4568 25.9766 24.9089 25.5984C25.5573 25.0559 26.2176 24.5035 26.807 23.9693C28.8739 22.096 30.75 19.8761 30.75 16.6267C30.75 12.9484 28.2127 10 24.4548 10C22.6365 10 21.1002 11.0545 20 12.4906C18.8998 11.0545 17.3635 10 15.5452 10Z";
174
+
175
+ const HeartOutlineStrokePath =
176
+ "M15.5452 12C13.0342 12 11.25 13.905 11.25 16.6267C11.25 18.9912 12.5659 20.7048 14.5314 22.4876C15.1157 23.0176 15.7038 23.5087 16.3148 24.019C16.7646 24.3946 17.2269 24.7807 17.7093 25.2003C18.4947 25.8835 19.2814 26.6141 19.9988 27.4215C20.7144 26.614 21.5001 25.8836 22.2849 25.2005C22.7714 24.7771 23.2368 24.3885 23.6895 24.0105C24.2967 23.5035 24.8813 23.0154 25.4639 22.4874C27.4317 20.704 28.75 18.9906 28.75 16.6267C28.75 13.905 26.9658 12 24.4548 12C23.069 12 21.747 12.8325 20.8919 14.5189C20.7215 14.8549 20.3768 15.0667 20 15.0667C19.6233 15.0667 19.2785 14.8549 19.1081 14.5189C18.2531 12.8325 16.931 12 15.5452 12ZM9.25 16.6267C9.25 12.9484 11.7873 10 15.5452 10C17.3146 10 18.8683 10.8364 20 12.2306C21.1317 10.8364 22.6854 10 24.4548 10C28.2127 10 30.75 12.9484 30.75 16.6267C30.75 19.8761 28.8739 22.096 26.807 23.9693C26.2176 24.5035 25.5573 25.0559 24.9089 25.5984C24.4568 25.9766 24.0105 26.35 23.598 26.7091C22.5453 27.6253 21.5785 28.5562 20.8016 29.5979C20.6131 29.8507 20.3163 29.9997 20.001 30C19.6856 30.0003 19.3886 29.8518 19.1995 29.5994C18.4191 28.557 17.4501 27.6257 16.3967 26.7093C15.9862 26.3522 15.5434 25.9817 15.095 25.6066C14.4438 25.0617 13.7807 24.5069 13.1877 23.969C11.1219 22.0952 9.25 19.8754 9.25 16.6267Z";
177
+
178
+ const UnselectedHeartIcon = () => (
179
+ <svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
180
+ <path d={HeartFillPath} fill="black" fillOpacity="0.063" />
181
+ <path fillRule="evenodd" clipRule="evenodd" d={HeartOutlineStrokePath} fill="white" />
182
+ </svg>
183
+ );
184
+
185
+ const SelectedHeartIcon = () => {
186
+ const id = React.useId();
187
+ const gradientId = `seed-heart-gradient${id.replace(/:/g, "")}`;
188
+ return (
189
+ <svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
190
+ <path d={HeartFillPath} fill={`url(#${gradientId})`} />
191
+ <defs>
192
+ <linearGradient
193
+ id={gradientId}
194
+ x1="7"
195
+ y1="8.5"
196
+ x2="26.0974"
197
+ y2="10.5391"
198
+ gradientUnits="userSpaceOnUse"
199
+ >
200
+ <stop stopColor="#FF9A56" />
201
+ <stop offset="1" stopColor="#FF6600" />
202
+ </linearGradient>
203
+ </defs>
204
+ </svg>
205
+ );
206
+ };
207
+
208
+ export interface ImageFrameReactionButtonProps
209
+ extends Omit<TogglePrimitive.RootProps, "children"> {}
210
+
211
+ export const ImageFrameReactionButton = React.forwardRef<
212
+ HTMLButtonElement,
213
+ ImageFrameReactionButtonProps
214
+ >(({ className, pressed, ...rest }, ref) => {
215
+ return (
216
+ <TogglePrimitive.Root
217
+ ref={ref}
218
+ className={clsx(imageFrameReactionButton(), className)}
219
+ pressed={pressed}
220
+ {...rest}
221
+ >
222
+ <Icon svg={pressed ? <SelectedHeartIcon /> : <UnselectedHeartIcon />} />
223
+ </TogglePrimitive.Root>
224
+ );
225
+ });
226
+
227
+ ImageFrameReactionButton.displayName = "ImageFrameReactionButton";
@@ -0,0 +1,14 @@
1
+ export {
2
+ ImageFrame,
3
+ ImageFrameFloater,
4
+ ImageFrameBadge,
5
+ ImageFrameIcon,
6
+ ImageFrameIndicator,
7
+ ImageFrameReactionButton,
8
+ type ImageFrameProps,
9
+ type ImageFrameFloaterProps,
10
+ type ImageFrameBadgeProps,
11
+ type ImageFrameIconProps,
12
+ type ImageFrameIndicatorProps,
13
+ type ImageFrameReactionButtonProps,
14
+ } from "./ImageFrame";
@@ -6,10 +6,14 @@ export {
6
6
  MenuSheetHeader as Header,
7
7
  MenuSheetRoot as Root,
8
8
  MenuSheetTitle as Title,
9
+ MenuSheetDescription as Description,
9
10
  MenuSheetTrigger as Trigger,
10
11
  MenuSheetList as List,
11
12
  MenuSheetGroup as Group,
12
13
  MenuSheetItem as Item,
14
+ MenuSheetItemContent as ItemContent,
15
+ MenuSheetItemLabel as ItemLabel,
16
+ MenuSheetItemDescription as ItemDescription,
13
17
  MenuSheetCloseButton as CloseButton,
14
18
  type MenuSheetBackdropProps as BackdropProps,
15
19
  type MenuSheetPositionerProps as PositionerProps,
@@ -18,9 +22,13 @@ export {
18
22
  type MenuSheetHeaderProps as HeaderProps,
19
23
  type MenuSheetRootProps as RootProps,
20
24
  type MenuSheetTitleProps as TitleProps,
25
+ type MenuSheetDescriptionProps as DescriptionProps,
21
26
  type MenuSheetTriggerProps as TriggerProps,
22
27
  type MenuSheetListProps as ListProps,
23
28
  type MenuSheetGroupProps as GroupProps,
24
29
  type MenuSheetItemProps as ItemProps,
30
+ type MenuSheetItemContentProps as ItemContentProps,
31
+ type MenuSheetItemLabelProps as ItemLabelProps,
32
+ type MenuSheetItemDescriptionProps as ItemDescriptionProps,
25
33
  type MenuSheetCloseButtonProps as CloseButtonProps,
26
34
  } from "./MenuSheet";
@@ -6,16 +6,17 @@ import {
6
6
  type MenuSheetItemVariantProps,
7
7
  } from "@seed-design/css/recipes/menu-sheet-item";
8
8
  import * as React from "react";
9
- import { createRecipeContext } from "../../utils/createRecipeContext";
10
9
  import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
11
10
  import { createWithStateProps } from "../../utils/createWithStateProps";
11
+ import clsx from "clsx";
12
12
 
13
- const { withRootProvider, withContext } = createSlotRecipeContext(menuSheet);
13
+ const { withRootProvider, withContext, useClassNames } = createSlotRecipeContext(menuSheet);
14
14
  const {
15
- withContext: withItemContext,
16
15
  PropsProvider: ItemPropsProvider,
17
16
  useProps: useItemProps,
18
- } = createRecipeContext(menuSheetItem);
17
+ withContext: withItemContext,
18
+ ClassNamesProvider: ItemClassNamesProvider,
19
+ } = createSlotRecipeContext(menuSheetItem);
19
20
  const withStateProps = createWithStateProps([useDialogContext]);
20
21
 
21
22
  ////////////////////////////////////////////////////////////////////////////////////
@@ -68,18 +69,18 @@ export interface MenuSheetContentProps
68
69
  extends DialogPrimitive.ContentProps,
69
70
  Pick<MenuSheetItemVariantProps, "labelAlign"> {}
70
71
 
71
- const MenuSheetContentBase = withContext<HTMLDivElement, DialogPrimitive.ContentProps>(
72
- DialogPrimitive.Content,
73
- "content",
74
- );
75
-
76
72
  export const MenuSheetContent = React.forwardRef<HTMLDivElement, MenuSheetContentProps>(
77
- ({ labelAlign, children, ...props }, ref) => {
73
+ ({ className, ...props }, ref) => {
74
+ const [variantProps, otherProps] = menuSheetItem.splitVariantProps(props);
75
+ const classNames = useClassNames();
76
+
78
77
  return (
79
- <ItemPropsProvider value={React.useMemo(() => ({ labelAlign }), [labelAlign])}>
80
- <MenuSheetContentBase ref={ref} {...props}>
81
- {children}
82
- </MenuSheetContentBase>
78
+ <ItemPropsProvider value={variantProps}>
79
+ <DialogPrimitive.Content
80
+ className={clsx(classNames.content, className)}
81
+ ref={ref}
82
+ {...otherProps}
83
+ />
83
84
  </ItemPropsProvider>
84
85
  );
85
86
  },
@@ -96,8 +97,9 @@ export const MenuSheetHeader = withContext<HTMLDivElement, MenuSheetHeaderProps>
96
97
  "header",
97
98
  );
98
99
 
99
- ////////////////////////////////////////////////////////////////////////////////////
100
-
100
+ // NOTE: uses DialogPrimitive.TitleProps,
101
+ // but actual rendered component is a Primitive.h2 rather than a DialogPrimitive.Title
102
+ // find out why later; h2 is same but missing and some a11y features
101
103
  export interface MenuSheetTitleProps extends DialogPrimitive.TitleProps {}
102
104
 
103
105
  export const MenuSheetTitle = withContext<HTMLHeadingElement, MenuSheetTitleProps>(
@@ -105,6 +107,16 @@ export const MenuSheetTitle = withContext<HTMLHeadingElement, MenuSheetTitleProp
105
107
  "title",
106
108
  );
107
109
 
110
+ // NOTE: uses DialogPrimitive.DescriptionProps,
111
+ // but actual rendered component is a Primitive.p rather than a DialogPrimitive.Description
112
+ // find out why later; p is same but missing and some a11y features
113
+ export interface MenuSheetDescriptionProps extends DialogPrimitive.DescriptionProps {}
114
+
115
+ export const MenuSheetDescription = withContext<HTMLParagraphElement, MenuSheetDescriptionProps>(
116
+ withStateProps(Primitive.p),
117
+ "description",
118
+ );
119
+
108
120
  ////////////////////////////////////////////////////////////////////////////////////
109
121
 
110
122
  export interface MenuSheetListProps extends PrimitiveProps, React.HTMLAttributes<HTMLDivElement> {}
@@ -120,21 +132,22 @@ export interface MenuSheetGroupProps
120
132
  extends React.HTMLAttributes<HTMLDivElement>,
121
133
  Pick<MenuSheetItemVariantProps, "labelAlign"> {}
122
134
 
123
- const MenuSheetGroupBase = withContext<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
124
- withStateProps(Primitive.div),
125
- "group",
126
- );
127
-
128
135
  export const MenuSheetGroup = React.forwardRef<HTMLDivElement, MenuSheetGroupProps>(
129
- ({ labelAlign: overriddenLabelAlign, children, ...props }, ref) => {
136
+ ({ className, ...props }, ref) => {
137
+ const [variantProps, otherProps] = menuSheetItem.splitVariantProps(props);
130
138
  const parentProps = useItemProps();
131
- const labelAlign = overriddenLabelAlign ?? parentProps?.labelAlign;
139
+
140
+ const classNames = useClassNames();
141
+ const { stateProps } = useDialogContext();
132
142
 
133
143
  return (
134
- <ItemPropsProvider value={React.useMemo(() => ({ labelAlign }), [labelAlign])}>
135
- <MenuSheetGroupBase ref={ref} {...props}>
136
- {children}
137
- </MenuSheetGroupBase>
144
+ <ItemPropsProvider value={{ ...parentProps, ...variantProps }}>
145
+ <Primitive.div
146
+ className={clsx(classNames.group, className)}
147
+ ref={ref}
148
+ {...stateProps}
149
+ {...otherProps}
150
+ />
138
151
  </ItemPropsProvider>
139
152
  );
140
153
  },
@@ -147,19 +160,54 @@ export interface MenuSheetItemProps
147
160
  MenuSheetItemVariantProps,
148
161
  React.HTMLAttributes<HTMLButtonElement> {}
149
162
 
150
- const MenuSheetItemBase = withItemContext<HTMLButtonElement, MenuSheetItemProps>(
151
- withStateProps(Primitive.button),
152
- );
153
-
154
163
  export const MenuSheetItem = React.forwardRef<HTMLButtonElement, MenuSheetItemProps>(
155
- ({ labelAlign: overriddenLabelAlign, ...props }, ref) => {
164
+ ({ className: propClassName, ...props }, ref) => {
165
+ const [variantProps, otherProps] = menuSheetItem.splitVariantProps(props);
156
166
  const parentProps = useItemProps();
157
- const labelAlign = overriddenLabelAlign ?? parentProps?.labelAlign;
158
167
 
159
- return <MenuSheetItemBase ref={ref} labelAlign={labelAlign} {...props} />;
168
+ const classNames = menuSheetItem({ ...parentProps, ...variantProps });
169
+ const { stateProps } = useDialogContext();
170
+
171
+ return (
172
+ <ItemClassNamesProvider value={classNames}>
173
+ <Primitive.button
174
+ ref={ref}
175
+ className={clsx(classNames.root, propClassName)}
176
+ {...stateProps}
177
+ {...otherProps}
178
+ />
179
+ </ItemClassNamesProvider>
180
+ );
160
181
  },
161
182
  );
162
183
 
184
+ export interface MenuSheetItemContentProps
185
+ extends PrimitiveProps,
186
+ React.HTMLAttributes<HTMLDivElement> {}
187
+
188
+ export const MenuSheetItemContent = withItemContext<HTMLDivElement, MenuSheetItemContentProps>(
189
+ withStateProps(Primitive.div),
190
+ "content",
191
+ );
192
+
193
+ export interface MenuSheetItemLabelProps
194
+ extends PrimitiveProps,
195
+ React.HTMLAttributes<HTMLSpanElement> {}
196
+
197
+ export const MenuSheetItemLabel = withItemContext<HTMLSpanElement, MenuSheetItemLabelProps>(
198
+ withStateProps(Primitive.span),
199
+ "label",
200
+ );
201
+
202
+ export interface MenuSheetItemDescriptionProps
203
+ extends PrimitiveProps,
204
+ React.HTMLAttributes<HTMLSpanElement> {}
205
+
206
+ export const MenuSheetItemDescription = withItemContext<
207
+ HTMLSpanElement,
208
+ MenuSheetItemDescriptionProps
209
+ >(withStateProps(Primitive.span), "description");
210
+
163
211
  ////////////////////////////////////////////////////////////////////////////////////
164
212
 
165
213
  export interface MenuSheetFooterProps
@@ -6,10 +6,14 @@ export {
6
6
  MenuSheetHeader,
7
7
  MenuSheetRoot,
8
8
  MenuSheetTitle,
9
+ MenuSheetDescription,
9
10
  MenuSheetTrigger,
10
11
  MenuSheetList,
11
12
  MenuSheetGroup,
12
13
  MenuSheetItem,
14
+ MenuSheetItemContent,
15
+ MenuSheetItemLabel,
16
+ MenuSheetItemDescription,
13
17
  MenuSheetCloseButton,
14
18
  type MenuSheetBackdropProps,
15
19
  type MenuSheetPositionerProps,
@@ -18,10 +22,14 @@ export {
18
22
  type MenuSheetHeaderProps,
19
23
  type MenuSheetRootProps,
20
24
  type MenuSheetTitleProps,
25
+ type MenuSheetDescriptionProps,
21
26
  type MenuSheetTriggerProps,
22
27
  type MenuSheetListProps,
23
28
  type MenuSheetGroupProps,
24
29
  type MenuSheetItemProps,
30
+ type MenuSheetItemContentProps,
31
+ type MenuSheetItemLabelProps,
32
+ type MenuSheetItemDescriptionProps,
25
33
  type MenuSheetCloseButtonProps,
26
34
  } from "./MenuSheet";
27
35
 
@@ -1,4 +1,5 @@
1
1
  import { radio, type RadioVariantProps } from "@seed-design/css/recipes/radio";
2
+ import { radioGroup, type RadioGroupVariantProps } from "@seed-design/css/recipes/radio-group";
2
3
  import { radiomark, type RadiomarkVariantProps } from "@seed-design/css/recipes/radiomark";
3
4
  import { mergeProps } from "@seed-design/dom-utils";
4
5
  import {
@@ -12,7 +13,9 @@ import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext";
12
13
  import { createWithStateProps } from "../../utils/createWithStateProps";
13
14
  import { InternalIcon } from "../private/Icon";
14
15
  import { splitMultipleVariantsProps } from "../../utils/splitMultipleVariantsProps";
16
+ import { createRecipeContext } from "../../utils/createRecipeContext";
15
17
 
18
+ const { withContext: withGroupContext } = createRecipeContext(radioGroup);
16
19
  const { ClassNamesProvider, withContext } = createSlotRecipeContext(radio);
17
20
  const {
18
21
  withProvider: withRadiomarkProvider,
@@ -23,9 +26,12 @@ const withStateProps = createWithStateProps([useRadioGroupItemContext]);
23
26
 
24
27
  ////////////////////////////////////////////////////////////////////////////////////
25
28
 
26
- export interface RadioGroupRootProps extends RadioGroupPrimitive.RootProps {}
29
+ export interface RadioGroupRootProps
30
+ extends RadioGroupVariantProps,
31
+ PrimitiveProps,
32
+ React.HTMLAttributes<HTMLDivElement> {}
27
33
 
28
- export const RadioGroupRoot = RadioGroupPrimitive.Root;
34
+ export const RadioGroupRoot = withGroupContext<HTMLDivElement, RadioGroupRootProps>(Primitive.div);
29
35
 
30
36
  ////////////////////////////////////////////////////////////////////////////////////
31
37
 
@@ -0,0 +1,18 @@
1
+ export {
2
+ RadioGroupFieldRoot as Root,
3
+ RadioGroupFieldHeader as Header,
4
+ RadioGroupFieldLabel as Label,
5
+ RadioGroupFieldIndicatorText as IndicatorText,
6
+ RadioGroupFieldRequiredIndicator as RequiredIndicator,
7
+ RadioGroupFieldFooter as Footer,
8
+ RadioGroupFieldDescription as Description,
9
+ RadioGroupFieldErrorMessage as ErrorMessage,
10
+ type RadioGroupFieldRootProps as RootProps,
11
+ type RadioGroupFieldHeaderProps as HeaderProps,
12
+ type RadioGroupFieldLabelProps as LabelProps,
13
+ type RadioGroupFieldIndicatorTextProps as IndicatorTextProps,
14
+ type RadioGroupFieldRequiredIndicatorProps as RequiredIndicatorProps,
15
+ type RadioGroupFieldFooterProps as FooterProps,
16
+ type RadioGroupFieldDescriptionProps as DescriptionProps,
17
+ type RadioGroupFieldErrorMessageProps as ErrorMessageProps,
18
+ } from "./RadioGroupField";