@teamturing/react-kit 1.4.0 → 2.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.
@@ -274,7 +274,7 @@ declare const GradientText: import("styled-components").IStyledComponent<"web",
274
274
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLSpanElement> | undefined;
275
275
  } & {
276
276
  typography?: import("styled-system").ResponsiveValue<"s" | "m" | "xxs" | "xs" | "l" | "xl" | "xxl" | "display1" | "display2" | "display3" | "display4" | "xxl/regular" | "xxl/bold" | "xl/regular" | "xl/bold" | "l/regular" | "l/bold" | "m/regular" | "m/bold" | "s/regular" | "s/bold" | "xs/regular" | "xs/bold" | "xxs/regular" | "xxs/bold"> | undefined;
277
- } & import("../../utils/styled-system").SxProp & import("../../utils/styled-system").WordBreakProps & import("../../utils/styled-system").WhiteSpaceProps & import("../../utils/styled-system").TextDecorationProps & import("styled-system").FontSizeProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, "s" | "m" | "xxs" | "xs" | "l" | "xl" | "xxl" | "display1" | "display2" | "display3" | "display4"> & import("styled-system").FontWeightProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, "bold" | "medium" | "regular"> & import("styled-system").LineHeightProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, 2 | 1> & import("styled-system").TextAlignProps<Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> & import("styled-system").ColorProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, "link" | "icon/neutral" | "scale/violet/0" | "scale/violet/1" | "scale/violet/2" | "scale/violet/3" | "scale/violet/4" | "scale/violet/5" | "scale/violet/6" | "scale/violet/7" | "scale/violet/8" | "scale/violet/9" | "dim" | "link/hovered" | "link/pressed" | "link/neutral" | "link/neutral/hovered" | "link/neutral/pressed" | "link/neutral/bold" | "link/neutral/bold/hovered" | "link/neutral/bold/pressed" | "link/disabled" | "icon/neutral/bold" | "icon/neutral/bolder" | "icon/accent/gray" | "icon/accent/blue" | "icon/accent/blue/bold" | "icon/accent/green" | "icon/accent/yellow" | "icon/accent/red" | "icon/inverse" | "icon/disabled" | "icon/disabled/subtler" | "icon/selected/primary" | "icon/selected/neutral" | "icon/primary" | "icon/primary/subtle" | "icon/primary/bold" | "icon/success" | "icon/warning" | "icon/danger" | "border/neutral/subtle" | "border/neutral" | "border/neutral/bolder" | "border/input" | "border/inverse" | "border/disabled" | "border/primary" | "border/hovered" | "border/focused" | "border/danger" | "border/success" | "bg/secondary" | "bg/secondary/hovered" | "bg/secondary/pressed" | "bg/primary" | "bg/primary/hovered" | "bg/primary/pressed" | "bg/neutral/subtler" | "bg/neutral/subtler/hovered" | "bg/neutral/subtler/pressed" | "bg/neutral/subtle" | "bg/neutral/subtle/hovered" | "bg/neutral/subtle/pressed" | "bg/neutral" | "bg/neutral/hovered" | "bg/neutral/pressed" | "bg/neutral/bold" | "bg/neutral/bold/hovered" | "bg/neutral/bold/pressed" | "bg/neutral/bolder" | "bg/neutral/bolder/hovered" | "bg/neutral/bolder/pressed" | "bg/disabled" | "bg/disabled/subtlest" | "bg/input" | "bg/accent/green/subtlest" | "bg/accent/yellow/subtlest" | "bg/accent/red/subtlest" | "bg/accent/red/subtle" | "bg/accent/red" | "bg/accent/gray/subtlest" | "bg/accent/blue/subtlest" | "bg/selected/violet" | "bg/selected/neutral" | "bg/selected/neutral/subtle" | "bg/inverse" | "bg/inverse/subtlest" | "bg/success" | "bg/success/bold" | "bg/warning" | "bg/warning/bold" | "bg/danger" | "bg/danger/bold" | "bg/danger/bold/hovered" | "bg/danger/bold/pressed" | "text/primary" | "text/accent/blue" | "text/accent/green" | "text/accent/yellow" | "text/accent/red" | "text/neutral/subtlest" | "text/neutral/subtler" | "text/neutral/subtle" | "text/neutral" | "text/inverse" | "text/inverse/subtle" | "text/inverse/subtler" | "text/disabled" | "text/success" | "text/warning" | "text/danger" | "text/selected/neutral">, "ref"> & {
277
+ } & import("../../utils/styled-system").SxProp & import("../../utils/styled-system").WordBreakProps & import("../../utils/styled-system").WhiteSpaceProps & import("../../utils/styled-system").TextDecorationProps & import("styled-system").FontSizeProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, "s" | "m" | "xxs" | "xs" | "l" | "xl" | "xxl" | "display1" | "display2" | "display3" | "display4"> & import("styled-system").FontWeightProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, "bold" | "medium" | "regular"> & import("styled-system").LineHeightProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, 2 | 1> & import("styled-system").TextAlignProps<Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> & import("styled-system").ColorProps<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>, "link" | "icon/neutral" | "scale/violet/0" | "scale/violet/1" | "scale/violet/2" | "scale/violet/3" | "scale/violet/4" | "scale/violet/5" | "scale/violet/6" | "scale/violet/7" | "scale/violet/8" | "scale/violet/9" | "dim" | "link/hovered" | "link/pressed" | "link/neutral" | "link/neutral/hovered" | "link/neutral/pressed" | "link/neutral/bold" | "link/neutral/bold/hovered" | "link/neutral/bold/pressed" | "link/disabled" | "icon/neutral/bold" | "icon/neutral/bolder" | "icon/accent/gray" | "icon/accent/blue" | "icon/accent/blue/bold" | "icon/accent/green" | "icon/accent/yellow" | "icon/accent/red" | "icon/inverse" | "icon/disabled" | "icon/disabled/subtler" | "icon/selected/violet" | "icon/selected" | "icon/primary/subtle" | "icon/primary" | "icon/primary/bold" | "icon/success" | "icon/warning" | "icon/danger" | "border/neutral/subtle" | "border/neutral" | "border/neutral/bolder" | "border/input" | "border/inverse" | "border/selected" | "border/disabled" | "border/primary" | "border/hovered" | "border/focused" | "border/danger" | "border/success" | "bg/secondary" | "bg/secondary/hovered" | "bg/secondary/pressed" | "bg/primary" | "bg/primary/hovered" | "bg/primary/pressed" | "bg/neutral/subtler" | "bg/neutral/subtler/hovered" | "bg/neutral/subtler/pressed" | "bg/neutral/subtle" | "bg/neutral/subtle/hovered" | "bg/neutral/subtle/pressed" | "bg/neutral" | "bg/neutral/hovered" | "bg/neutral/pressed" | "bg/neutral/bold" | "bg/neutral/bold/hovered" | "bg/neutral/bold/pressed" | "bg/neutral/bolder" | "bg/neutral/bolder/hovered" | "bg/neutral/bolder/pressed" | "bg/disabled" | "bg/disabled/subtlest" | "bg/input" | "bg/accent/blue/subtlest" | "bg/accent/green/subtlest" | "bg/accent/yellow/subtlest" | "bg/accent/red/subtlest" | "bg/accent/red/subtle" | "bg/accent/red" | "bg/accent/gray/subtlest" | "bg/selected/violet" | "bg/selected" | "bg/selected/subtle" | "bg/inverse" | "bg/inverse/subtlest" | "bg/success" | "bg/success/bold" | "bg/warning" | "bg/warning/bold" | "bg/danger" | "bg/danger/bold" | "bg/danger/bold/hovered" | "bg/danger/bold/pressed" | "text/primary" | "text/accent/blue" | "text/accent/green" | "text/accent/yellow" | "text/accent/red" | "text/neutral/subtlest" | "text/neutral/subtler" | "text/neutral/subtle" | "text/neutral" | "text/inverse" | "text/inverse/subtle" | "text/inverse/subtler" | "text/disabled" | "text/success" | "text/warning" | "text/danger" | "text/selected">, "ref"> & {
278
278
  ref?: ((instance: HTMLSpanElement | null) => void) | import("react").RefObject<HTMLSpanElement> | null | undefined;
279
279
  }, Props>>;
280
280
  export default GradientText;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { LayoutProps } from 'styled-system';
3
+ import { SxProp } from '../../utils/styled-system';
4
+ type Props = {} & SxProp & LayoutProps;
5
+ declare const Image: import("styled-components").IStyledComponent<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, Props>>;
6
+ export default Image;
7
+ export type { Props as ImageProps };
@@ -0,0 +1,6 @@
1
+ import { ISection } from '../types';
2
+ type Props = {
3
+ section: ISection;
4
+ };
5
+ declare const EnigmaUI: ({ section: { views, responsiveLayout } }: Props) => import("react/jsx-runtime").JSX.Element;
6
+ export default EnigmaUI;
@@ -0,0 +1,8 @@
1
+ import { SingleColumnLayout as SingleColumnLayoutType } from '../../types';
2
+ type Props = {
3
+ layout: SingleColumnLayoutType;
4
+ viewsObject: any;
5
+ viewComponentsObject: any;
6
+ };
7
+ declare const SingleColumnLayout: ({ layout, viewsObject, viewComponentsObject }: Props) => import("react/jsx-runtime").JSX.Element;
8
+ export default SingleColumnLayout;
@@ -0,0 +1 @@
1
+ export { default as SingleColumnLayout } from './SingleColumnLayout';
@@ -0,0 +1,6 @@
1
+ import { ImageView as ImageViewType } from '../../types';
2
+ type Props = {
3
+ view: ImageViewType;
4
+ };
5
+ declare const ImageView: ({ view: { ...props } }: Props) => import("react/jsx-runtime").JSX.Element;
6
+ export default ImageView;
@@ -0,0 +1,6 @@
1
+ import { TextView as TextViewType } from '../../types';
2
+ type Props = {
3
+ view: TextViewType;
4
+ };
5
+ declare const TextView: ({ view: { text, textProps } }: Props) => import("react/jsx-runtime").JSX.Element;
6
+ export default TextView;
@@ -0,0 +1,2 @@
1
+ export { default as ImageView } from './ImageView';
2
+ export { default as TextView } from './TextView';
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Default Types
3
+ */
4
+ type TextProps = any;
5
+ type SpaceProps = any;
6
+ /**
7
+ * View Related Model
8
+ */
9
+ export type TextView = {
10
+ text: string;
11
+ textProps?: TextProps;
12
+ };
13
+ export type ImageView = {
14
+ src: string;
15
+ alt: string;
16
+ width: number;
17
+ height: number;
18
+ };
19
+ export type View = TextView | ImageView;
20
+ export type ViewComponentType = 'TextView' | 'ImageView';
21
+ export interface IViewContainer {
22
+ id: string;
23
+ viewComponentType: ViewComponentType;
24
+ view: View;
25
+ }
26
+ /**
27
+ * Layout Related Model
28
+ */
29
+ export interface IViewContainerDetail {
30
+ viewContainerId: string;
31
+ spaceProps: SpaceProps;
32
+ }
33
+ export type SingleColumnLayout = {
34
+ main: IViewContainerDetail[];
35
+ };
36
+ export type Layout = SingleColumnLayout;
37
+ export type LayoutComponentType = 'SingleColumnLayout';
38
+ export interface ILayoutContainer {
39
+ layoutComponentType: LayoutComponentType;
40
+ layout: Layout;
41
+ }
42
+ export interface IResponsiveLayoutContainer {
43
+ mobile: ILayoutContainer;
44
+ tablet?: ILayoutContainer;
45
+ desktop?: ILayoutContainer;
46
+ }
47
+ /**
48
+ * Section Related Model
49
+ */
50
+ export interface ISection {
51
+ id: string;
52
+ views: IViewContainer[];
53
+ responsiveLayout: IResponsiveLayoutContainer;
54
+ }
55
+ export {};
package/dist/index.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ /**
2
+ * core components
3
+ */
1
4
  export { default as Button } from './core/Button';
2
5
  export type { ButtonProps } from './core/Button';
3
6
  export { default as Chip } from './core/Chip';
@@ -10,6 +13,8 @@ export { default as IconButton } from './core/IconButton';
10
13
  export type { IconButtonProps } from './core/IconButton';
11
14
  export { default as IconToggleButton } from './core/IconToggleButton';
12
15
  export type { IconToggleButtonProps } from './core/IconToggleButton';
16
+ export { default as Image } from './core/Image';
17
+ export type { ImageProps } from './core/Image';
13
18
  export { default as ItemList } from './core/ItemList';
14
19
  export type { ItemListProps } from './core/ItemList';
15
20
  export { default as Space } from './core/Space';
@@ -26,6 +31,13 @@ export { default as View } from './core/View';
26
31
  export type { ViewProps } from './core/View';
27
32
  export { default as UnstyledButton } from './core/_UnstyledButton';
28
33
  export type { UnstyledButtonProps } from './core/_UnstyledButton';
34
+ /**
35
+ * enigma component
36
+ */
37
+ export { default as EnigmaUI } from './enigma/EnigmaUI';
38
+ /**
39
+ * hooks
40
+ */
29
41
  export { default as useDevice } from './hook/useDevice';
30
42
  export { default as useOutsideClick } from './hook/useOutsideClick';
31
43
  export { default as useProvidedOrCreatedRef } from './hook/useProvidedOrCreatedRef';
package/dist/index.js CHANGED
@@ -26,6 +26,15 @@ function _interopNamespace(e) {
26
26
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
27
  var styled__default = /*#__PURE__*/_interopDefault(styled);
28
28
 
29
+ const device = {
30
+ deviceDesktop: 1280,
31
+ deviceTablet: 900,
32
+ deviceMobile: 640
33
+ };
34
+
35
+ const baseBreakpoints = [device.deviceMobile, device.deviceTablet, device.deviceDesktop];
36
+ const breakpoints = baseBreakpoints.map(value => `${value + 1}px`);
37
+
29
38
  const gray = {
30
39
  gray50: '#F9FAFB',
31
40
  gray100: '#F3F4F6',
@@ -132,7 +141,7 @@ const textColor = {
132
141
  'text/success': palette.green500,
133
142
  'text/warning': palette.yellow500,
134
143
  'text/danger': palette.red500,
135
- 'text/selected/neutral': palette.gray900
144
+ 'text/selected': palette.gray900
136
145
  };
137
146
  const bgColor = {
138
147
  'bg/secondary': palette.violet50,
@@ -159,16 +168,16 @@ const bgColor = {
159
168
  'bg/disabled': palette.gray100,
160
169
  'bg/disabled/subtlest': palette.transparent,
161
170
  'bg/input': palette.white,
171
+ 'bg/accent/blue/subtlest': palette.blue50,
162
172
  'bg/accent/green/subtlest': palette.green50,
163
173
  'bg/accent/yellow/subtlest': palette.yellow50,
164
174
  'bg/accent/red/subtlest': palette.red50,
165
175
  'bg/accent/red/subtle': palette.red400,
166
176
  'bg/accent/red': palette.red500,
167
177
  'bg/accent/gray/subtlest': palette.gray200,
168
- 'bg/accent/blue/subtlest': palette.blue50,
169
178
  'bg/selected/violet': palette.violet500,
170
- 'bg/selected/neutral': palette.gray900,
171
- 'bg/selected/neutral/subtle': palette.gray100,
179
+ 'bg/selected': palette.gray900,
180
+ 'bg/selected/subtle': palette.gray100,
172
181
  'bg/inverse': palette.black,
173
182
  'bg/inverse/subtlest': palette.white10A,
174
183
  'bg/success': palette.green50,
@@ -186,6 +195,7 @@ const borderColor = {
186
195
  'border/neutral/bolder': palette.gray300,
187
196
  'border/input': palette.gray200,
188
197
  'border/inverse': palette.white10A,
198
+ 'border/selected': palette.gray900,
189
199
  'border/disabled': palette.gray100,
190
200
  'border/primary': palette.violet500,
191
201
  'border/hovered': palette.blue300,
@@ -206,10 +216,10 @@ const iconColor = {
206
216
  'icon/inverse': palette.white,
207
217
  'icon/disabled': palette.gray300,
208
218
  'icon/disabled/subtler': palette.gray200,
209
- 'icon/selected/primary': palette.violet500,
210
- 'icon/selected/neutral': palette.gray900,
211
- 'icon/primary': palette.violet500,
219
+ 'icon/selected/violet': palette.violet500,
220
+ 'icon/selected': palette.gray900,
212
221
  'icon/primary/subtle': palette.violet300,
222
+ 'icon/primary': palette.violet500,
213
223
  'icon/primary/bold': palette.violet700,
214
224
  'icon/success': palette.green500,
215
225
  'icon/warning': palette.yellow500,
@@ -3837,7 +3847,7 @@ const BaseIconToggleButton = styled__default.default(UnstyledButton)(({
3837
3847
  plain: {
3838
3848
  backgroundColor: color$1['bg/neutral/subtler'],
3839
3849
  ...(selected ? {
3840
- color: color$1['icon/selected/primary']
3850
+ color: color$1['icon/selected/violet']
3841
3851
  } : {
3842
3852
  color: color$1['icon/neutral']
3843
3853
  }),
@@ -3849,6 +3859,11 @@ const BaseIconToggleButton = styled__default.default(UnstyledButton)(({
3849
3859
  }
3850
3860
  }), sx);
3851
3861
 
3862
+ const Image = styled__default.default.img`
3863
+ ${layout}
3864
+ ${sx}
3865
+ `;
3866
+
3852
3867
  const ItemList = ({
3853
3868
  items,
3854
3869
  renderItem,
@@ -3937,6 +3952,126 @@ const StyledIcon = ({
3937
3952
  children: /*#__PURE__*/jsxRuntimeExports.jsx(Icon, {})
3938
3953
  });
3939
3954
 
3955
+ const useMediaQuery = query => {
3956
+ const getMatches = query => {
3957
+ /**
3958
+ * SSR 문제를 방지하기 위해 있습니다.
3959
+ */
3960
+ if (typeof window !== 'undefined') {
3961
+ return window.matchMedia(query).matches;
3962
+ }
3963
+ return false;
3964
+ };
3965
+ const [matches, setMatches] = React.useState(getMatches(query));
3966
+ function handleChange() {
3967
+ setMatches(getMatches(query));
3968
+ }
3969
+ React.useEffect(() => {
3970
+ const matchMedia = window.matchMedia(query);
3971
+
3972
+ /**
3973
+ * 클라이언트에서 mediaQuery를 반영하기 위해 로드됩니다.
3974
+ */
3975
+ handleChange();
3976
+ if (matchMedia.addListener) {
3977
+ matchMedia.addListener(handleChange);
3978
+ } else {
3979
+ matchMedia.addEventListener('change', handleChange);
3980
+ }
3981
+ return () => {
3982
+ if (matchMedia.removeListener) {
3983
+ matchMedia.removeListener(handleChange);
3984
+ } else {
3985
+ matchMedia.removeEventListener('change', handleChange);
3986
+ }
3987
+ };
3988
+ }, [query]);
3989
+ return matches;
3990
+ };
3991
+
3992
+ const SingleColumnLayout = ({
3993
+ layout,
3994
+ viewsObject,
3995
+ viewComponentsObject
3996
+ }) => /*#__PURE__*/jsxRuntimeExports.jsx(ItemList, {
3997
+ items: layout.main,
3998
+ renderItem: ({
3999
+ viewContainerId
4000
+ }) => {
4001
+ const view = viewsObject[viewContainerId];
4002
+ const ViewComponent = viewComponentsObject[viewContainerId];
4003
+ return ViewComponent ? /*#__PURE__*/jsxRuntimeExports.jsx(ViewComponent, {
4004
+ view: view
4005
+ }) : null;
4006
+ },
4007
+ renderItemWrapper: (children, {
4008
+ viewContainerId,
4009
+ spaceProps
4010
+ }, i) => /*#__PURE__*/jsxRuntimeExports.jsx(Space, {
4011
+ ...spaceProps,
4012
+ children: children
4013
+ }, [viewContainerId, `${i}`].join('-'))
4014
+ });
4015
+
4016
+ const ImageView = ({
4017
+ view: {
4018
+ ...props
4019
+ }
4020
+ }) => /*#__PURE__*/jsxRuntimeExports.jsx(Image, {
4021
+ loading: 'lazy',
4022
+ ...props
4023
+ });
4024
+
4025
+ const TextView = ({
4026
+ view: {
4027
+ text,
4028
+ textProps
4029
+ }
4030
+ }) => /*#__PURE__*/jsxRuntimeExports.jsx(Text, {
4031
+ ...textProps,
4032
+ children: text
4033
+ });
4034
+
4035
+ const EnigmaUI = ({
4036
+ section: {
4037
+ views,
4038
+ responsiveLayout
4039
+ }
4040
+ }) => {
4041
+ const isMatchDesktop = useMediaQuery(`screen and (min-width: ${breakpoints[1]})`);
4042
+ const isMatchTablet = useMediaQuery(`screen and (min-width: ${breakpoints[0]})`);
4043
+ const media = isMatchDesktop ? 'desktop' : !isMatchDesktop && isMatchTablet ? 'tablet' : 'mobile';
4044
+ const layoutContainer = responsiveLayout[media] || responsiveLayout['desktop'] || responsiveLayout['tablet'] || responsiveLayout['mobile'];
4045
+ const LayoutComponent = getLayoutComponent(layoutContainer);
4046
+ const layout = layoutContainer.layout;
4047
+ const viewsObject = Object.fromEntries(views.map(viewContainer => {
4048
+ return [viewContainer.id, viewContainer.view];
4049
+ }));
4050
+ const viewComponentsObject = Object.fromEntries(views.map(view => {
4051
+ return [view.id, getViewComponent(view)];
4052
+ }));
4053
+ return /*#__PURE__*/jsxRuntimeExports.jsx(LayoutComponent, {
4054
+ layout: layout,
4055
+ viewsObject: viewsObject,
4056
+ viewComponentsObject: viewComponentsObject
4057
+ });
4058
+ };
4059
+ const getLayoutComponent = layoutContainer => {
4060
+ const renderableLayoutComponent = {
4061
+ SingleColumnLayout: SingleColumnLayout
4062
+ };
4063
+ const LayoutComponent = renderableLayoutComponent[layoutContainer.layoutComponentType];
4064
+ return LayoutComponent;
4065
+ };
4066
+ const getViewComponent = viewContainer => {
4067
+ const renderableViewComponent = {
4068
+ TextView: TextView,
4069
+ ImageView: ImageView
4070
+ };
4071
+ const ViewComponent = renderableViewComponent[viewContainer.viewComponentType];
4072
+ return ViewComponent;
4073
+ };
4074
+
3940
4075
  /**
3941
4076
  * lodash (Custom Build) <https://lodash.com/>
3942
4077
  * Build: `lodash modularize exports="npm" -o ./`
@@ -4441,10 +4576,12 @@ const useToggleHandler = ({
4441
4576
 
4442
4577
  exports.Button = Button;
4443
4578
  exports.Chip = Chip;
4579
+ exports.EnigmaUI = EnigmaUI;
4444
4580
  exports.GradientText = GradientText;
4445
4581
  exports.Grid = index$1;
4446
4582
  exports.IconButton = IconButton;
4447
4583
  exports.IconToggleButton = IconToggleButton;
4584
+ exports.Image = Image;
4448
4585
  exports.ItemList = ItemList;
4449
4586
  exports.Space = Space;
4450
4587
  exports.Spinner = Spinner;
@@ -92,7 +92,7 @@ const BaseIconToggleButton = styled(UnstyledButton)(({
92
92
  plain: {
93
93
  backgroundColor: color['bg/neutral/subtler'],
94
94
  ...(selected ? {
95
- color: color['icon/selected/primary']
95
+ color: color['icon/selected/violet']
96
96
  } : {
97
97
  color: color['icon/neutral']
98
98
  }),
@@ -0,0 +1,11 @@
1
+ import styled from 'styled-components';
2
+ import '../../node_modules/styled-system/dist/index.esm.js';
3
+ import { sx } from '../../utils/styled-system/index.js';
4
+ import { layout } from '../../node_modules/@styled-system/layout/dist/index.esm.js';
5
+
6
+ const Image = styled.img`
7
+ ${layout}
8
+ ${sx}
9
+ `;
10
+
11
+ export { Image as default };
@@ -0,0 +1,48 @@
1
+ import breakpoints from '../../packages/token-studio/esm/token/breakpoints/index.js';
2
+ import useMediaQuery from '../../hook/useMediaQuery.js';
3
+ import SingleColumnLayout from '../Layout/SingleColumnLayout/index.js';
4
+ import ImageView from '../View/ImageView/index.js';
5
+ import TextView from '../View/TextView/index.js';
6
+ import { j as jsxRuntimeExports } from '../../node_modules/react/jsx-runtime.js';
7
+
8
+ const EnigmaUI = ({
9
+ section: {
10
+ views,
11
+ responsiveLayout
12
+ }
13
+ }) => {
14
+ const isMatchDesktop = useMediaQuery(`screen and (min-width: ${breakpoints[1]})`);
15
+ const isMatchTablet = useMediaQuery(`screen and (min-width: ${breakpoints[0]})`);
16
+ const media = isMatchDesktop ? 'desktop' : !isMatchDesktop && isMatchTablet ? 'tablet' : 'mobile';
17
+ const layoutContainer = responsiveLayout[media] || responsiveLayout['desktop'] || responsiveLayout['tablet'] || responsiveLayout['mobile'];
18
+ const LayoutComponent = getLayoutComponent(layoutContainer);
19
+ const layout = layoutContainer.layout;
20
+ const viewsObject = Object.fromEntries(views.map(viewContainer => {
21
+ return [viewContainer.id, viewContainer.view];
22
+ }));
23
+ const viewComponentsObject = Object.fromEntries(views.map(view => {
24
+ return [view.id, getViewComponent(view)];
25
+ }));
26
+ return /*#__PURE__*/jsxRuntimeExports.jsx(LayoutComponent, {
27
+ layout: layout,
28
+ viewsObject: viewsObject,
29
+ viewComponentsObject: viewComponentsObject
30
+ });
31
+ };
32
+ const getLayoutComponent = layoutContainer => {
33
+ const renderableLayoutComponent = {
34
+ SingleColumnLayout: SingleColumnLayout
35
+ };
36
+ const LayoutComponent = renderableLayoutComponent[layoutContainer.layoutComponentType];
37
+ return LayoutComponent;
38
+ };
39
+ const getViewComponent = viewContainer => {
40
+ const renderableViewComponent = {
41
+ TextView: TextView,
42
+ ImageView: ImageView
43
+ };
44
+ const ViewComponent = renderableViewComponent[viewContainer.viewComponentType];
45
+ return ViewComponent;
46
+ };
47
+
48
+ export { EnigmaUI as default };
@@ -0,0 +1,29 @@
1
+ import ItemList from '../../../core/ItemList/index.js';
2
+ import Space from '../../../core/Space/index.js';
3
+ import { j as jsxRuntimeExports } from '../../../node_modules/react/jsx-runtime.js';
4
+
5
+ const SingleColumnLayout = ({
6
+ layout,
7
+ viewsObject,
8
+ viewComponentsObject
9
+ }) => /*#__PURE__*/jsxRuntimeExports.jsx(ItemList, {
10
+ items: layout.main,
11
+ renderItem: ({
12
+ viewContainerId
13
+ }) => {
14
+ const view = viewsObject[viewContainerId];
15
+ const ViewComponent = viewComponentsObject[viewContainerId];
16
+ return ViewComponent ? /*#__PURE__*/jsxRuntimeExports.jsx(ViewComponent, {
17
+ view: view
18
+ }) : null;
19
+ },
20
+ renderItemWrapper: (children, {
21
+ viewContainerId,
22
+ spaceProps
23
+ }, i) => /*#__PURE__*/jsxRuntimeExports.jsx(Space, {
24
+ ...spaceProps,
25
+ children: children
26
+ }, [viewContainerId, `${i}`].join('-'))
27
+ });
28
+
29
+ export { SingleColumnLayout as default };
@@ -0,0 +1,13 @@
1
+ import Image from '../../../core/Image/index.js';
2
+ import { j as jsxRuntimeExports } from '../../../node_modules/react/jsx-runtime.js';
3
+
4
+ const ImageView = ({
5
+ view: {
6
+ ...props
7
+ }
8
+ }) => /*#__PURE__*/jsxRuntimeExports.jsx(Image, {
9
+ loading: 'lazy',
10
+ ...props
11
+ });
12
+
13
+ export { ImageView as default };
@@ -0,0 +1,14 @@
1
+ import Text from '../../../core/Text/index.js';
2
+ import { j as jsxRuntimeExports } from '../../../node_modules/react/jsx-runtime.js';
3
+
4
+ const TextView = ({
5
+ view: {
6
+ text,
7
+ textProps
8
+ }
9
+ }) => /*#__PURE__*/jsxRuntimeExports.jsx(Text, {
10
+ ...textProps,
11
+ children: text
12
+ });
13
+
14
+ export { TextView as default };
@@ -0,0 +1,40 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ const useMediaQuery = query => {
4
+ const getMatches = query => {
5
+ /**
6
+ * SSR 문제를 방지하기 위해 있습니다.
7
+ */
8
+ if (typeof window !== 'undefined') {
9
+ return window.matchMedia(query).matches;
10
+ }
11
+ return false;
12
+ };
13
+ const [matches, setMatches] = useState(getMatches(query));
14
+ function handleChange() {
15
+ setMatches(getMatches(query));
16
+ }
17
+ useEffect(() => {
18
+ const matchMedia = window.matchMedia(query);
19
+
20
+ /**
21
+ * 클라이언트에서 mediaQuery를 반영하기 위해 로드됩니다.
22
+ */
23
+ handleChange();
24
+ if (matchMedia.addListener) {
25
+ matchMedia.addListener(handleChange);
26
+ } else {
27
+ matchMedia.addEventListener('change', handleChange);
28
+ }
29
+ return () => {
30
+ if (matchMedia.removeListener) {
31
+ matchMedia.removeListener(handleChange);
32
+ } else {
33
+ matchMedia.removeEventListener('change', handleChange);
34
+ }
35
+ };
36
+ }, [query]);
37
+ return matches;
38
+ };
39
+
40
+ export { useMediaQuery as default };
package/esm/index.js CHANGED
@@ -4,6 +4,7 @@ export { default as GradientText } from './core/GradientText/index.js';
4
4
  export { default as Grid } from './core/Grid/index.js';
5
5
  export { default as IconButton } from './core/IconButton/index.js';
6
6
  export { default as IconToggleButton } from './core/IconToggleButton/index.js';
7
+ export { default as Image } from './core/Image/index.js';
7
8
  export { default as ItemList } from './core/ItemList/index.js';
8
9
  export { default as Space } from './core/Space/index.js';
9
10
  export { default as Spinner } from './core/Spinner/index.js';
@@ -12,6 +13,7 @@ export { default as StyledIcon } from './core/StyledIcon/index.js';
12
13
  export { default as Text } from './core/Text/index.js';
13
14
  export { default as View } from './core/View/index.js';
14
15
  export { default as UnstyledButton } from './core/_UnstyledButton.js';
16
+ export { default as EnigmaUI } from './enigma/EnigmaUI/index.js';
15
17
  export { default as useDevice } from './hook/useDevice.js';
16
18
  export { default as useOutsideClick } from './hook/useOutsideClick.js';
17
19
  export { default as useProvidedOrCreatedRef } from './hook/useProvidedOrCreatedRef.js';
@@ -0,0 +1,7 @@
1
+ const device = {
2
+ deviceDesktop: 1280,
3
+ deviceTablet: 900,
4
+ deviceMobile: 640
5
+ };
6
+
7
+ export { device as default };
@@ -0,0 +1,6 @@
1
+ import device from '../../foundation/breakpoint/device.js';
2
+
3
+ const baseBreakpoints = [device.deviceMobile, device.deviceTablet, device.deviceDesktop];
4
+ const breakpoints = baseBreakpoints.map(value => `${value + 1}px`);
5
+
6
+ export { baseBreakpoints, breakpoints as default };
@@ -17,7 +17,7 @@ const textColor = {
17
17
  'text/success': palette.green500,
18
18
  'text/warning': palette.yellow500,
19
19
  'text/danger': palette.red500,
20
- 'text/selected/neutral': palette.gray900
20
+ 'text/selected': palette.gray900
21
21
  };
22
22
  const bgColor = {
23
23
  'bg/secondary': palette.violet50,
@@ -44,16 +44,16 @@ const bgColor = {
44
44
  'bg/disabled': palette.gray100,
45
45
  'bg/disabled/subtlest': palette.transparent,
46
46
  'bg/input': palette.white,
47
+ 'bg/accent/blue/subtlest': palette.blue50,
47
48
  'bg/accent/green/subtlest': palette.green50,
48
49
  'bg/accent/yellow/subtlest': palette.yellow50,
49
50
  'bg/accent/red/subtlest': palette.red50,
50
51
  'bg/accent/red/subtle': palette.red400,
51
52
  'bg/accent/red': palette.red500,
52
53
  'bg/accent/gray/subtlest': palette.gray200,
53
- 'bg/accent/blue/subtlest': palette.blue50,
54
54
  'bg/selected/violet': palette.violet500,
55
- 'bg/selected/neutral': palette.gray900,
56
- 'bg/selected/neutral/subtle': palette.gray100,
55
+ 'bg/selected': palette.gray900,
56
+ 'bg/selected/subtle': palette.gray100,
57
57
  'bg/inverse': palette.black,
58
58
  'bg/inverse/subtlest': palette.white10A,
59
59
  'bg/success': palette.green50,
@@ -71,6 +71,7 @@ const borderColor = {
71
71
  'border/neutral/bolder': palette.gray300,
72
72
  'border/input': palette.gray200,
73
73
  'border/inverse': palette.white10A,
74
+ 'border/selected': palette.gray900,
74
75
  'border/disabled': palette.gray100,
75
76
  'border/primary': palette.violet500,
76
77
  'border/hovered': palette.blue300,
@@ -91,10 +92,10 @@ const iconColor = {
91
92
  'icon/inverse': palette.white,
92
93
  'icon/disabled': palette.gray300,
93
94
  'icon/disabled/subtler': palette.gray200,
94
- 'icon/selected/primary': palette.violet500,
95
- 'icon/selected/neutral': palette.gray900,
96
- 'icon/primary': palette.violet500,
95
+ 'icon/selected/violet': palette.violet500,
96
+ 'icon/selected': palette.gray900,
97
97
  'icon/primary/subtle': palette.violet300,
98
+ 'icon/primary': palette.violet500,
98
99
  'icon/primary/bold': palette.violet700,
99
100
  'icon/success': palette.green500,
100
101
  'icon/warning': palette.yellow500,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamturing/react-kit",
3
- "version": "1.4.0",
3
+ "version": "2.0.1",
4
4
  "description": "React components, hooks for create teamturing web application",
5
5
  "author": "Sungchang Park <psch300@gmail.com> (https://github.com/psch300)",
6
6
  "homepage": "https://github.com/weareteamturing/bombe#readme",
@@ -50,10 +50,10 @@
50
50
  },
51
51
  "dependencies": {
52
52
  "@teamturing/icons": "^1.19.0",
53
- "@teamturing/token-studio": "^1.1.6",
53
+ "@teamturing/token-studio": "^1.1.7",
54
54
  "lodash.debounce": "^4.0.8",
55
55
  "lodash.throttle": "^4.1.1",
56
56
  "styled-system": "^5.1.5"
57
57
  },
58
- "gitHead": "e302acb51e25f77d313c324dafbaaed9655abeae"
58
+ "gitHead": "f109beda81cc597a7c045964c71a1c0f209a30ec"
59
59
  }