@nurihaus/web-design-system 3.4.0 → 3.5.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.
@@ -22,7 +22,6 @@ declare const meta: {
22
22
  title: import("react").ReactNode;
23
23
  track?: string | undefined;
24
24
  key?: import("react").Key | null | undefined;
25
- value?: string | number | readonly string[] | undefined;
26
25
  defaultChecked?: boolean | undefined | undefined;
27
26
  defaultValue?: string | number | readonly string[] | undefined;
28
27
  suppressContentEditableWarning?: boolean | undefined | undefined;
@@ -286,10 +285,11 @@ declare const meta: {
286
285
  onTransitionEnd?: import("react").TransitionEventHandler<HTMLLIElement> | undefined;
287
286
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLLIElement> | undefined;
288
287
  variant?: (typeof variants)[number] | undefined;
289
- trackProps?: Record<string, string | number | boolean> | undefined;
290
- open?: boolean | undefined;
291
288
  defaultOpen?: boolean | undefined;
289
+ open?: boolean | undefined;
292
290
  onOpenChange?: ((open: boolean) => void) | undefined;
291
+ trackProps?: Record<string, string | number | boolean> | undefined;
292
+ value?: string | number | readonly string[] | undefined;
293
293
  onResume?: (() => void) | undefined;
294
294
  duration?: number | undefined;
295
295
  description?: import("react").ReactNode;
@@ -411,32 +411,6 @@
411
411
  border: var(--hairline) solid var(--color-grey-scale-300);
412
412
  }
413
413
 
414
- /* 버튼 같은 대상의 모서리에 띄우는 말풍선 (ADR 0006). 자리는 쓰는 쪽이 정하고, 꼬리는 아래 왼쪽에서 대상을 가리킨다.
415
- 흰 둘레로 밑에 깔린 같은 색 면(보라 버튼)과도 갈라 보인다. */
416
-
417
- .variant-callout:is(.option,.icon-text,.icon-text-option) {
418
- padding: 0 var(--spacing-10);
419
- border-color: transparent;
420
- border-radius: var(--radius-6);
421
- color: var(--color-white);
422
- background-color: var(--color-purple-900);
423
- box-shadow:
424
- 0 0 0 var(--spacing-2) var(--color-white),
425
- var(--shadow-popover);
426
- }
427
-
428
- .variant-callout:is(.option,.icon-text,.icon-text-option)::after {
429
- content: '';
430
- position: absolute;
431
- /* 꼬리(--spacing-8 정사각형) 한 변의 절반만큼 아래로 내려 반이 밖으로 나온다 */
432
- bottom: calc(var(--spacing-4) * -1);
433
- left: var(--spacing-12);
434
- width: var(--spacing-8);
435
- height: var(--spacing-8);
436
- background-color: inherit;
437
- transform: rotate(45deg);
438
- }
439
-
440
414
  .base-bottom-nav:where(.root) {
441
415
  position: fixed;
442
416
  left: var(--spacing-16);
@@ -788,6 +762,19 @@
788
762
  background-color: var(--color-grey-scale-100);
789
763
  }
790
764
 
765
+ /* callout prop: 오른쪽 위 모서리에 반쯤 걸친 말풍선 (ADR 0007). 글자 흐름 밖이라 글자가 움직이지 않는다.
766
+ .base-callout 의 position: relative 를 순서와 상관없이 이기도록 .cta-button > 로 한 단계 높인다 */
767
+
768
+ .cta-button.with-callout {
769
+ position: relative;
770
+ }
771
+
772
+ .cta-button > .cta-button-callout {
773
+ position: absolute;
774
+ top: calc(var(--spacing-12) * -1);
775
+ right: var(--spacing-14);
776
+ }
777
+
791
778
  .cta-button.size-xl {
792
779
  height: var(--control-height-xl);
793
780
  padding: 0 var(--spacing-24);
@@ -840,6 +827,60 @@
840
827
  border: none;
841
828
  }
842
829
 
830
+ /* 대상에 붙어 늘 떠 있는 작은 말풍선 (ADR 0007).
831
+ 연보라(primary 뱃지·secondary 버튼과 같은 색)는 흰 면 위에서 묻혀서 purple-300 테두리로 윤곽을 잡는다. */
832
+
833
+ .base-callout {
834
+ position: relative;
835
+ display: inline-flex;
836
+ align-items: center;
837
+ height: var(--label-height-xs);
838
+ padding: 0 var(--spacing-10);
839
+ border: var(--hairline) solid var(--color-purple-300);
840
+ border-radius: var(--radius-6);
841
+
842
+ background-color: var(--color-purple-50);
843
+ color: var(--color-purple-900);
844
+ box-shadow: var(--shadow-popover);
845
+
846
+ font-size: var(--font-size-xsm);
847
+ line-height: var(--line-height-xsm);
848
+ font-weight: var(--font-weight-bold);
849
+ white-space: nowrap;
850
+
851
+ /* 꼬리: --spacing-8 정사각형을 45도 돌린다. 한 변의 절반에 테두리 두께만큼 더 밖으로 내어 몸통 테두리를 덮는다 */
852
+ }
853
+
854
+ .base-callout::after {
855
+ content: '';
856
+ position: absolute;
857
+ width: var(--spacing-8);
858
+ height: var(--spacing-8);
859
+ border: 0 solid var(--color-purple-300);
860
+ background-color: inherit;
861
+ transform: rotate(45deg);
862
+ }
863
+
864
+ .base-callout:is(.tail-bottom-start,.tail-bottom-end)::after {
865
+ bottom: calc((var(--spacing-4) + var(--hairline)) * -1);
866
+ border-right-width: var(--hairline);
867
+ border-bottom-width: var(--hairline);
868
+ }
869
+
870
+ .base-callout:is(.tail-top-start,.tail-top-end)::after {
871
+ top: calc((var(--spacing-4) + var(--hairline)) * -1);
872
+ border-left-width: var(--hairline);
873
+ border-top-width: var(--hairline);
874
+ }
875
+
876
+ .base-callout:is(.tail-bottom-start,.tail-top-start)::after {
877
+ left: var(--spacing-12);
878
+ }
879
+
880
+ .base-callout:is(.tail-bottom-end,.tail-top-end)::after {
881
+ right: var(--spacing-12);
882
+ }
883
+
843
884
  .base-check-box.label {
844
885
  font-size: var(--font-size-sm);
845
886
  font-weight: var(--font-weight-medium);
@@ -14,9 +14,10 @@ import * as __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_179142b8__ from "react/j
14
14
  /* harmony import */ var _helpers_hooks_useTrack__WEBPACK_IMPORTED_MODULE_2__ = __nuri_require__(4560);
15
15
  /* harmony import */ var _helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__ = __nuri_require__(3274);
16
16
  /* harmony import */ var _helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__ = __nuri_require__(7335);
17
- /* harmony import */ var _loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_5__ = __nuri_require__(6302);
18
- /* harmony import */ var _base_button__WEBPACK_IMPORTED_MODULE_6__ = __nuri_require__(8933);
19
- /* harmony import */ var _button_props__WEBPACK_IMPORTED_MODULE_7__ = __nuri_require__(9976);
17
+ /* harmony import */ var _callout_callout__WEBPACK_IMPORTED_MODULE_5__ = __nuri_require__(1163);
18
+ /* harmony import */ var _loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_6__ = __nuri_require__(6302);
19
+ /* harmony import */ var _base_button__WEBPACK_IMPORTED_MODULE_7__ = __nuri_require__(8933);
20
+ /* harmony import */ var _button_props__WEBPACK_IMPORTED_MODULE_8__ = __nuri_require__(9976);
20
21
  var __assign = undefined && undefined.__assign || function () {
21
22
  __assign = Object.assign || function (t) {
22
23
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -43,30 +44,35 @@ var __rest = undefined && undefined.__rest || function (s, e) {
43
44
 
44
45
 
45
46
 
47
+
46
48
  var CTAButton = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(function (props, ref) {
47
- var _a = (0,_helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__/* .getMergedProps */ .p)(props, _button_props__WEBPACK_IMPORTED_MODULE_7__/* .ctaButtonProps */ .Lr),
49
+ var _a = (0,_helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__/* .getMergedProps */ .p)(props, _button_props__WEBPACK_IMPORTED_MODULE_8__/* .ctaButtonProps */ .Lr),
48
50
  className = _a.className,
49
51
  text = _a.text,
50
52
  leftIcon = _a.leftIcon,
51
53
  rightIcon = _a.rightIcon,
54
+ callout = _a.callout,
52
55
  _onClick = _a.onClick,
53
56
  track = _a.track,
54
57
  trackProps = _a.trackProps,
55
- restProps = __rest(_a, ["className", "text", "leftIcon", "rightIcon", "onClick", "track", "trackProps"]);
58
+ restProps = __rest(_a, ["className", "text", "leftIcon", "rightIcon", "callout", "onClick", "track", "trackProps"]);
56
59
  var emit = (0,_helpers_hooks_useTrack__WEBPACK_IMPORTED_MODULE_2__/* .useTrack */ .n)('CTAButton', {
57
60
  track: track,
58
61
  trackProps: trackProps
59
62
  });
60
- return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_base_button__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, __assign({
63
+ return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_base_button__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A, __assign({
61
64
  ref: ref,
62
- className: (0,_helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__/* .classNames */ .x)(className, 'cta-button'),
63
- loadingComponent: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A, {}),
65
+ className: (0,_helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__/* .classNames */ .x)(className, 'cta-button', callout ? 'with-callout' : undefined),
66
+ loadingComponent: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, {}),
64
67
  onClick: function onClick(event) {
65
68
  emit('click');
66
69
  _onClick === null || _onClick === void 0 ? void 0 : _onClick(event);
67
70
  }
68
71
  }, restProps, {
69
- children: [leftIcon, text, rightIcon]
72
+ children: [leftIcon, text, rightIcon, callout ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_callout_callout__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A, {
73
+ className: 'cta-button-callout',
74
+ text: callout
75
+ }) : null]
70
76
  }));
71
77
  });
72
78
  CTAButton.displayName = 'CTAButton';
@@ -239,13 +245,15 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
239
245
  /******/ __nuri_require__.C(__webpack_chunk_5__);
240
246
  /******/ import * as __webpack_chunk_6__ from "./chunk-6302.js";
241
247
  /******/ __nuri_require__.C(__webpack_chunk_6__);
242
- /******/ import * as __webpack_chunk_7__ from "./chunk-9976.js";
248
+ /******/ import * as __webpack_chunk_7__ from "./chunk-2496.js";
243
249
  /******/ __nuri_require__.C(__webpack_chunk_7__);
250
+ /******/ import * as __webpack_chunk_8__ from "./chunk-5226.js";
251
+ /******/ __nuri_require__.C(__webpack_chunk_8__);
244
252
  /******/
245
253
  /******/ // startup
246
254
  /******/ // Load entry module and return exports
247
255
  /******/ // This entry module depends on other loaded chunks and execution need to be delayed
248
- /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,4560,2777,7298,8933,6302,9976], () => (__nuri_require__(910)))
256
+ /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,4560,2777,7298,8933,6302,2496,5226], () => (__nuri_require__(910)))
249
257
  /******/ __webpack_exports__ = __nuri_require__.O(__webpack_exports__);
250
258
  /******/ const __webpack_exports__default = __webpack_exports__.A;
251
259
  /******/ export { __webpack_exports__default as default };
@@ -23,7 +23,7 @@ var __assign = undefined && undefined.__assign || function () {
23
23
  return __assign.apply(this, arguments);
24
24
  };
25
25
 
26
- var variant = ['neutral', 'primary', 'danger', 'outlined', 'callout'];
26
+ var variant = ['neutral', 'primary', 'danger', 'outlined'];
27
27
  var sizes = ['xs', 's', 'm', 'l', 'xl'];
28
28
  var commonBadgeProps = {
29
29
  variant: {
@@ -22,7 +22,7 @@ var __assign = undefined && undefined.__assign || function () {
22
22
  return __assign.apply(this, arguments);
23
23
  };
24
24
 
25
- var variant = ['neutral', 'primary', 'danger', 'outlined', 'callout'];
25
+ var variant = ['neutral', 'primary', 'danger', 'outlined'];
26
26
  var sizes = ['xs', 's', 'm', 'l', 'xl'];
27
27
  var commonBadgeProps = {
28
28
  variant: {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { default as Avatar } from './components/avatar/avatar';
2
2
  export { default as CTAButton } from './components/button/cta-button';
3
+ export { default as Callout } from './components/callout/callout';
3
4
  export { default as OptionBadge } from './components/badge/option-badge';
4
5
  export { default as IconTextBadge } from './components/badge/icon-text-badge';
5
6
  export { default as IconTextOptionBadge } from './components/badge/icon-text-option-badge';
@@ -29,6 +30,7 @@ export { default as ChipGroup } from './components/chip-group/chip-group';
29
30
  export { LogProvider, useLog } from './components/logging/logging';
30
31
  export type { AvatarProps } from './components/avatar/avatar-type';
31
32
  export type { CTAButtonProps } from './components/button/button-type';
33
+ export type { CalloutProps } from './components/callout/callout-type';
32
34
  export type { OptionBadgeProps, IconTextBadgeProps, IconTextOptionBadgeProps, } from './components/badge/badge-type';
33
35
  export type { DataTableProps, RowItem } from './components/table/table-type';
34
36
  export type { TextFieldProps } from './components/text-field/text-field-type';
package/dist/index.js CHANGED
@@ -268,7 +268,7 @@ var __assign = undefined && undefined.__assign || function () {
268
268
  return __assign.apply(this, arguments);
269
269
  };
270
270
 
271
- var variant = ['neutral', 'primary', 'danger', 'outlined', 'callout'];
271
+ var variant = ['neutral', 'primary', 'danger', 'outlined'];
272
272
  var sizes = ['xs', 's', 'm', 'l', 'xl'];
273
273
  var commonBadgeProps = {
274
274
  variant: {
@@ -1014,9 +1014,10 @@ var ctaButtonProps = {
1014
1014
  /* harmony import */ var _helpers_hooks_useTrack__WEBPACK_IMPORTED_MODULE_2__ = __nuri_require__(4560);
1015
1015
  /* harmony import */ var _helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__ = __nuri_require__(3274);
1016
1016
  /* harmony import */ var _helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__ = __nuri_require__(7335);
1017
- /* harmony import */ var _loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_5__ = __nuri_require__(6302);
1018
- /* harmony import */ var _base_button__WEBPACK_IMPORTED_MODULE_6__ = __nuri_require__(8933);
1019
- /* harmony import */ var _button_props__WEBPACK_IMPORTED_MODULE_7__ = __nuri_require__(9976);
1017
+ /* harmony import */ var _callout_callout__WEBPACK_IMPORTED_MODULE_5__ = __nuri_require__(1163);
1018
+ /* harmony import */ var _loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_6__ = __nuri_require__(6302);
1019
+ /* harmony import */ var _base_button__WEBPACK_IMPORTED_MODULE_7__ = __nuri_require__(8933);
1020
+ /* harmony import */ var _button_props__WEBPACK_IMPORTED_MODULE_8__ = __nuri_require__(9976);
1020
1021
  var __assign = undefined && undefined.__assign || function () {
1021
1022
  __assign = Object.assign || function (t) {
1022
1023
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -1043,30 +1044,35 @@ var __rest = undefined && undefined.__rest || function (s, e) {
1043
1044
 
1044
1045
 
1045
1046
 
1047
+
1046
1048
  var CTAButton = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(function (props, ref) {
1047
- var _a = (0,_helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__/* .getMergedProps */ .p)(props, _button_props__WEBPACK_IMPORTED_MODULE_7__/* .ctaButtonProps */ .Lr),
1049
+ var _a = (0,_helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__/* .getMergedProps */ .p)(props, _button_props__WEBPACK_IMPORTED_MODULE_8__/* .ctaButtonProps */ .Lr),
1048
1050
  className = _a.className,
1049
1051
  text = _a.text,
1050
1052
  leftIcon = _a.leftIcon,
1051
1053
  rightIcon = _a.rightIcon,
1054
+ callout = _a.callout,
1052
1055
  _onClick = _a.onClick,
1053
1056
  track = _a.track,
1054
1057
  trackProps = _a.trackProps,
1055
- restProps = __rest(_a, ["className", "text", "leftIcon", "rightIcon", "onClick", "track", "trackProps"]);
1058
+ restProps = __rest(_a, ["className", "text", "leftIcon", "rightIcon", "callout", "onClick", "track", "trackProps"]);
1056
1059
  var emit = (0,_helpers_hooks_useTrack__WEBPACK_IMPORTED_MODULE_2__/* .useTrack */ .n)('CTAButton', {
1057
1060
  track: track,
1058
1061
  trackProps: trackProps
1059
1062
  });
1060
- return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_base_button__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, __assign({
1063
+ return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_base_button__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A, __assign({
1061
1064
  ref: ref,
1062
- className: (0,_helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__/* .classNames */ .x)(className, 'cta-button'),
1063
- loadingComponent: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A, {}),
1065
+ className: (0,_helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__/* .classNames */ .x)(className, 'cta-button', callout ? 'with-callout' : undefined),
1066
+ loadingComponent: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, {}),
1064
1067
  onClick: function onClick(event) {
1065
1068
  emit('click');
1066
1069
  _onClick === null || _onClick === void 0 ? void 0 : _onClick(event);
1067
1070
  }
1068
1071
  }, restProps, {
1069
- children: [leftIcon, text, rightIcon]
1072
+ children: [leftIcon, text, rightIcon, callout ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_callout_callout__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A, {
1073
+ className: 'cta-button-callout',
1074
+ text: callout
1075
+ }) : null]
1070
1076
  }));
1071
1077
  });
1072
1078
  CTAButton.displayName = 'CTAButton';
@@ -1074,6 +1080,120 @@ CTAButton.displayName = 'CTAButton';
1074
1080
 
1075
1081
  /***/ },
1076
1082
 
1083
+ /***/ 1211
1084
+ (__unused_webpack_module, __webpack_exports__, __nuri_require__) {
1085
+
1086
+ /* harmony export */ __nuri_require__.d(__webpack_exports__, {
1087
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1088
+ /* harmony export */ });
1089
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __nuri_require__(612);
1090
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __nuri_require__(1041);
1091
+ /* harmony import */ var _helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_2__ = __nuri_require__(3274);
1092
+ var __assign = undefined && undefined.__assign || function () {
1093
+ __assign = Object.assign || function (t) {
1094
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
1095
+ s = arguments[i];
1096
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
1097
+ }
1098
+ return t;
1099
+ };
1100
+ return __assign.apply(this, arguments);
1101
+ };
1102
+ var __rest = undefined && undefined.__rest || function (s, e) {
1103
+ var t = {};
1104
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
1105
+ if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
1106
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
1107
+ }
1108
+ return t;
1109
+ };
1110
+
1111
+
1112
+
1113
+ // span 이다 — CTAButton 처럼 button 안에도 들어간다 (button 안에는 div 를 둘 수 없다)
1114
+ var BaseCallout = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(function (props, ref) {
1115
+ var className = props.className,
1116
+ restProps = __rest(props, ["className"]);
1117
+ return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span", __assign({
1118
+ ref: ref,
1119
+ className: (0,_helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_2__/* .classNames */ .x)('nuri-theme base-callout', className)
1120
+ }, restProps));
1121
+ });
1122
+ BaseCallout.displayName = 'BaseCallout';
1123
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BaseCallout);
1124
+
1125
+ /***/ },
1126
+
1127
+ /***/ 7810
1128
+ (__unused_webpack_module, __webpack_exports__, __nuri_require__) {
1129
+
1130
+ /* harmony export */ __nuri_require__.d(__webpack_exports__, {
1131
+ /* harmony export */ B: () => (/* binding */ calloutProps)
1132
+ /* harmony export */ });
1133
+ /* unused harmony export tail */
1134
+ /** 꼬리가 나오는 자리. `bottom-start` 는 말풍선 아래 왼쪽에서 아래를 가리킨다 */
1135
+ var tail = ['bottom-start', 'bottom-end', 'top-start', 'top-end'];
1136
+ var calloutProps = {
1137
+ tail: {
1138
+ type: 'className',
1139
+ className: 'tail',
1140
+ values: tail,
1141
+ "default": 'bottom-start'
1142
+ }
1143
+ };
1144
+
1145
+ /***/ },
1146
+
1147
+ /***/ 1163
1148
+ (__unused_webpack_module, __webpack_exports__, __nuri_require__) {
1149
+
1150
+ /* harmony export */ __nuri_require__.d(__webpack_exports__, {
1151
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1152
+ /* harmony export */ });
1153
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __nuri_require__(612);
1154
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __nuri_require__(1041);
1155
+ /* harmony import */ var _helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_2__ = __nuri_require__(7335);
1156
+ /* harmony import */ var _base_callout__WEBPACK_IMPORTED_MODULE_3__ = __nuri_require__(1211);
1157
+ /* harmony import */ var _callout_props__WEBPACK_IMPORTED_MODULE_4__ = __nuri_require__(7810);
1158
+ var __assign = undefined && undefined.__assign || function () {
1159
+ __assign = Object.assign || function (t) {
1160
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
1161
+ s = arguments[i];
1162
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
1163
+ }
1164
+ return t;
1165
+ };
1166
+ return __assign.apply(this, arguments);
1167
+ };
1168
+ var __rest = undefined && undefined.__rest || function (s, e) {
1169
+ var t = {};
1170
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
1171
+ if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
1172
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
1173
+ }
1174
+ return t;
1175
+ };
1176
+
1177
+
1178
+
1179
+
1180
+
1181
+ /** 대상에 붙어 늘 떠 있는 작은 말풍선 (ADR 0007). 자리는 쓰는 쪽이 정한다 — CTAButton 은 `callout` prop 으로 모서리에 끼운다 */
1182
+ var Callout = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(function (props, ref) {
1183
+ var _a = (0,_helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_2__/* .getMergedProps */ .p)(props, _callout_props__WEBPACK_IMPORTED_MODULE_4__/* .calloutProps */ .B),
1184
+ text = _a.text,
1185
+ restProps = __rest(_a, ["text"]);
1186
+ return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_base_callout__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A, __assign({
1187
+ ref: ref
1188
+ }, restProps, {
1189
+ children: text
1190
+ }));
1191
+ });
1192
+ Callout.displayName = 'Callout';
1193
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Callout);
1194
+
1195
+ /***/ },
1196
+
1077
1197
  /***/ 445
1078
1198
  (__unused_webpack_module, __webpack_exports__, __nuri_require__) {
1079
1199
 
@@ -6015,6 +6135,8 @@ var __webpack_exports__ = {};
6015
6135
  var avatar = __nuri_require__(5468);
6016
6136
  // EXTERNAL MODULE: ./components/button/cta-button.tsx
6017
6137
  var cta_button = __nuri_require__(910);
6138
+ // EXTERNAL MODULE: ./components/callout/callout.tsx
6139
+ var callout = __nuri_require__(1163);
6018
6140
  // EXTERNAL MODULE: ./components/badge/option-badge.tsx
6019
6141
  var option_badge = __nuri_require__(9401);
6020
6142
  // EXTERNAL MODULE: ./components/badge/icon-text-badge.tsx
@@ -6668,6 +6790,7 @@ var colors = __nuri_require__(7232);
6668
6790
 
6669
6791
 
6670
6792
 
6793
+
6671
6794
 
6672
6795
 
6673
6796
  const __webpack_exports__colors = colors/* colors */.T;
@@ -6676,6 +6799,7 @@ export const Avatar = avatar/* default */.A;
6676
6799
  export const BottomNav = bottom_nav/* default */.A;
6677
6800
  export const Breadcrumb = breadcrumb/* default */.A;
6678
6801
  export const CTAButton = cta_button/* default */.A;
6802
+ export const Callout = callout/* default */.A;
6679
6803
  export const Checkbox = check_box/* default */.A;
6680
6804
  export const ChipGroup = chip_group/* default */.A;
6681
6805
  export const CollapsibleMenu = collapsible_menu/* default */.A;
@@ -315,19 +315,21 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
315
315
  /******/ __nuri_require__.C(__webpack_chunk_5__);
316
316
  /******/ import * as __webpack_chunk_6__ from "./chunk-6302.js";
317
317
  /******/ __nuri_require__.C(__webpack_chunk_6__);
318
- /******/ import * as __webpack_chunk_7__ from "./chunk-6713.js";
318
+ /******/ import * as __webpack_chunk_7__ from "./chunk-2496.js";
319
319
  /******/ __nuri_require__.C(__webpack_chunk_7__);
320
- /******/ import * as __webpack_chunk_8__ from "./chunk-9976.js";
320
+ /******/ import * as __webpack_chunk_8__ from "./chunk-6713.js";
321
321
  /******/ __nuri_require__.C(__webpack_chunk_8__);
322
- /******/ import * as __webpack_chunk_9__ from "./chunk-1657.js";
322
+ /******/ import * as __webpack_chunk_9__ from "./chunk-5226.js";
323
323
  /******/ __nuri_require__.C(__webpack_chunk_9__);
324
- /******/ import * as __webpack_chunk_10__ from "./chunk-910.js";
324
+ /******/ import * as __webpack_chunk_10__ from "./chunk-1657.js";
325
325
  /******/ __nuri_require__.C(__webpack_chunk_10__);
326
+ /******/ import * as __webpack_chunk_11__ from "./chunk-910.js";
327
+ /******/ __nuri_require__.C(__webpack_chunk_11__);
326
328
  /******/
327
329
  /******/ // startup
328
330
  /******/ // Load entry module and return exports
329
331
  /******/ // This entry module depends on other loaded chunks and execution need to be delayed
330
- /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,4560,2777,7298,8933,6302,6713,9976,1657,910], () => (__nuri_require__(8949)))
332
+ /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,4560,2777,7298,8933,6302,2496,6713,5226,1657,910], () => (__nuri_require__(8949)))
331
333
  /******/ __webpack_exports__ = __nuri_require__.O(__webpack_exports__);
332
334
  /******/ const __webpack_exports__default = __webpack_exports__.A;
333
335
  /******/ export { __webpack_exports__default as default };
@@ -23,7 +23,7 @@ var __assign = undefined && undefined.__assign || function () {
23
23
  return __assign.apply(this, arguments);
24
24
  };
25
25
 
26
- var variant = ['neutral', 'primary', 'danger', 'outlined', 'callout'];
26
+ var variant = ['neutral', 'primary', 'danger', 'outlined'];
27
27
  var sizes = ['xs', 's', 'm', 'l', 'xl'];
28
28
  var commonBadgeProps = {
29
29
  variant: {
package/dist/styles.css CHANGED
@@ -789,29 +789,6 @@ p {
789
789
  background-color: var(--color-white);
790
790
  border: var(--hairline) solid var(--color-grey-scale-300);
791
791
  }
792
- /* 버튼 같은 대상의 모서리에 띄우는 말풍선 (ADR 0006). 자리는 쓰는 쪽이 정하고, 꼬리는 아래 왼쪽에서 대상을 가리킨다.
793
- 흰 둘레로 밑에 깔린 같은 색 면(보라 버튼)과도 갈라 보인다. */
794
- .variant-callout:is(.option,.icon-text,.icon-text-option) {
795
- padding: 0 var(--spacing-10);
796
- border-color: transparent;
797
- border-radius: var(--radius-6);
798
- color: var(--color-white);
799
- background-color: var(--color-purple-900);
800
- box-shadow:
801
- 0 0 0 var(--spacing-2) var(--color-white),
802
- var(--shadow-popover);
803
- }
804
- .variant-callout:is(.option,.icon-text,.icon-text-option)::after {
805
- content: '';
806
- position: absolute;
807
- /* 꼬리(--spacing-8 정사각형) 한 변의 절반만큼 아래로 내려 반이 밖으로 나온다 */
808
- bottom: calc(var(--spacing-4) * -1);
809
- left: var(--spacing-12);
810
- width: var(--spacing-8);
811
- height: var(--spacing-8);
812
- background-color: inherit;
813
- transform: rotate(45deg);
814
- }
815
792
  .base-bottom-nav:where(.root) {
816
793
  position: fixed;
817
794
  left: var(--spacing-16);
@@ -1108,6 +1085,16 @@ p {
1108
1085
  .cta-button.variant-social:not(:disabled):hover {
1109
1086
  background-color: var(--color-grey-scale-100);
1110
1087
  }
1088
+ /* callout prop: 오른쪽 위 모서리에 반쯤 걸친 말풍선 (ADR 0007). 글자 흐름 밖이라 글자가 움직이지 않는다.
1089
+ .base-callout 의 position: relative 를 순서와 상관없이 이기도록 .cta-button > 로 한 단계 높인다 */
1090
+ .cta-button.with-callout {
1091
+ position: relative;
1092
+ }
1093
+ .cta-button > .cta-button-callout {
1094
+ position: absolute;
1095
+ top: calc(var(--spacing-12) * -1);
1096
+ right: var(--spacing-14);
1097
+ }
1111
1098
  .cta-button.size-xl {
1112
1099
  height: var(--control-height-xl);
1113
1100
  padding: 0 var(--spacing-24);
@@ -1154,6 +1141,53 @@ p {
1154
1141
  cursor: not-allowed;
1155
1142
  border: none;
1156
1143
  }
1144
+ /* 대상에 붙어 늘 떠 있는 작은 말풍선 (ADR 0007).
1145
+ 연보라(primary 뱃지·secondary 버튼과 같은 색)는 흰 면 위에서 묻혀서 purple-300 테두리로 윤곽을 잡는다. */
1146
+ .base-callout {
1147
+ position: relative;
1148
+ display: inline-flex;
1149
+ align-items: center;
1150
+ height: var(--label-height-xs);
1151
+ padding: 0 var(--spacing-10);
1152
+ border: var(--hairline) solid var(--color-purple-300);
1153
+ border-radius: var(--radius-6);
1154
+
1155
+ background-color: var(--color-purple-50);
1156
+ color: var(--color-purple-900);
1157
+ box-shadow: var(--shadow-popover);
1158
+
1159
+ font-size: var(--font-size-xsm);
1160
+ line-height: var(--line-height-xsm);
1161
+ font-weight: var(--font-weight-bold);
1162
+ white-space: nowrap;
1163
+
1164
+ /* 꼬리: --spacing-8 정사각형을 45도 돌린다. 한 변의 절반에 테두리 두께만큼 더 밖으로 내어 몸통 테두리를 덮는다 */
1165
+ }
1166
+ .base-callout::after {
1167
+ content: '';
1168
+ position: absolute;
1169
+ width: var(--spacing-8);
1170
+ height: var(--spacing-8);
1171
+ border: 0 solid var(--color-purple-300);
1172
+ background-color: inherit;
1173
+ transform: rotate(45deg);
1174
+ }
1175
+ .base-callout:is(.tail-bottom-start,.tail-bottom-end)::after {
1176
+ bottom: calc((var(--spacing-4) + var(--hairline)) * -1);
1177
+ border-right-width: var(--hairline);
1178
+ border-bottom-width: var(--hairline);
1179
+ }
1180
+ .base-callout:is(.tail-top-start,.tail-top-end)::after {
1181
+ top: calc((var(--spacing-4) + var(--hairline)) * -1);
1182
+ border-left-width: var(--hairline);
1183
+ border-top-width: var(--hairline);
1184
+ }
1185
+ .base-callout:is(.tail-bottom-start,.tail-top-start)::after {
1186
+ left: var(--spacing-12);
1187
+ }
1188
+ .base-callout:is(.tail-bottom-end,.tail-top-end)::after {
1189
+ right: var(--spacing-12);
1190
+ }
1157
1191
  .base-check-box.label {
1158
1192
  font-size: var(--font-size-sm);
1159
1193
  font-weight: var(--font-weight-medium);
package/dist/toast.js CHANGED
@@ -494,19 +494,21 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
494
494
  /******/ __nuri_require__.C(__webpack_chunk_5__);
495
495
  /******/ import * as __webpack_chunk_6__ from "./chunk-6302.js";
496
496
  /******/ __nuri_require__.C(__webpack_chunk_6__);
497
- /******/ import * as __webpack_chunk_7__ from "./chunk-6713.js";
497
+ /******/ import * as __webpack_chunk_7__ from "./chunk-2496.js";
498
498
  /******/ __nuri_require__.C(__webpack_chunk_7__);
499
- /******/ import * as __webpack_chunk_8__ from "./chunk-9976.js";
499
+ /******/ import * as __webpack_chunk_8__ from "./chunk-6713.js";
500
500
  /******/ __nuri_require__.C(__webpack_chunk_8__);
501
- /******/ import * as __webpack_chunk_9__ from "./chunk-910.js";
501
+ /******/ import * as __webpack_chunk_9__ from "./chunk-5226.js";
502
502
  /******/ __nuri_require__.C(__webpack_chunk_9__);
503
- /******/ import * as __webpack_chunk_10__ from "./chunk-5077.js";
503
+ /******/ import * as __webpack_chunk_10__ from "./chunk-910.js";
504
504
  /******/ __nuri_require__.C(__webpack_chunk_10__);
505
+ /******/ import * as __webpack_chunk_11__ from "./chunk-5077.js";
506
+ /******/ __nuri_require__.C(__webpack_chunk_11__);
505
507
  /******/
506
508
  /******/ // startup
507
509
  /******/ // Load entry module and return exports
508
510
  /******/ // This entry module depends on other loaded chunks and execution need to be delayed
509
- /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,4560,2777,7298,8933,6302,6713,9976,910,5077], () => (__nuri_require__(4012)))
511
+ /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,4560,2777,7298,8933,6302,2496,6713,5226,910,5077], () => (__nuri_require__(4012)))
510
512
  /******/ __webpack_exports__ = __nuri_require__.O(__webpack_exports__);
511
513
  /******/ const __webpack_exports__ToastProvider = __webpack_exports__.t;
512
514
  /******/ const __webpack_exports__default = __webpack_exports__.A;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurihaus/web-design-system",
3
- "version": "3.4.0",
3
+ "version": "3.5.0",
4
4
  "description": "Nurihaus 디자인 시스템 — 컴포넌트와 디자인 토큰",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -118,6 +118,10 @@
118
118
  "types": "./dist/components/button/cta-button.d.ts",
119
119
  "default": "./dist/cta-button.js"
120
120
  },
121
+ "./callout": {
122
+ "types": "./dist/components/callout/callout.d.ts",
123
+ "default": "./dist/callout.js"
124
+ },
121
125
  "./option-badge": {
122
126
  "types": "./dist/components/badge/option-badge.d.ts",
123
127
  "default": "./dist/option-badge.js"